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

Side by Side Diff: cc/render_surface_impl.cc

Issue 11883027: Fix masks when scaling is in the tree (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add test Created 7 years, 11 months 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/layer_tree_host_impl_unittest.cc ('k') | no next file » | 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 "cc/render_surface_impl.h" 5 #include "cc/render_surface_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 maskLayer = 0; 217 maskLayer = 0;
218 218
219 if (!maskLayer && forReplica) { 219 if (!maskLayer && forReplica) {
220 maskLayer = m_owningLayer->replicaLayer()->maskLayer(); 220 maskLayer = m_owningLayer->replicaLayer()->maskLayer();
221 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().IsEm pty())) 221 if (maskLayer && (!maskLayer->drawsContent() || maskLayer->bounds().IsEm pty()))
222 maskLayer = 0; 222 maskLayer = 0;
223 } 223 }
224 224
225 gfx::RectF maskUVRect(0.0f, 0.0f, 1.0f, 1.0f); 225 gfx::RectF maskUVRect(0.0f, 0.0f, 1.0f, 1.0f);
226 if (maskLayer) { 226 if (maskLayer) {
227 float scaleX = contentRect().width() / maskLayer->contentsScaleX() / mas kLayer->bounds().width(); 227 // Because the RenderSurface is sized base on the screen footprint,
228 float scaleY = contentRect().height() / maskLayer->contentsScaleY() / ma skLayer->bounds().height(); 228 // there can be a scale between the RenderSurface and the owning layer,
229 // as well as the mask. While the mask doesn't have a drawTransform, the
230 // owning layer has it (and should be pure scaling), so use that to
231 // scale the mask to the right size.
232 gfx::Vector2dF maskDrawScale = MathUtil::computeTransform2dScaleComponen ts(m_owningLayer->drawTransform(), 1.f);
enne (OOO) 2013/01/15 04:12:43 This will work given the current implementation of
danakj 2013/01/15 16:31:11 I'm not sure I agree. My POV is that the mask is a
danakj 2013/01/15 17:11:53 Ok I take this back. I had developed an impression
233 float scaleX = contentRect().width() / maskLayer->contentsScaleX() / mas kLayer->bounds().width() / maskDrawScale.x();
234 float scaleY = contentRect().height() / maskLayer->contentsScaleY() / ma skLayer->bounds().height() / maskDrawScale.y();
229 235
230 maskUVRect = gfx::RectF(static_cast<float>(contentRect().x()) / contentR ect().width() * scaleX, 236 maskUVRect = gfx::RectF(static_cast<float>(contentRect().x()) / contentR ect().width() * scaleX,
231 static_cast<float>(contentRect().y()) / contentR ect().height() * scaleY, 237 static_cast<float>(contentRect().y()) / contentR ect().height() * scaleY,
232 scaleX, 238 scaleX,
233 scaleY); 239 scaleY);
234 } 240 }
235 241
236 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content sResourceId() : 0; 242 ResourceProvider::ResourceId maskResourceId = maskLayer ? maskLayer->content sResourceId() : 0;
237 gfx::Rect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect : gfx::Rect(); 243 gfx::Rect contentsChangedSinceLastFrame = contentsChanged() ? m_contentRect : gfx::Rect();
238 244
239 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); 245 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
240 quad->SetNew(sharedQuadState, contentRect(), renderPassId, forReplica, maskR esourceId, contentsChangedSinceLastFrame, maskUVRect, m_owningLayer->filters(), m_owningLayer->filter(), m_owningLayer->backgroundFilters()); 246 quad->SetNew(sharedQuadState, contentRect(), renderPassId, forReplica, maskR esourceId, contentsChangedSinceLastFrame, maskUVRect, m_owningLayer->filters(), m_owningLayer->filter(), m_owningLayer->backgroundFilters());
241 quadSink.append(quad.PassAs<DrawQuad>(), appendQuadsData); 247 quadSink.append(quad.PassAs<DrawQuad>(), appendQuadsData);
242 } 248 }
243 249
244 } // namespace cc 250 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layer_tree_host_impl_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698