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

Unified Diff: src/effects/SkBlurImageFilter.cpp

Issue 920513003: Make filters use SkImage instead of SkBitmap Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « src/effects/SkBitmapSource.cpp ('k') | src/effects/SkColorFilterImageFilter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkBlurImageFilter.cpp
diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
index 01eeddd9ca4ba688e9c9761551d6a16f9f34455a..a772f30fe48ecf836771a011a44885eaf2edc75d 100644
--- a/src/effects/SkBlurImageFilter.cpp
+++ b/src/effects/SkBlurImageFilter.cpp
@@ -8,6 +8,8 @@
#include "SkBitmap.h"
#include "SkBlurImageFilter.h"
#include "SkColorPriv.h"
+#include "SkImage_Base.h"
+#include "SkImagePriv.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkGpuBlurUtils.h"
@@ -145,32 +147,31 @@ static void getBox3Params(SkScalar s, int *kernelSize, int* kernelSize3, int *lo
}
bool SkBlurImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source, const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
- SkBitmap src = source;
+ const SkImage* source, const Context& ctx,
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const {
+ SkAutoTUnref<const SkImage> src(SkRef(source));
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcOffset)) {
- return false;
- }
-
- if (src.colorType() != kN32_SkColorType) {
+ if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, src, &srcOffset)) {
return false;
}
SkIRect srcBounds, dstBounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &srcBounds, &src)) {
+ if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &srcBounds, src)) {
return false;
}
- SkAutoLockPixels alp(src);
- if (!src.getPixels()) {
+ SkBitmap srcBitmap;
+ SkAutoAdoptImageAsN32Bitmap aai(src, &srcBitmap);
+ if (NULL == srcBitmap.getPixels()) {
return false;
}
- if (!dst->tryAllocPixels(src.info().makeWH(srcBounds.width(), srcBounds.height()))) {
+ SkBitmap dstBitmap;
+ if (!dstBitmap.tryAllocPixels(
+ srcBitmap.info().makeWH(srcBounds.width(), srcBounds.height()))) {
return false;
}
- dst->getBounds(&dstBounds);
+ dstBitmap.getBounds(&dstBounds);
SkVector sigma = mapSigma(fSigma, ctx.ctm());
@@ -184,25 +185,31 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy,
}
if (kernelSizeX == 0 && kernelSizeY == 0) {
- src.copyTo(dst, dst->colorType());
+ srcBitmap.copyTo(&dstBitmap, dstBitmap.colorType());
+ srcBitmap = SkBitmap();
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
offset->fX = srcBounds.fLeft;
offset->fY = srcBounds.fTop;
return true;
}
SkBitmap temp;
- if (!temp.tryAllocPixels(dst->info())) {
+ if (!temp.tryAllocPixels(dstBitmap.info())) {
return false;
}
- offset->fX = srcBounds.fLeft;
- offset->fY = srcBounds.fTop;
+ int32_t resultX = srcBounds.fLeft;
+ int32_t resultY = srcBounds.fTop;
srcBounds.offset(-srcOffset);
- const SkPMColor* s = src.getAddr32(srcBounds.left(), srcBounds.top());
+ const SkPMColor* s = srcBitmap.getAddr32(srcBounds.left(), srcBounds.top());
SkPMColor* t = temp.getAddr32(0, 0);
- SkPMColor* d = dst->getAddr32(0, 0);
+ SkPMColor* d = dstBitmap.getAddr32(0, 0);
int w = dstBounds.width(), h = dstBounds.height();
- int sw = src.rowBytesAsPixels();
+ int sw = srcBitmap.rowBytesAsPixels();
SkBoxBlurProc boxBlurX, boxBlurY, boxBlurXY, boxBlurYX;
if (!SkBoxBlurGetPlatformProcs(&boxBlurX, &boxBlurY, &boxBlurXY, &boxBlurYX)) {
boxBlurX = boxBlur<kX, kX>;
@@ -227,6 +234,14 @@ bool SkBlurImageFilter::onFilterImage(Proxy* proxy,
boxBlurX(d, h, t, kernelSizeY, highOffsetY, lowOffsetY, h, w);
boxBlurXY(t, h, d, kernelSizeY3, highOffsetY, highOffsetY, h, w);
}
+ temp = SkBitmap();
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
+ offset->fX = resultX;
+ offset->fY = resultY;
return true;
}
@@ -255,19 +270,19 @@ bool SkBlurImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
return true;
}
-bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
+bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx,
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const {
#if SK_SUPPORT_GPU
- SkBitmap input = src;
+ SkAutoTUnref<const SkImage> input(SkRef(src));
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) {
+ if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, input, &srcOffset)) {
return false;
}
SkIRect rect;
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &rect, &input)) {
+ if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &rect, input)) {
return false;
}
- GrTexture* source = input.getTexture();
+ GrTexture* source = input->getTexture();
SkVector sigma = mapSigma(fSigma, ctx.ctm());
offset->fX = rect.fLeft;
offset->fY = rect.fTop;
@@ -282,7 +297,9 @@ bool SkBlurImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const
if (!tex) {
return false;
}
- WrapTexture(tex, rect.width(), rect.height(), result);
+ if (!WrapTexture(tex, rect.width(), rect.height(), result)) {
+ return false;
+ }
return true;
#else
SkDEBUGFAIL("Should not call in GPU-less build");
« no previous file with comments | « src/effects/SkBitmapSource.cpp ('k') | src/effects/SkColorFilterImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698