aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-03-18 08:14:27 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-18 08:14:27 -0700
commit83c17fa56b23159166394cb3feb431ffafbbab48 (patch)
tree5a13d5597db58b5baccd2ac599706e1c4f24a8bd /src/core
parent2b1b40e11afc41452b4d2f74cdebb1b6e6f7cc96 (diff)
Add SkSpecialImage::makeTextureImage entry point
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkImageFilter.cpp13
-rw-r--r--src/core/SkSpecialImage.cpp40
-rw-r--r--src/core/SkSpecialImage.h11
3 files changed, 62 insertions, 2 deletions
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index 1a4c876d61..4ae839c3d4 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -596,7 +596,18 @@ SkSpecialImage* SkImageFilter::filterInput(int index,
return SkRef(src);
}
- return input->filterImage(src, this->mapContext(ctx), offset);
+ SkAutoTUnref<SkSpecialImage> result(input->filterImage(src, this->mapContext(ctx), offset));
+
+#if SK_SUPPORT_GPU
+ if (src->peekTexture() && result && !result->peekTexture()) {
+ // Keep the result on the GPU - this is still required for some
+ // image filters that don't support GPU in all cases
+ GrContext* context = src->peekTexture()->getContext();
+ return result->makeTextureImage(src->internal_getProxy(), context).release();
+ }
+#endif
+
+ return result.release();
}
#if SK_SUPPORT_GPU
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp
index e90c655a58..991e163515 100644
--- a/src/core/SkSpecialImage.cpp
+++ b/src/core/SkSpecialImage.cpp
@@ -4,10 +4,16 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file
*/
+#include "SkSpecialImage.h"
+
+#if SK_SUPPORT_GPU
+#include "GrTexture.h"
+#include "GrTextureParams.h"
+#include "SkGr.h"
+#endif
#include "SkCanvas.h"
#include "SkImage_Base.h"
-#include "SkSpecialImage.h"
#include "SkSpecialSurface.h"
///////////////////////////////////////////////////////////////////////////////
@@ -42,6 +48,38 @@ static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) {
return static_cast<const SkSpecialImage_Base*>(image);
}
+sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* proxy,
+ GrContext* context) {
+#if SK_SUPPORT_GPU
+ if (!context) {
+ return nullptr;
+ }
+ if (GrTexture* peek = as_SIB(this)->peekTexture()) {
+ return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)) : nullptr;
+ }
+
+ SkBitmap bmp;
+ if (!this->internal_getBM(&bmp)) {
+ return nullptr;
+ }
+
+ SkAutoTUnref<GrTexture> resultTex(
+ GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter()));
+ if (!resultTex) {
+ return nullptr;
+ }
+
+ SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType;
+
+ return SkSpecialImage::MakeFromGpu(proxy,
+ SkIRect::MakeWH(resultTex->width(), resultTex->height()),
+ this->uniqueID(),
+ resultTex, at);
+#else
+ return nullptr;
+#endif
+}
+
void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const {
return as_SIB(this)->onDraw(canvas, x, y, paint);
}
diff --git a/src/core/SkSpecialImage.h b/src/core/SkSpecialImage.h
index 1a01a5abc7..47ad6ccab7 100644
--- a/src/core/SkSpecialImage.h
+++ b/src/core/SkSpecialImage.h
@@ -14,12 +14,16 @@
// remove this when internal_getProxy goes away (see skbug.com/4965)
#include "SkImageFilter.h"
+#include "SkImageInfo.h" // for SkAlphaType
+
+class GrContext;
class GrTexture;
class SkBitmap;
class SkCanvas;
class SkImage;
struct SkImageInfo;
class SkPaint;
+class SkPixmap;
class SkSpecialSurface;
enum {
@@ -51,6 +55,13 @@ public:
virtual size_t getSize() const = 0;
/**
+ * Ensures that a special image is backed by a texture (when GrContext is non-null). If no
+ * transformation is required, the returned image may be the same as this special image.
+ * If this special image is from a different GrContext, this will fail.
+ */
+ sk_sp<SkSpecialImage> makeTextureImage(SkImageFilter::Proxy*, GrContext*);
+
+ /**
* Draw this SpecialImage into the canvas.
*/
void draw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const;