void DragClientImpl::startDrag(DragImageRef dragImage, const IntPoint& dragImageOrigin, const IntPoint& eventPos, Clipboard* clipboard, Frame* frame, bool isLinkDrag) { // Add a ref to the frame just in case a load occurs mid-drag. RefPtr<Frame> frameProtector = frame; WebDragData dragData = static_cast<ClipboardChromium*>(clipboard)->dataObject(); DragOperation dragOperationMask = clipboard->sourceOperation(); IntSize offsetSize(eventPos - dragImageOrigin); WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); m_webView->startDragging( dragData, static_cast<WebDragOperationsMask>(dragOperationMask), #if WEBKIT_USING_SKIA dragImage ? WebImage(*dragImage) : WebImage(), #else dragImage ? WebImage(dragImage) : WebImage(), #endif offsetPoint); }
WebImage WebImageDecoder::getFrameAtIndex(int index = 0) const { DCHECK(m_private); ImageFrame* const frameBuffer = m_private->frameBufferAtIndex(index); if (!frameBuffer) return WebImage(); return WebImage(frameBuffer->bitmap()); }
WebImage WebImageDecoder::getFrameAtIndex(int index = 0) const { ASSERT(m_private); ImageFrame* const frameBuffer = m_private->frameBufferAtIndex(index); if (!frameBuffer) return WebImage(); OwnPtr<NativeImageSkia> image = adoptPtr(frameBuffer->asNewNativeImage()); return WebImage(image->bitmap()); }
WebImage WebImageDecoder::getFrameAtIndex(int index = 0) const { ASSERT(m_private); RGBA32Buffer* const frameBuffer = m_private->frameBufferAtIndex(index); if (!frameBuffer) return WebImage(); #if WEBKIT_USING_SKIA OwnPtr<NativeImageSkia>image(frameBuffer->asNewNativeImage()); return WebImage(*image); #elif WEBKIT_USING_CG // FIXME: Implement CG side of this. return WebImage(frameBuffer->asNewNativeImage()); #endif }
WebImage WebElement::imageContents() { if (isNull()) return WebImage(); WebCore::Image* image = unwrap<Element>()->imageContents(); if (!image) return WebImage(); RefPtr<NativeImageSkia> bitmap = image->nativeImageForCurrentFrame(); if (!bitmap) return WebImage(); return bitmap->bitmap(); }
WebImage WebElement::imageContents() { if (isNull()) return WebImage(); Image* image = unwrap<Element>()->imageContents(); if (!image) return WebImage(); SkBitmap bitmap; if (!image->bitmapForCurrentFrame(&bitmap)) return WebImage(); return WebImage(bitmap); }
WebImage WebImage::fromData(const WebData& data, const WebSize& desiredSize) { RefPtr<SharedBuffer> buffer = PassRefPtr<SharedBuffer>(data); OwnPtr<ImageDecoder> decoder(ImageDecoder::create(*buffer.get(), ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileIgnored)); if (!decoder) return WebImage(); decoder->setData(buffer.get(), true); if (!decoder->isSizeAvailable()) return WebImage(); // Frames are arranged by decreasing size, then decreasing bit depth. // Pick the frame closest to |desiredSize|'s area without being smaller, // which has the highest bit depth. const size_t frameCount = decoder->frameCount(); size_t index = 0; // Default to first frame if none are large enough. int frameAreaAtIndex = 0; for (size_t i = 0; i < frameCount; ++i) { const IntSize frameSize = decoder->frameSizeAtIndex(i); if (WebSize(frameSize) == desiredSize) { index = i; break; // Perfect match. } const int frameArea = frameSize.width() * frameSize.height(); if (frameArea < (desiredSize.width * desiredSize.height)) break; // No more frames that are large enough. if (!i || (frameArea < frameAreaAtIndex)) { index = i; // Closer to desired area than previous best match. frameAreaAtIndex = frameArea; } } ImageFrame* frame = decoder->frameBufferAtIndex(index); if (!frame) return WebImage(); RefPtr<NativeImageSkia> image = frame->asNewNativeImage(); if (!image) return WebImage(); return WebImage(image->bitmap()); }
WebVector<WebImage> WebImage::framesFromData(const WebData& data) { // This is to protect from malicious images. It should be big enough that it's never hit in pracice. const size_t maxFrameCount = 8; RefPtr<SharedBuffer> buffer = PassRefPtr<SharedBuffer>(data); OwnPtr<ImageDecoder> decoder(ImageDecoder::create(*buffer.get(), ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileIgnored)); if (!decoder) return WebVector<WebImage>(); decoder->setData(buffer.get(), true); if (!decoder->isSizeAvailable()) return WebVector<WebImage>(); // Frames are arranged by decreasing size, then decreasing bit depth. // Keep the first frame at every size, has the highest bit depth. const size_t frameCount = decoder->frameCount(); IntSize lastSize; Vector<WebImage> frames; for (size_t i = 0; i < std::min(frameCount, maxFrameCount); ++i) { const IntSize frameSize = decoder->frameSizeAtIndex(i); if (frameSize == lastSize) continue; lastSize = frameSize; ImageFrame* frame = decoder->frameBufferAtIndex(i); if (!frame) continue; RefPtr<NativeImageSkia> image = frame->asNewNativeImage(); if (image && image->isDataComplete()) frames.append(WebImage(image->bitmap())); } return frames; }
void DragClientImpl::startDrag(DragImageRef dragImage, const IntPoint& dragImageOrigin, const IntPoint& eventPos, Clipboard* clipboard, Frame* frame, bool isLinkDrag) { // Add a ref to the frame just in case a load occurs mid-drag. RefPtr<Frame> frameProtector = frame; WebDragData dragData = static_cast<ClipboardChromium*>(clipboard)->dataObject(); DragOperation dragOperationMask = clipboard->sourceOperation(); IntSize offsetSize(eventPos - dragImageOrigin); WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); if (dragImage && dragImage->bitmap && m_webView->deviceScaleFactor() != dragImage->resolutionScale) { ASSERT(dragImage->resolutionScale > 0); float scale = m_webView->deviceScaleFactor() / dragImage->resolutionScale; dragImage = scaleDragImage(dragImage, WebCore::FloatSize(scale, scale)); } m_webView->startDragging(frame, dragData, static_cast<WebDragOperationsMask>(dragOperationMask), (dragImage && dragImage->bitmap) ? WebImage(*dragImage->bitmap) : WebImage(), offsetPoint); }