diff --git a/gyp/core.gypi b/gyp/core.gypi index fe14d9656a..710a8e4378 100644 --- a/gyp/core.gypi +++ b/gyp/core.gypi @@ -254,8 +254,6 @@ '<(skia_src_path)/image/SkImage_Generator.cpp', # '<(skia_src_path)/image/SkImage_Gpu.cpp', '<(skia_src_path)/image/SkImage_Raster.cpp', - '<(skia_src_path)/image/SkImageShader.cpp', - '<(skia_src_path)/image/SkImageShader.h', '<(skia_src_path)/image/SkSurface.cpp', '<(skia_src_path)/image/SkSurface_Base.h', # '<(skia_src_path)/image/SkSurface_Gpu.cpp', diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index 975d7ba803..6f4655758e 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -11,7 +11,6 @@ #include "SkData.h" #include "SkImageGenerator.h" #include "SkImagePriv.h" -#include "SkImageShader.h" #include "SkImage_Base.h" #include "SkNextID.h" #include "SkPixelRef.h" @@ -70,7 +69,7 @@ void SkImage::preroll(GrContext* ctx) const { SkShader* SkImage::newShader(SkShader::TileMode tileX, SkShader::TileMode tileY, const SkMatrix* localMatrix) const { - return SkImageShader::Create(this, tileX, tileY, localMatrix); + return as_IB(this)->onNewShader(tileX, tileY, localMatrix); } SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const { diff --git a/src/image/SkImageShader.cpp b/src/image/SkImageShader.cpp deleted file mode 100644 index 58eddf3f7d..0000000000 --- a/src/image/SkImageShader.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - * 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 "SkBitmapProcShader.h" -#include "SkBitmapProvider.h" -#include "SkImage_Base.h" -#include "SkImageShader.h" -#include "SkReadBuffer.h" -#include "SkWriteBuffer.h" - -SkImageShader::SkImageShader(const SkImage* img, TileMode tmx, TileMode tmy, const SkMatrix* matrix) - : INHERITED(matrix) - , fImage(SkRef(img)) - , fTileModeX(tmx) - , fTileModeY(tmy) -{} - -SkFlattenable* SkImageShader::CreateProc(SkReadBuffer& buffer) { - const TileMode tx = (TileMode)buffer.readUInt(); - const TileMode ty = (TileMode)buffer.readUInt(); - SkMatrix matrix; - buffer.readMatrix(&matrix); - SkAutoTUnref img(buffer.readImage()); - if (!img) { - return nullptr; - } - return new SkImageShader(img, tx, ty, &matrix); -} - -void SkImageShader::flatten(SkWriteBuffer& buffer) const { - buffer.writeUInt(fTileModeX); - buffer.writeUInt(fTileModeY); - buffer.writeMatrix(this->getLocalMatrix()); - buffer.writeImage(fImage); -} - -bool SkImageShader::isOpaque() const { - return fImage->isOpaque(); -} - -size_t SkImageShader::contextSize() const { - return SkBitmapProcShader::ContextSize(); -} - -SkShader::Context* SkImageShader::onCreateContext(const ContextRec& rec, void* storage) const { - return SkBitmapProcShader::MakeContext(*this, fTileModeX, fTileModeY, - SkBitmapProvider(fImage), rec, storage); -} - -SkShader* SkImageShader::Create(const SkImage* image, TileMode tx, TileMode ty, - const SkMatrix* localMatrix) { - if (!image) { - return nullptr; - } - return new SkImageShader(image, tx, ty, localMatrix); -} - -#ifndef SK_IGNORE_TO_STRING -void SkImageShader::toString(SkString* str) const { - const char* gTileModeName[SkShader::kTileModeCount] = { - "clamp", "repeat", "mirror" - }; - - str->appendf("ImageShader: ((%s %s) ", gTileModeName[fTileModeX], gTileModeName[fTileModeY]); - fImage->toString(str); - this->INHERITED::toString(str); - str->append(")"); -} -#endif - -/////////////////////////////////////////////////////////////////////////////////////////////////// - -#if SK_SUPPORT_GPU - -#include "GrTextureAccess.h" -#include "SkGr.h" -#include "effects/GrSimpleTextureEffect.h" -#include "effects/GrBicubicEffect.h" -#include "effects/GrExtractAlphaFragmentProcessor.h" -#include "effects/GrSimpleTextureEffect.h" - -const GrFragmentProcessor* SkImageShader::asFragmentProcessor(GrContext* context, - const SkMatrix& viewM, - const SkMatrix* localMatrix, - SkFilterQuality filterQuality, - GrProcessorDataManager* mgr) const { - SkMatrix matrix; - matrix.setIDiv(fImage->width(), fImage->height()); - - SkMatrix lmInverse; - if (!this->getLocalMatrix().invert(&lmInverse)) { - return nullptr; - } - if (localMatrix) { - SkMatrix inv; - if (!localMatrix->invert(&inv)) { - return nullptr; - } - lmInverse.postConcat(inv); - } - matrix.preConcat(lmInverse); - - SkShader::TileMode tm[] = { fTileModeX, fTileModeY }; - - // Must set wrap and filter on the sampler before requesting a texture. In two places below - // we check the matrix scale factors to determine how to interpret the filter quality setting. - // This completely ignores the complexity of the drawVertices case where explicit local coords - // are provided by the caller. - bool doBicubic; - GrTextureParams::FilterMode textureFilterMode = - GrSkFilterQualityToGrFilterMode(filterQuality, viewM, this->getLocalMatrix(), &doBicubic); - GrTextureParams params(tm, textureFilterMode); - - SkImageUsageType usageType; - if (kClamp_TileMode == fTileModeX && kClamp_TileMode == fTileModeY) { - usageType = kUntiled_SkImageUsageType; - } else if (GrTextureParams::kNone_FilterMode == textureFilterMode) { - usageType = kTiled_Unfiltered_SkImageUsageType; - } else { - usageType = kTiled_Filtered_SkImageUsageType; - } - - SkAutoTUnref texture(as_IB(fImage)->asTextureRef(context, usageType)); - if (!texture) { - return nullptr; - } - - SkAutoTUnref inner; - if (doBicubic) { - inner.reset(GrBicubicEffect::Create(mgr, texture, matrix, tm)); - } else { - inner.reset(GrSimpleTextureEffect::Create(mgr, texture, matrix, params)); - } - - if (GrPixelConfigIsAlphaOnly(texture->config())) { - return SkRef(inner.get()); - } - return GrExtractAlphaFragmentProcessor::Create(inner); -} - -#endif diff --git a/src/image/SkImageShader.h b/src/image/SkImageShader.h deleted file mode 100644 index fdd7976aad..0000000000 --- a/src/image/SkImageShader.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 SkImageShader_DEFINED -#define SkImageShader_DEFINED - -#include "SkImage.h" -#include "SkShader.h" - -class SkImageShader : public SkShader { -public: - static SkShader* Create(const SkImage*, TileMode tx, TileMode ty, const SkMatrix* localMatrix); - - bool isOpaque() const override; - size_t contextSize() const override; - - SK_TO_STRING_OVERRIDE() - SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkImageShader) - -#if SK_SUPPORT_GPU - const GrFragmentProcessor* asFragmentProcessor(GrContext*, const SkMatrix& viewM, - const SkMatrix*, SkFilterQuality, - GrProcessorDataManager*) const override; -#endif - -protected: - void flatten(SkWriteBuffer&) const override; - Context* onCreateContext(const ContextRec&, void* storage) const override; - - SkAutoTUnref fImage; - const TileMode fTileModeX; - const TileMode fTileModeY; - -private: - SkImageShader(const SkImage*, TileMode tx, TileMode ty, const SkMatrix* localMatrix); - - typedef SkShader INHERITED; -}; - -#endif diff --git a/src/image/SkImage_Base.h b/src/image/SkImage_Base.h index bbe70a7e4a..d0cb8d5840 100644 --- a/src/image/SkImage_Base.h +++ b/src/image/SkImage_Base.h @@ -56,6 +56,10 @@ public: // Caller must call unref when they are done. virtual GrTexture* asTextureRef(GrContext*, SkImageUsageType) const = 0; + virtual SkShader* onNewShader(SkShader::TileMode, + SkShader::TileMode, + const SkMatrix* localMatrix) const { return nullptr; } + // newWidth > 0, newHeight > 0, subset either nullptr or a proper subset of this bounds virtual SkImage* onNewImage(int newWidth, int newHeight, const SkIRect* subset, SkFilterQuality) const; diff --git a/src/image/SkImage_Generator.cpp b/src/image/SkImage_Generator.cpp index f0bf7e3641..0f1fa3692c 100644 --- a/src/image/SkImage_Generator.cpp +++ b/src/image/SkImage_Generator.cpp @@ -28,6 +28,11 @@ public: bool getROPixels(SkBitmap*) const override; GrTexture* asTextureRef(GrContext*, SkImageUsageType) const override; + + SkShader* onNewShader(SkShader::TileMode, + SkShader::TileMode, + const SkMatrix* localMatrix) const override; + bool onIsLazyGenerated() const override { return true; } private: @@ -38,6 +43,17 @@ private: /////////////////////////////////////////////////////////////////////////////// +SkShader* SkImage_Generator::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY, + const SkMatrix* localMatrix) const { + // TODO: need a native Shader that takes Cacherator (or this image) so we can natively return + // textures as output from the shader. + SkBitmap bm; + if (this->getROPixels(&bm)) { + return SkShader::CreateBitmapShader(bm, tileX, tileY, localMatrix); + } + return nullptr; +} + SkSurface* SkImage_Generator::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const { return SkSurface::NewRaster(info, &props); diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 527bcc3ef5..163e62e02d 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -49,6 +49,13 @@ extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { } } +SkShader* SkImage_Gpu::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY, + const SkMatrix* localMatrix) const { + SkBitmap bm; + GrWrapTextureInBitmap(fTexture, this->width(), this->height(), this->isOpaque(), &bm); + return SkShader::CreateBitmapShader(bm, tileX, tileY, localMatrix); +} + bool SkImage_Gpu::getROPixels(SkBitmap* dst) const { if (SkBitmapCache::Find(this->uniqueID(), dst)) { SkASSERT(dst->getGenerationID() == this->uniqueID()); diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h index cc576c499c..d168fb6853 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -40,6 +40,9 @@ public: GrTexture* asTextureRef(GrContext* ctx, SkImageUsageType usage) const override; GrTexture* peekTexture() const override { return fTexture; } + SkShader* onNewShader(SkShader::TileMode, + SkShader::TileMode, + const SkMatrix* localMatrix) const override; bool isOpaque() const override; SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) const override; bool onReadPixels(const SkImageInfo&, void* dstPixels, size_t dstRowBytes, diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 18d6ba6fd7..67498f0e11 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -80,6 +80,10 @@ public: SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); } + SkShader* onNewShader(SkShader::TileMode, + SkShader::TileMode, + const SkMatrix* localMatrix) const override; + bool isOpaque() const override; bool onAsLegacyBitmap(SkBitmap*, LegacyBitmapMode) const override; @@ -140,6 +144,11 @@ SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, const SkIPoint& SkImage_Raster::~SkImage_Raster() {} +SkShader* SkImage_Raster::onNewShader(SkShader::TileMode tileX, SkShader::TileMode tileY, + const SkMatrix* localMatrix) const { + return SkShader::CreateBitmapShader(fBitmap, tileX, tileY, localMatrix); +} + SkSurface* SkImage_Raster::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) const { return SkSurface::NewRaster(info, &props); }