Index: Source/platform/graphics/Pattern.cpp |
diff --git a/Source/platform/graphics/Pattern.cpp b/Source/platform/graphics/Pattern.cpp |
index 278ad46105d995dbedaea6e403781285b76efc1b..ab9e26f2e299c0d595a8b289801e50f02074f249 100644 |
--- a/Source/platform/graphics/Pattern.cpp |
+++ b/Source/platform/graphics/Pattern.cpp |
@@ -31,6 +31,9 @@ |
#include <v8.h> |
#include "SkCanvas.h" |
#include "SkColorShader.h" |
+#include "SkShader.h" |
+#include "platform/graphics/DisplayList.h" |
+#include "platform/graphics/Image.h" |
#include "platform/graphics/skia/SkiaUtils.h" |
@@ -41,6 +44,12 @@ PassRefPtr<Pattern> Pattern::createBitmapPattern(PassRefPtr<Image> tileImage, Re |
return adoptRef(new Pattern(tileImage, repeatMode)); |
} |
+PassRefPtr<Pattern> Pattern::createDisplayListPattern(PassRefPtr<DisplayList> displayList, |
+ RepeatMode repeatMode) |
+{ |
+ return adoptRef(new Pattern(displayList, repeatMode)); |
+} |
+ |
Pattern::Pattern(PassRefPtr<Image> image, RepeatMode repeatMode) |
: m_repeatMode(repeatMode) |
, m_externalMemoryAllocated(0) |
@@ -50,8 +59,17 @@ Pattern::Pattern(PassRefPtr<Image> image, RepeatMode repeatMode) |
} |
} |
+Pattern::Pattern(PassRefPtr<DisplayList> displayList, RepeatMode repeatMode) |
+ : m_tileDisplayList(displayList) |
+ , m_repeatMode(repeatMode) |
+ , m_externalMemoryAllocated(0) |
+{ |
+} |
+ |
Pattern::~Pattern() |
{ |
+ ASSERT(!m_tileImage || !m_tileDisplayList); |
+ |
if (m_externalMemoryAllocated) |
v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_externalMemoryAllocated); |
} |
@@ -63,12 +81,21 @@ SkShader* Pattern::shader() |
SkMatrix localMatrix = affineTransformToSkMatrix(m_patternSpaceTransformation); |
- // If we don't have a bitmap, return a transparent shader. |
+ // FIXME: convert all clients to DisplayList and drop the Image tile code. |
if (!m_tileImage) { |
- m_pattern = adoptRef(new SkColorShader(SK_ColorTRANSPARENT)); |
+ if (m_tileDisplayList) { |
+ // All current display list clients use RepeatModeXY, so we only support this mode. |
+ ASSERT(m_repeatMode == RepeatModeXY); |
+ |
+ SkRect tileBounds = SkRect::MakeWH(m_tileDisplayList->bounds().width(), |
+ m_tileDisplayList->bounds().height()); |
+ m_pattern = adoptRef(SkShader::CreatePictureShader(m_tileDisplayList->picture(), |
+ SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &localMatrix, &tileBounds)); |
+ } else { |
+ 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)); |
+ 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 |