Index: Source/platform/graphics/Pattern.cpp |
diff --git a/Source/platform/graphics/Pattern.cpp b/Source/platform/graphics/Pattern.cpp |
index 51c1796506602347d3fd3d4d8c77f0197f6d147b..92ef5366c709961b285c70315777c0ccb0f9f874 100644 |
--- a/Source/platform/graphics/Pattern.cpp |
+++ b/Source/platform/graphics/Pattern.cpp |
@@ -28,82 +28,40 @@ |
#include "config.h" |
#include "platform/graphics/Pattern.h" |
+#include "platform/graphics/BitmapPattern.h" |
+#include "platform/graphics/StaticBitmapPattern.h" |
+#include "third_party/skia/include/core/SkImage.h" |
+#include "third_party/skia/include/core/SkShader.h" |
#include <v8.h> |
-#include "SkCanvas.h" |
-#include "SkColorShader.h" |
-#include "platform/graphics/skia/SkiaUtils.h" |
namespace blink { |
PassRefPtr<Pattern> Pattern::createBitmapPattern(PassRefPtr<Image> tileImage, RepeatMode repeatMode) |
{ |
- return adoptRef(new Pattern(tileImage, repeatMode)); |
+ if (tileImage->image()) |
+ return StaticBitmapPattern::create(tileImage, repeatMode); |
+ |
+ return BitmapPattern::create(tileImage, repeatMode); |
} |
-Pattern::Pattern(PassRefPtr<Image> image, RepeatMode repeatMode) |
+Pattern::Pattern(RepeatMode repeatMode, int64_t externalMemoryAllocated) |
: m_repeatMode(repeatMode) |
, m_externalMemoryAllocated(0) |
{ |
- if (image) { |
- m_tileImage = image->nativeImageForCurrentFrame(); |
- } |
+ adjustExternalMemoryAllocated(externalMemoryAllocated); |
} |
Pattern::~Pattern() |
{ |
- if (m_externalMemoryAllocated) |
- v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_externalMemoryAllocated); |
+ adjustExternalMemoryAllocated(-m_externalMemoryAllocated); |
} |
SkShader* Pattern::shader() |
{ |
- if (m_pattern) |
- return m_pattern.get(); |
- |
- SkMatrix localMatrix = affineTransformToSkMatrix(m_patternSpaceTransformation); |
- |
- // If we don't have a bitmap, return a transparent shader. |
- if (!m_tileImage) { |
- m_pattern = adoptRef(new SkColorShader(SK_ColorTRANSPARENT)); |
- } else if (m_repeatMode == RepeatModeXY) { |
- m_pattern = adoptRef(SkShader::CreateBitmapShader(m_tileImage->bitmap(), |
- SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &localMatrix)); |
- } 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 |
- // image to have a line of transparent pixels on the "repeated" edge(s), |
- // thus causing extra space to be transparent filled. |
- SkShader::TileMode tileModeX = (m_repeatMode & RepeatModeX) |
- ? SkShader::kRepeat_TileMode |
- : SkShader::kClamp_TileMode; |
- SkShader::TileMode tileModeY = (m_repeatMode & RepeatModeY) |
- ? SkShader::kRepeat_TileMode |
- : SkShader::kClamp_TileMode; |
- int expandW = (m_repeatMode & RepeatModeX) ? 0 : 1; |
- int expandH = (m_repeatMode & RepeatModeY) ? 0 : 1; |
- |
- // 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; |
- // we explicitly require non-opaquness, since we are going to add a transparent strip. |
- info.fAlphaType = kPremul_SkAlphaType; |
- |
- SkBitmap bm2; |
- bm2.allocPixels(info); |
- bm2.eraseARGB(0x00, 0x00, 0x00, 0x00); |
- SkCanvas canvas(bm2); |
- canvas.drawBitmap(m_tileImage->bitmap(), 0, 0); |
- bm2.setImmutable(); |
- m_pattern = 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())); |
- v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(m_externalMemoryAllocated); |
+ if (!m_pattern) { |
+ m_pattern = createShader(); |
} |
+ |
return m_pattern.get(); |
} |
@@ -116,4 +74,13 @@ void Pattern::setPatternSpaceTransform(const AffineTransform& patternSpaceTransf |
m_pattern.clear(); |
} |
+void Pattern::adjustExternalMemoryAllocated(int64_t delta) |
+{ |
+ delta = std::max(-m_externalMemoryAllocated, delta); |
+ |
+ v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(delta); |
+ |
+ m_externalMemoryAllocated += delta; |
+} |
+ |
} // namespace blink |