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

Side by Side Diff: cc/picture_layer_tiling.cc

Issue 12383060: cc: Remove texture scaling and clear edge texels of a layer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and expand base picture Created 7 years, 9 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
« no previous file with comments | « cc/picture_layer_tiling.h ('k') | cc/picture_pile.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 2012 The Chromium Authors. All rights reserved. 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 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/picture_layer_tiling.h" 5 #include "cc/picture_layer_tiling.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "cc/math_util.h" 10 #include "cc/math_util.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 bottom_(-1) { 183 bottom_(-1) {
184 } 184 }
185 185
186 PictureLayerTiling::Iterator::Iterator(const PictureLayerTiling* tiling, 186 PictureLayerTiling::Iterator::Iterator(const PictureLayerTiling* tiling,
187 float dest_scale, 187 float dest_scale,
188 gfx::Rect dest_rect, 188 gfx::Rect dest_rect,
189 LayerDeviceAlignment layerDeviceAlignment ) 189 LayerDeviceAlignment layerDeviceAlignment )
190 : tiling_(tiling), 190 : tiling_(tiling),
191 dest_rect_(dest_rect), 191 dest_rect_(dest_rect),
192 current_tile_(NULL), 192 current_tile_(NULL),
193 dest_to_content_scale_x_(0), 193 dest_to_content_scale_(0),
194 dest_to_content_scale_y_(0),
195 tile_i_(0), 194 tile_i_(0),
196 tile_j_(0), 195 tile_j_(0),
197 left_(0), 196 left_(0),
198 top_(0), 197 top_(0),
199 right_(-1), 198 right_(-1),
200 bottom_(-1) { 199 bottom_(-1) {
201 DCHECK(tiling_); 200 DCHECK(tiling_);
202 if (dest_rect_.IsEmpty()) 201 if (dest_rect_.IsEmpty())
203 return; 202 return;
204 203
205 float dest_to_content_scale = tiling_->contents_scale_ / dest_scale; 204 dest_to_content_scale_ = tiling_->contents_scale_ / dest_scale;
206 // This is the maximum size that the dest rect can be, given the content size. 205 // This is the maximum size that the dest rect can be, given the content size.
207 gfx::Size dest_content_size = gfx::ToCeiledSize(gfx::ScaleSize( 206 gfx::Size dest_content_size = gfx::ToCeiledSize(gfx::ScaleSize(
208 tiling_->ContentRect().size(), 207 tiling_->ContentRect().size(),
209 1 / dest_to_content_scale, 208 1 / dest_to_content_scale_,
210 1 / dest_to_content_scale)); 209 1 / dest_to_content_scale_));
211
212 // The last row/column of texels may not have full rasterization coverage,
213 // which can happen if the ceiled content size does not equal the floored
214 // content size. These texels will sample outside of the recording to
215 // generate their pixels. Use the floored size here to ignore them.
216 gfx::Size content_size_floor = gfx::ToFlooredSize(tiling->ContentSizeF());
217 dest_to_content_scale_x_ = content_size_floor.width() /
218 static_cast<float>(dest_content_size.width());
219 dest_to_content_scale_y_ = content_size_floor.height() /
220 static_cast<float>(dest_content_size.height());
221
222 // It's possible that when drawing a quad with texel:pixel ratio < 1
223 // GL_LINEAR will cause us to blend in invalid texels.
224 // We stretch the content a little more to prevent sampling past the
225 // middle of the last texel.
226 if (layerDeviceAlignment == LayerAlignedToDevice){
227 if (dest_to_content_scale_x_ < 1.0)
228 dest_to_content_scale_x_ -= 0.5f / dest_content_size.width();
229 if (dest_to_content_scale_y_ < 1.0)
230 dest_to_content_scale_y_ -= 0.5f / dest_content_size.height();
231 }
232 else if (layerDeviceAlignment == LayerNotAlignedToDevice) {
233 dest_to_content_scale_x_ -= 0.5f / dest_content_size.width();
234 dest_to_content_scale_y_ -= 0.5f / dest_content_size.height();
235 }
236 210
237 gfx::Rect content_rect = 211 gfx::Rect content_rect =
238 gfx::ToEnclosingRect(gfx::ScaleRect(dest_rect_, 212 gfx::ToEnclosingRect(gfx::ScaleRect(dest_rect_,
239 dest_to_content_scale_x_, 213 dest_to_content_scale_,
240 dest_to_content_scale_y_)); 214 dest_to_content_scale_));
241 // IndexFromSrcCoord clamps to valid tile ranges, so it's necessary to 215 // IndexFromSrcCoord clamps to valid tile ranges, so it's necessary to
242 // check for non-intersection first. 216 // check for non-intersection first.
243 content_rect.Intersect(gfx::Rect(tiling_->tiling_data_.total_size())); 217 content_rect.Intersect(gfx::Rect(tiling_->tiling_data_.total_size()));
244 if (content_rect.IsEmpty()) 218 if (content_rect.IsEmpty())
245 return; 219 return;
246 220
247 left_ = tiling_->tiling_data_.TileXIndexFromSrcCoord(content_rect.x()); 221 left_ = tiling_->tiling_data_.TileXIndexFromSrcCoord(content_rect.x());
248 top_ = tiling_->tiling_data_.TileYIndexFromSrcCoord(content_rect.y()); 222 top_ = tiling_->tiling_data_.TileYIndexFromSrcCoord(content_rect.y());
249 right_ = tiling_->tiling_data_.TileXIndexFromSrcCoord( 223 right_ = tiling_->tiling_data_.TileXIndexFromSrcCoord(
250 content_rect.right() - 1); 224 content_rect.right() - 1);
(...skipping 28 matching lines...) Expand all
279 current_tile_ = tiling_->TileAt(tile_i_, tile_j_); 253 current_tile_ = tiling_->TileAt(tile_i_, tile_j_);
280 254
281 // Calculate the current geometry rect. Due to floating point rounding 255 // Calculate the current geometry rect. Due to floating point rounding
282 // and ToEnclosingRect, tiles might overlap in destination space on the 256 // and ToEnclosingRect, tiles might overlap in destination space on the
283 // edges. 257 // edges.
284 gfx::Rect last_geometry_rect = current_geometry_rect_; 258 gfx::Rect last_geometry_rect = current_geometry_rect_;
285 259
286 gfx::Rect content_rect = tiling_->tiling_data_.TileBounds(tile_i_, tile_j_); 260 gfx::Rect content_rect = tiling_->tiling_data_.TileBounds(tile_i_, tile_j_);
287 261
288 current_geometry_rect_ = gfx::ToEnclosingRect( 262 current_geometry_rect_ = gfx::ToEnclosingRect(
289 gfx::ScaleRect(content_rect, 1 / dest_to_content_scale_x_, 263 gfx::ScaleRect(content_rect, 1 / dest_to_content_scale_,
290 1 / dest_to_content_scale_y_)); 264 1 / dest_to_content_scale_));
291 265
292 current_geometry_rect_.Intersect(dest_rect_); 266 current_geometry_rect_.Intersect(dest_rect_);
293 267
294 if (first_time) 268 if (first_time)
295 return *this; 269 return *this;
296 270
297 // Iteration happens left->right, top->bottom. Running off the bottom-right 271 // Iteration happens left->right, top->bottom. Running off the bottom-right
298 // edge is handled by the intersection above with dest_rect_. Here we make 272 // edge is handled by the intersection above with dest_rect_. Here we make
299 // sure that the new current geometry rect doesn't overlap with the last. 273 // sure that the new current geometry rect doesn't overlap with the last.
300 int min_left; 274 int min_left;
(...skipping 28 matching lines...) Expand all
329 rect.set_size(tiling_->tiling_data_.max_texture_size()); 303 rect.set_size(tiling_->tiling_data_.max_texture_size());
330 return rect; 304 return rect;
331 } 305 }
332 306
333 gfx::RectF PictureLayerTiling::Iterator::texture_rect() const { 307 gfx::RectF PictureLayerTiling::Iterator::texture_rect() const {
334 gfx::PointF tex_origin = 308 gfx::PointF tex_origin =
335 tiling_->tiling_data_.TileBoundsWithBorder(tile_i_, tile_j_).origin(); 309 tiling_->tiling_data_.TileBoundsWithBorder(tile_i_, tile_j_).origin();
336 310
337 // Convert from dest space => content space => texture space. 311 // Convert from dest space => content space => texture space.
338 gfx::RectF texture_rect(current_geometry_rect_); 312 gfx::RectF texture_rect(current_geometry_rect_);
339 texture_rect.Scale(dest_to_content_scale_x_, 313 texture_rect.Scale(dest_to_content_scale_,
340 dest_to_content_scale_y_); 314 dest_to_content_scale_);
341 texture_rect.Offset(-tex_origin.OffsetFromOrigin()); 315 texture_rect.Offset(-tex_origin.OffsetFromOrigin());
342 texture_rect.Intersect(tiling_->ContentRect()); 316 texture_rect.Intersect(tiling_->ContentRect());
343 317
344 return texture_rect; 318 return texture_rect;
345 } 319 }
346 320
347 gfx::Size PictureLayerTiling::Iterator::texture_size() const { 321 gfx::Size PictureLayerTiling::Iterator::texture_size() const {
348 return tiling_->tiling_data_.max_texture_size(); 322 return tiling_->tiling_data_.max_texture_size();
349 } 323 }
350 324
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 (bottom_complete ? 1 : 0); 720 (bottom_complete ? 1 : 0);
747 if (num_edges_complete == 4) 721 if (num_edges_complete == 4)
748 return working_rect; 722 return working_rect;
749 } 723 }
750 724
751 NOTREACHED(); 725 NOTREACHED();
752 return starting_rect; 726 return starting_rect;
753 } 727 }
754 728
755 } // namespace cc 729 } // namespace cc
OLDNEW
« no previous file with comments | « cc/picture_layer_tiling.h ('k') | cc/picture_pile.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698