aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2015-09-25 09:15:55 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-25 09:15:55 -0700
commit2f5891ea6460675b3c8d08684e1fa8b239bc0a14 (patch)
treeb67a41b8f44935eb74ec797388e4021951b00bfc
parentd114645d931d4e95a938597a45a270f211273c17 (diff)
Remove SkBitmapSource
To avoid breaking existing SKPs, add a deserialization stub which unflattens SkBitmapSource records to SkImageSources. R=reed@google.com,mtklein@google.com,robertphillips@google.com Review URL: https://codereview.chromium.org/1363913002
-rw-r--r--bench/LightingBench.cpp1
-rw-r--r--gm/bigtileimagefilter.cpp34
-rw-r--r--gm/bitmapsource.cpp77
-rw-r--r--gm/colorcube.cpp1
-rw-r--r--gm/filterfastbounds.cpp21
-rw-r--r--gm/imagefilterscropped.cpp1
-rw-r--r--gm/imagefilterstransformed.cpp60
-rw-r--r--gyp/effects.gypi2
-rw-r--r--gyp/utils.gypi2
-rw-r--r--include/core/SkBitmap.h1
-rw-r--r--include/core/SkPicture.h3
-rw-r--r--include/effects/SkBitmapSource.h45
-rw-r--r--src/effects/SkBitmapSource.cpp110
-rw-r--r--src/ports/SkGlobalInitialization_chromium.cpp4
-rw-r--r--src/ports/SkGlobalInitialization_default.cpp4
-rw-r--r--src/utils/SkBitmapSourceDeserializer.cpp34
-rw-r--r--src/utils/SkBitmapSourceDeserializer.h21
17 files changed, 125 insertions, 296 deletions
diff --git a/bench/LightingBench.cpp b/bench/LightingBench.cpp
index ce6c11989d..e65362b123 100644
--- a/bench/LightingBench.cpp
+++ b/bench/LightingBench.cpp
@@ -5,7 +5,6 @@
* found in the LICENSE file.
*/
#include "Benchmark.h"
-#include "SkBitmapSource.h"
#include "SkCanvas.h"
#include "SkDevice.h"
#include "SkLightingImageFilter.h"
diff --git a/gm/bigtileimagefilter.cpp b/gm/bigtileimagefilter.cpp
index 3c55b71410..20c462b744 100644
--- a/gm/bigtileimagefilter.cpp
+++ b/gm/bigtileimagefilter.cpp
@@ -5,21 +5,24 @@
* found in the LICENSE file.
*/
-#include "SkBitmapSource.h"
+#include "SkImageSource.h"
+#include "SkSurface.h"
#include "SkTileImageFilter.h"
#include "gm.h"
-static void create_circle_texture(SkBitmap* bm, SkColor color) {
- SkCanvas canvas(*bm);
- canvas.clear(0xFF000000);
+static SkImage* create_circle_texture(int size, SkColor color) {
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(size, size));
+ SkCanvas* canvas = surface->getCanvas();
+ canvas->clear(0xFF000000);
SkPaint paint;
paint.setColor(color);
paint.setStrokeWidth(3);
paint.setStyle(SkPaint::kStroke_Style);
- canvas.drawCircle(SkScalarHalf(bm->width()), SkScalarHalf(bm->height()),
- SkScalarHalf(bm->width()), paint);
+ canvas->drawCircle(SkScalarHalf(size), SkScalarHalf(size), SkScalarHalf(size), paint);
+
+ return surface->newImageSnapshot();
}
namespace skiagm {
@@ -41,11 +44,8 @@ protected:
}
void onOnceBeforeDraw() override {
- fRedBitmap.allocN32Pixels(kBitmapSize, kBitmapSize);
- create_circle_texture(&fRedBitmap, SK_ColorRED);
-
- fGreenBitmap.allocN32Pixels(kBitmapSize, kBitmapSize);
- create_circle_texture(&fGreenBitmap, SK_ColorGREEN);
+ fRedImage.reset(create_circle_texture(kBitmapSize, SK_ColorRED));
+ fGreenImage.reset(create_circle_texture(kBitmapSize, SK_ColorGREEN));
}
void onDraw(SkCanvas* canvas) override {
@@ -55,11 +55,11 @@ protected:
SkPaint p;
SkRect bound = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
- SkAutoTUnref<SkBitmapSource> bms(SkBitmapSource::Create(fRedBitmap));
+ SkAutoTUnref<SkImageFilter> imageSource(SkImageSource::Create(fRedImage));
SkAutoTUnref<SkTileImageFilter> tif(SkTileImageFilter::Create(
SkRect::MakeWH(SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)),
SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight)),
- bms));
+ imageSource));
p.setImageFilter(tif);
canvas->saveLayer(&bound, &p);
@@ -84,8 +84,8 @@ protected:
SkRect bound3 = SkRect::MakeXYWH(320, 320,
SkIntToScalar(kBitmapSize),
SkIntToScalar(kBitmapSize));
- canvas->drawBitmapRect(fGreenBitmap, bound2, bound3, nullptr,
- SkCanvas::kStrict_SrcRectConstraint);
+ canvas->drawImageRect(fGreenImage, bound2, bound3, nullptr,
+ SkCanvas::kStrict_SrcRectConstraint);
canvas->restore();
}
}
@@ -95,8 +95,8 @@ private:
static const int kHeight = 512;
static const int kBitmapSize = 64;
- SkBitmap fRedBitmap;
- SkBitmap fGreenBitmap;
+ SkAutoTUnref<SkImage> fRedImage;
+ SkAutoTUnref<SkImage> fGreenImage;
typedef GM INHERITED;
};
diff --git a/gm/bitmapsource.cpp b/gm/bitmapsource.cpp
deleted file mode 100644
index 155785b200..0000000000
--- a/gm/bitmapsource.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gm.h"
-
-#include "SkBitmapSource.h"
-
-// This GM exercises the SkBitmapSource ImageFilter class.
-
-class BitmapSourceGM : public skiagm::GM {
-public:
- BitmapSourceGM() {
- }
-
-protected:
- SkString onShortName() override {
- return SkString("bitmapsource");
- }
-
- SkISize onISize() override { return SkISize::Make(500, 150); }
-
- void onOnceBeforeDraw() override {
- fBitmap = sk_tool_utils::create_string_bitmap(100, 100, 0xFFFFFFFF, 20, 70, 96, "e");
- }
-
- static void FillRectFiltered(SkCanvas* canvas, const SkRect& clipRect, SkImageFilter* filter) {
- SkPaint paint;
- paint.setImageFilter(filter);
- canvas->save();
- canvas->clipRect(clipRect);
- canvas->drawPaint(paint);
- canvas->restore();
- }
-
- void onDraw(SkCanvas* canvas) override {
- canvas->clear(SK_ColorBLACK);
- {
- SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
- SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
- SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
- SkRect bounds;
- fBitmap.getBounds(&bounds);
- SkAutoTUnref<SkImageFilter> bitmapSource(SkBitmapSource::Create(fBitmap));
- SkAutoTUnref<SkImageFilter> bitmapSourceSrcRect(SkBitmapSource::Create(fBitmap, srcRect, srcRect));
- SkAutoTUnref<SkImageFilter> bitmapSourceSrcRectDstRect(SkBitmapSource::Create(fBitmap, srcRect, dstRect));
- SkAutoTUnref<SkImageFilter> bitmapSourceDstRectOnly(SkBitmapSource::Create(fBitmap, bounds, dstRect));
-
- // Draw an unscaled bitmap.
- FillRectFiltered(canvas, clipRect, bitmapSource);
- canvas->translate(SkIntToScalar(100), 0);
-
- // Draw an unscaled subset of the source bitmap (srcRect -> srcRect).
- FillRectFiltered(canvas, clipRect, bitmapSourceSrcRect);
- canvas->translate(SkIntToScalar(100), 0);
-
- // Draw a subset of the bitmap scaled to a destination rect (srcRect -> dstRect).
- FillRectFiltered(canvas, clipRect, bitmapSourceSrcRectDstRect);
- canvas->translate(SkIntToScalar(100), 0);
-
- // Draw the entire bitmap scaled to a destination rect (bounds -> dstRect).
- FillRectFiltered(canvas, clipRect, bitmapSourceDstRectOnly);
- canvas->translate(SkIntToScalar(100), 0);
- }
- }
-
-private:
- SkBitmap fBitmap;
- typedef GM INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-DEF_GM( return new BitmapSourceGM; )
diff --git a/gm/colorcube.cpp b/gm/colorcube.cpp
index 18de813134..519f88a6a5 100644
--- a/gm/colorcube.cpp
+++ b/gm/colorcube.cpp
@@ -7,7 +7,6 @@
#include "gm.h"
#include "SkColorCubeFilter.h"
-#include "SkBitmapSource.h"
#include "SkData.h"
#include "SkGradientShader.h"
diff --git a/gm/filterfastbounds.cpp b/gm/filterfastbounds.cpp
index fe06ff1049..dcff05bfcc 100644
--- a/gm/filterfastbounds.cpp
+++ b/gm/filterfastbounds.cpp
@@ -6,13 +6,14 @@
*/
#include "gm.h"
-#include "SkBitmapSource.h"
#include "SkBlurImageFilter.h"
#include "SkDropShadowImageFilter.h"
+#include "SkImageSource.h"
#include "SkOffsetImageFilter.h"
#include "SkPictureImageFilter.h"
#include "SkPictureRecorder.h"
#include "SkRandom.h"
+#include "SkSurface.h"
namespace skiagm {
@@ -251,24 +252,24 @@ protected:
create_paints(pif, &pifPaints);
//-----------
- // Paints with a BitmapSource as a source
- SkBitmap bm;
+ // Paints with a SkImageSource as a source
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(10, 10));
{
SkPaint p;
- bm.allocN32Pixels(10, 10);
- SkCanvas temp(bm);
- temp.clear(SK_ColorYELLOW);
+ SkCanvas* temp = surface->getCanvas();
+ temp->clear(SK_ColorYELLOW);
p.setColor(SK_ColorBLUE);
- temp.drawRect(SkRect::MakeLTRB(5, 5, 10, 10), p);
+ temp->drawRect(SkRect::MakeLTRB(5, 5, 10, 10), p);
p.setColor(SK_ColorGREEN);
- temp.drawRect(SkRect::MakeLTRB(5, 0, 10, 5), p);
+ temp->drawRect(SkRect::MakeLTRB(5, 0, 10, 5), p);
}
- SkAutoTUnref<SkBitmapSource> bms(SkBitmapSource::Create(bm));
+ SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
+ SkAutoTUnref<SkImageFilter> imageSource(SkImageSource::Create(image));
SkTArray<SkPaint> bmsPaints;
- create_paints(bms, &bmsPaints);
+ create_paints(imageSource, &bmsPaints);
//-----------
SkASSERT(paints.count() == kNumVertTiles);
diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp
index 92e45ea499..82d538999f 100644
--- a/gm/imagefilterscropped.cpp
+++ b/gm/imagefilterscropped.cpp
@@ -14,7 +14,6 @@
#include "SkBlurImageFilter.h"
#include "SkMorphologyImageFilter.h"
#include "SkColorFilterImageFilter.h"
-#include "SkBitmapSource.h"
#include "SkMergeImageFilter.h"
#include "SkOffsetImageFilter.h"
#include "SkTestImageFilters.h"
diff --git a/gm/imagefilterstransformed.cpp b/gm/imagefilterstransformed.cpp
index c6ff5a7931..8e59b9242c 100644
--- a/gm/imagefilterstransformed.cpp
+++ b/gm/imagefilterstransformed.cpp
@@ -6,14 +6,16 @@
*/
#include "sk_tool_utils.h"
-#include "SkBitmapSource.h"
#include "SkBlurImageFilter.h"
#include "SkColor.h"
#include "SkDisplacementMapEffect.h"
#include "SkDropShadowImageFilter.h"
#include "SkGradientShader.h"
+#include "SkImage.h"
+#include "SkImageSource.h"
#include "SkMorphologyImageFilter.h"
#include "SkScalar.h"
+#include "SkSurface.h"
#include "gm.h"
namespace skiagm {
@@ -22,6 +24,29 @@ namespace skiagm {
// It checks that the scale portion of the CTM is correctly extracted
// and applied to the image inputs separately from the non-scale portion.
+static SkImage* make_gradient_circle(int width, int height) {
+ SkScalar x = SkIntToScalar(width / 2);
+ SkScalar y = SkIntToScalar(height / 2);
+ SkScalar radius = SkMinScalar(x, y) * 0.8f;
+
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(width, height));
+ SkCanvas* canvas = surface->getCanvas();
+
+ canvas->clear(0x00000000);
+ SkColor colors[2];
+ colors[0] = SK_ColorWHITE;
+ colors[1] = SK_ColorBLACK;
+ SkAutoTUnref<SkShader> shader(
+ SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, nullptr, 2,
+ SkShader::kClamp_TileMode)
+ );
+ SkPaint paint;
+ paint.setShader(shader);
+ canvas->drawCircle(x, y, radius, paint);
+
+ return surface->newImageSnapshot();
+}
+
class ImageFiltersTransformedGM : public GM {
public:
ImageFiltersTransformedGM() {
@@ -34,34 +59,15 @@ protected:
SkISize onISize() override { return SkISize::Make(420, 240); }
- void makeGradientCircle(int width, int height) {
- SkScalar x = SkIntToScalar(width / 2);
- SkScalar y = SkIntToScalar(height / 2);
- SkScalar radius = SkMinScalar(x, y) * 0.8f;
- fGradientCircle.allocN32Pixels(width, height);
- SkCanvas canvas(fGradientCircle);
- canvas.clear(0x00000000);
- SkColor colors[2];
- colors[0] = SK_ColorWHITE;
- colors[1] = SK_ColorBLACK;
- SkAutoTUnref<SkShader> shader(
- SkGradientShader::CreateRadial(SkPoint::Make(x, y), radius, colors, nullptr, 2,
- SkShader::kClamp_TileMode)
- );
- SkPaint paint;
- paint.setShader(shader);
- canvas.drawCircle(x, y, radius, paint);
- }
-
void onOnceBeforeDraw() override {
- fCheckerboard = sk_tool_utils::create_checkerboard_bitmap(64, 64,
- 0xFFA0A0A0, 0xFF404040, 8);
- this->makeGradientCircle(64, 64);
+ fCheckerboard.reset(SkImage::NewFromBitmap(
+ sk_tool_utils::create_checkerboard_bitmap(64, 64, 0xFFA0A0A0, 0xFF404040, 8)));
+ fGradientCircle.reset(make_gradient_circle(64, 64));
}
void onDraw(SkCanvas* canvas) override {
- SkAutoTUnref<SkImageFilter> gradient(SkBitmapSource::Create(fGradientCircle));
- SkAutoTUnref<SkImageFilter> checkerboard(SkBitmapSource::Create(fCheckerboard));
+ SkAutoTUnref<SkImageFilter> gradient(SkImageSource::Create(fGradientCircle));
+ SkAutoTUnref<SkImageFilter> checkerboard(SkImageSource::Create(fCheckerboard));
SkImageFilter* filters[] = {
SkBlurImageFilter::Create(12, 0),
SkDropShadowImageFilter::Create(0, 15, 8, 0, SK_ColorGREEN,
@@ -110,8 +116,8 @@ protected:
}
private:
- SkBitmap fCheckerboard;
- SkBitmap fGradientCircle;
+ SkAutoTUnref<SkImage> fCheckerboard;
+ SkAutoTUnref<SkImage> fGradientCircle;
typedef GM INHERITED;
};
diff --git a/gyp/effects.gypi b/gyp/effects.gypi
index 5be4370af8..4c0ca575aa 100644
--- a/gyp/effects.gypi
+++ b/gyp/effects.gypi
@@ -21,7 +21,6 @@
'<(skia_src_path)/effects/SkArithmeticMode.cpp',
'<(skia_src_path)/effects/SkArithmeticMode_gpu.cpp',
'<(skia_src_path)/effects/SkArithmeticMode_gpu.h',
- '<(skia_src_path)/effects/SkBitmapSource.cpp',
'<(skia_src_path)/effects/SkBlurDrawLooper.cpp',
'<(skia_src_path)/effects/SkBlurMask.cpp',
'<(skia_src_path)/effects/SkBlurMask.h',
@@ -88,7 +87,6 @@
'<(skia_include_path)/effects/Sk2DPathEffect.h',
'<(skia_include_path)/effects/SkAlphaThresholdFilter.h',
'<(skia_include_path)/effects/SkArithmeticMode.h',
- '<(skia_include_path)/effects/SkBitmapSource.h',
'<(skia_include_path)/effects/SkBlurDrawLooper.h',
'<(skia_include_path)/effects/SkBlurImageFilter.h',
'<(skia_include_path)/effects/SkBlurMaskFilter.h',
diff --git a/gyp/utils.gypi b/gyp/utils.gypi
index e2abc03d5a..089e3fc3a8 100644
--- a/gyp/utils.gypi
+++ b/gyp/utils.gypi
@@ -41,6 +41,8 @@
'<(skia_src_path)/utils/SkBase64.h',
'<(skia_src_path)/utils/SkBitmapHasher.cpp',
'<(skia_src_path)/utils/SkBitmapHasher.h',
+ '<(skia_src_path)/utils/SkBitmapSourceDeserializer.cpp',
+ '<(skia_src_path)/utils/SkBitmapSourceDeserializer.h',
'<(skia_src_path)/utils/SkBitSet.cpp',
'<(skia_src_path)/utils/SkBitSet.h',
'<(skia_src_path)/utils/SkBoundaryPatch.cpp',
diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h
index 2c5a506826..eda13b3c52 100644
--- a/include/core/SkBitmap.h
+++ b/include/core/SkBitmap.h
@@ -754,7 +754,6 @@ private:
static void WriteRawPixels(SkWriteBuffer*, const SkBitmap&);
static bool ReadRawPixels(SkReadBuffer*, SkBitmap*);
- friend class SkBitmapSource; // unflatten
friend class SkReadBuffer; // unflatten, rawpixels
friend class SkWriteBuffer; // rawpixels
friend struct SkBitmapProcState;
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 61a584b61d..720747e9a3 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -192,6 +192,9 @@ private:
static_assert(MIN_PICTURE_VERSION <= 42,
"Remove COMMENT API handlers from SkPicturePlayback.cpp");
+ static_assert(MIN_PICTURE_VERSION <= 43,
+ "Remove SkBitmapSourceDeserializer.");
+
static bool IsValidPictInfo(const SkPictInfo& info);
static SkPicture* Forwardport(const SkPictInfo&, const SkPictureData*);
diff --git a/include/effects/SkBitmapSource.h b/include/effects/SkBitmapSource.h
deleted file mode 100644
index 38b13020eb..0000000000
--- a/include/effects/SkBitmapSource.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2012 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SkBitmapSource_DEFINED
-#define SkBitmapSource_DEFINED
-
-#include "SkImageFilter.h"
-#include "SkBitmap.h"
-
-class SK_API SkBitmapSource : public SkImageFilter {
-public:
- static SkBitmapSource* Create(const SkBitmap& bitmap) { return new SkBitmapSource(bitmap); }
- static SkBitmapSource* Create(const SkBitmap& bitmap,
- const SkRect& srcRect, const SkRect& dstRect,
- SkFilterQuality filterQuality = kHigh_SkFilterQuality) {
- return new SkBitmapSource(bitmap, srcRect, dstRect, filterQuality);
- }
- void computeFastBounds(const SkRect& src, SkRect* dst) const override;
-
- SK_TO_STRING_OVERRIDE()
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
-
-protected:
- explicit SkBitmapSource(const SkBitmap& bitmap);
- SkBitmapSource(const SkBitmap& bitmap,
- const SkRect& srcRect, const SkRect& dstRect,
- SkFilterQuality filterQuality);
- void flatten(SkWriteBuffer&) const override;
-
- bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
- SkBitmap* result, SkIPoint* offset) const override;
-
-private:
- SkBitmap fBitmap;
- SkRect fSrcRect, fDstRect;
- SkFilterQuality fFilterQuality;
-
- typedef SkImageFilter INHERITED;
-};
-
-#endif
diff --git a/src/effects/SkBitmapSource.cpp b/src/effects/SkBitmapSource.cpp
deleted file mode 100644
index 5b1934f68a..0000000000
--- a/src/effects/SkBitmapSource.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2012 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkBitmapSource.h"
-#include "SkDevice.h"
-#include "SkCanvas.h"
-#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
-#include "SkValidationUtils.h"
-
-SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap)
- : INHERITED(0, 0)
- , fBitmap(bitmap)
- , fSrcRect(SkRect::MakeWH(SkIntToScalar(bitmap.width()),
- SkIntToScalar(bitmap.height())))
- , fDstRect(fSrcRect)
- , fFilterQuality(kHigh_SkFilterQuality) {
-}
-
-SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap,
- const SkRect& srcRect, const SkRect& dstRect,
- SkFilterQuality filterQuality)
- : INHERITED(0, 0)
- , fBitmap(bitmap)
- , fSrcRect(srcRect)
- , fDstRect(dstRect)
- , fFilterQuality(filterQuality) {
-}
-
-SkFlattenable* SkBitmapSource::CreateProc(SkReadBuffer& buffer) {
- SkFilterQuality filterQuality;
- if (buffer.isVersionLT(SkReadBuffer::kBitmapSourceFilterQuality_Version)) {
- filterQuality = kHigh_SkFilterQuality;
- } else {
- filterQuality = (SkFilterQuality)buffer.readInt();
- }
- SkRect src, dst;
- buffer.readRect(&src);
- buffer.readRect(&dst);
- SkBitmap bitmap;
- if (!buffer.readBitmap(&bitmap)) {
- return nullptr;
- }
- return SkBitmapSource::Create(bitmap, src, dst, filterQuality);
-}
-
-void SkBitmapSource::flatten(SkWriteBuffer& buffer) const {
- buffer.writeInt(fFilterQuality);
- buffer.writeRect(fSrcRect);
- buffer.writeRect(fDstRect);
- buffer.writeBitmap(fBitmap);
-}
-
-bool SkBitmapSource::onFilterImage(Proxy* proxy, const SkBitmap&, const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
- SkRect bounds, dstRect;
- fBitmap.getBounds(&bounds);
- ctx.ctm().mapRect(&dstRect, fDstRect);
- if (fSrcRect == bounds && dstRect == bounds) {
- // No regions cropped out or resized; return entire bitmap.
- *result = fBitmap;
- offset->fX = offset->fY = 0;
- return true;
- }
-
- const SkIRect dstIRect = dstRect.roundOut();
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstIRect.width(), dstIRect.height()));
- if (nullptr == device.get()) {
- return false;
- }
-
- SkCanvas canvas(device.get());
- SkPaint paint;
-
- // Subtract off the integer component of the translation (will be applied in loc, below).
- dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop));
- paint.setXfermodeMode(SkXfermode::kSrc_Mode);
- // FIXME: this probably shouldn't be necessary, but drawBitmapRect asserts
- // None filtering when it's translate-only
- paint.setFilterQuality(
- fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.height() ?
- kNone_SkFilterQuality : fFilterQuality);
- canvas.drawBitmapRect(fBitmap, fSrcRect, dstRect, &paint, SkCanvas::kStrict_SrcRectConstraint);
-
- *result = device.get()->accessBitmap(false);
- offset->fX = dstIRect.fLeft;
- offset->fY = dstIRect.fTop;
-
- return true;
-}
-
-void SkBitmapSource::computeFastBounds(const SkRect&, SkRect* dst) const {
- *dst = fDstRect;
-}
-
-#ifndef SK_IGNORE_TO_STRING
-void SkBitmapSource::toString(SkString* str) const {
- str->appendf("SkBitmapSource: (");
- str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ",
- fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBottom,
- fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBottom);
- str->appendf("bitmap: (%d,%d)",
- fBitmap.width(), fBitmap.height());
- str->append(")");
-}
-#endif
diff --git a/src/ports/SkGlobalInitialization_chromium.cpp b/src/ports/SkGlobalInitialization_chromium.cpp
index e0c7d191b3..8ff43f78e8 100644
--- a/src/ports/SkGlobalInitialization_chromium.cpp
+++ b/src/ports/SkGlobalInitialization_chromium.cpp
@@ -17,7 +17,7 @@
#include "Sk2DPathEffect.h"
#include "SkArithmeticMode.h"
#include "SkArcToPathEffect.h"
-#include "SkBitmapSource.h"
+#include "SkBitmapSourceDeserializer.h"
#include "SkBlurDrawLooper.h"
#include "SkBlurImageFilter.h"
#include "SkBlurMaskFilter.h"
@@ -85,7 +85,7 @@ public:
static void Init() {
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArcToPathEffect)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapProcShader)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapSource)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapSourceDeserializer)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurDrawLooper)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurImageFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkColorCubeFilter)
diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp
index 73e4f5a902..3038e25c5d 100644
--- a/src/ports/SkGlobalInitialization_default.cpp
+++ b/src/ports/SkGlobalInitialization_default.cpp
@@ -13,7 +13,7 @@
#include "Sk2DPathEffect.h"
#include "SkArithmeticMode.h"
#include "SkArcToPathEffect.h"
-#include "SkBitmapSource.h"
+#include "SkBitmapSourceDeserializer.h"
#include "SkBlurDrawLooper.h"
#include "SkBlurImageFilter.h"
#include "SkBlurMaskFilter.h"
@@ -64,7 +64,7 @@ public:
static void Init() {
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArcToPathEffect)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapProcShader)
- SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapSource)
+ SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBitmapSourceDeserializer)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurDrawLooper)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurImageFilter)
SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkColorCubeFilter)
diff --git a/src/utils/SkBitmapSourceDeserializer.cpp b/src/utils/SkBitmapSourceDeserializer.cpp
new file mode 100644
index 0000000000..bb783bfeef
--- /dev/null
+++ b/src/utils/SkBitmapSourceDeserializer.cpp
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkBitmapSourceDeserializer.h"
+
+#include "SkBitmap.h"
+#include "SkFilterQuality.h"
+#include "SkImage.h"
+#include "SkImageSource.h"
+#include "SkReadBuffer.h"
+
+SkFlattenable* SkBitmapSourceDeserializer::CreateProc(SkReadBuffer& buffer) {
+ SkFilterQuality filterQuality;
+ if (buffer.isVersionLT(SkReadBuffer::kBitmapSourceFilterQuality_Version)) {
+ filterQuality = kHigh_SkFilterQuality;
+ } else {
+ filterQuality = (SkFilterQuality)buffer.readInt();
+ }
+ SkRect src, dst;
+ buffer.readRect(&src);
+ buffer.readRect(&dst);
+ SkBitmap bitmap;
+ if (!buffer.readBitmap(&bitmap)) {
+ return nullptr;
+ }
+ bitmap.setImmutable();
+
+ SkAutoTUnref<SkImage> image(SkImage::NewFromBitmap(bitmap));
+ return SkImageSource::Create(image, src, dst, filterQuality);
+}
diff --git a/src/utils/SkBitmapSourceDeserializer.h b/src/utils/SkBitmapSourceDeserializer.h
new file mode 100644
index 0000000000..e017599918
--- /dev/null
+++ b/src/utils/SkBitmapSourceDeserializer.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkBitmapSourceDeserializer_DEFINED
+#define SkBitmapSourceDeserializer_DEFINED
+
+#include "SkFlattenable.h"
+
+// A temporary utility class to support deserializing legacy SkBitmapSource as SkImageSource.
+// Should be removed when SKP versions which may contain SkBitmapSource records are phased out.
+class SkBitmapSourceDeserializer : public SkFlattenable {
+public:
+ SK_DEFINE_FLATTENABLE_TYPE(SkImageFilter)
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
+};
+
+#endif