| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gfx/image/image_skia.h" | 5 #include "ui/gfx/image/image_skia.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/threading/simple_thread.h" | 8 #include "base/threading/simple_thread.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "third_party/skia/include/core/SkBitmap.h" | 10 #include "third_party/skia/include/core/SkBitmap.h" |
| 11 #include "ui/base/layout.h" | |
| 12 #include "ui/gfx/image/image_skia_rep.h" | 11 #include "ui/gfx/image/image_skia_rep.h" |
| 13 #include "ui/gfx/image/image_skia_source.h" | 12 #include "ui/gfx/image/image_skia_source.h" |
| 14 #include "ui/gfx/size.h" | 13 #include "ui/gfx/size.h" |
| 15 | 14 |
| 16 // Duplicated from base/threading/non_thread_safe.h so that we can be | 15 // Duplicated from base/threading/non_thread_safe.h so that we can be |
| 17 // good citizens there and undef the macro. | 16 // good citizens there and undef the macro. |
| 18 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 17 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
| 19 #define ENABLE_NON_THREAD_SAFE 1 | 18 #define ENABLE_NON_THREAD_SAFE 1 |
| 20 #else | 19 #else |
| 21 #define ENABLE_NON_THREAD_SAFE 0 | 20 #define ENABLE_NON_THREAD_SAFE 0 |
| 22 #endif | 21 #endif |
| 23 | 22 |
| 24 namespace gfx { | 23 namespace gfx { |
| 25 | 24 |
| 26 namespace { | 25 namespace { |
| 27 | 26 |
| 28 class FixedSource : public ImageSkiaSource { | 27 class FixedSource : public ImageSkiaSource { |
| 29 public: | 28 public: |
| 30 FixedSource(const ImageSkiaRep& image) : image_(image) {} | 29 FixedSource(const ImageSkiaRep& image) : image_(image) {} |
| 31 | 30 |
| 32 virtual ~FixedSource() { | 31 virtual ~FixedSource() { |
| 33 } | 32 } |
| 34 | 33 |
| 35 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { | 34 virtual ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
| 36 return image_; | 35 return image_; |
| 37 } | 36 } |
| 38 | 37 |
| 39 private: | 38 private: |
| 40 ImageSkiaRep image_; | 39 ImageSkiaRep image_; |
| 41 | 40 |
| 42 DISALLOW_COPY_AND_ASSIGN(FixedSource); | 41 DISALLOW_COPY_AND_ASSIGN(FixedSource); |
| 43 }; | 42 }; |
| 44 | 43 |
| 45 class DynamicSource : public ImageSkiaSource { | 44 class DynamicSource : public ImageSkiaSource { |
| 46 public: | 45 public: |
| 47 DynamicSource(const gfx::Size& size) : size_(size) {} | 46 DynamicSource(const gfx::Size& size) : size_(size) {} |
| 48 | 47 |
| 49 virtual ~DynamicSource() { | 48 virtual ~DynamicSource() { |
| 50 } | 49 } |
| 51 | 50 |
| 52 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { | 51 virtual ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
| 53 return gfx::ImageSkiaRep(size_, scale_factor); | 52 return gfx::ImageSkiaRep(size_, scale); |
| 54 } | 53 } |
| 55 | 54 |
| 56 private: | 55 private: |
| 57 gfx::Size size_; | 56 gfx::Size size_; |
| 58 | 57 |
| 59 DISALLOW_COPY_AND_ASSIGN(DynamicSource); | 58 DISALLOW_COPY_AND_ASSIGN(DynamicSource); |
| 60 }; | 59 }; |
| 61 | 60 |
| 62 class NullSource: public ImageSkiaSource { | 61 class NullSource: public ImageSkiaSource { |
| 63 public: | 62 public: |
| 64 NullSource() { | 63 NullSource() { |
| 65 } | 64 } |
| 66 | 65 |
| 67 virtual ~NullSource() { | 66 virtual ~NullSource() { |
| 68 } | 67 } |
| 69 | 68 |
| 70 virtual ImageSkiaRep GetImageForScale(ui::ScaleFactor scale_factor) OVERRIDE { | 69 virtual ImageSkiaRep GetImageForScale(float scale) OVERRIDE { |
| 71 return gfx::ImageSkiaRep(); | 70 return gfx::ImageSkiaRep(); |
| 72 } | 71 } |
| 73 | 72 |
| 74 private: | 73 private: |
| 75 DISALLOW_COPY_AND_ASSIGN(NullSource); | 74 DISALLOW_COPY_AND_ASSIGN(NullSource); |
| 76 }; | 75 }; |
| 77 | 76 |
| 78 } // namespace | 77 } // namespace |
| 79 | 78 |
| 80 namespace test { | 79 namespace test { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 108 | 107 |
| 109 bool can_read_; | 108 bool can_read_; |
| 110 bool can_modify_; | 109 bool can_modify_; |
| 111 | 110 |
| 112 DISALLOW_COPY_AND_ASSIGN(TestOnThread); | 111 DISALLOW_COPY_AND_ASSIGN(TestOnThread); |
| 113 }; | 112 }; |
| 114 | 113 |
| 115 } // namespace test | 114 } // namespace test |
| 116 | 115 |
| 117 TEST(ImageSkiaTest, FixedSource) { | 116 TEST(ImageSkiaTest, FixedSource) { |
| 118 ImageSkiaRep image(Size(100, 200), ui::SCALE_FACTOR_100P); | 117 ImageSkiaRep image(Size(100, 200), 1.0f); |
| 119 ImageSkia image_skia(new FixedSource(image), Size(100, 200)); | 118 ImageSkia image_skia(new FixedSource(image), Size(100, 200)); |
| 120 EXPECT_EQ(0U, image_skia.image_reps().size()); | 119 EXPECT_EQ(0U, image_skia.image_reps().size()); |
| 121 | 120 |
| 122 const ImageSkiaRep& result_100p = | 121 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); |
| 123 image_skia.GetRepresentation(ui::SCALE_FACTOR_100P); | |
| 124 EXPECT_EQ(100, result_100p.GetWidth()); | 122 EXPECT_EQ(100, result_100p.GetWidth()); |
| 125 EXPECT_EQ(200, result_100p.GetHeight()); | 123 EXPECT_EQ(200, result_100p.GetHeight()); |
| 126 EXPECT_EQ(ui::SCALE_FACTOR_100P, result_100p.scale_factor()); | 124 EXPECT_EQ(1.0f, result_100p.scale()); |
| 127 EXPECT_EQ(1U, image_skia.image_reps().size()); | 125 EXPECT_EQ(1U, image_skia.image_reps().size()); |
| 128 | 126 |
| 129 const ImageSkiaRep& result_200p = | 127 const ImageSkiaRep& result_200p = image_skia.GetRepresentation(2.0f); |
| 130 image_skia.GetRepresentation(ui::SCALE_FACTOR_200P); | |
| 131 | 128 |
| 132 EXPECT_EQ(100, result_200p.GetWidth()); | 129 EXPECT_EQ(100, result_200p.GetWidth()); |
| 133 EXPECT_EQ(200, result_200p.GetHeight()); | 130 EXPECT_EQ(200, result_200p.GetHeight()); |
| 134 EXPECT_EQ(100, result_200p.pixel_width()); | 131 EXPECT_EQ(100, result_200p.pixel_width()); |
| 135 EXPECT_EQ(200, result_200p.pixel_height()); | 132 EXPECT_EQ(200, result_200p.pixel_height()); |
| 136 EXPECT_EQ(ui::SCALE_FACTOR_100P, result_200p.scale_factor()); | 133 EXPECT_EQ(1.0f, result_200p.scale()); |
| 137 EXPECT_EQ(1U, image_skia.image_reps().size()); | 134 EXPECT_EQ(1U, image_skia.image_reps().size()); |
| 138 | 135 |
| 139 // Get the representation again and make sure it doesn't | 136 // Get the representation again and make sure it doesn't |
| 140 // generate new image skia rep. | 137 // generate new image skia rep. |
| 141 image_skia.GetRepresentation(ui::SCALE_FACTOR_100P); | 138 image_skia.GetRepresentation(1.0f); |
| 142 image_skia.GetRepresentation(ui::SCALE_FACTOR_200P); | 139 image_skia.GetRepresentation(2.0f); |
| 143 EXPECT_EQ(1U, image_skia.image_reps().size()); | 140 EXPECT_EQ(1U, image_skia.image_reps().size()); |
| 144 } | 141 } |
| 145 | 142 |
| 146 TEST(ImageSkiaTest, DynamicSource) { | 143 TEST(ImageSkiaTest, DynamicSource) { |
| 147 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); | 144 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); |
| 148 EXPECT_EQ(0U, image_skia.image_reps().size()); | 145 EXPECT_EQ(0U, image_skia.image_reps().size()); |
| 149 const ImageSkiaRep& result_100p = | 146 const ImageSkiaRep& result_100p = image_skia.GetRepresentation(1.0f); |
| 150 image_skia.GetRepresentation(ui::SCALE_FACTOR_100P); | |
| 151 EXPECT_EQ(100, result_100p.GetWidth()); | 147 EXPECT_EQ(100, result_100p.GetWidth()); |
| 152 EXPECT_EQ(200, result_100p.GetHeight()); | 148 EXPECT_EQ(200, result_100p.GetHeight()); |
| 153 EXPECT_EQ(ui::SCALE_FACTOR_100P, result_100p.scale_factor()); | 149 EXPECT_EQ(1.0f, result_100p.scale()); |
| 154 EXPECT_EQ(1U, image_skia.image_reps().size()); | 150 EXPECT_EQ(1U, image_skia.image_reps().size()); |
| 155 | 151 |
| 156 const ImageSkiaRep& result_200p = | 152 const ImageSkiaRep& result_200p = |
| 157 image_skia.GetRepresentation(ui::SCALE_FACTOR_200P); | 153 image_skia.GetRepresentation(2.0f); |
| 158 EXPECT_EQ(100, result_200p.GetWidth()); | 154 EXPECT_EQ(100, result_200p.GetWidth()); |
| 159 EXPECT_EQ(200, result_200p.GetHeight()); | 155 EXPECT_EQ(200, result_200p.GetHeight()); |
| 160 EXPECT_EQ(200, result_200p.pixel_width()); | 156 EXPECT_EQ(200, result_200p.pixel_width()); |
| 161 EXPECT_EQ(400, result_200p.pixel_height()); | 157 EXPECT_EQ(400, result_200p.pixel_height()); |
| 162 EXPECT_EQ(ui::SCALE_FACTOR_200P, result_200p.scale_factor()); | 158 EXPECT_EQ(2.0f, result_200p.scale()); |
| 163 EXPECT_EQ(2U, image_skia.image_reps().size()); | 159 EXPECT_EQ(2U, image_skia.image_reps().size()); |
| 164 | 160 |
| 165 // Get the representation again and make sure it doesn't | 161 // Get the representation again and make sure it doesn't |
| 166 // generate new image skia rep. | 162 // generate new image skia rep. |
| 167 image_skia.GetRepresentation(ui::SCALE_FACTOR_100P); | 163 image_skia.GetRepresentation(1.0f); |
| 168 EXPECT_EQ(2U, image_skia.image_reps().size()); | 164 EXPECT_EQ(2U, image_skia.image_reps().size()); |
| 169 image_skia.GetRepresentation(ui::SCALE_FACTOR_200P); | 165 image_skia.GetRepresentation(2.0f); |
| 170 EXPECT_EQ(2U, image_skia.image_reps().size()); | 166 EXPECT_EQ(2U, image_skia.image_reps().size()); |
| 171 } | 167 } |
| 172 | 168 |
| 173 // Tests that image_reps returns all of the representations in the | 169 // Tests that image_reps returns all of the representations in the |
| 174 // image when there are multiple representations for a scale factor. | 170 // image when there are multiple representations for a scale factor. |
| 175 // This currently is the case with ImageLoader::LoadImages. | 171 // This currently is the case with ImageLoader::LoadImages. |
| 176 TEST(ImageSkiaTest, ManyRepsPerScaleFactor) { | 172 TEST(ImageSkiaTest, ManyRepsPerScaleFactor) { |
| 177 const int kSmallIcon1x = 16; | 173 const int kSmallIcon1x = 16; |
| 178 const int kSmallIcon2x = 32; | 174 const int kSmallIcon2x = 32; |
| 179 const int kLargeIcon1x = 32; | 175 const int kLargeIcon1x = 32; |
| 180 | 176 |
| 181 ImageSkia image(new NullSource(), gfx::Size(kSmallIcon1x, kSmallIcon1x)); | 177 ImageSkia image(new NullSource(), gfx::Size(kSmallIcon1x, kSmallIcon1x)); |
| 182 // Simulate a source which loads images on a delay. Upon | 178 // Simulate a source which loads images on a delay. Upon |
| 183 // GetImageForScaleFactor, it immediately returns null and starts loading | 179 // GetImageForScaleFactor, it immediately returns null and starts loading |
| 184 // image reps slowly. | 180 // image reps slowly. |
| 185 image.GetRepresentation(ui::SCALE_FACTOR_100P); | 181 image.GetRepresentation(1.0f); |
| 186 image.GetRepresentation(ui::SCALE_FACTOR_200P); | 182 image.GetRepresentation(2.0f); |
| 187 | 183 |
| 188 // After a lengthy amount of simulated time, finally loaded image reps. | 184 // After a lengthy amount of simulated time, finally loaded image reps. |
| 189 image.AddRepresentation(ImageSkiaRep( | 185 image.AddRepresentation(ImageSkiaRep( |
| 190 gfx::Size(kSmallIcon1x, kSmallIcon1x), ui::SCALE_FACTOR_100P)); | 186 gfx::Size(kSmallIcon1x, kSmallIcon1x), 1.0f)); |
| 191 image.AddRepresentation(ImageSkiaRep( | 187 image.AddRepresentation(ImageSkiaRep( |
| 192 gfx::Size(kSmallIcon2x, kSmallIcon2x), ui::SCALE_FACTOR_200P)); | 188 gfx::Size(kSmallIcon2x, kSmallIcon2x), 2.0f)); |
| 193 image.AddRepresentation(ImageSkiaRep( | 189 image.AddRepresentation(ImageSkiaRep( |
| 194 gfx::Size(kLargeIcon1x, kLargeIcon1x), ui::SCALE_FACTOR_100P)); | 190 gfx::Size(kLargeIcon1x, kLargeIcon1x), 1.0f)); |
| 195 | 191 |
| 196 std::vector<ImageSkiaRep> image_reps = image.image_reps(); | 192 std::vector<ImageSkiaRep> image_reps = image.image_reps(); |
| 197 EXPECT_EQ(3u, image_reps.size()); | 193 EXPECT_EQ(3u, image_reps.size()); |
| 198 | 194 |
| 199 int num_1x = 0; | 195 int num_1x = 0; |
| 200 int num_2x = 0; | 196 int num_2x = 0; |
| 201 for (size_t i = 0; i < image_reps.size(); ++i) { | 197 for (size_t i = 0; i < image_reps.size(); ++i) { |
| 202 if (image_reps[i].scale_factor() == ui::SCALE_FACTOR_100P) | 198 if (image_reps[i].scale() == 1.0f) |
| 203 num_1x++; | 199 num_1x++; |
| 204 else if (image_reps[i].scale_factor() == ui::SCALE_FACTOR_200P) | 200 else if (image_reps[i].scale() == 2.0f) |
| 205 num_2x++; | 201 num_2x++; |
| 206 } | 202 } |
| 207 EXPECT_EQ(2, num_1x); | 203 EXPECT_EQ(2, num_1x); |
| 208 EXPECT_EQ(1, num_2x); | 204 EXPECT_EQ(1, num_2x); |
| 209 } | 205 } |
| 210 | 206 |
| 211 TEST(ImageSkiaTest, GetBitmap) { | 207 TEST(ImageSkiaTest, GetBitmap) { |
| 212 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); | 208 ImageSkia image_skia(new DynamicSource(Size(100, 200)), Size(100, 200)); |
| 213 const SkBitmap* bitmap = image_skia.bitmap(); | 209 const SkBitmap* bitmap = image_skia.bitmap(); |
| 214 EXPECT_NE(static_cast<SkBitmap*>(NULL), bitmap); | 210 EXPECT_NE(static_cast<SkBitmap*>(NULL), bitmap); |
| 215 EXPECT_FALSE(bitmap->isNull()); | 211 EXPECT_FALSE(bitmap->isNull()); |
| 216 } | 212 } |
| 217 | 213 |
| 218 TEST(ImageSkiaTest, GetBitmapFromEmpty) { | 214 TEST(ImageSkiaTest, GetBitmapFromEmpty) { |
| 219 // Create an image with 1 representation and remove it so the ImageSkiaStorage | 215 // Create an image with 1 representation and remove it so the ImageSkiaStorage |
| 220 // is left with no representations. | 216 // is left with no representations. |
| 221 ImageSkia empty_image(ImageSkiaRep(Size(100, 200), ui::SCALE_FACTOR_100P)); | 217 ImageSkia empty_image(ImageSkiaRep(Size(100, 200), 1.0f)); |
| 222 ImageSkia empty_image_copy(empty_image); | 218 ImageSkia empty_image_copy(empty_image); |
| 223 empty_image.RemoveRepresentation(ui::SCALE_FACTOR_100P); | 219 empty_image.RemoveRepresentation(1.0f); |
| 224 | 220 |
| 225 // Check that ImageSkia::bitmap() still returns a valid SkBitmap pointer for | 221 // Check that ImageSkia::bitmap() still returns a valid SkBitmap pointer for |
| 226 // the image and all its copies. | 222 // the image and all its copies. |
| 227 const SkBitmap* bitmap = empty_image_copy.bitmap(); | 223 const SkBitmap* bitmap = empty_image_copy.bitmap(); |
| 228 ASSERT_NE(static_cast<SkBitmap*>(NULL), bitmap); | 224 ASSERT_NE(static_cast<SkBitmap*>(NULL), bitmap); |
| 229 EXPECT_TRUE(bitmap->isNull()); | 225 EXPECT_TRUE(bitmap->isNull()); |
| 230 EXPECT_TRUE(bitmap->empty()); | 226 EXPECT_TRUE(bitmap->empty()); |
| 231 } | 227 } |
| 232 | 228 |
| 233 TEST(ImageSkiaTest, BackedBySameObjectAs) { | 229 TEST(ImageSkiaTest, BackedBySameObjectAs) { |
| 234 // Null images should all be backed by the same object (NULL). | 230 // Null images should all be backed by the same object (NULL). |
| 235 ImageSkia image; | 231 ImageSkia image; |
| 236 ImageSkia unrelated; | 232 ImageSkia unrelated; |
| 237 EXPECT_TRUE(image.BackedBySameObjectAs(unrelated)); | 233 EXPECT_TRUE(image.BackedBySameObjectAs(unrelated)); |
| 238 | 234 |
| 239 image.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 235 image.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
| 240 ui::SCALE_FACTOR_100P)); | 236 1.0f)); |
| 241 ImageSkia copy = image; | 237 ImageSkia copy = image; |
| 242 copy.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 238 copy.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
| 243 ui::SCALE_FACTOR_200P)); | 239 2.0f)); |
| 244 unrelated.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), | 240 unrelated.AddRepresentation(gfx::ImageSkiaRep(gfx::Size(10, 10), |
| 245 ui::SCALE_FACTOR_100P)); | 241 1.0f)); |
| 246 EXPECT_TRUE(image.BackedBySameObjectAs(copy)); | 242 EXPECT_TRUE(image.BackedBySameObjectAs(copy)); |
| 247 EXPECT_FALSE(image.BackedBySameObjectAs(unrelated)); | 243 EXPECT_FALSE(image.BackedBySameObjectAs(unrelated)); |
| 248 EXPECT_FALSE(copy.BackedBySameObjectAs(unrelated)); | 244 EXPECT_FALSE(copy.BackedBySameObjectAs(unrelated)); |
| 249 } | 245 } |
| 250 | 246 |
| 251 #if ENABLE_NON_THREAD_SAFE | 247 #if ENABLE_NON_THREAD_SAFE |
| 252 TEST(ImageSkiaTest, EmptyOnThreadTest) { | 248 TEST(ImageSkiaTest, EmptyOnThreadTest) { |
| 253 ImageSkia empty; | 249 ImageSkia empty; |
| 254 test::TestOnThread empty_on_thread(&empty); | 250 test::TestOnThread empty_on_thread(&empty); |
| 255 empty_on_thread.Start(); | 251 empty_on_thread.Start(); |
| 256 empty_on_thread.Join(); | 252 empty_on_thread.Join(); |
| 257 EXPECT_TRUE(empty_on_thread.can_read()); | 253 EXPECT_TRUE(empty_on_thread.can_read()); |
| 258 EXPECT_TRUE(empty_on_thread.can_modify()); | 254 EXPECT_TRUE(empty_on_thread.can_modify()); |
| 259 } | 255 } |
| 260 | 256 |
| 261 TEST(ImageSkiaTest, StaticOnThreadTest) { | 257 TEST(ImageSkiaTest, StaticOnThreadTest) { |
| 262 ImageSkia image(ImageSkiaRep(Size(100, 200), ui::SCALE_FACTOR_100P)); | 258 ImageSkia image(ImageSkiaRep(Size(100, 200), 1.0f)); |
| 263 EXPECT_FALSE(image.IsThreadSafe()); | 259 EXPECT_FALSE(image.IsThreadSafe()); |
| 264 | 260 |
| 265 test::TestOnThread image_on_thread(&image); | 261 test::TestOnThread image_on_thread(&image); |
| 266 // an image that was never accessed on this thread can be | 262 // an image that was never accessed on this thread can be |
| 267 // read by other thread. | 263 // read by other thread. |
| 268 image_on_thread.StartAndJoin(); | 264 image_on_thread.StartAndJoin(); |
| 269 EXPECT_TRUE(image_on_thread.can_read()); | 265 EXPECT_TRUE(image_on_thread.can_read()); |
| 270 EXPECT_TRUE(image_on_thread.can_modify()); | 266 EXPECT_TRUE(image_on_thread.can_modify()); |
| 271 EXPECT_FALSE(image.CanRead()); | 267 EXPECT_FALSE(image.CanRead()); |
| 272 EXPECT_FALSE(image.CanModify()); | 268 EXPECT_FALSE(image.CanModify()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 readonly_on_thread.StartAndJoin(); | 354 readonly_on_thread.StartAndJoin(); |
| 359 EXPECT_TRUE(readonly_on_thread.can_read()); | 355 EXPECT_TRUE(readonly_on_thread.can_read()); |
| 360 EXPECT_FALSE(readonly_on_thread.can_modify()); | 356 EXPECT_FALSE(readonly_on_thread.can_modify()); |
| 361 EXPECT_FALSE(image.CanRead()); | 357 EXPECT_FALSE(image.CanRead()); |
| 362 EXPECT_FALSE(image.CanModify()); | 358 EXPECT_FALSE(image.CanModify()); |
| 363 | 359 |
| 364 image.DetachStorageFromThread(); | 360 image.DetachStorageFromThread(); |
| 365 image.MakeThreadSafe(); | 361 image.MakeThreadSafe(); |
| 366 EXPECT_TRUE(image.IsThreadSafe()); | 362 EXPECT_TRUE(image.IsThreadSafe()); |
| 367 // Check if image reps are generated for supported scale factors. | 363 // Check if image reps are generated for supported scale factors. |
| 368 EXPECT_EQ(ui::GetSupportedScaleFactors().size(), | 364 EXPECT_EQ(ImageSkia::GetSupportedScales().size(), |
| 369 image.image_reps().size()); | 365 image.image_reps().size()); |
| 370 test::TestOnThread threadsafe_on_thread(&image); | 366 test::TestOnThread threadsafe_on_thread(&image); |
| 371 threadsafe_on_thread.StartAndJoin(); | 367 threadsafe_on_thread.StartAndJoin(); |
| 372 EXPECT_TRUE(threadsafe_on_thread.can_read()); | 368 EXPECT_TRUE(threadsafe_on_thread.can_read()); |
| 373 EXPECT_FALSE(threadsafe_on_thread.can_modify()); | 369 EXPECT_FALSE(threadsafe_on_thread.can_modify()); |
| 374 EXPECT_TRUE(image.CanRead()); | 370 EXPECT_TRUE(image.CanRead()); |
| 375 EXPECT_FALSE(image.CanModify()); | 371 EXPECT_FALSE(image.CanModify()); |
| 376 } | 372 } |
| 377 #endif // ENABLE_NON_THREAD_SAFE | 373 #endif // ENABLE_NON_THREAD_SAFE |
| 378 | 374 |
| 379 // Just in case we ever get lumped together with other compilation units. | 375 // Just in case we ever get lumped together with other compilation units. |
| 380 #undef ENABLE_NON_THREAD_SAFE | 376 #undef ENABLE_NON_THREAD_SAFE |
| 381 | 377 |
| 382 } // namespace gfx | 378 } // namespace gfx |
| OLD | NEW |