OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013, Google Inc. All rights reserved. | 2 * Copyright (c) 2013, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 22 matching lines...) Expand all Loading... |
33 | 33 |
34 #include "SkPixelRef.h" | 34 #include "SkPixelRef.h" |
35 #include "core/dom/Document.h" | 35 #include "core/dom/Document.h" |
36 #include "core/fetch/ImageResource.h" | 36 #include "core/fetch/ImageResource.h" |
37 #include "core/fetch/MemoryCache.h" | 37 #include "core/fetch/MemoryCache.h" |
38 #include "core/fetch/MockImageResourceClient.h" | 38 #include "core/fetch/MockImageResourceClient.h" |
39 #include "core/fetch/ResourcePtr.h" | 39 #include "core/fetch/ResourcePtr.h" |
40 #include "core/html/HTMLCanvasElement.h" | 40 #include "core/html/HTMLCanvasElement.h" |
41 #include "core/html/HTMLImageElement.h" | 41 #include "core/html/HTMLImageElement.h" |
42 #include "core/html/canvas/CanvasRenderingContext2D.h" | 42 #include "core/html/canvas/CanvasRenderingContext2D.h" |
| 43 #include "heap/Handle.h" |
43 #include "platform/graphics/BitmapImage.h" | 44 #include "platform/graphics/BitmapImage.h" |
44 #include "platform/graphics/skia/NativeImageSkia.h" | 45 #include "platform/graphics/skia/NativeImageSkia.h" |
45 #include "platform/network/ResourceRequest.h" | 46 #include "platform/network/ResourceRequest.h" |
46 #include "wtf/OwnPtr.h" | 47 #include "wtf/OwnPtr.h" |
47 | 48 |
48 #include <gtest/gtest.h> | 49 #include <gtest/gtest.h> |
49 | 50 |
50 namespace WebCore { | 51 namespace WebCore { |
51 | 52 |
52 class ImageBitmapTest : public ::testing::Test { | 53 class ImageBitmapTest : public ::testing::Test { |
53 protected: | 54 protected: |
54 virtual void SetUp() | 55 virtual void SetUp() |
55 { | 56 { |
56 m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); | 57 m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); |
57 m_bitmap.allocPixels(); | 58 m_bitmap.allocPixels(); |
58 m_bitmap.eraseColor(0xFFFFFFFF); | 59 m_bitmap.eraseColor(0xFFFFFFFF); |
59 | 60 |
60 m_bitmap2.setConfig(SkBitmap::kARGB_8888_Config, 5, 5); | 61 m_bitmap2.setConfig(SkBitmap::kARGB_8888_Config, 5, 5); |
61 m_bitmap2.allocPixels(); | 62 m_bitmap2.allocPixels(); |
62 m_bitmap2.eraseColor(0xAAAAAAAA); | 63 m_bitmap2.eraseColor(0xAAAAAAAA); |
63 | 64 |
64 // Save the global memory cache to restore it upon teardown. | 65 // Save the global memory cache to restore it upon teardown. |
65 m_globalMemoryCache = adoptPtr(memoryCache()); | 66 m_globalMemoryCache = adoptPtr(memoryCache()); |
66 // Create the test memory cache instance and hook it in. | 67 // Create the test memory cache instance and hook it in. |
67 m_testingMemoryCache = adoptPtr(new MemoryCache()); | 68 m_testingMemoryCache = adoptPtr(new MemoryCache()); |
68 setMemoryCacheForTesting(m_testingMemoryCache.leakPtr()); | 69 setMemoryCacheForTesting(m_testingMemoryCache.leakPtr()); |
69 } | 70 } |
70 virtual void TearDown() | 71 virtual void TearDown() |
71 { | 72 { |
| 73 // Garbage collection is required prior to switching out the |
| 74 // test's memory cache; image resources are released, evicting |
| 75 // them from the cache. |
| 76 Heap::collectGarbage(ThreadState::NoHeapPointersOnStack, Heap::ForcedFor
Testing); |
| 77 |
72 // Regain the ownership of testing memory cache, so that it will be | 78 // Regain the ownership of testing memory cache, so that it will be |
73 // destroyed. | 79 // destroyed. |
74 m_testingMemoryCache = adoptPtr(memoryCache()); | 80 m_testingMemoryCache = adoptPtr(memoryCache()); |
75 // Yield the ownership of the global memory cache back. | 81 // Yield the ownership of the global memory cache back. |
76 setMemoryCacheForTesting(m_globalMemoryCache.leakPtr()); | 82 setMemoryCacheForTesting(m_globalMemoryCache.leakPtr()); |
77 } | 83 } |
78 | 84 |
79 SkBitmap m_bitmap, m_bitmap2; | 85 SkBitmap m_bitmap, m_bitmap2; |
80 OwnPtr<MemoryCache> m_testingMemoryCache; | 86 OwnPtr<MemoryCache> m_testingMemoryCache; |
81 OwnPtr<MemoryCache> m_globalMemoryCache; | 87 OwnPtr<MemoryCache> m_globalMemoryCache; |
82 }; | 88 }; |
83 | 89 |
84 // Verifies that the image resource held by an ImageBitmap is the same as the | 90 // Verifies that the image resource held by an ImageBitmap is the same as the |
85 // one held by the HTMLImageElement. | 91 // one held by the HTMLImageElement. |
86 TEST_F(ImageBitmapTest, ImageResourceConsistency) | 92 TEST_F(ImageBitmapTest, ImageResourceConsistency) |
87 { | 93 { |
88 RefPtr<HTMLImageElement> imageElement = HTMLImageElement::create(*Document::
create().get()); | 94 RefPtr<HTMLImageElement> imageElement = HTMLImageElement::create(*Document::
create().get()); |
89 imageElement->setImageResource(new ImageResource(BitmapImage::create(NativeI
mageSkia::create(m_bitmap)).get())); | 95 imageElement->setImageResource(new ImageResource(BitmapImage::create(NativeI
mageSkia::create(m_bitmap)).get())); |
90 | 96 |
91 RefPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imageElement.get
(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); | 97 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imag
eElement.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); |
92 RefPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::create(imageEleme
nt.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.width()
/ 2, m_bitmap.height() / 2)); | 98 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bit
map.width() / 2, m_bitmap.height() / 2)); |
93 RefPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::create(imageEleme
nt.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitmap.width(
), m_bitmap.height())); | 99 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::creat
e(imageElement.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_b
itmap.width(), m_bitmap.height())); |
94 RefPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create(imageElemen
t.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width(), m_bitm
ap.height())); | 100 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create
(imageElement.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.wid
th(), m_bitmap.height())); |
95 | 101 |
96 ASSERT_EQ(imageBitmapNoCrop->bitmapImage().get(), imageElement->cachedImage(
)->image()); | 102 ASSERT_EQ(imageBitmapNoCrop->bitmapImage().get(), imageElement->cachedImage(
)->image()); |
97 ASSERT_EQ(imageBitmapInteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); | 103 ASSERT_EQ(imageBitmapInteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); |
98 ASSERT_EQ(imageBitmapExteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); | 104 ASSERT_EQ(imageBitmapExteriorCrop->bitmapImage().get(), imageElement->cached
Image()->image()); |
99 | 105 |
100 RefPtr<Image> emptyImage = imageBitmapOutsideCrop->bitmapImage(); | 106 RefPtr<Image> emptyImage = imageBitmapOutsideCrop->bitmapImage(); |
101 ASSERT_NE(emptyImage.get(), imageElement->cachedImage()->image()); | 107 ASSERT_NE(emptyImage.get(), imageElement->cachedImage()->image()); |
102 } | 108 } |
103 | 109 |
104 // Verifies that HTMLImageElements are given an elevated CacheLiveResourcePriori
ty when used to construct an ImageBitmap. | 110 // Verifies that HTMLImageElements are given an elevated CacheLiveResourcePriori
ty when used to construct an ImageBitmap. |
(...skipping 30 matching lines...) Expand all Loading... |
135 memoryCache()->insertInLiveDecodedResourcesList(cachedImageInteriorCrop.get(
)); | 141 memoryCache()->insertInLiveDecodedResourcesList(cachedImageInteriorCrop.get(
)); |
136 memoryCache()->insertInLiveDecodedResourcesList(cachedImageExteriorCrop.get(
)); | 142 memoryCache()->insertInLiveDecodedResourcesList(cachedImageExteriorCrop.get(
)); |
137 memoryCache()->insertInLiveDecodedResourcesList(cachedImageOutsideCrop.get()
); | 143 memoryCache()->insertInLiveDecodedResourcesList(cachedImageOutsideCrop.get()
); |
138 | 144 |
139 // HTMLImageElements should default to CacheLiveResourcePriorityLow. | 145 // HTMLImageElements should default to CacheLiveResourcePriorityLow. |
140 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resource:
:CacheLiveResourcePriorityLow); | 146 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resource:
:CacheLiveResourcePriorityLow); |
141 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); | 147 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); |
142 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); | 148 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); |
143 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(), Reso
urce::CacheLiveResourcePriorityLow); | 149 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(), Reso
urce::CacheLiveResourcePriorityLow); |
144 | 150 |
145 RefPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::create(imageInter
iorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitmap.wid
th(), m_bitmap.height())); | 151 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapInteriorCrop = ImageBitmap::creat
e(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2,
m_bitmap.width(), m_bitmap.height())); |
146 { | 152 { |
147 RefPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imageNoCrop.
get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); | 153 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(
imageNoCrop.get(), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); |
148 RefPtr<ImageBitmap> imageBitmapInteriorCrop2 = ImageBitmap::create(image
InteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height() / 2, m_bitma
p.width(), m_bitmap.height())); | 154 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapInteriorCrop2 = ImageBitmap::
create(imageInteriorCrop.get(), IntRect(m_bitmap.width() / 2, m_bitmap.height()
/ 2, m_bitmap.width(), m_bitmap.height())); |
149 RefPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::create(imageE
xteriorCrop.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height() / 2, m_bitm
ap.width(), m_bitmap.height())); | 155 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapExteriorCrop = ImageBitmap::c
reate(imageExteriorCrop.get(), IntRect(-m_bitmap.width() / 2, -m_bitmap.height()
/ 2, m_bitmap.width(), m_bitmap.height())); |
150 RefPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::create(imageOu
tsideCrop.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bitmap.width()
, m_bitmap.height())); | 156 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapOutsideCrop = ImageBitmap::cr
eate(imageOutsideCrop.get(), IntRect(-m_bitmap.width(), -m_bitmap.height(), m_bi
tmap.width(), m_bitmap.height())); |
151 | 157 |
152 // Images that are referenced by ImageBitmaps have CacheLiveResourcePrio
rityHigh. | 158 // Images that are referenced by ImageBitmaps have CacheLiveResourcePrio
rityHigh. |
153 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resou
rce::CacheLiveResourcePriorityHigh); | 159 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resou
rce::CacheLiveResourcePriorityHigh); |
154 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityHigh); | 160 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityHigh); |
155 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityHigh); | 161 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityHigh); |
156 | 162 |
157 // ImageBitmaps that do not contain any of the source image do not eleva
te CacheLiveResourcePriority. | 163 // ImageBitmaps that do not contain any of the source image do not eleva
te CacheLiveResourcePriority. |
158 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityLow); | 164 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(),
Resource::CacheLiveResourcePriorityLow); |
| 165 |
| 166 // Stub out references to the ImageBitmaps created and force a |
| 167 // garbage collection to have the ImageBitmaps be collected and |
| 168 // destructed. |
| 169 imageBitmapNoCrop = nullptr; |
| 170 imageBitmapInteriorCrop2 = nullptr; |
| 171 imageBitmapExteriorCrop = nullptr; |
| 172 imageBitmapOutsideCrop = nullptr; |
| 173 Heap::collectGarbage(ThreadState::HeapPointersOnStack, Heap::ForcedForTe
sting); |
159 } | 174 } |
160 | 175 |
161 // CacheLiveResourcePriroity should return to CacheLiveResourcePriorityLow w
hen no ImageBitmaps reference the image. | 176 // CacheLiveResourcePriroity should return to CacheLiveResourcePriorityLow w
hen no ImageBitmaps reference the image. |
162 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resource:
:CacheLiveResourcePriorityLow); | 177 ASSERT_EQ(imageNoCrop->cachedImage()->cacheLiveResourcePriority(), Resource:
:CacheLiveResourcePriorityLow); |
163 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); | 178 ASSERT_EQ(imageExteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityLow); |
164 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(), Reso
urce::CacheLiveResourcePriorityLow); | 179 ASSERT_EQ(imageOutsideCrop->cachedImage()->cacheLiveResourcePriority(), Reso
urce::CacheLiveResourcePriorityLow); |
165 | 180 |
166 // There is still an ImageBitmap that references this image. | 181 // There is still an ImageBitmap that references this image. |
167 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityHigh); | 182 ASSERT_EQ(imageInteriorCrop->cachedImage()->cacheLiveResourcePriority(), Res
ource::CacheLiveResourcePriorityHigh); |
| 183 imageBitmapInteriorCrop = nullptr; |
168 } | 184 } |
169 | 185 |
170 // Verifies that ImageBitmaps constructed from HTMLImageElements hold a referenc
e to the original Image if the HTMLImageElement src is changed. | 186 // Verifies that ImageBitmaps constructed from HTMLImageElements hold a referenc
e to the original Image if the HTMLImageElement src is changed. |
171 TEST_F(ImageBitmapTest, ImageBitmapSourceChanged) | 187 TEST_F(ImageBitmapTest, ImageBitmapSourceChanged) |
172 { | 188 { |
173 RefPtr<HTMLImageElement> image = HTMLImageElement::create(*Document::create(
).get()); | 189 RefPtr<HTMLImageElement> image = HTMLImageElement::create(*Document::create(
).get()); |
174 ResourcePtr<ImageResource> originalImageResource = new ImageResource(BitmapI
mage::create(NativeImageSkia::create(m_bitmap)).get()); | 190 ResourcePtr<ImageResource> originalImageResource = new ImageResource(BitmapI
mage::create(NativeImageSkia::create(m_bitmap)).get()); |
175 image->setImageResource(originalImageResource.get()); | 191 image->setImageResource(originalImageResource.get()); |
176 | 192 |
177 RefPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(), IntRect(0
, 0, m_bitmap.width(), m_bitmap.height())); | 193 RefPtrWillBeRawPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(
), IntRect(0, 0, m_bitmap.width(), m_bitmap.height())); |
178 ASSERT_EQ(imageBitmap->bitmapImage().get(), originalImageResource->image()); | 194 ASSERT_EQ(imageBitmap->bitmapImage().get(), originalImageResource->image()); |
179 | 195 |
180 ResourcePtr<ImageResource> newImageResource = new ImageResource(BitmapImage:
:create(NativeImageSkia::create(m_bitmap2)).get()); | 196 ResourcePtr<ImageResource> newImageResource = new ImageResource(BitmapImage:
:create(NativeImageSkia::create(m_bitmap2)).get()); |
181 image->setImageResource(newImageResource.get()); | 197 image->setImageResource(newImageResource.get()); |
182 | 198 |
183 // The ImageBitmap should contain the same data as the original cached image
but should no longer hold a reference. | 199 // The ImageBitmap should contain the same data as the original cached image
but should no longer hold a reference. |
184 ASSERT_NE(imageBitmap->bitmapImage().get(), originalImageResource->image()); | 200 ASSERT_NE(imageBitmap->bitmapImage().get(), originalImageResource->image()); |
185 ASSERT_EQ(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), | 201 ASSERT_EQ(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), |
186 originalImageResource->image()->nativeImageForCurrentFrame()->bitmap().p
ixelRef()->pixels()); | 202 originalImageResource->image()->nativeImageForCurrentFrame()->bitmap().p
ixelRef()->pixels()); |
187 | 203 |
188 ASSERT_NE(imageBitmap->bitmapImage().get(), newImageResource->image()); | 204 ASSERT_NE(imageBitmap->bitmapImage().get(), newImageResource->image()); |
189 ASSERT_NE(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), | 205 ASSERT_NE(imageBitmap->bitmapImage()->nativeImageForCurrentFrame()->bitmap()
.pixelRef()->pixels(), |
190 newImageResource->image()->nativeImageForCurrentFrame()->bitmap().pixelR
ef()->pixels()); | 206 newImageResource->image()->nativeImageForCurrentFrame()->bitmap().pixelR
ef()->pixels()); |
191 } | 207 } |
192 | 208 |
193 // Verifies that ImageBitmaps constructed from ImageBitmaps hold onto their own
Image. | 209 // Verifies that ImageBitmaps constructed from ImageBitmaps hold onto their own
Image. |
194 TEST_F(ImageBitmapTest, ImageResourceLifetime) | 210 TEST_F(ImageBitmapTest, ImageResourceLifetime) |
195 { | 211 { |
196 RefPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::create(*Documen
t::create().get()); | 212 RefPtr<HTMLCanvasElement> canvasElement = HTMLCanvasElement::create(*Documen
t::create().get()); |
197 canvasElement->setHeight(40); | 213 canvasElement->setHeight(40); |
198 canvasElement->setWidth(40); | 214 canvasElement->setWidth(40); |
199 RefPtr<ImageBitmap> imageBitmapDerived; | 215 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapDerived; |
200 { | 216 { |
201 RefPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::create(canvasEl
ement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->height())); | 217 RefPtrWillBeRawPtr<ImageBitmap> imageBitmapFromCanvas = ImageBitmap::cre
ate(canvasElement.get(), IntRect(0, 0, canvasElement->width(), canvasElement->he
ight())); |
202 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(0, 0, 20, 20)); | 218 imageBitmapDerived = ImageBitmap::create(imageBitmapFromCanvas.get(), In
tRect(0, 0, 20, 20)); |
203 } | 219 } |
204 CanvasRenderingContext* context = canvasElement->getContext("2d"); | 220 CanvasRenderingContext* context = canvasElement->getContext("2d"); |
205 TrackExceptionState exceptionState; | 221 TrackExceptionState exceptionState; |
206 toCanvasRenderingContext2D(context)->drawImage(imageBitmapDerived.get(), 0,
0, exceptionState); | 222 toCanvasRenderingContext2D(context)->drawImage(imageBitmapDerived.get(), 0,
0, exceptionState); |
207 } | 223 } |
208 | 224 |
209 } // namespace | 225 } // namespace |
OLD | NEW |