Chromium Code Reviews| Index: cc/resources/picture.h |
| diff --git a/cc/resources/picture.h b/cc/resources/picture.h |
| index a56156b575373e34612d9baa74d08dbbf44a10b7..1aaa3836ce753bef1e5dd62c7c437f353896c272 100644 |
| --- a/cc/resources/picture.h |
| +++ b/cc/resources/picture.h |
| @@ -5,13 +5,17 @@ |
| #ifndef CC_RESOURCES_PICTURE_H_ |
| #define CC_RESOURCES_PICTURE_H_ |
| -#include <list> |
| #include <string> |
| +#include <utility> |
| #include <vector> |
| #include "base/basictypes.h" |
| +#include "base/hash_tables.h" |
| +#include "base/lazy_instance.h" |
| +#include "base/logging.h" |
| #include "base/memory/ref_counted.h" |
| #include "cc/base/cc_export.h" |
| +#include "cc/base/hash_pair.h" |
| #include "skia/ext/lazy_pixel_ref.h" |
| #include "skia/ext/refptr.h" |
| #include "third_party/skia/include/core/SkPixelRef.h" |
| @@ -30,6 +34,10 @@ struct RenderingStats; |
| class CC_EXPORT Picture |
| : public base::RefCountedThreadSafe<Picture> { |
| public: |
| + typedef std::pair<int, int> PixelRefMapKey; |
| + typedef std::vector<skia::LazyPixelRef*> PixelRefs; |
| + typedef base::hash_map<PixelRefMapKey, PixelRefs> PixelRefMap; |
| + |
| static scoped_refptr<Picture> Create(gfx::Rect layer_rect); |
| static scoped_refptr<Picture> CreateFromBase64String( |
| const std::string& encoded_string); |
| @@ -58,12 +66,41 @@ class CC_EXPORT Picture |
| float contents_scale, |
| bool enable_lcd_text); |
| - void GatherPixelRefs( |
| - gfx::Rect layer_rect, |
| - std::list<skia::LazyPixelRef*>& pixel_ref_list); |
| - |
| void AsBase64String(std::string* output) const; |
| + class CC_EXPORT PixelRefIterator { |
| + public: |
| + PixelRefIterator(); |
| + PixelRefIterator(gfx::Rect layer_rect, const Picture* picture); |
| + ~PixelRefIterator(); |
| + |
| + skia::LazyPixelRef* operator->() const { |
| + DCHECK(current_index_ < current_pixel_refs_->size()); |
|
reveman
2013/04/25 00:36:28
nit: use DCHECK_LT
|
| + return (*current_pixel_refs_)[current_index_]; |
|
reveman
2013/04/25 00:36:28
current_pixel_refs_->at(index) might be a bit clea
|
| + } |
| + |
| + skia::LazyPixelRef* operator*() const { |
| + DCHECK(current_index_ < current_pixel_refs_->size()); |
|
reveman
2013/04/25 00:36:28
nit: use DCHECK_LT
|
| + return (*current_pixel_refs_)[current_index_]; |
| + } |
| + |
| + PixelRefIterator& operator++(); |
| + operator bool() const { |
| + return current_index_ < current_pixel_refs_->size(); |
| + } |
| + |
| + private: |
| + static base::LazyInstance<PixelRefs> empty_pixel_refs_; |
| + const Picture* picture_; |
| + const PixelRefs* current_pixel_refs_; |
| + unsigned int current_index_; |
|
reveman
2013/04/25 00:36:28
nit: just "unsigned" is preferred
|
| + |
| + gfx::Point min_point_; |
| + gfx::Point max_point_; |
| + int current_x_; |
| + int current_y_; |
| + }; |
| + |
| private: |
| explicit Picture(gfx::Rect layer_rect); |
| Picture(const std::string& encoded_string, bool* success); |
| @@ -71,9 +108,13 @@ class CC_EXPORT Picture |
| // ownership to this picture. |
| Picture(const skia::RefPtr<SkPicture>&, |
| gfx::Rect layer_rect, |
| - gfx::Rect opaque_rect); |
| + gfx::Rect opaque_rect, |
| + const PixelRefMap& pixel_refs); |
| ~Picture(); |
| + void GatherPixelRefsFromSkia(gfx::Rect query_rect, PixelRefs* pixel_refs); |
| + void GatherAllPixelRefs(); |
| + |
| gfx::Rect layer_rect_; |
| gfx::Rect opaque_rect_; |
| skia::RefPtr<SkPicture> picture_; |
| @@ -81,7 +122,13 @@ class CC_EXPORT Picture |
| typedef std::vector<scoped_refptr<Picture> > PictureVector; |
| PictureVector clones_; |
| + PixelRefMap pixel_refs_; |
| + gfx::Point min_pixel_cell_; |
| + gfx::Point max_pixel_cell_; |
| + gfx::Size cell_size_; |
| + |
| friend class base::RefCountedThreadSafe<Picture>; |
| + friend class PixelRefIterator; |
| DISALLOW_COPY_AND_ASSIGN(Picture); |
| }; |