Index: Source/platform/graphics/ImagePattern.cpp |
diff --git a/Source/platform/graphics/Pattern.cpp b/Source/platform/graphics/ImagePattern.cpp |
similarity index 69% |
copy from Source/platform/graphics/Pattern.cpp |
copy to Source/platform/graphics/ImagePattern.cpp |
index 3d7c0acf95791118ba0c3523330de2f3db0fa311..4af9204d0605c5625cf60b189e8a33eb312d1db6 100644 |
--- a/Source/platform/graphics/Pattern.cpp |
+++ b/Source/platform/graphics/ImagePattern.cpp |
@@ -26,45 +26,36 @@ |
*/ |
#include "config.h" |
-#include "platform/graphics/Pattern.h" |
+#include "platform/graphics/ImagePattern.h" |
+ |
-#include <v8.h> |
#include "SkCanvas.h" |
#include "SkColorShader.h" |
#include "platform/graphics/skia/SkiaUtils.h" |
- |
+#include <v8.h> |
Justin Novosad
2014/07/02 19:04:18
Why is this needed?
Rémi Piotaix
2014/07/02 20:21:32
For:
L89: v8::Isolate::GetCurrent()..... ?
|
namespace WebCore { |
-Pattern::Pattern(PassRefPtr<Image> image, bool repeatX, bool repeatY) |
- : m_repeatX(repeatX) |
- , m_repeatY(repeatY) |
- , m_externalMemoryAllocated(0) |
+ImagePattern::ImagePattern(PassRefPtr<SkImage> image, bool repeatX, bool repeatY) |
+: Pattern(repeatX, repeatY) |
{ |
if (image) { |
- m_tileImage = image->nativeImageForCurrentFrame(); |
+ m_tileImage = image; |
} |
} |
-Pattern::~Pattern() |
-{ |
- if (m_externalMemoryAllocated) |
- v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_externalMemoryAllocated); |
-} |
- |
-SkShader* Pattern::shader() |
+PassRefPtr<SkShader> ImagePattern::createShader() |
{ |
- if (m_pattern) |
- return m_pattern.get(); |
- |
SkMatrix localMatrix = affineTransformToSkMatrix(m_patternSpaceTransformation); |
+ RefPtr<SkShader> shader; |
+ |
// If we don't have a bitmap, return a transparent shader. |
- if (!m_tileImage) |
- m_pattern = adoptRef(new SkColorShader(SK_ColorTRANSPARENT)); |
- else if (m_repeatX && m_repeatY) |
- m_pattern = adoptRef(SkShader::CreateBitmapShader(m_tileImage->bitmap(), SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &localMatrix)); |
- else { |
+ if (!m_tileImage) { |
+ shader = adoptRef(new SkColorShader(SK_ColorTRANSPARENT)); |
+ } else if (m_repeatX && m_repeatY) { |
+ shader = m_tileImage->newShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode); |
+ } else { |
// Skia does not have a "draw the tile only once" option. Clamp_TileMode |
// repeats the last line of the image after drawing one tile. To avoid |
// filling the space with arbitrary pixels, this workaround forces the |
@@ -78,9 +69,9 @@ SkShader* Pattern::shader() |
// Create a transparent bitmap 1 pixel wider and/or taller than the |
// original, then copy the orignal into it. |
// FIXME: Is there a better way to pad (not scale) an image in skia? |
- SkImageInfo info = m_tileImage->bitmap().info(); |
- info.fWidth += expandW; |
- info.fHeight += expandH; |
+ SkImageInfo info; |
+ info.fWidth = m_tileImage->width() + expandW; |
+ info.fHeight = m_tileImage->height() + expandH; |
// we explicitly require non-opaquness, since we are going to add a transparent strip. |
info.fAlphaType = kPremul_SkAlphaType; |
@@ -88,22 +79,16 @@ SkShader* Pattern::shader() |
bm2.allocPixels(info); |
bm2.eraseARGB(0x00, 0x00, 0x00, 0x00); |
SkCanvas canvas(bm2); |
- canvas.drawBitmap(m_tileImage->bitmap(), 0, 0); |
+ m_tileImage->draw(&canvas, SkIntToScalar(0), SkIntToScalar(0), 0); |
+ |
bm2.setImmutable(); |
- m_pattern = adoptRef(SkShader::CreateBitmapShader(bm2, tileModeX, tileModeY, &localMatrix)); |
+ shader = adoptRef(SkShader::CreateBitmapShader(bm2, tileModeX, tileModeY, &localMatrix)); |
// Clamp to int, since that's what the adjust function takes. |
- m_externalMemoryAllocated = static_cast<int>(std::min(static_cast<size_t>(INT_MAX), bm2.getSafeSize())); |
+ m_externalMemoryAllocated = static_cast<int> (std::min(static_cast<size_t> (INT_MAX), bm2.getSafeSize())); |
v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(m_externalMemoryAllocated); |
} |
- return m_pattern.get(); |
+ return shader; |
} |
-void Pattern::setPatternSpaceTransform(const AffineTransform& patternSpaceTransformation) |
-{ |
- m_patternSpaceTransformation = patternSpaceTransformation; |
- if (m_pattern) |
- m_pattern.clear(); |
-} |
- |
-} |
+} // namespace |