| Index: src/image/SkImage_Gpu.cpp
|
| diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
|
| index b1f78513ecfe394e1f1a1d6ba5e241add7426836..4cbc2fef0347d2dce4394be2116e20c6254d3ff4 100644
|
| --- a/src/image/SkImage_Gpu.cpp
|
| +++ b/src/image/SkImage_Gpu.cpp
|
| @@ -24,7 +24,13 @@ SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrText
|
| , fAlphaType(at)
|
| , fBudgeted(budgeted)
|
| , fAddedRasterVersionToCache(false)
|
| - {}
|
| +{
|
| + // At the moment, we can't handle general transformations on textures (e.g. tiling,
|
| + // mip/filtering) unless they are exactly sized to match the "logical" size (image size).
|
| + // Hence these asserts.
|
| + SkASSERT(tex->width() == w);
|
| + SkASSERT(tex->height() == h);
|
| +}
|
|
|
| SkImage_Gpu::~SkImage_Gpu() {
|
| if (fAddedRasterVersionToCache.load()) {
|
| @@ -187,10 +193,10 @@ SkImage* SkImage_Gpu::onNewSubset(const SkIRect& subset) const {
|
| #include "SkImageFilter.h"
|
|
|
| class SkGpuImageFilterProxy : public SkImageFilter::Proxy {
|
| - GrContext* fCtx;
|
| -
|
| public:
|
| - SkGpuImageFilterProxy(GrContext* ctx) : fCtx(ctx) {}
|
| + SkGpuImageFilterProxy(GrContext* ctx, bool requireExactTexSize)
|
| + : INHERITED(requireExactTexSize), fCtx(ctx)
|
| + {}
|
|
|
| SkBaseDevice* createDevice(int width, int height) override {
|
| GrSurfaceDesc desc;
|
| @@ -216,6 +222,11 @@ public:
|
| return filter->canFilterImageGPU() &&
|
| filter->filterImageGPU(this, src, ctx, dst, offset);
|
| }
|
| +
|
| +private:
|
| + GrContext* fCtx;
|
| +
|
| + typedef Proxy INHERITED;
|
| };
|
|
|
| static SkIRect compute_fast_ibounds(SkImageFilter* filter, const SkIRect& srcBounds) {
|
| @@ -233,10 +244,14 @@ SkImage* SkImage_Gpu::onApplyFilter(SkImageFilter* filter, SkIPoint* offsetResul
|
| SkBitmap src;
|
| GrWrapTextureInBitmap(fTexture, this->width(), this->height(), this->isOpaque(), &src);
|
|
|
| - const SkIRect clipBounds = srcBounds;
|
| - SkGpuImageFilterProxy proxy(fTexture->getContext());
|
| + // Since we want to return an image that wraps the filter's texture, and our clients
|
| + // assume (at the moment) that the image can be scaled/tiled etc., we must have an exact
|
| + // sized texture (matching the image's logical size). Hence we pass true to the Proxy's
|
| + // constructor.
|
| + const bool kRequireExactTexSize = true;
|
| + SkGpuImageFilterProxy proxy(fTexture->getContext(), kRequireExactTexSize);
|
| SkAutoTUnref<SkImageFilter::Cache> cache(SkGpuDevice::NewImageFilterCache());
|
| - SkImageFilter::Context ctx(SkMatrix::I(), clipBounds, cache);
|
| + SkImageFilter::Context ctx(SkMatrix::I(), srcBounds, cache);
|
|
|
| SkBitmap dst;
|
| if (!filter->filterImage(&proxy, src, ctx, &dst, offsetResult)) {
|
|
|