Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Side by Side Diff: cc/render_surface_impl.cc

Issue 11264056: cc: Use gfx:: Geometry types for positions, bounds, and related things. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ScaleAsVector Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/render_surface_impl.h ('k') | cc/renderer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "cc/render_surface_impl.h" 7 #include "cc/render_surface_impl.h"
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
11 #include "cc/damage_tracker.h" 11 #include "cc/damage_tracker.h"
12 #include "cc/debug_border_draw_quad.h" 12 #include "cc/debug_border_draw_quad.h"
13 #include "cc/delegated_renderer_layer_impl.h" 13 #include "cc/delegated_renderer_layer_impl.h"
14 #include "cc/layer_impl.h" 14 #include "cc/layer_impl.h"
15 #include "cc/math_util.h" 15 #include "cc/math_util.h"
16 #include "cc/quad_sink.h" 16 #include "cc/quad_sink.h"
17 #include "cc/render_pass.h" 17 #include "cc/render_pass.h"
18 #include "cc/render_pass_draw_quad.h" 18 #include "cc/render_pass_draw_quad.h"
19 #include "cc/render_pass_sink.h" 19 #include "cc/render_pass_sink.h"
20 #include "cc/shared_quad_state.h" 20 #include "cc/shared_quad_state.h"
21 #include "ui/gfx/rect_conversions.h"
21 #include <public/WebTransformationMatrix.h> 22 #include <public/WebTransformationMatrix.h>
22 23
23 using WebKit::WebTransformationMatrix; 24 using WebKit::WebTransformationMatrix;
24 25
25 namespace cc { 26 namespace cc {
26 27
27 static const int debugSurfaceBorderWidth = 2; 28 static const int debugSurfaceBorderWidth = 2;
28 static const int debugSurfaceBorderAlpha = 100; 29 static const int debugSurfaceBorderAlpha = 100;
29 static const int debugSurfaceBorderColorRed = 0; 30 static const int debugSurfaceBorderColorRed = 0;
30 static const int debugSurfaceBorderColorGreen = 0; 31 static const int debugSurfaceBorderColorGreen = 0;
(...skipping 13 matching lines...) Expand all
44 , m_targetRenderSurfaceLayerIndexHistory(0) 45 , m_targetRenderSurfaceLayerIndexHistory(0)
45 , m_currentLayerIndexHistory(0) 46 , m_currentLayerIndexHistory(0)
46 { 47 {
47 m_damageTracker = DamageTracker::create(); 48 m_damageTracker = DamageTracker::create();
48 } 49 }
49 50
50 RenderSurfaceImpl::~RenderSurfaceImpl() 51 RenderSurfaceImpl::~RenderSurfaceImpl()
51 { 52 {
52 } 53 }
53 54
54 FloatRect RenderSurfaceImpl::drawableContentRect() const 55 gfx::RectF RenderSurfaceImpl::drawableContentRect() const
55 { 56 {
56 FloatRect drawableContentRect = MathUtil::mapClippedRect(m_drawTransform, m_ contentRect); 57 gfx::RectF drawableContentRect = MathUtil::mapClippedRect(m_drawTransform, m _contentRect);
57 if (m_owningLayer->hasReplica()) 58 if (m_owningLayer->hasReplica())
58 drawableContentRect.unite(MathUtil::mapClippedRect(m_replicaDrawTransfor m, m_contentRect)); 59 drawableContentRect.Union(MathUtil::mapClippedRect(m_replicaDrawTransfor m, m_contentRect));
59 60
60 return drawableContentRect; 61 return drawableContentRect;
61 } 62 }
62 63
63 std::string RenderSurfaceImpl::name() const 64 std::string RenderSurfaceImpl::name() const
64 { 65 {
65 return base::StringPrintf("RenderSurfaceImpl(id=%i,owner=%s)", m_owningLayer ->id(), m_owningLayer->debugName().data()); 66 return base::StringPrintf("RenderSurfaceImpl(id=%i,owner=%s)", m_owningLayer ->id(), m_owningLayer->debugName().data());
66 } 67 }
67 68
68 static std::string indentString(int indent) 69 static std::string indentString(int indent)
(...skipping 26 matching lines...) Expand all
95 m_damageTracker->currentDamageRect().x(), m_damageTracker->currentDamage Rect().y(), 96 m_damageTracker->currentDamageRect().x(), m_damageTracker->currentDamage Rect().y(),
96 m_damageTracker->currentDamageRect().width(), m_damageTracker->currentDa mageRect().height()); 97 m_damageTracker->currentDamageRect().width(), m_damageTracker->currentDa mageRect().height());
97 } 98 }
98 99
99 int RenderSurfaceImpl::owningLayerId() const 100 int RenderSurfaceImpl::owningLayerId() const
100 { 101 {
101 return m_owningLayer ? m_owningLayer->id() : 0; 102 return m_owningLayer ? m_owningLayer->id() : 0;
102 } 103 }
103 104
104 105
105 void RenderSurfaceImpl::setClipRect(const IntRect& clipRect) 106 void RenderSurfaceImpl::setClipRect(const gfx::Rect& clipRect)
106 { 107 {
107 if (m_clipRect == clipRect) 108 if (m_clipRect == clipRect)
108 return; 109 return;
109 110
110 m_surfacePropertyChanged = true; 111 m_surfacePropertyChanged = true;
111 m_clipRect = clipRect; 112 m_clipRect = clipRect;
112 } 113 }
113 114
114 bool RenderSurfaceImpl::contentsChanged() const 115 bool RenderSurfaceImpl::contentsChanged() const
115 { 116 {
116 return !m_damageTracker->currentDamageRect().isEmpty(); 117 return !m_damageTracker->currentDamageRect().IsEmpty();
117 } 118 }
118 119
119 void RenderSurfaceImpl::setContentRect(const IntRect& contentRect) 120 void RenderSurfaceImpl::setContentRect(const gfx::Rect& contentRect)
120 { 121 {
121 if (m_contentRect == contentRect) 122 if (m_contentRect == contentRect)
122 return; 123 return;
123 124
124 m_surfacePropertyChanged = true; 125 m_surfacePropertyChanged = true;
125 m_contentRect = contentRect; 126 m_contentRect = contentRect;
126 } 127 }
127 128
128 bool RenderSurfaceImpl::surfacePropertyChanged() const 129 bool RenderSurfaceImpl::surfacePropertyChanged() const
129 { 130 {
(...skipping 20 matching lines...) Expand all
150 DelegatedRendererLayerImpl* delegatedRendererLayer = static_cast<DelegatedRe ndererLayerImpl*>(layer); 151 DelegatedRendererLayerImpl* delegatedRendererLayer = static_cast<DelegatedRe ndererLayerImpl*>(layer);
151 m_contributingDelegatedRenderPassLayerList.push_back(delegatedRendererLayer) ; 152 m_contributingDelegatedRenderPassLayerList.push_back(delegatedRendererLayer) ;
152 } 153 }
153 154
154 void RenderSurfaceImpl::clearLayerLists() 155 void RenderSurfaceImpl::clearLayerLists()
155 { 156 {
156 m_layerList.clear(); 157 m_layerList.clear();
157 m_contributingDelegatedRenderPassLayerList.clear(); 158 m_contributingDelegatedRenderPassLayerList.clear();
158 } 159 }
159 160
160 static inline IntRect computeClippedRectInTarget(const LayerImpl* owningLayer) 161 static inline gfx::Rect computeClippedRectInTarget(const LayerImpl* owningLayer)
161 { 162 {
162 DCHECK(owningLayer->parent()); 163 DCHECK(owningLayer->parent());
163 164
164 const LayerImpl* renderTarget = owningLayer->parent()->renderTarget(); 165 const LayerImpl* renderTarget = owningLayer->parent()->renderTarget();
165 const RenderSurfaceImpl* self = owningLayer->renderSurface(); 166 const RenderSurfaceImpl* self = owningLayer->renderSurface();
166 167
167 IntRect clippedRectInTarget = self->clipRect(); 168 gfx::Rect clippedRectInTarget = self->clipRect();
168 if (owningLayer->backgroundFilters().hasFilterThatMovesPixels()) { 169 if (owningLayer->backgroundFilters().hasFilterThatMovesPixels()) {
169 // If the layer has background filters that move pixels, we cannot sciss or as tightly. 170 // If the layer has background filters that move pixels, we cannot sciss or as tightly.
170 // FIXME: this should be able to be a tighter scissor, perhaps expanded by the filter outsets? 171 // FIXME: this should be able to be a tighter scissor, perhaps expanded by the filter outsets?
171 clippedRectInTarget = renderTarget->renderSurface()->contentRect(); 172 clippedRectInTarget = renderTarget->renderSurface()->contentRect();
172 } else if (clippedRectInTarget.isEmpty()) { 173 } else if (clippedRectInTarget.IsEmpty()) {
173 // For surfaces, empty clipRect means that the surface does not clip any thing. 174 // For surfaces, empty clipRect means that the surface does not clip any thing.
174 clippedRectInTarget = enclosingIntRect(intersection(renderTarget->render Surface()->contentRect(), self->drawableContentRect())); 175 clippedRectInTarget = renderTarget->renderSurface()->contentRect();
176 clippedRectInTarget.Intersect(gfx::ToEnclosingRect(self->drawableContent Rect()));
175 } else 177 } else
176 clippedRectInTarget.intersect(enclosingIntRect(self->drawableContentRect ())); 178 clippedRectInTarget.Intersect(gfx::ToEnclosingRect(self->drawableContent Rect()));
177 return clippedRectInTarget; 179 return clippedRectInTarget;
178 } 180 }
179 181
180 RenderPass::Id RenderSurfaceImpl::renderPassId() 182 RenderPass::Id RenderSurfaceImpl::renderPassId()
181 { 183 {
182 int layerId = m_owningLayer->id(); 184 int layerId = m_owningLayer->id();
183 int subId = 0; 185 int subId = 0;
184 DCHECK(layerId > 0); 186 DCHECK(layerId > 0);
185 return RenderPass::Id(layerId, subId); 187 return RenderPass::Id(layerId, subId);
186 } 188 }
187 189
188 void RenderSurfaceImpl::appendRenderPasses(RenderPassSink& passSink) 190 void RenderSurfaceImpl::appendRenderPasses(RenderPassSink& passSink)
189 { 191 {
190 for (size_t i = 0; i < m_contributingDelegatedRenderPassLayerList.size(); ++ i) 192 for (size_t i = 0; i < m_contributingDelegatedRenderPassLayerList.size(); ++ i)
191 m_contributingDelegatedRenderPassLayerList[i]->appendContributingRenderP asses(passSink); 193 m_contributingDelegatedRenderPassLayerList[i]->appendContributingRenderP asses(passSink);
192 194
193 scoped_ptr<RenderPass> pass = RenderPass::create(renderPassId(), m_contentRe ct, m_screenSpaceTransform); 195 scoped_ptr<RenderPass> pass = RenderPass::create(renderPassId(), m_contentRe ct, m_screenSpaceTransform);
194 pass->setDamageRect(m_damageTracker->currentDamageRect()); 196 pass->setDamageRect(m_damageTracker->currentDamageRect());
195 pass->setFilters(m_owningLayer->filters()); 197 pass->setFilters(m_owningLayer->filters());
196 pass->setFilter(m_owningLayer->filter()); 198 pass->setFilter(m_owningLayer->filter());
197 pass->setBackgroundFilters(m_owningLayer->backgroundFilters()); 199 pass->setBackgroundFilters(m_owningLayer->backgroundFilters());
198 passSink.appendRenderPass(pass.Pass()); 200 passSink.appendRenderPass(pass.Pass());
199 } 201 }
200 202
201 void RenderSurfaceImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQ uadsData, bool forReplica, RenderPass::Id renderPassId) 203 void RenderSurfaceImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQ uadsData, bool forReplica, RenderPass::Id renderPassId)
202 { 204 {
203 DCHECK(!forReplica || m_owningLayer->hasReplica()); 205 DCHECK(!forReplica || m_owningLayer->hasReplica());
204 206
205 IntRect clippedRectInTarget = computeClippedRectInTarget(m_owningLayer); 207 gfx::Rect clippedRectInTarget = computeClippedRectInTarget(m_owningLayer);
206 bool isOpaque = false; 208 bool isOpaque = false;
207 const WebTransformationMatrix& drawTransform = forReplica ? m_replicaDrawTra nsform : m_drawTransform; 209 const WebTransformationMatrix& drawTransform = forReplica ? m_replicaDrawTra nsform : m_drawTransform;
208 SharedQuadState* sharedQuadState = quadSink.useSharedQuadState(SharedQuadSta te::create(drawTransform, m_contentRect, clippedRectInTarget, m_drawOpacity, isO paque).Pass()); 210 SharedQuadState* sharedQuadState = quadSink.useSharedQuadState(SharedQuadSta te::create(drawTransform, m_contentRect, clippedRectInTarget, m_drawOpacity, isO paque).Pass());
209 211
210 if (m_owningLayer->hasDebugBorders()) { 212 if (m_owningLayer->hasDebugBorders()) {
211 int red = forReplica ? debugReplicaBorderColorRed : debugSurfaceBorderCo lorRed; 213 int red = forReplica ? debugReplicaBorderColorRed : debugSurfaceBorderCo lorRed;
212 int green = forReplica ? debugReplicaBorderColorGreen : debugSurfaceBor derColorGreen; 214 int green = forReplica ? debugReplicaBorderColorGreen : debugSurfaceBor derColorGreen;
213 int blue = forReplica ? debugReplicaBorderColorBlue : debugSurfaceBorder ColorBlue; 215 int blue = forReplica ? debugReplicaBorderColorBlue : debugSurfaceBorder ColorBlue;
214 SkColor color = SkColorSetARGB(debugSurfaceBorderAlpha, red, green, blue ); 216 SkColor color = SkColorSetARGB(debugSurfaceBorderAlpha, red, green, blue );
215 quadSink.append(DebugBorderDrawQuad::create(sharedQuadState, contentRect (), color, debugSurfaceBorderWidth).PassAs<DrawQuad>(), appendQuadsData); 217 quadSink.append(DebugBorderDrawQuad::create(sharedQuadState, contentRect (), color, debugSurfaceBorderWidth).PassAs<DrawQuad>(), appendQuadsData);
216 } 218 }
217 219
218 // FIXME: By using the same RenderSurfaceImpl for both the content and its r eflection, 220 // FIXME: By using the same RenderSurfaceImpl for both the content and its r eflection,
219 // it's currently not possible to apply a separate mask to the reflection la yer 221 // it's currently not possible to apply a separate mask to the reflection la yer
220 // or correctly handle opacity in reflections (opacity must be applied after drawing 222 // or correctly handle opacity in reflections (opacity must be applied after drawing
221 // both the layer and its reflection). The solution is to introduce yet anot her RenderSurfaceImpl 223 // both the layer and its reflection). The solution is to introduce yet anot her RenderSurfaceImpl
222 // to draw the layer and its reflection in. For now we only apply a separate reflection 224 // to draw the layer and its reflection in. For now we only apply a separate reflection
223 // mask if the contents don't have a mask of their own. 225 // mask if the contents don't have a mask of their own.
224 LayerImpl* maskLayer = m_owningLayer->maskLayer(); 226 LayerImpl* maskLayer = m_owningLayer->maskLayer();
225 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().isEmpty( ))) 227 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().IsEmpty( )))
226 maskLayer = 0; 228 maskLayer = 0;
227 229
228 if (!maskLayer && forReplica) { 230 if (!maskLayer && forReplica) {
229 maskLayer = m_owningLayer->replicaLayer()->maskLayer(); 231 maskLayer = m_owningLayer->replicaLayer()->maskLayer();
230 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().isEm pty())) 232 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().IsEm pty()))
231 maskLayer = 0; 233 maskLayer = 0;
232 } 234 }
233 235
234 float maskTexCoordScaleX = 1; 236 float maskTexCoordScaleX = 1;
235 float maskTexCoordScaleY = 1; 237 float maskTexCoordScaleY = 1;
236 float maskTexCoordOffsetX = 0; 238 float maskTexCoordOffsetX = 0;
237 float maskTexCoordOffsetY = 0; 239 float maskTexCoordOffsetY = 0;
238 if (maskLayer) { 240 if (maskLayer) {
239 maskTexCoordScaleX = contentRect().width() / maskLayer->contentsScaleX() / maskLayer->bounds().width(); 241 maskTexCoordScaleX = contentRect().width() / maskLayer->contentsScaleX() / maskLayer->bounds().width();
240 maskTexCoordScaleY = contentRect().height() / maskLayer->contentsScaleY( ) / maskLayer->bounds().height(); 242 maskTexCoordScaleY = contentRect().height() / maskLayer->contentsScaleY( ) / maskLayer->bounds().height();
241 maskTexCoordOffsetX = static_cast<float>(contentRect().x()) / contentRec t().width() * maskTexCoordScaleX; 243 maskTexCoordOffsetX = static_cast<float>(contentRect().x()) / contentRec t().width() * maskTexCoordScaleX;
242 maskTexCoordOffsetY = static_cast<float>(contentRect().y()) / contentRec t().height() * maskTexCoordScaleY; 244 maskTexCoordOffsetY = static_cast<float>(contentRect().y()) / contentRec t().height() * maskTexCoordScaleY;
243 } 245 }
244 246
245 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content sResourceId() : 0; 247 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content sResourceId() : 0;
246 IntRect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect : IntRect(); 248 gfx::Rect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect : gfx::Rect();
247 249
248 quadSink.append(RenderPassDrawQuad::create(sharedQuadState, contentRect(), r enderPassId, forReplica, maskResourceId, contentsChangedSinceLastFrame, 250 quadSink.append(RenderPassDrawQuad::create(sharedQuadState, contentRect(), r enderPassId, forReplica, maskResourceId, contentsChangedSinceLastFrame,
249 maskTexCoordScaleX, maskTexCoor dScaleY, maskTexCoordOffsetX, maskTexCoordOffsetY).PassAs<DrawQuad>(), appendQua dsData); 251 maskTexCoordScaleX, maskTexCoor dScaleY, maskTexCoordOffsetX, maskTexCoordOffsetY).PassAs<DrawQuad>(), appendQua dsData);
250 } 252 }
251 253
252 } 254 }
OLDNEW
« no previous file with comments | « cc/render_surface_impl.h ('k') | cc/renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698