aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Robert Phillips <robertphillips@google.com>2017-02-17 13:28:47 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-02-17 13:29:00 +0000
commite14349a7545e7bd1e93f4c3095db8f481939b053 (patch)
treee6125d64ef731f6ea4c4455bc1ea6d008ab6e882
parent2028625f9b92b3423d841a926f785140a8955a84 (diff)
Revert "Replace SkSpecialImage::makeTightSubset with asImage"
This reverts commit 5df6db15dc04ea7f8c8fa7a7b58ecb881d7a70fe. Reason for revert: Possibly blocking Chrome DEPS roll Original change's description: > Replace SkSpecialImage::makeTightSubset with asImage > > This should allow the relanding of: > > https://skia-review.googlesource.com/c/8450/ (Remove asTextureRef from SkSpecialImage & update effects accordingly (take 2)) > > Change-Id: I517af11036e3f44a280bbe6b9275f6c38f4a86a4 > Reviewed-on: https://skia-review.googlesource.com/8498 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Robert Phillips <robertphillips@google.com> > TBR=bsalomon@google.com,robertphillips@google.com,reviews@skia.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Change-Id: Ib5bebda78b2323e65a73504a61af918872ad231f Reviewed-on: https://skia-review.googlesource.com/8607 Reviewed-by: Robert Phillips <robertphillips@google.com> Commit-Queue: Robert Phillips <robertphillips@google.com>
-rw-r--r--src/core/SkSpecialImage.cpp55
-rw-r--r--src/core/SkSpecialImage.h9
-rw-r--r--src/effects/SkTileImageFilter.cpp2
-rw-r--r--src/image/SkImage.cpp22
-rw-r--r--tests/ImageFilterTest.cpp13
-rw-r--r--tests/SpecialImageTest.cpp4
6 files changed, 44 insertions, 61 deletions
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp
index 8497e7915f..cef87b75be 100644
--- a/src/core/SkSpecialImage.cpp
+++ b/src/core/SkSpecialImage.cpp
@@ -18,7 +18,6 @@
#if SK_SUPPORT_GPU
#include "GrContext.h"
#include "GrSurfaceContext.h"
-#include "GrSurfaceProxyPriv.h"
#include "GrTexture.h"
#include "GrSamplerParams.h"
#include "GrTextureProxy.h"
@@ -60,7 +59,7 @@ public:
virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageFilter::OutputProperties& outProps,
const SkISize& size, SkAlphaType at) const = 0;
- virtual sk_sp<SkImage> onAsImage(const SkIRect* subset) const = 0;
+ virtual sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const = 0;
virtual sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps,
const SkISize& size, SkAlphaType at) const = 0;
@@ -171,11 +170,10 @@ sk_sp<SkSpecialImage> SkSpecialImage::makeSubset(const SkIRect& subset) const {
return as_SIB(this)->onMakeSubset(subset);
}
-sk_sp<SkImage> SkSpecialImage::asImage(const SkIRect* subset) const {
- return as_SIB(this)->onAsImage(subset);
+sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const {
+ return as_SIB(this)->onMakeTightSubset(subset);
}
-
#ifdef SK_DEBUG
static bool rect_fits(const SkIRect& rect, int width, int height) {
if (0 == width && 0 == height) {
@@ -303,18 +301,14 @@ public:
&this->props());
}
- sk_sp<SkImage> onAsImage(const SkIRect* subset) const override {
- if (subset) {
- SkBitmap subsetBM;
-
- if (!fBitmap.extractSubset(&subsetBM, *subset)) {
- return nullptr;
- }
+ sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override {
+ SkBitmap subsetBM;
- return SkImage::MakeFromBitmap(subsetBM);
+ if (!fBitmap.extractSubset(&subsetBM, subset)) {
+ return nullptr;
}
- return SkImage::MakeFromBitmap(fBitmap);
+ return SkImage::MakeFromBitmap(subsetBM);
}
sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps,
@@ -370,9 +364,7 @@ static sk_sp<SkImage> wrap_proxy_in_image(GrContext* context, GrTextureProxy* pr
return nullptr;
}
- // Note that we're explicitly using the GrTexture's width & height here b.c. SkImages
- // must be tight.
- return sk_make_sp<SkImage_Gpu>(tex->width(), tex->height(),
+ return sk_make_sp<SkImage_Gpu>(proxy->width(), proxy->height(),
kNeedNewImageUniqueID, alphaType,
sk_ref_sp(tex),
std::move(colorSpace), SkBudgeted::kYes);
@@ -507,25 +499,20 @@ public:
}
// TODO: move all the logic here into the subset-flavor GrSurfaceProxy::copy?
- sk_sp<SkImage> onAsImage(const SkIRect* subset) const override {
- if (subset) {
- // TODO: if this becomes a bottle neck we could base this logic on what the size
- // will be when it is finally instantiated - but that is more fraught.
- if (//fSurfaceProxy->priv().isExact() &&
- 0 == subset->fLeft && 0 == subset->fTop &&
- fTextureProxy->width() == subset->width() &&
- fTextureProxy->height() == subset->height()) {
- // The existing GrTexture is already tight so reuse it in the SkImage
- return wrap_proxy_in_image(fContext, fTextureProxy.get(), fAlphaType, fColorSpace);
- }
-
- sk_sp<GrTextureProxy> subsetProxy(GrSurfaceProxy::Copy(fContext, fTextureProxy.get(),
- *subset, SkBudgeted::kYes));
-
- return wrap_proxy_in_image(fContext, subsetProxy.get(), fAlphaType, fColorSpace);
+ sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override {
+ // TODO: this is problematic since the surfaceProxy could be loose
+ if (0 == subset.fLeft && 0 == subset.fTop &&
+ fTextureProxy->width() == subset.width() &&
+ fTextureProxy->height() == subset.height()) {
+ // The existing GrTexture is already tight so reuse it in the SkImage
+ return wrap_proxy_in_image(fContext, fTextureProxy.get(),
+ fAlphaType, fColorSpace);
}
- return wrap_proxy_in_image(fContext, fTextureProxy.get(), fAlphaType, fColorSpace);
+ sk_sp<GrTextureProxy> subsetProxy(GrSurfaceProxy::Copy(fContext, fTextureProxy.get(),
+ subset, SkBudgeted::kYes));
+
+ return wrap_proxy_in_image(fContext, subsetProxy.get(), fAlphaType, fColorSpace);
}
sk_sp<SkSurface> onMakeTightSurface(const SkImageFilter::OutputProperties& outProps,
diff --git a/src/core/SkSpecialImage.h b/src/core/SkSpecialImage.h
index a837683143..1c9c5a1b4c 100644
--- a/src/core/SkSpecialImage.h
+++ b/src/core/SkSpecialImage.h
@@ -117,14 +117,11 @@ public:
sk_sp<SkSpecialImage> makeSubset(const SkIRect& subset) const;
/**
- * Create an SkImage from the contents of this special image optionally extracting a subset.
+ * Extract a subset of this special image and return it as an SkImage.
* It may or may not point to the same backing memory.
- * Note: when no 'subset' parameter is specified the the entire SkSpecialImage will be
- * returned - including whatever extra padding may have resulted from a loose fit!
- * When the 'subset' parameter is specified the returned image will be tight even if that
- * entails a copy!
+ * TODO: switch this to makeSurface once we resolved the naming issue
*/
- sk_sp<SkImage> asImage(const SkIRect* subset = nullptr) const;
+ sk_sp<SkImage> makeTightSubset(const SkIRect& subset) const;
// TODO: hide this when GrLayerHoister uses SkSpecialImages more fully (see skbug.com/5063)
/**
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
index b36f742d77..a140db216b 100644
--- a/src/effects/SkTileImageFilter.cpp
+++ b/src/effects/SkTileImageFilter.cpp
@@ -73,7 +73,7 @@ sk_sp<SkSpecialImage> SkTileImageFilter::onFilterImage(SkSpecialImage* source,
// We create an SkImage here b.c. it needs to be a tight fit for the tiling
sk_sp<SkImage> subset;
if (inputBounds.contains(srcIRect)) {
- subset = input->asImage(&srcIRect);
+ subset = input->makeTightSubset(srcIRect);
if (!subset) {
return nullptr;
}
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 48d9ad32ba..2ae01b8510 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -266,7 +266,6 @@ sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize&
matrix, paint, bitDepth,
std::move(colorSpace)));
}
-
sk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
const SkIRect& clipBounds, SkIRect* outSubset,
SkIPoint* offset) const {
@@ -285,21 +284,32 @@ sk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRec
SkImageFilter::OutputProperties outputProperties(colorSpace);
SkImageFilter::Context context(SkMatrix::I(), clipBounds, cache.get(), outputProperties);
- sk_sp<SkSpecialImage> result = filter->filterImage(srcSpecialImage.get(), context, offset);
+ sk_sp<SkSpecialImage> result =
+ filter->filterImage(srcSpecialImage.get(), context, offset);
+
if (!result) {
return nullptr;
}
+ SkIRect fullSize = SkIRect::MakeWH(result->width(), result->height());
+#if SK_SUPPORT_GPU
+ if (result->isTextureBacked()) {
+ GrContext* context = result->getContext();
+ sk_sp<GrTexture> texture = result->asTextureRef(context);
+ if (!texture) {
+ return nullptr;
+ }
+ fullSize = SkIRect::MakeWH(texture->width(), texture->height());
+ }
+#endif
*outSubset = SkIRect::MakeWH(result->width(), result->height());
if (!outSubset->intersect(clipBounds.makeOffset(-offset->x(), -offset->y()))) {
return nullptr;
}
offset->fX += outSubset->x();
offset->fY += outSubset->y();
-
- // Note that here we're returning the special image's entire backing store, loose padding
- // and all!
- return result->asImage();
+ // This isn't really a "tight" subset, but includes any texture padding.
+ return result->makeTightSubset(fullSize);
}
bool SkImage::isLazyGenerated() const {
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 79f34f7654..28612e882b 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -1750,7 +1750,7 @@ DEF_TEST(ImageFilterBlurLargeImage, reporter) {
}
static void test_make_with_filter(skiatest::Reporter* reporter, GrContext* context) {
- sk_sp<SkSurface> surface(create_surface(context, 192, 128));
+ sk_sp<SkSurface> surface(create_surface(context, 100, 100));
surface->getCanvas()->clear(SK_ColorRED);
SkPaint bluePaint;
bluePaint.setColor(SK_ColorBLUE);
@@ -1795,17 +1795,6 @@ static void test_make_with_filter(skiatest::Reporter* reporter, GrContext* conte
SkIRect destRect = SkIRect::MakeXYWH(offset.x(), offset.y(),
outSubset.width(), outSubset.height());
REPORTER_ASSERT(reporter, clipBounds.contains(destRect));
-
- // In GPU-mode, this case creates a special image with a backing size that differs from
- // the content size
- {
- clipBounds.setXYWH(0, 0, 170, 100);
- subset.setXYWH(0, 0, 160, 90);
-
- filter = SkXfermodeImageFilter::Make(SkBlendMode::kSrc, nullptr);
- result = sourceImage->makeWithFilter(filter.get(), subset, clipBounds, &outSubset, &offset);
- REPORTER_ASSERT(reporter, result);
- }
}
DEF_TEST(ImageFilterMakeWithFilter, reporter) {
diff --git a/tests/SpecialImageTest.cpp b/tests/SpecialImageTest.cpp
index fc59f05d1e..e2e4990d12 100644
--- a/tests/SpecialImageTest.cpp
+++ b/tests/SpecialImageTest.cpp
@@ -110,11 +110,11 @@ static void test_image(const sk_sp<SkSpecialImage>& img, skiatest::Reporter* rep
kSmallerSize+kPad));
//--------------
- // Test that asImage & makeTightSurface return appropriately sized objects
+ // Test that makeTightSubset & makeTightSurface return appropriately sized objects
// of the correct backing type
SkIRect newSubset = SkIRect::MakeWH(subset.width(), subset.height());
{
- sk_sp<SkImage> tightImg(img->asImage(&newSubset));
+ sk_sp<SkImage> tightImg(img->makeTightSubset(newSubset));
REPORTER_ASSERT(reporter, tightImg->width() == subset.width());
REPORTER_ASSERT(reporter, tightImg->height() == subset.height());