diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp | 105 |
1 files changed, 70 insertions, 35 deletions
diff --git a/chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp index ec54c645533..bbd9e0fd5d8 100644 --- a/chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp +++ b/chromium/third_party/WebKit/Source/core/frame/ImageBitmap.cpp @@ -14,23 +14,21 @@ #include "platform/graphics/ImageBuffer.h" #include "wtf/RefPtr.h" -using namespace std; - namespace WebCore { static inline IntRect normalizeRect(const IntRect& rect) { - return IntRect(min(rect.x(), rect.maxX()), - min(rect.y(), rect.maxY()), - max(rect.width(), -rect.width()), - max(rect.height(), -rect.height())); + return IntRect(std::min(rect.x(), rect.maxX()), + std::min(rect.y(), rect.maxY()), + std::max(rect.width(), -rect.width()), + std::max(rect.height(), -rect.height())); } static inline PassRefPtr<Image> cropImage(Image* image, const IntRect& cropRect) { IntRect intersectRect = intersection(IntRect(IntPoint(), image->size()), cropRect); if (!intersectRect.width() || !intersectRect.height()) - return 0; + return nullptr; SkBitmap cropped; image->nativeImageForCurrentFrame()->bitmap().extractSubset(&cropped, intersectRect); @@ -39,15 +37,15 @@ static inline PassRefPtr<Image> cropImage(Image* image, const IntRect& cropRect) ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect) : m_imageElement(image) - , m_bitmap(0) + , m_bitmap(nullptr) , m_cropRect(cropRect) { 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_bitmapRect = IntRect(IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())), srcRect.size()); m_bitmapOffset = srcRect.location(); if (!srcRect.width() || !srcRect.height()) - m_imageElement = 0; + m_imageElement = nullptr; else m_imageElement->addClient(this); @@ -55,11 +53,16 @@ ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect) } ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) - : m_imageElement(0) + : m_imageElement(nullptr) , m_cropRect(cropRect) , m_bitmapOffset(IntPoint()) { - IntRect videoRect = IntRect(IntPoint(), video->player()->naturalSize()); + IntSize playerSize; + + if (video->webMediaPlayer()) + playerSize = video->webMediaPlayer()->naturalSize(); + + IntRect videoRect = IntRect(IntPoint(), playerSize); IntRect srcRect = intersection(cropRect, videoRect); IntRect dstRect(IntPoint(), srcRect.size()); @@ -71,13 +74,13 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect) c->translate(-srcRect.x(), -srcRect.y()); video->paintCurrentFrameInContext(c, videoRect); m_bitmap = buf->copyImage(DontCopyBackingStore); - m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); + m_bitmapRect = IntRect(IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())), srcRect.size()); ScriptWrappable::init(this); } ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect) - : m_imageElement(0) + : m_imageElement(nullptr) , m_cropRect(cropRect) , m_bitmapOffset(IntPoint()) { @@ -86,14 +89,14 @@ ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect) sourceContext->paintRenderingResultsToCanvas(); IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), canvas->size())); - m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); + m_bitmapRect = IntRect(IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())), srcRect.size()); m_bitmap = cropImage(canvas->buffer()->copyImage(CopyBackingStore).get(), cropRect); ScriptWrappable::init(this); } ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect) - : m_imageElement(0) + : m_imageElement(nullptr) , m_cropRect(cropRect) , m_bitmapOffset(IntPoint()) { @@ -103,23 +106,23 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect) if (!buf) return; if (srcRect.width() > 0 && srcRect.height() > 0) - buf->putByteArray(Premultiplied, data->data(), data->size(), srcRect, IntPoint(min(0, -cropRect.x()), min(0, -cropRect.y()))); + buf->putByteArray(Premultiplied, data->data(), data->size(), srcRect, IntPoint(std::min(0, -cropRect.x()), std::min(0, -cropRect.y()))); m_bitmap = buf->copyImage(DontCopyBackingStore); - m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); + m_bitmapRect = IntRect(IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())), srcRect.size()); ScriptWrappable::init(this); } ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect) : m_imageElement(bitmap->imageElement()) - , m_bitmap(0) + , m_bitmap(nullptr) , m_cropRect(cropRect) , m_bitmapOffset(IntPoint()) { IntRect oldBitmapRect = bitmap->bitmapRect(); IntRect srcRect = intersection(cropRect, oldBitmapRect); - m_bitmapRect = IntRect(IntPoint(max(0, oldBitmapRect.x() - cropRect.x()), max(0, oldBitmapRect.y() - cropRect.y())), srcRect.size()); + m_bitmapRect = IntRect(IntPoint(std::max(0, oldBitmapRect.x() - cropRect.x()), std::max(0, oldBitmapRect.y() - cropRect.y())), srcRect.size()); if (m_imageElement) { m_imageElement->addClient(this); @@ -133,63 +136,65 @@ ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect) } ImageBitmap::ImageBitmap(Image* image, const IntRect& cropRect) - : m_imageElement(0) + : m_imageElement(nullptr) , m_cropRect(cropRect) { IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), image->size())); m_bitmap = cropImage(image, cropRect); - m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size()); + m_bitmapRect = IntRect(IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRect.y())), srcRect.size()); ScriptWrappable::init(this); } ImageBitmap::~ImageBitmap() { +#if !ENABLE(OILPAN) if (m_imageElement) m_imageElement->removeClient(this); +#endif } -PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLImageElement* image, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(HTMLImageElement* image, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(image, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(image, normalizedCropRect)); } -PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLVideoElement* video, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(HTMLVideoElement* video, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(video, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(video, normalizedCropRect)); } -PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLCanvasElement* canvas, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(HTMLCanvasElement* canvas, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(canvas, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(canvas, normalizedCropRect)); } -PassRefPtr<ImageBitmap> ImageBitmap::create(ImageData* data, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(ImageData* data, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(data, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(data, normalizedCropRect)); } -PassRefPtr<ImageBitmap> ImageBitmap::create(ImageBitmap* bitmap, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(ImageBitmap* bitmap, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(bitmap, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(bitmap, normalizedCropRect)); } -PassRefPtr<ImageBitmap> ImageBitmap::create(Image* image, const IntRect& cropRect) +PassRefPtrWillBeRawPtr<ImageBitmap> ImageBitmap::create(Image* image, const IntRect& cropRect) { IntRect normalizedCropRect = normalizeRect(cropRect); - return adoptRef(new ImageBitmap(image, normalizedCropRect)); + return adoptRefWillBeNoop(new ImageBitmap(image, normalizedCropRect)); } void ImageBitmap::notifyImageSourceChanged() { m_bitmap = cropImage(m_imageElement->cachedImage()->image(), m_cropRect); m_bitmapOffset = IntPoint(); - m_imageElement = 0; + m_imageElement = nullptr; } PassRefPtr<Image> ImageBitmap::bitmapImage() const @@ -200,4 +205,34 @@ PassRefPtr<Image> ImageBitmap::bitmapImage() const return m_bitmap; } +PassRefPtr<Image> ImageBitmap::getSourceImageForCanvas(SourceImageMode, SourceImageStatus* status) const +{ + *status = NormalSourceImageStatus; + return bitmapImage(); +} + +void ImageBitmap::adjustDrawRects(FloatRect* srcRect, FloatRect* dstRect) const +{ + FloatRect intersectRect = intersection(m_bitmapRect, *srcRect); + FloatRect newSrcRect = intersectRect; + newSrcRect.move(m_bitmapOffset - m_bitmapRect.location()); + FloatRect newDstRect(FloatPoint(intersectRect.location() - srcRect->location()), m_bitmapRect.size()); + newDstRect.scale(dstRect->width() / srcRect->width() * intersectRect.width() / m_bitmapRect.width(), + dstRect->height() / srcRect->height() * intersectRect.height() / m_bitmapRect.height()); + newDstRect.moveBy(dstRect->location()); + *srcRect = newSrcRect; + *dstRect = newDstRect; +} + +FloatSize ImageBitmap::sourceSize() const +{ + return FloatSize(width(), height()); +} + +void ImageBitmap::trace(Visitor* visitor) +{ + visitor->trace(m_imageElement); + ImageLoaderClient::trace(visitor); +} + } |