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

Unified Diff: cc/picture_pile_impl.cc

Issue 12316084: cc: Consolidate the analysis_canvas operations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win warning fix 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/picture_pile_impl.h ('k') | cc/switches.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/picture_pile_impl.cc
diff --git a/cc/picture_pile_impl.cc b/cc/picture_pile_impl.cc
index 544d2a182b7032c12c6fda6eddb879dc1e7a3c91..56d5045367081ec1640c17bee758081b3839e7bb 100644
--- a/cc/picture_pile_impl.cc
+++ b/cc/picture_pile_impl.cc
@@ -7,6 +7,7 @@
#include "cc/picture_pile_impl.h"
#include "cc/region.h"
#include "cc/rendering_stats.h"
+#include "skia/ext/analysis_canvas.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSize.h"
#include "ui/gfx/rect_conversions.h"
@@ -212,28 +213,66 @@ skia::RefPtr<SkPicture> PicturePileImpl::GetFlattenedPicture() {
return picture;
}
-bool PicturePileImpl::IsCheapInRect(
- gfx::Rect content_rect, float contents_scale) const {
+void PicturePileImpl::AnalyzeInRect(const gfx::Rect& content_rect,
+ float contents_scale,
+ PicturePileImpl::Analysis* analysis) {
+ DCHECK(analysis);
+
+ TRACE_EVENT0("cc", "PicturePileImpl::AnalyzeInRect");
+
gfx::Rect layer_rect = gfx::ToEnclosingRect(
gfx::ScaleRect(content_rect, 1.f / contents_scale));
+ SkBitmap emptyBitmap;
+ emptyBitmap.setConfig(SkBitmap::kNo_Config, content_rect.width(),
+ content_rect.height());
+ skia::AnalysisDevice device(emptyBitmap);
+ skia::AnalysisCanvas canvas(&device);
+
+ canvas.translate(-content_rect.x(), -content_rect.y());
+ canvas.clipRect(gfx::RectToSkRect(content_rect));
+
+ // The loop here is similar to the raster loop.
+ Region unclipped(content_rect);
for (TilingData::Iterator tile_iter(&tiling_, layer_rect);
tile_iter; ++tile_iter) {
- PictureListMap::const_iterator map_iter =
+ PictureListMap::iterator map_iter =
picture_list_map_.find(tile_iter.index());
if (map_iter == picture_list_map_.end())
continue;
+ PictureList& pic_list = map_iter->second;
+ if (pic_list.empty())
+ continue;
- const PictureList& pic_list = map_iter->second;
- for (PictureList::const_iterator i = pic_list.begin();
- i != pic_list.end(); ++i) {
- if (!(*i)->LayerRect().Intersects(layer_rect) || !(*i)->HasRecording())
+ for (PictureList::reverse_iterator i = pic_list.rbegin();
+ i != pic_list.rend(); ++i) {
+ gfx::Rect content_clip = gfx::ToEnclosedRect(
+ gfx::ScaleRect((*i)->LayerRect(), contents_scale));
+ DCHECK(!content_clip.IsEmpty());
+ if (!unclipped.Intersects(content_clip))
continue;
- if (!(*i)->IsCheapInRect(layer_rect))
- return false;
+
+ (*i)->AnalyzeInRect(&canvas,
+ content_rect,
+ contents_scale);
+
+ canvas.clipRect(
+ gfx::RectToSkRect(content_clip),
+ SkRegion::kDifference_Op);
+ unclipped.Subtract(content_clip);
+
}
}
- return true;
+
+ analysis->is_transparent = canvas.isTransparent();
+ analysis->is_solid_color = canvas.getColorIfSolid(&analysis->solid_color);
+ analysis->is_cheap_to_raster = canvas.isCheap();
+}
+
+PicturePileImpl::Analysis::Analysis() :
+ is_solid_color(false),
+ is_transparent(false),
+ is_cheap_to_raster(false) {
}
} // namespace cc
« no previous file with comments | « cc/picture_pile_impl.h ('k') | cc/switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698