OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007 Apple 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "platform/graphics/ImageBuffer.h" | 41 #include "platform/graphics/ImageBuffer.h" |
42 #include "platform/graphics/paint/DrawingRecorder.h" | 42 #include "platform/graphics/paint/DrawingRecorder.h" |
43 #include "platform/graphics/paint/SkPictureBuilder.h" | 43 #include "platform/graphics/paint/SkPictureBuilder.h" |
44 #include "platform/text/BidiTextRun.h" | 44 #include "platform/text/BidiTextRun.h" |
45 #include "platform/text/StringTruncator.h" | 45 #include "platform/text/StringTruncator.h" |
46 #include "platform/text/TextRun.h" | 46 #include "platform/text/TextRun.h" |
47 #include "platform/transforms/AffineTransform.h" | 47 #include "platform/transforms/AffineTransform.h" |
48 #include "platform/weborigin/KURL.h" | 48 #include "platform/weborigin/KURL.h" |
49 #include "skia/ext/image_operations.h" | 49 #include "skia/ext/image_operations.h" |
50 #include "third_party/skia/include/core/SkCanvas.h" | 50 #include "third_party/skia/include/core/SkCanvas.h" |
51 #include "third_party/skia/include/core/SkColor.h" | 51 #include "third_party/skia/include/core/SkImage.h" |
52 #include "third_party/skia/include/core/SkMatrix.h" | 52 #include "third_party/skia/include/core/SkMatrix.h" |
| 53 #include "third_party/skia/include/core/SkSurface.h" |
53 #include "wtf/PassOwnPtr.h" | 54 #include "wtf/PassOwnPtr.h" |
54 #include "wtf/RefPtr.h" | 55 #include "wtf/RefPtr.h" |
55 #include "wtf/text/WTFString.h" | 56 #include "wtf/text/WTFString.h" |
56 | 57 |
57 #include <algorithm> | 58 #include <algorithm> |
58 | 59 |
59 namespace blink { | 60 namespace blink { |
60 | 61 |
| 62 namespace { |
| 63 |
61 const float kDragLabelBorderX = 4; | 64 const float kDragLabelBorderX = 4; |
62 // Keep border_y in synch with DragController::LinkDragBorderInset. | 65 // Keep border_y in synch with DragController::LinkDragBorderInset. |
63 const float kDragLabelBorderY = 2; | 66 const float kDragLabelBorderY = 2; |
64 const float kLabelBorderYOffset = 2; | 67 const float kLabelBorderYOffset = 2; |
65 | 68 |
66 const float kMaxDragLabelWidth = 300; | 69 const float kMaxDragLabelWidth = 300; |
67 const float kMaxDragLabelStringWidth = (kMaxDragLabelWidth - 2 * kDragLabelBorde
rX); | 70 const float kMaxDragLabelStringWidth = (kMaxDragLabelWidth - 2 * kDragLabelBorde
rX); |
68 | 71 |
69 const float kDragLinkLabelFontSize = 11; | 72 const float kDragLinkLabelFontSize = 11; |
70 const float kDragLinkUrlFontSize = 10; | 73 const float kDragLinkUrlFontSize = 10; |
71 | 74 |
72 PassOwnPtr<DragImage> DragImage::create(Image* image, RespectImageOrientationEnu
m shouldRespectImageOrientation, float deviceScaleFactor, InterpolationQuality i
nterpolationQuality) | 75 PassRefPtr<SkImage> adjustedImage(PassRefPtr<SkImage> image, const IntSize& size
, |
| 76 const AffineTransform& transform, float opacity, InterpolationQuality interp
olationQuality) |
| 77 { |
| 78 if (transform.isIdentity() && opacity == 1) { |
| 79 // Nothing to adjust, just use the original. |
| 80 ASSERT(image->width() == size.width()); |
| 81 ASSERT(image->height() == size.height()); |
| 82 return image; |
| 83 } |
| 84 |
| 85 RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(size.widt
h(), size.height())); |
| 86 if (!surface) |
| 87 return nullptr; |
| 88 |
| 89 SkPaint paint; |
| 90 ASSERT(opacity >= 0 && opacity <= 1); |
| 91 paint.setAlpha(opacity * 255); |
| 92 paint.setFilterQuality(interpolationQuality == InterpolationNone |
| 93 ? kNone_SkFilterQuality : kHigh_SkFilterQuality); |
| 94 |
| 95 SkCanvas* canvas = surface->getCanvas(); |
| 96 canvas->clear(SK_ColorTRANSPARENT); |
| 97 canvas->concat(affineTransformToSkMatrix(transform)); |
| 98 canvas->drawImage(image.get(), 0, 0, &paint); |
| 99 |
| 100 return adoptRef(surface->newImageSnapshot()); |
| 101 } |
| 102 |
| 103 } // anonymous namespace |
| 104 |
| 105 FloatSize DragImage::clampedImageScale(const Image& image, const IntSize& size, |
| 106 const IntSize& maxSize) |
| 107 { |
| 108 // Non-uniform scaling for size mapping. |
| 109 FloatSize imageScale( |
| 110 static_cast<float>(size.width()) / image.width(), |
| 111 static_cast<float>(size.height()) / image.height()); |
| 112 |
| 113 // Uniform scaling for clamping. |
| 114 const float clampScaleX = size.width() > maxSize.width() |
| 115 ? static_cast<float>(maxSize.width()) / size.width() : 1; |
| 116 const float clampScaleY = size.height() > maxSize.height() |
| 117 ? static_cast<float>(maxSize.height()) / size.height() : 1; |
| 118 imageScale.scale(std::min(clampScaleX, clampScaleY)); |
| 119 |
| 120 return imageScale; |
| 121 } |
| 122 |
| 123 PassOwnPtr<DragImage> DragImage::create(Image* image, |
| 124 RespectImageOrientationEnum shouldRespectImageOrientation, float deviceScale
Factor, |
| 125 InterpolationQuality interpolationQuality, float opacity, const FloatSize& i
mageScale) |
73 { | 126 { |
74 if (!image) | 127 if (!image) |
75 return nullptr; | 128 return nullptr; |
76 | 129 |
77 SkBitmap bitmap; | 130 RefPtr<SkImage> skImage = image->imageForCurrentFrame(); |
78 if (!image->deprecatedBitmapForCurrentFrame(&bitmap)) | 131 if (!skImage) |
79 return nullptr; | 132 return nullptr; |
80 | 133 |
81 if (image->isBitmapImage()) { | 134 IntSize size = image->size(); |
82 ImageOrientation orientation = DefaultImageOrientation; | 135 size.scale(imageScale.width(), imageScale.height()); |
| 136 if (size.isEmpty()) |
| 137 return nullptr; |
| 138 |
| 139 AffineTransform transform; |
| 140 transform.scaleNonUniform(imageScale.width(), imageScale.height()); |
| 141 |
| 142 if (shouldRespectImageOrientation == RespectImageOrientation && image->isBit
mapImage()) { |
83 BitmapImage* bitmapImage = toBitmapImage(image); | 143 BitmapImage* bitmapImage = toBitmapImage(image); |
84 IntSize sizeRespectingOrientation = bitmapImage->sizeRespectingOrientati
on(); | 144 ImageOrientation orientation = bitmapImage->currentFrameOrientation(); |
85 | |
86 if (shouldRespectImageOrientation == RespectImageOrientation) | |
87 orientation = bitmapImage->currentFrameOrientation(); | |
88 | 145 |
89 if (orientation != DefaultImageOrientation) { | 146 if (orientation != DefaultImageOrientation) { |
90 FloatRect destRect(FloatPoint(), sizeRespectingOrientation); | 147 size = bitmapImage->sizeRespectingOrientation(); |
91 if (orientation.usesWidthAsHeight()) | 148 if (orientation.usesWidthAsHeight()) |
92 destRect = destRect.transposedRect(); | 149 size.scale(imageScale.height(), imageScale.width()); |
| 150 else |
| 151 size.scale(imageScale.width(), imageScale.height()); |
93 | 152 |
94 SkBitmap skBitmap; | 153 transform *= orientation.transformFromDefault(size); |
95 if (!skBitmap.tryAllocN32Pixels(sizeRespectingOrientation.width(), s
izeRespectingOrientation.height())) | |
96 return nullptr; | |
97 | |
98 skBitmap.eraseColor(SK_ColorTRANSPARENT); | |
99 SkCanvas canvas(skBitmap); | |
100 canvas.concat(affineTransformToSkMatrix(orientation.transformFromDef
ault(sizeRespectingOrientation))); | |
101 canvas.drawBitmapRect(bitmap, destRect, nullptr); | |
102 | |
103 return adoptPtr(new DragImage(skBitmap, deviceScaleFactor, interpola
tionQuality)); | |
104 } | 154 } |
105 } | 155 } |
106 | 156 |
107 SkBitmap skBitmap; | 157 SkBitmap bm; |
108 if (!bitmap.copyTo(&skBitmap, kN32_SkColorType)) | 158 RefPtr<SkImage> resizedImage = |
| 159 adjustedImage(skImage.release(), size, transform, opacity, interpolation
Quality); |
| 160 if (!resizedImage || !resizedImage->asLegacyBitmap(&bm, SkImage::kRO_LegacyB
itmapMode)) |
109 return nullptr; | 161 return nullptr; |
110 return adoptPtr(new DragImage(skBitmap, deviceScaleFactor, interpolationQual
ity)); | 162 |
| 163 return adoptPtr(new DragImage(bm, deviceScaleFactor, interpolationQuality)); |
111 } | 164 } |
112 | 165 |
113 static Font deriveDragLabelFont(int size, FontWeight fontWeight, const FontDescr
iption& systemFont) | 166 static Font deriveDragLabelFont(int size, FontWeight fontWeight, const FontDescr
iption& systemFont) |
114 { | 167 { |
115 FontDescription description = systemFont; | 168 FontDescription description = systemFont; |
116 description.setWeight(fontWeight); | 169 description.setWeight(fontWeight); |
117 description.setSpecifiedSize(size); | 170 description.setSpecifiedSize(size); |
118 description.setComputedSize(size); | 171 description.setComputedSize(size); |
119 Font result(description); | 172 Font result(description); |
120 result.update(nullptr); | 173 result.update(nullptr); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 : m_bitmap(bitmap) | 265 : m_bitmap(bitmap) |
213 , m_resolutionScale(resolutionScale) | 266 , m_resolutionScale(resolutionScale) |
214 , m_interpolationQuality(interpolationQuality) | 267 , m_interpolationQuality(interpolationQuality) |
215 { | 268 { |
216 } | 269 } |
217 | 270 |
218 DragImage::~DragImage() | 271 DragImage::~DragImage() |
219 { | 272 { |
220 } | 273 } |
221 | 274 |
222 void DragImage::fitToMaxSize(const IntSize& srcSize, const IntSize& maxSize) | |
223 { | |
224 float heightResizeRatio = 0.0f; | |
225 float widthResizeRatio = 0.0f; | |
226 float resizeRatio = -1.0f; | |
227 IntSize originalSize = size(); | |
228 | |
229 if (srcSize.width() > maxSize.width()) { | |
230 widthResizeRatio = maxSize.width() / static_cast<float>(srcSize.width())
; | |
231 resizeRatio = widthResizeRatio; | |
232 } | |
233 | |
234 if (srcSize.height() > maxSize.height()) { | |
235 heightResizeRatio = maxSize.height() / static_cast<float>(srcSize.height
()); | |
236 if ((resizeRatio < 0.0f) || (resizeRatio > heightResizeRatio)) | |
237 resizeRatio = heightResizeRatio; | |
238 } | |
239 | |
240 if (srcSize == originalSize) { | |
241 if (resizeRatio > 0.0f) | |
242 scale(resizeRatio, resizeRatio); | |
243 return; | |
244 } | |
245 | |
246 // The image was scaled in the webpage so at minimum we must account for tha
t scaling | |
247 float scaleX = srcSize.width() / static_cast<float>(originalSize.width()); | |
248 float scaleY = srcSize.height() / static_cast<float>(originalSize.height()); | |
249 if (resizeRatio > 0.0f) { | |
250 scaleX *= resizeRatio; | |
251 scaleY *= resizeRatio; | |
252 } | |
253 | |
254 scale(scaleX, scaleY); | |
255 } | |
256 | |
257 void DragImage::scale(float scaleX, float scaleY) | 275 void DragImage::scale(float scaleX, float scaleY) |
258 { | 276 { |
259 skia::ImageOperations::ResizeMethod resizeMethod = m_interpolationQuality ==
InterpolationNone ? skia::ImageOperations::RESIZE_BOX : skia::ImageOperations::
RESIZE_LANCZOS3; | 277 skia::ImageOperations::ResizeMethod resizeMethod = m_interpolationQuality ==
InterpolationNone ? skia::ImageOperations::RESIZE_BOX : skia::ImageOperations::
RESIZE_LANCZOS3; |
260 int imageWidth = scaleX * m_bitmap.width(); | 278 int imageWidth = scaleX * m_bitmap.width(); |
261 int imageHeight = scaleY * m_bitmap.height(); | 279 int imageHeight = scaleY * m_bitmap.height(); |
262 m_bitmap = skia::ImageOperations::Resize(m_bitmap, resizeMethod, imageWidth,
imageHeight); | 280 m_bitmap = skia::ImageOperations::Resize(m_bitmap, resizeMethod, imageWidth,
imageHeight); |
263 } | 281 } |
264 | 282 |
265 void DragImage::dissolveToFraction(float fraction) | |
266 { | |
267 m_bitmap.setAlphaType(kPremul_SkAlphaType); | |
268 SkAutoLockPixels lock(m_bitmap); | |
269 | |
270 for (int row = 0; row < m_bitmap.height(); ++row) { | |
271 for (int column = 0; column < m_bitmap.width(); ++column) { | |
272 uint32_t* pixel = m_bitmap.getAddr32(column, row); | |
273 *pixel = SkPreMultiplyARGB( | |
274 SkColorGetA(*pixel) * fraction, | |
275 SkColorGetR(*pixel), | |
276 SkColorGetG(*pixel), | |
277 SkColorGetB(*pixel)); | |
278 } | |
279 } | |
280 } | |
281 | |
282 } // namespace blink | 283 } // namespace blink |
OLD | NEW |