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

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

Issue 358893002: Use newImageSnapshot() to get an image from a Canvas (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created ImagePattern and StaticBitmapImage Created 6 years, 6 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/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

Powered by Google App Engine
This is Rietveld 408576698