diff options
author | fmalita <fmalita@chromium.org> | 2015-09-25 09:15:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-25 09:15:55 -0700 |
commit | 2f5891ea6460675b3c8d08684e1fa8b239bc0a14 (patch) | |
tree | b67a41b8f44935eb74ec797388e4021951b00bfc | |
parent | d114645d931d4e95a938597a45a270f211273c17 (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.cpp | 1 | ||||
-rw-r--r-- | gm/bigtileimagefilter.cpp | 34 | ||||
-rw-r--r-- | gm/bitmapsource.cpp | 77 | ||||
-rw-r--r-- | gm/colorcube.cpp | 1 | ||||
-rw-r--r-- | gm/filterfastbounds.cpp | 21 | ||||
-rw-r--r-- | gm/imagefilterscropped.cpp | 1 | ||||
-rw-r--r-- | gm/imagefilterstransformed.cpp | 60 | ||||
-rw-r--r-- | gyp/effects.gypi | 2 | ||||
-rw-r--r-- | gyp/utils.gypi | 2 | ||||
-rw-r--r-- | include/core/SkBitmap.h | 1 | ||||
-rw-r--r-- | include/core/SkPicture.h | 3 | ||||
-rw-r--r-- | include/effects/SkBitmapSource.h | 45 | ||||
-rw-r--r-- | src/effects/SkBitmapSource.cpp | 110 | ||||
-rw-r--r-- | src/ports/SkGlobalInitialization_chromium.cpp | 4 | ||||
-rw-r--r-- | src/ports/SkGlobalInitialization_default.cpp | 4 | ||||
-rw-r--r-- | src/utils/SkBitmapSourceDeserializer.cpp | 34 | ||||
-rw-r--r-- | src/utils/SkBitmapSourceDeserializer.h | 21 |
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 |