Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: src/image/SkImage_Gpu.cpp

Issue 1421493003: tunnel down texture-size-constraint to imagefilters (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: re-export include/gpu to clients of core.gyp Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« include/core/SkMaskFilter.h ('K') | « src/gpu/SkGpuDevice.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/image/SkImage_Gpu.cpp
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index b1f78513ecfe394e1f1a1d6ba5e241add7426836..e1834be97f55ac638d3db365a56465919466ce0e 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.
robertphillips 2015/10/21 15:29:41 kRequireExactTexSize ?
reed1 2015/10/21 17:05:51 Done.
+ const bool requireExactTexSize = true;
+ SkGpuImageFilterProxy proxy(fTexture->getContext(), requireExactTexSize);
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)) {
« include/core/SkMaskFilter.h ('K') | « src/gpu/SkGpuDevice.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698