Index: Source/core/page/ImageBitmap.cpp |
diff --git a/Source/core/page/ImageBitmap.cpp b/Source/core/page/ImageBitmap.cpp |
index 2f83dd31d15ef34c1697d544f39b783227b699fb..ffe3af0dfa65d59ae71c04122efe6fad942d5949 100644 |
--- a/Source/core/page/ImageBitmap.cpp |
+++ b/Source/core/page/ImageBitmap.cpp |
@@ -38,8 +38,9 @@ ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect) |
{ |
m_imageElement->addClient(this); |
- IntSize bitmapSize = intersection(cropRect, IntRect(0, 0, image->width(), image->height())).size(); |
- m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), bitmapSize); |
+ IntRect srcRect = intersection(cropRect, IntRect(0, 0, image->width(), image->height())); |
+ m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); |
+ m_bitmapOffset = srcRect.location(); |
ScriptWrappable::init(this); |
} |
@@ -47,6 +48,7 @@ ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect) |
ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) |
: m_cropRect(cropRect) |
, m_imageElement(0) |
+ , m_bitmapOffset(IntPoint()) |
{ |
IntRect videoRect = IntRect(IntPoint(), video->player()->naturalSize()); |
IntRect srcRect = intersection(cropRect, videoRect); |
@@ -66,6 +68,7 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) |
ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect) |
: m_cropRect(cropRect) |
, m_imageElement(0) |
+ , m_bitmapOffset(IntPoint()) |
{ |
IntSize canvasSize = canvas->size(); |
IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), canvasSize)); |
@@ -82,6 +85,7 @@ ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect) |
ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect) |
: m_cropRect(cropRect) |
, m_imageElement(0) |
+ , m_bitmapOffset(IntPoint()) |
{ |
IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), data->size())); |
@@ -98,14 +102,16 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect) |
ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect) |
: m_cropRect(cropRect) |
, m_imageElement(bitmap->imageElement()) |
+ , m_bitmapOffset(IntPoint()) |
{ |
IntRect oldBitmapRect = bitmap->bitmapRect(); |
- IntSize bitmapSize = intersection(cropRect, oldBitmapRect).size(); |
- IntPoint bitmapOffset(max(0, oldBitmapRect.x() - cropRect.x()), max(0, oldBitmapRect.y() - cropRect.y())); |
- m_bitmapRect = IntRect(bitmapOffset, bitmapSize); |
+ IntRect srcRect = intersection(cropRect, oldBitmapRect); |
+ m_bitmapRect = IntRect(IntPoint(max(0, oldBitmapRect.x() - cropRect.x()), max(0, oldBitmapRect.y() - cropRect.y())), srcRect.size()); |
+ |
if (m_imageElement) { |
m_imageElement->addClient(this); |
m_bitmap = 0; |
+ m_bitmapOffset = srcRect.location(); |
} else { |
IntRect adjustedCropRect(IntPoint(cropRect.x() -oldBitmapRect.x(), cropRect.y() - oldBitmapRect.y()), cropRect.size()); |
m_bitmap = cropImage(bitmap->bitmapImage().get(), adjustedCropRect); |
@@ -157,6 +163,7 @@ PassRefPtr<ImageBitmap> ImageBitmap::create(ImageBitmap* bitmap, const IntRect& |
void ImageBitmap::notifyImageSourceChanged() |
{ |
m_bitmap = cropImage(m_imageElement->cachedImage()->image(), m_cropRect); |
+ m_bitmapOffset = IntPoint(); |
m_imageElement = 0; |
} |
@@ -164,7 +171,7 @@ PassRefPtr<Image> ImageBitmap::bitmapImage() const |
{ |
ASSERT((m_imageElement || m_bitmap) && (!m_imageElement || !m_bitmap)); |
if (m_imageElement) |
- return cropImage(m_imageElement->cachedImage()->image(), m_cropRect); |
+ return m_imageElement->cachedImage()->image(); |
return m_bitmap; |
} |