| 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
|
|
|