Index: Source/core/platform/DragImage.cpp |
diff --git a/Source/core/platform/DragImage.cpp b/Source/core/platform/DragImage.cpp |
deleted file mode 100644 |
index 22d3f17b0999eb83ebae1a591a5d16eaa9efe9f0..0000000000000000000000000000000000000000 |
--- a/Source/core/platform/DragImage.cpp |
+++ /dev/null |
@@ -1,267 +0,0 @@ |
-/* |
- * Copyright (C) 2007 Apple Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "core/platform/DragImage.h" |
- |
-#include "platform/fonts/Font.h" |
-#include "platform/fonts/FontCache.h" |
-#include "platform/fonts/FontDescription.h" |
-#include "platform/fonts/FontMetrics.h" |
-#include "platform/geometry/FloatPoint.h" |
-#include "platform/geometry/FloatRect.h" |
-#include "platform/geometry/IntPoint.h" |
-#include "platform/graphics/BitmapImage.h" |
-#include "platform/graphics/Color.h" |
-#include "platform/graphics/GraphicsContext.h" |
-#include "platform/graphics/Image.h" |
-#include "platform/graphics/ImageBuffer.h" |
-#include "platform/graphics/skia/NativeImageSkia.h" |
-#include "platform/text/StringTruncator.h" |
-#include "platform/text/TextRun.h" |
-#include "platform/transforms/AffineTransform.h" |
-#include "platform/weborigin/KURL.h" |
-#include "skia/ext/image_operations.h" |
-#include "third_party/skia/include/core/SkCanvas.h" |
-#include "third_party/skia/include/core/SkMatrix.h" |
-#include "wtf/PassOwnPtr.h" |
-#include "wtf/RefPtr.h" |
-#include "wtf/text/WTFString.h" |
- |
-#include <algorithm> |
- |
-namespace WebCore { |
- |
-const float kDragLabelBorderX = 4; |
-// Keep border_y in synch with DragController::LinkDragBorderInset. |
-const float kDragLabelBorderY = 2; |
-const float kLabelBorderYOffset = 2; |
- |
-const float kMaxDragLabelWidth = 300; |
-const float kMaxDragLabelStringWidth = (kMaxDragLabelWidth - 2 * kDragLabelBorderX); |
- |
-const float kDragLinkLabelFontSize = 11; |
-const float kDragLinkUrlFontSize = 10; |
- |
-PassOwnPtr<DragImage> DragImage::create(Image* image, RespectImageOrientationEnum shouldRespectImageOrientation) |
-{ |
- if (!image) |
- return nullptr; |
- |
- RefPtr<NativeImageSkia> bitmap = image->nativeImageForCurrentFrame(); |
- if (!bitmap) |
- return nullptr; |
- |
- if (image->isBitmapImage()) { |
- ImageOrientation orientation = DefaultImageOrientation; |
- BitmapImage* bitmapImage = toBitmapImage(image); |
- IntSize sizeRespectingOrientation = bitmapImage->sizeRespectingOrientation(); |
- |
- if (shouldRespectImageOrientation == RespectImageOrientation) |
- orientation = bitmapImage->currentFrameOrientation(); |
- |
- if (orientation != DefaultImageOrientation) { |
- FloatRect destRect(FloatPoint(), sizeRespectingOrientation); |
- if (orientation.usesWidthAsHeight()) |
- destRect = destRect.transposedRect(); |
- |
- SkBitmap skBitmap; |
- skBitmap.setConfig( |
- SkBitmap::kARGB_8888_Config, sizeRespectingOrientation.width(), sizeRespectingOrientation.height()); |
- if (!skBitmap.allocPixels()) |
- return nullptr; |
- |
- SkCanvas canvas(skBitmap); |
- canvas.concat(affineTransformToSkMatrix(orientation.transformFromDefault(sizeRespectingOrientation))); |
- canvas.drawBitmapRect(bitmap->bitmap(), 0, destRect); |
- |
- return adoptPtr(new DragImage(skBitmap, bitmap->resolutionScale())); |
- } |
- } |
- |
- SkBitmap skBitmap; |
- if (!bitmap->bitmap().copyTo(&skBitmap, SkBitmap::kARGB_8888_Config)) |
- return nullptr; |
- return adoptPtr(new DragImage(skBitmap, bitmap->resolutionScale())); |
-} |
- |
-static Font deriveDragLabelFont(int size, FontWeight fontWeight, const FontDescription& systemFont) |
-{ |
- FontDescription description = systemFont; |
- description.setWeight(fontWeight); |
- description.setSpecifiedSize(size); |
- description.setComputedSize(size); |
- Font result(description, 0, 0); |
- result.update(0); |
- return result; |
-} |
- |
-PassOwnPtr<DragImage> DragImage::create(const KURL& url, const String& inLabel, const FontDescription& systemFont, float deviceScaleFactor) |
-{ |
- const Font labelFont = deriveDragLabelFont(kDragLinkLabelFontSize, FontWeightBold, systemFont); |
- const Font urlFont = deriveDragLabelFont(kDragLinkUrlFontSize, FontWeightNormal, systemFont); |
- FontCachePurgePreventer fontCachePurgePreventer; |
- |
- bool drawURLString = true; |
- bool clipURLString = false; |
- bool clipLabelString = false; |
- |
- String urlString = url.string(); |
- String label = inLabel; |
- if (label.isEmpty()) { |
- drawURLString = false; |
- label = urlString; |
- } |
- |
- // First step is drawing the link drag image width. |
- TextRun labelRun(label.impl()); |
- TextRun urlRun(urlString.impl()); |
- IntSize labelSize(labelFont.width(labelRun), labelFont.fontMetrics().ascent() + labelFont.fontMetrics().descent()); |
- |
- if (labelSize.width() > kMaxDragLabelStringWidth) { |
- labelSize.setWidth(kMaxDragLabelStringWidth); |
- clipLabelString = true; |
- } |
- |
- IntSize urlStringSize; |
- IntSize imageSize(labelSize.width() + kDragLabelBorderX * 2, labelSize.height() + kDragLabelBorderY * 2); |
- |
- if (drawURLString) { |
- urlStringSize.setWidth(urlFont.width(urlRun)); |
- urlStringSize.setHeight(urlFont.fontMetrics().ascent() + urlFont.fontMetrics().descent()); |
- imageSize.setHeight(imageSize.height() + urlStringSize.height()); |
- if (urlStringSize.width() > kMaxDragLabelStringWidth) { |
- imageSize.setWidth(kMaxDragLabelWidth); |
- clipURLString = true; |
- } else |
- imageSize.setWidth(std::max(labelSize.width(), urlStringSize.width()) + kDragLabelBorderX * 2); |
- } |
- |
- // We now know how big the image needs to be, so we create and |
- // fill the background |
- IntSize scaledImageSize = imageSize; |
- scaledImageSize.scale(deviceScaleFactor); |
- OwnPtr<ImageBuffer> buffer(ImageBuffer::create(scaledImageSize)); |
- if (!buffer) |
- return nullptr; |
- buffer->context()->scale(FloatSize(deviceScaleFactor, deviceScaleFactor)); |
- |
- const float DragLabelRadius = 5; |
- const IntSize radii(DragLabelRadius, DragLabelRadius); |
- IntRect rect(IntPoint(), imageSize); |
- const Color backgroundColor(140, 140, 140); |
- buffer->context()->fillRoundedRect(rect, radii, radii, radii, radii, backgroundColor); |
- |
- // Draw the text |
- if (drawURLString) { |
- if (clipURLString) |
- urlString = StringTruncator::centerTruncate(urlString, imageSize.width() - (kDragLabelBorderX * 2.0f), urlFont, StringTruncator::EnableRoundingHacks); |
- IntPoint textPos(kDragLabelBorderX, imageSize.height() - (kLabelBorderYOffset + urlFont.fontMetrics().descent())); |
- TextRun textRun(urlString); |
- buffer->context()->drawText(urlFont, TextRunPaintInfo(textRun), textPos); |
- } |
- |
- if (clipLabelString) |
- label = StringTruncator::rightTruncate(label, imageSize.width() - (kDragLabelBorderX * 2.0f), labelFont, StringTruncator::EnableRoundingHacks); |
- |
- IntPoint textPos(kDragLabelBorderX, kDragLabelBorderY + labelFont.pixelSize()); |
- TextRun textRun(label); |
- buffer->context()->drawText(urlFont, TextRunPaintInfo(textRun), textPos); |
- |
- RefPtr<Image> image = buffer->copyImage(); |
- return DragImage::create(image.get()); |
-} |
- |
-DragImage::DragImage(const SkBitmap& bitmap, float resolutionScale) |
- : m_bitmap(bitmap) |
- , m_resolutionScale(resolutionScale) |
-{ |
-} |
- |
-DragImage::~DragImage() |
-{ |
-} |
- |
-void DragImage::fitToMaxSize(const IntSize& srcSize, const IntSize& maxSize) |
-{ |
- float heightResizeRatio = 0.0f; |
- float widthResizeRatio = 0.0f; |
- float resizeRatio = -1.0f; |
- IntSize originalSize = size(); |
- |
- if (srcSize.width() > maxSize.width()) { |
- widthResizeRatio = maxSize.width() / static_cast<float>(srcSize.width()); |
- resizeRatio = widthResizeRatio; |
- } |
- |
- if (srcSize.height() > maxSize.height()) { |
- heightResizeRatio = maxSize.height() / static_cast<float>(srcSize.height()); |
- if ((resizeRatio < 0.0f) || (resizeRatio > heightResizeRatio)) |
- resizeRatio = heightResizeRatio; |
- } |
- |
- if (srcSize == originalSize) { |
- if (resizeRatio > 0.0f) |
- scale(resizeRatio, resizeRatio); |
- return; |
- } |
- |
- // The image was scaled in the webpage so at minimum we must account for that scaling |
- float scaleX = srcSize.width() / static_cast<float>(originalSize.width()); |
- float scaleY = srcSize.height() / static_cast<float>(originalSize.height()); |
- if (resizeRatio > 0.0f) { |
- scaleX *= resizeRatio; |
- scaleY *= resizeRatio; |
- } |
- |
- scale(scaleX, scaleY); |
-} |
- |
-void DragImage::scale(float scaleX, float scaleY) |
-{ |
- int imageWidth = scaleX * m_bitmap.width(); |
- int imageHeight = scaleY * m_bitmap.height(); |
- m_bitmap = skia::ImageOperations::Resize( |
- m_bitmap, skia::ImageOperations::RESIZE_LANCZOS3, imageWidth, imageHeight); |
-} |
- |
-void DragImage::dissolveToFraction(float fraction) |
-{ |
- m_bitmap.setAlphaType(kPremul_SkAlphaType); |
- SkAutoLockPixels lock(m_bitmap); |
- |
- for (int row = 0; row < m_bitmap.height(); ++row) { |
- for (int column = 0; column < m_bitmap.width(); ++column) { |
- uint32_t* pixel = m_bitmap.getAddr32(column, row); |
- *pixel = SkPreMultiplyARGB( |
- SkColorGetA(*pixel) * fraction, |
- SkColorGetR(*pixel), |
- SkColorGetG(*pixel), |
- SkColorGetB(*pixel)); |
- } |
- } |
-} |
- |
-} // namespace WebCore |