// 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. #ifndef CC_PLAYBACK_PICTURE_H_ #define CC_PLAYBACK_PICTURE_H_ #include "base/basictypes.h" #include "base/containers/hash_tables.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/trace_event/trace_event.h" #include "cc/base/cc_export.h" #include "cc/base/region.h" #include "cc/playback/pixel_ref_map.h" #include "cc/playback/recording_source.h" #include "skia/ext/refptr.h" #include "third_party/skia/include/core/SkPicture.h" #include "ui/gfx/geometry/rect.h" class SkPixelRef; namespace base { class Value; } namespace skia { class AnalysisCanvas; } namespace cc { class ContentLayerClient; class CC_EXPORT Picture : public base::RefCountedThreadSafe { public: static scoped_refptr Create( const gfx::Rect& layer_rect, ContentLayerClient* client, const gfx::Size& tile_grid_size, bool gather_pixels_refs, RecordingSource::RecordingMode recording_mode); static scoped_refptr CreateFromValue(const base::Value* value); static scoped_refptr CreateFromSkpValue(const base::Value* value); gfx::Rect LayerRect() const { return layer_rect_; } // Has Record() been called yet? bool HasRecording() const { return picture_.get() != NULL; } bool IsSuitableForGpuRasterization(const char** reason) const; int ApproximateOpCount() const; size_t ApproximateMemoryUsage() const; bool ShouldBeAnalyzedForSolidColor() const; bool HasText() const; // Apply this scale and raster the negated region into the canvas. // |negated_content_region| specifies the region to be clipped out of the // raster operation, i.e., the parts of the canvas which will not get drawn // to. int Raster(SkCanvas* canvas, SkPicture::AbortCallback* callback, const Region& negated_content_region, float contents_scale) const; // Draw the picture directly into the given canvas, without applying any // clip/scale/layer transformations. void Replay(SkCanvas* canvas, SkPicture::AbortCallback* callback = NULL); scoped_ptr AsValue() const; void EmitTraceSnapshot() const; void EmitTraceSnapshotAlias(Picture* original) const; bool WillPlayBackBitmaps() const { return picture_->willPlayBackBitmaps(); } PixelRefMap::Iterator GetPixelRefMapIterator( const gfx::Rect& layer_rect) const; private: Picture(const gfx::Rect& layer_rect, const gfx::Size& tile_grid_size); // This constructor assumes SkPicture is already ref'd and transfers // ownership to this picture. Picture(const skia::RefPtr&, const gfx::Rect& layer_rect, const PixelRefMap& pixel_refs); // This constructor will call AdoptRef on the SkPicture. Picture(SkPicture*, const gfx::Rect& layer_rect); ~Picture(); // Record a paint operation. To be able to safely use this SkPicture for // playback on a different thread this can only be called once. void Record(ContentLayerClient* client, RecordingSource::RecordingMode recording_mode); // Gather pixel refs from recording. void GatherPixelRefs(); gfx::Rect layer_rect_; skia::RefPtr picture_; PixelRefMap pixel_refs_; scoped_refptr AsTraceableRasterData(float scale) const; scoped_refptr AsTraceableRecordData() const; friend class base::RefCountedThreadSafe; friend class PixelRefMap::Iterator; DISALLOW_COPY_AND_ASSIGN(Picture); }; } // namespace cc #endif // CC_PLAYBACK_PICTURE_H_