| Index: src/core/SkSpecialImage.cpp
|
| diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp
|
| index 681c224ad841ec1d64cada400780f97dffcc43d2..abac9471cd1d6b2eb018bad41942160150cd0560 100644
|
| --- a/src/core/SkSpecialImage.cpp
|
| +++ b/src/core/SkSpecialImage.cpp
|
| @@ -15,12 +15,14 @@
|
| #include "SkCanvas.h"
|
| #include "SkImage_Base.h"
|
| #include "SkSpecialSurface.h"
|
| +#include "SkSurfacePriv.h"
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| class SkSpecialImage_Base : public SkSpecialImage {
|
| public:
|
| - SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint32_t uniqueID)
|
| - : INHERITED(proxy, subset, uniqueID) {
|
| + SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint32_t uniqueID,
|
| + const SkSurfaceProps* props)
|
| + : INHERITED(proxy, subset, uniqueID, props) {
|
| }
|
| virtual ~SkSpecialImage_Base() { }
|
|
|
| @@ -52,6 +54,16 @@ static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) {
|
| return static_cast<const SkSpecialImage_Base*>(image);
|
| }
|
|
|
| +SkSpecialImage::SkSpecialImage(SkImageFilter::Proxy* proxy,
|
| + const SkIRect& subset,
|
| + uint32_t uniqueID,
|
| + const SkSurfaceProps* props)
|
| + : fProps(SkSurfacePropsCopyOrDefault(props))
|
| + , fSubset(subset)
|
| + , fUniqueID(kNeedNewImageUniqueID_SpecialImage == uniqueID ? SkNextID::ImageID() : uniqueID)
|
| + , fProxy(proxy) {
|
| +}
|
| +
|
| sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* proxy,
|
| GrContext* context) {
|
| #if SK_SUPPORT_GPU
|
| @@ -68,7 +80,7 @@ sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* pro
|
| }
|
|
|
| if (bmp.empty()) {
|
| - return SkSpecialImage::MakeFromRaster(proxy, SkIRect::MakeEmpty(), bmp);
|
| + return SkSpecialImage::MakeFromRaster(proxy, SkIRect::MakeEmpty(), bmp, &this->props());
|
| }
|
|
|
| SkAutoTUnref<GrTexture> resultTex(
|
| @@ -82,7 +94,7 @@ sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* pro
|
| return SkSpecialImage::MakeFromGpu(proxy,
|
| SkIRect::MakeWH(resultTex->width(), resultTex->height()),
|
| this->uniqueID(),
|
| - resultTex, at);
|
| + resultTex, &this->props(), at);
|
| #else
|
| return nullptr;
|
| #endif
|
| @@ -126,16 +138,18 @@ sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const {
|
| #endif
|
|
|
| sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* proxy,
|
| - const SkBitmap& src) {
|
| + const SkBitmap& src,
|
| + const SkSurfaceProps* props) {
|
| // Need to test offset case! (see skbug.com/4967)
|
| if (src.getTexture()) {
|
| return SkSpecialImage::MakeFromGpu(proxy,
|
| src.bounds(),
|
| src.getGenerationID(),
|
| - src.getTexture());
|
| + src.getTexture(),
|
| + props);
|
| }
|
|
|
| - return SkSpecialImage::MakeFromRaster(proxy, src.bounds(), src);
|
| + return SkSpecialImage::MakeFromRaster(proxy, src.bounds(), src, props);
|
| }
|
|
|
| bool SkSpecialImage::internal_getBM(SkBitmap* result) {
|
| @@ -160,8 +174,9 @@ class SkSpecialImage_Image : public SkSpecialImage_Base {
|
| public:
|
| SkSpecialImage_Image(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| - sk_sp<SkImage> image)
|
| - : INHERITED(proxy, subset, image->uniqueID())
|
| + sk_sp<SkImage> image,
|
| + const SkSurfaceProps* props)
|
| + : INHERITED(proxy, subset, image->uniqueID(), props)
|
| , fImage(image) {
|
| }
|
|
|
| @@ -240,7 +255,8 @@ public:
|
|
|
| return SkSpecialImage::MakeFromImage(this->internal_getProxy(),
|
| SkIRect::MakeWH(subset.width(), subset.height()),
|
| - subsetImg);
|
| + subsetImg,
|
| + &this->props());
|
| }
|
|
|
| sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override {
|
| @@ -279,10 +295,11 @@ static bool rect_fits(const SkIRect& rect, int width, int height) {
|
|
|
| sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| - sk_sp<SkImage> image) {
|
| + sk_sp<SkImage> image,
|
| + const SkSurfaceProps* props) {
|
| SkASSERT(rect_fits(subset, image->width(), image->height()));
|
|
|
| - return sk_make_sp<SkSpecialImage_Image>(proxy, subset, image);
|
| + return sk_make_sp<SkSpecialImage_Image>(proxy, subset, image, props);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -292,8 +309,9 @@ sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(SkImageFilter::Proxy* proxy,
|
|
|
| class SkSpecialImage_Raster : public SkSpecialImage_Base {
|
| public:
|
| - SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, const SkBitmap& bm)
|
| - : INHERITED(proxy, subset, bm.getGenerationID())
|
| + SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, const SkBitmap& bm,
|
| + const SkSurfaceProps* props)
|
| + : INHERITED(proxy, subset, bm.getGenerationID(), props)
|
| , fBitmap(bm) {
|
| if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) {
|
| // we only preemptively lock if there is no chance of triggering something expensive
|
| @@ -306,8 +324,9 @@ public:
|
| const SkIRect& subset,
|
| const SkPixmap& pixmap,
|
| RasterReleaseProc releaseProc,
|
| - ReleaseContext context)
|
| - : INHERITED(proxy, subset, kNeedNewImageUniqueID_SpecialImage) {
|
| + ReleaseContext context,
|
| + const SkSurfaceProps* props)
|
| + : INHERITED(proxy, subset, kNeedNewImageUniqueID_SpecialImage, props) {
|
| fBitmap.installPixels(pixmap.info(), pixmap.writable_addr(),
|
| pixmap.rowBytes(), pixmap.ctable(),
|
| releaseProc, context);
|
| @@ -364,7 +383,8 @@ public:
|
|
|
| return SkSpecialImage::MakeFromRaster(this->internal_getProxy(),
|
| SkIRect::MakeWH(subset.width(), subset.height()),
|
| - subsetBM);
|
| + subsetBM,
|
| + &this->props());
|
| }
|
|
|
| sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override {
|
| @@ -389,23 +409,25 @@ private:
|
|
|
| sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| - const SkBitmap& bm) {
|
| + const SkBitmap& bm,
|
| + const SkSurfaceProps* props) {
|
| SkASSERT(nullptr == bm.getTexture());
|
| SkASSERT(rect_fits(subset, bm.width(), bm.height()));
|
|
|
| - return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, bm);
|
| + return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, bm, props);
|
| }
|
|
|
| sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| const SkPixmap& src,
|
| RasterReleaseProc releaseProc,
|
| - ReleaseContext context) {
|
| + ReleaseContext context,
|
| + const SkSurfaceProps* props) {
|
| if (!src.addr()) {
|
| return nullptr;
|
| }
|
|
|
| - return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, src, releaseProc, context);
|
| + return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, src, releaseProc, context, props);
|
| }
|
|
|
|
|
| @@ -417,8 +439,9 @@ sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(SkImageFilter::Proxy* proxy
|
| class SkSpecialImage_Gpu : public SkSpecialImage_Base {
|
| public:
|
| SkSpecialImage_Gpu(SkImageFilter::Proxy* proxy, const SkIRect& subset,
|
| - uint32_t uniqueID, GrTexture* tex, SkAlphaType at)
|
| - : INHERITED(proxy, subset, uniqueID)
|
| + uint32_t uniqueID, GrTexture* tex, SkAlphaType at,
|
| + const SkSurfaceProps* props)
|
| + : INHERITED(proxy, subset, uniqueID, props)
|
| , fTexture(SkRef(tex))
|
| , fAlphaType(at) {
|
| }
|
| @@ -496,6 +519,7 @@ public:
|
| subset,
|
| this->uniqueID(),
|
| fTexture,
|
| + &this->props(),
|
| fAlphaType);
|
| }
|
|
|
| @@ -539,9 +563,10 @@ sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| uint32_t uniqueID,
|
| GrTexture* tex,
|
| + const SkSurfaceProps* props,
|
| SkAlphaType at) {
|
| SkASSERT(rect_fits(subset, tex->width(), tex->height()));
|
| - return sk_make_sp<SkSpecialImage_Gpu>(proxy, subset, uniqueID, tex, at);
|
| + return sk_make_sp<SkSpecialImage_Gpu>(proxy, subset, uniqueID, tex, at, props);
|
| }
|
|
|
| #else
|
| @@ -550,6 +575,7 @@ sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy,
|
| const SkIRect& subset,
|
| uint32_t uniqueID,
|
| GrTexture* tex,
|
| + const SkSurfaceProps* props,
|
| SkAlphaType at) {
|
| return nullptr;
|
| }
|
|
|