Index: ui/gfx/image/image_skia.h |
diff --git a/ui/gfx/image/image_skia.h b/ui/gfx/image/image_skia.h |
index 2518b2c447c9276917833f8b48c018cdd932d23b..9b79ab61d74ba7b1be977e700a07027074f43f67 100644 |
--- a/ui/gfx/image/image_skia.h |
+++ b/ui/gfx/image/image_skia.h |
@@ -8,6 +8,7 @@ |
#include <vector> |
#include "base/basictypes.h" |
+#include "base/gtest_prod_util.h" |
#include "base/memory/ref_counted.h" |
#include "ui/base/ui_export.h" |
#include "ui/gfx/image/image_skia_rep.h" |
@@ -20,6 +21,10 @@ namespace internal { |
class ImageSkiaStorage; |
} // namespace internal |
+namespace test { |
+class TestOnThread; |
+} |
+ |
// Container for the same image at different densities, similar to NSImage. |
// Image height and width are in DIP (Density Indepent Pixel) coordinates. |
// |
@@ -37,6 +42,7 @@ class UI_EXPORT ImageSkia { |
// Creates an instance that will use the |source| to get the image |
// for scale factors. |size| specifes the size of the image in DIP. |
+ // ImageSkia owns |source|. |
ImageSkia(ImageSkiaSource* source, const gfx::Size& size); |
// Adds ref to passed in bitmap. |
@@ -62,6 +68,15 @@ class UI_EXPORT ImageSkia { |
~ImageSkia(); |
+ // Returns a deep copy of this ImageSkia which has its own storage with |
+ // the ImageSkiaRep instances that this ImageSkia currently has. |
+ // This can be safely passed to and manipulated by another thread. |
+ // Note that this does NOT generate ImageSkiaReps from its source. |
+ // If you want to create a deep copy with ImageSkiaReps for supported |
+ // scale factors, you need to explicitly call |
+ // |EnsureRepsForSupportedScaleFactors()| first. |
+ ImageSkia DeepCopy() const; |
+ |
// Returns true if this object is backed by the same ImageSkiaStorage as |
// |other|. Will also return true if both images are isNull(). |
bool BackedBySameObjectAs(const gfx::ImageSkia& other) const; |
@@ -82,16 +97,23 @@ class UI_EXPORT ImageSkia { |
const gfx::ImageSkiaRep& GetRepresentation( |
ui::ScaleFactor scale_factor) const; |
-#if defined(OS_MACOSX) |
- // Returns the image reps contained by this object. |
- // If the image has a source, this method will attempt to generate |
- // representations from the source for all supported scale factors. |
- // Mac only for now. |
- std::vector<ImageSkiaRep> GetRepresentations() const; |
-#endif // OS_MACOSX |
+ // Make the ImageSkia instance read-only. Note that this only prevent |
+ // modification from client code, and the storage may still be |
+ // modified by the source if any (thus, it's not thread safe). This |
+ // detaches the storage from currently accessing thread, so its safe |
+ // to pass it to other thread as long as it is accessed only by that |
+ // thread. If this ImageSkia's storage will be accessed by multiple |
+ // threads, use |MakeThreadSafe()| method. |
+ void SetReadOnly(); |
+ |
+ // Make the image thread safe by making the storage read only and remove |
+ // its source if any. All ImageSkia that shares the same storage will also |
+ // become thread safe. Note that in order to make it 100% thread safe, |
+ // this must be called before it's been passed to anther thread. |
+ void MakeThreadSafe(); |
+ bool IsThreadSafe() const; |
// Returns true if this is a null object. |
- // TODO(pkotwicz): Merge this function into empty(). |
bool isNull() const { return storage_ == NULL; } |
// Width and height of image in DIP coordinate system. |
@@ -109,17 +131,33 @@ class UI_EXPORT ImageSkia { |
// Returns a vector with the image reps contained in this object. |
// There is no guarantee that this will return all images rep for |
// supported scale factors. |
- // TODO(oshima): Update all use of this API and make this to fail |
- // when source is used. |
std::vector<gfx::ImageSkiaRep> image_reps() const; |
+ // When the source is available, generates all ImageReps for |
+ // supported scale factors. This method is defined as const as |
+ // the state change in the storage is agnostic to the caller. |
+ void EnsureRepsForSupportedScaleFactors() const; |
+ |
private: |
+ friend class test::TestOnThread; |
+ FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, EmptyOnThreadTest); |
+ FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, StaticOnThreadTest); |
+ FRIEND_TEST_ALL_PREFIXES(ImageSkiaTest, SourceOnThreadTest); |
+ |
// Initialize ImageSkiaStorage with passed in parameters. |
// If the image rep's bitmap is empty, ImageStorage is set to NULL. |
void Init(const gfx::ImageSkiaRep& image_rep); |
SkBitmap& GetBitmap() const; |
+ // Checks if the current thread can read/modify the ImageSkia. |
+ bool CanRead() const; |
+ bool CanModify() const; |
+ |
+ // Detach the storage from the currently assinged thread |
+ // so that other thread can access the storage. |
+ void DetachStorageFromThread(); |
+ |
// A refptr so that ImageRepSkia can be copied cheaply. |
scoped_refptr<internal::ImageSkiaStorage> storage_; |
}; |