1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #if USE(ACCELERATED_COMPOSITING)
9 #include "CCScrollbarLayerImpl.h"
11 #include "CCQuadSink.h"
12 #include "CCScrollbarAnimationController.h"
13 #include "CCTextureDrawQuad.h"
15 using WebKit::WebRect
;
16 using WebKit::WebScrollbar
;
20 PassOwnPtr
<CCScrollbarLayerImpl
> CCScrollbarLayerImpl::create(int id
)
22 return adoptPtr(new CCScrollbarLayerImpl(id
));
25 CCScrollbarLayerImpl::CCScrollbarLayerImpl(int id
)
28 , m_backTrackResourceId(0)
29 , m_foreTrackResourceId(0)
30 , m_thumbResourceId(0)
31 , m_scrollbarOverlayStyle(WebScrollbar::ScrollbarOverlayStyleDefault
)
32 , m_orientation(WebScrollbar::Horizontal
)
33 , m_controlSize(WebScrollbar::RegularScrollbar
)
34 , m_pressedPart(WebScrollbar::NoPart
)
35 , m_hoveredPart(WebScrollbar::NoPart
)
36 , m_isScrollableAreaActive(false)
37 , m_isScrollViewScrollbar(false)
39 , m_isCustomScrollbar(false)
40 , m_isOverlayScrollbar(false)
44 void CCScrollbarLayerImpl::setScrollbarGeometry(PassOwnPtr
<CCScrollbarGeometryFixedThumb
> geometry
)
46 m_geometry
= geometry
;
49 void CCScrollbarLayerImpl::setScrollbarData(WebScrollbar
* scrollbar
)
51 m_scrollbarOverlayStyle
= scrollbar
->scrollbarOverlayStyle();
52 m_orientation
= scrollbar
->orientation();
53 m_controlSize
= scrollbar
->controlSize();
54 m_pressedPart
= scrollbar
->pressedPart();
55 m_hoveredPart
= scrollbar
->hoveredPart();
56 m_isScrollableAreaActive
= scrollbar
->isScrollableAreaActive();
57 m_isScrollViewScrollbar
= scrollbar
->isScrollViewScrollbar();
58 m_enabled
= scrollbar
->enabled();
59 m_isCustomScrollbar
= scrollbar
->isCustomScrollbar();
60 m_isOverlayScrollbar
= scrollbar
->isOverlay();
62 scrollbar
->getTickmarks(m_tickmarks
);
64 m_geometry
->update(scrollbar
);
67 static FloatRect
toUVRect(const WebRect
& r
, const IntRect
& bounds
)
69 return FloatRect(static_cast<float>(r
.x
) / bounds
.width(), static_cast<float>(r
.y
) / bounds
.height(),
70 static_cast<float>(r
.width
) / bounds
.width(), static_cast<float>(r
.height
) / bounds
.height());
73 void CCScrollbarLayerImpl::appendQuads(CCQuadSink
& quadSink
, CCAppendQuadsData
& appendQuadsData
)
75 bool premultipledAlpha
= false;
77 FloatRect
uvRect(0, 0, 1, 1);
78 IntRect
boundsRect(IntPoint(), contentBounds());
80 CCSharedQuadState
* sharedQuadState
= quadSink
.useSharedQuadState(createSharedQuadState());
81 appendDebugBorderQuad(quadSink
, sharedQuadState
, appendQuadsData
);
83 WebRect thumbRect
, backTrackRect
, foreTrackRect
;
84 m_geometry
->splitTrack(&m_scrollbar
, m_geometry
->trackRect(&m_scrollbar
), backTrackRect
, thumbRect
, foreTrackRect
);
85 if (!m_geometry
->hasThumb(&m_scrollbar
))
86 thumbRect
= WebRect();
88 if (m_thumbResourceId
&& !thumbRect
.isEmpty()) {
89 OwnPtr
<CCTextureDrawQuad
> quad
= CCTextureDrawQuad::create(sharedQuadState
, IntRect(thumbRect
.x
, thumbRect
.y
, thumbRect
.width
, thumbRect
.height
), m_thumbResourceId
, premultipledAlpha
, uvRect
, flipped
);
90 quad
->setNeedsBlending();
91 quadSink
.append(quad
.release(), appendQuadsData
);
94 if (!m_backTrackResourceId
)
97 // We only paint the track in two parts if we were given a texture for the forward track part.
98 if (m_foreTrackResourceId
&& !foreTrackRect
.isEmpty())
99 quadSink
.append(CCTextureDrawQuad::create(sharedQuadState
, IntRect(foreTrackRect
.x
, foreTrackRect
.y
, foreTrackRect
.width
, foreTrackRect
.height
), m_foreTrackResourceId
, premultipledAlpha
, toUVRect(foreTrackRect
, boundsRect
), flipped
), appendQuadsData
);
101 // Order matters here: since the back track texture is being drawn to the entire contents rect, we must append it after the thumb and
102 // fore track quads. The back track texture contains (and displays) the buttons.
103 if (!boundsRect
.isEmpty())
104 quadSink
.append(CCTextureDrawQuad::create(sharedQuadState
, IntRect(boundsRect
), m_backTrackResourceId
, premultipledAlpha
, uvRect
, flipped
), appendQuadsData
);
107 void CCScrollbarLayerImpl::didLoseContext()
109 m_backTrackResourceId
= 0;
110 m_foreTrackResourceId
= 0;
111 m_thumbResourceId
= 0;
114 bool CCScrollbarLayerImpl::CCScrollbar::isOverlay() const
116 return m_owner
->m_isOverlayScrollbar
;
119 int CCScrollbarLayerImpl::CCScrollbar::value() const
121 return m_owner
->m_currentPos
;
124 WebKit::WebPoint
CCScrollbarLayerImpl::CCScrollbar::location() const
126 return WebKit::WebPoint();
129 WebKit::WebSize
CCScrollbarLayerImpl::CCScrollbar::size() const
131 return WebKit::WebSize(m_owner
->contentBounds().width(), m_owner
->contentBounds().height());
134 bool CCScrollbarLayerImpl::CCScrollbar::enabled() const
136 return m_owner
->m_enabled
;
139 int CCScrollbarLayerImpl::CCScrollbar::maximum() const
141 return m_owner
->m_maximum
;
144 int CCScrollbarLayerImpl::CCScrollbar::totalSize() const
146 return m_owner
->m_totalSize
;
149 bool CCScrollbarLayerImpl::CCScrollbar::isScrollViewScrollbar() const
151 return m_owner
->m_isScrollViewScrollbar
;
154 bool CCScrollbarLayerImpl::CCScrollbar::isScrollableAreaActive() const
156 return m_owner
->m_isScrollableAreaActive
;
159 void CCScrollbarLayerImpl::CCScrollbar::getTickmarks(WebKit::WebVector
<WebRect
>& tickmarks
) const
161 tickmarks
= m_owner
->m_tickmarks
;
164 WebScrollbar::ScrollbarControlSize
CCScrollbarLayerImpl::CCScrollbar::controlSize() const
166 return m_owner
->m_controlSize
;
169 WebScrollbar::ScrollbarPart
CCScrollbarLayerImpl::CCScrollbar::pressedPart() const
171 return m_owner
->m_pressedPart
;
174 WebScrollbar::ScrollbarPart
CCScrollbarLayerImpl::CCScrollbar::hoveredPart() const
176 return m_owner
->m_hoveredPart
;
179 WebScrollbar::ScrollbarOverlayStyle
CCScrollbarLayerImpl::CCScrollbar::scrollbarOverlayStyle() const
181 return m_owner
->m_scrollbarOverlayStyle
;
184 WebScrollbar::Orientation
CCScrollbarLayerImpl::CCScrollbar::orientation() const
186 return m_owner
->m_orientation
;
189 bool CCScrollbarLayerImpl::CCScrollbar::isCustomScrollbar() const
191 return m_owner
->m_isCustomScrollbar
;
195 #endif // USE(ACCELERATED_COMPOSITING)