Chromium Code Reviews| 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 |