Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Unified Diff: Source/platform/graphics/Pattern.cpp

Issue 453653003: [SVG] DisplayList-based patterns. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 9 tests marked for rebaseline Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« Source/core/rendering/svg/SVGRenderingContext.cpp ('K') | « Source/platform/graphics/Pattern.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698