| Index: cc/picture_pile_impl.cc
|
| diff --git a/cc/picture_pile_impl.cc b/cc/picture_pile_impl.cc
|
| deleted file mode 100644
|
| index 04703717ddeeed6eea8c098b33eb413a846b7f3b..0000000000000000000000000000000000000000
|
| --- a/cc/picture_pile_impl.cc
|
| +++ /dev/null
|
| @@ -1,251 +0,0 @@
|
| -// Copyright 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/debug/trace_event.h"
|
| -#include "cc/base/region.h"
|
| -#include "cc/debug/debug_colors.h"
|
| -#include "cc/debug/rendering_stats.h"
|
| -#include "cc/picture_pile_impl.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"
|
| -#include "ui/gfx/size_conversions.h"
|
| -#include "ui/gfx/skia_util.h"
|
| -
|
| -namespace cc {
|
| -
|
| -PicturePileImpl::ClonesForDrawing::ClonesForDrawing(
|
| - const PicturePileImpl* pile, int num_threads) {
|
| - for (int i = 0; i < num_threads; i++) {
|
| - scoped_refptr<PicturePileImpl> clone =
|
| - PicturePileImpl::CreateCloneForDrawing(pile, i);
|
| - clones_.push_back(clone);
|
| - }
|
| -}
|
| -
|
| -PicturePileImpl::ClonesForDrawing::~ClonesForDrawing() {
|
| -}
|
| -
|
| -scoped_refptr<PicturePileImpl> PicturePileImpl::Create() {
|
| - return make_scoped_refptr(new PicturePileImpl());
|
| -}
|
| -
|
| -scoped_refptr<PicturePileImpl> PicturePileImpl::CreateFromOther(
|
| - const PicturePileBase* other) {
|
| - return make_scoped_refptr(new PicturePileImpl(other));
|
| -}
|
| -
|
| -scoped_refptr<PicturePileImpl> PicturePileImpl::CreateCloneForDrawing(
|
| - const PicturePileImpl* other, unsigned thread_index) {
|
| - return make_scoped_refptr(new PicturePileImpl(other, thread_index));
|
| -}
|
| -
|
| -PicturePileImpl::PicturePileImpl()
|
| - : clones_for_drawing_(ClonesForDrawing(this, 0)) {
|
| -}
|
| -
|
| -PicturePileImpl::PicturePileImpl(const PicturePileBase* other)
|
| - : PicturePileBase(other),
|
| - clones_for_drawing_(ClonesForDrawing(this, num_raster_threads())) {
|
| -}
|
| -
|
| -PicturePileImpl::PicturePileImpl(
|
| - const PicturePileImpl* other, unsigned thread_index)
|
| - : PicturePileBase(other, thread_index),
|
| - clones_for_drawing_(ClonesForDrawing(this, 0)) {
|
| -}
|
| -
|
| -PicturePileImpl::~PicturePileImpl() {
|
| -}
|
| -
|
| -PicturePileImpl* PicturePileImpl::GetCloneForDrawingOnThread(
|
| - unsigned thread_index) const {
|
| - CHECK_GT(clones_for_drawing_.clones_.size(), thread_index);
|
| - return clones_for_drawing_.clones_[thread_index];
|
| -}
|
| -
|
| -void PicturePileImpl::Raster(
|
| - SkCanvas* canvas,
|
| - gfx::Rect canvas_rect,
|
| - float contents_scale,
|
| - int64* total_pixels_rasterized) {
|
| -
|
| - DCHECK(contents_scale >= min_contents_scale_);
|
| -
|
| -#ifndef NDEBUG
|
| - // Any non-painted areas will be left in this color.
|
| - canvas->clear(DebugColors::NonPaintedFillColor());
|
| -#endif // NDEBUG
|
| -
|
| - canvas->save();
|
| - canvas->translate(-canvas_rect.x(), -canvas_rect.y());
|
| -
|
| - gfx::SizeF total_content_size = gfx::ScaleSize(tiling_.total_size(),
|
| - contents_scale);
|
| - gfx::Rect total_content_rect(gfx::ToCeiledSize(total_content_size));
|
| - gfx::Rect content_rect = total_content_rect;
|
| - content_rect.Intersect(canvas_rect);
|
| -
|
| - // Clear one texel inside the right/bottom edge of the content rect,
|
| - // as it may only be partially covered by the picture playback.
|
| - // Also clear one texel outside the right/bottom edge of the content rect,
|
| - // as it may get blended in by linear filtering when zoomed in.
|
| - gfx::Rect deflated_content_rect = total_content_rect;
|
| - deflated_content_rect.Inset(0, 0, 1, 1);
|
| -
|
| - gfx::Rect canvas_outside_content_rect = canvas_rect;
|
| - canvas_outside_content_rect.Subtract(deflated_content_rect);
|
| -
|
| - if (!canvas_outside_content_rect.IsEmpty()) {
|
| - gfx::Rect inflated_content_rect = total_content_rect;
|
| - inflated_content_rect.Inset(0, 0, -1, -1);
|
| - canvas->clipRect(gfx::RectToSkRect(inflated_content_rect),
|
| - SkRegion::kReplace_Op);
|
| - canvas->clipRect(gfx::RectToSkRect(deflated_content_rect),
|
| - SkRegion::kDifference_Op);
|
| - canvas->drawColor(background_color_, SkXfermode::kSrc_Mode);
|
| - }
|
| -
|
| - // Rasterize the collection of relevant picture piles.
|
| - gfx::Rect layer_rect = gfx::ToEnclosingRect(
|
| - gfx::ScaleRect(content_rect, 1.f / contents_scale));
|
| -
|
| - canvas->clipRect(gfx::RectToSkRect(content_rect),
|
| - SkRegion::kReplace_Op);
|
| - Region unclipped(content_rect);
|
| - for (TilingData::Iterator tile_iter(&tiling_, layer_rect);
|
| - tile_iter; ++tile_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;
|
| -
|
| - // Raster through the picture list top down, using clips to make sure that
|
| - // pictures on top are not overdrawn by pictures on the bottom.
|
| - for (PictureList::reverse_iterator i = pic_list.rbegin();
|
| - i != pic_list.rend(); ++i) {
|
| - // This is intentionally *enclosed* rect, so that the clip is aligned on
|
| - // integral post-scale content pixels and does not extend past the edges
|
| - // of the picture's layer rect. The min_contents_scale enforces that
|
| - // enough buffer pixels have been added such that the enclosed rect
|
| - // encompasses all invalidated pixels at any larger scale level.
|
| - gfx::Rect content_clip = gfx::ToEnclosedRect(
|
| - gfx::ScaleRect((*i)->LayerRect(), contents_scale));
|
| - DCHECK(!content_clip.IsEmpty());
|
| - if (!unclipped.Intersects(content_clip))
|
| - continue;
|
| -
|
| - if (slow_down_raster_scale_factor_for_debug_) {
|
| - for (int j = 0; j < slow_down_raster_scale_factor_for_debug_; ++j)
|
| - (*i)->Raster(canvas, content_clip, contents_scale);
|
| - } else {
|
| - (*i)->Raster(canvas, content_clip, contents_scale);
|
| - }
|
| -
|
| - // Don't allow pictures underneath to draw where this picture did.
|
| - canvas->clipRect(
|
| - gfx::RectToSkRect(content_clip),
|
| - SkRegion::kDifference_Op);
|
| - unclipped.Subtract(content_clip);
|
| -
|
| - *total_pixels_rasterized +=
|
| - content_clip.width() * content_clip.height();
|
| - }
|
| - }
|
| -
|
| -#ifndef NDEBUG
|
| - // Fill the remaining clip with debug color. This allows us to
|
| - // distinguish between non painted areas and problems with missing
|
| - // pictures.
|
| - SkPaint paint;
|
| - paint.setColor(DebugColors::MissingPictureFillColor());
|
| - paint.setXfermodeMode(SkXfermode::kSrc_Mode);
|
| - canvas->drawPaint(paint);
|
| -#endif // NDEBUG
|
| -
|
| - // We should always paint some part of |content_rect|.
|
| - DCHECK(!unclipped.Contains(content_rect));
|
| -
|
| - canvas->restore();
|
| -}
|
| -
|
| -void PicturePileImpl::GatherPixelRefs(
|
| - gfx::Rect content_rect,
|
| - float contents_scale,
|
| - std::list<skia::LazyPixelRef*>& pixel_refs) {
|
| - std::list<skia::LazyPixelRef*> result;
|
| -
|
| - gfx::Rect layer_rect = gfx::ToEnclosingRect(
|
| - gfx::ScaleRect(content_rect, 1.f / contents_scale));
|
| -
|
| - for (TilingData::Iterator tile_iter(&tiling_, layer_rect);
|
| - tile_iter; ++tile_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;
|
| - for (PictureList::const_iterator i = pic_list.begin();
|
| - i != pic_list.end(); ++i) {
|
| - (*i)->GatherPixelRefs(layer_rect, result);
|
| - pixel_refs.splice(pixel_refs.end(), result);
|
| - }
|
| - }
|
| -}
|
| -
|
| -skia::RefPtr<SkPicture> PicturePileImpl::GetFlattenedPicture() {
|
| - TRACE_EVENT0("cc", "PicturePileImpl::GetFlattenedPicture");
|
| -
|
| - gfx::Rect layer_rect(tiling_.total_size());
|
| - skia::RefPtr<SkPicture> picture = skia::AdoptRef(new SkPicture);
|
| - if (layer_rect.IsEmpty())
|
| - return picture;
|
| -
|
| - SkCanvas* canvas = picture->beginRecording(
|
| - layer_rect.width(),
|
| - layer_rect.height(),
|
| - SkPicture::kUsePathBoundsForClip_RecordingFlag);
|
| -
|
| - int64 total_pixels_rasterized = 0;
|
| - Raster(canvas, layer_rect, 1.0, &total_pixels_rasterized);
|
| - picture->endRecording();
|
| -
|
| - return picture;
|
| -}
|
| -
|
| -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);
|
| -
|
| - int64 total_pixels_rasterized = 0;
|
| - Raster(&canvas, content_rect, contents_scale, &total_pixels_rasterized);
|
| -
|
| - 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
|
|
|