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

Unified Diff: src/effects/SkMorphologyImageFilter.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/SkMergeImageFilter.cpp ('k') | src/effects/SkOffsetImageFilter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkMorphologyImageFilter.cpp
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index 32d525a42a8e1b409534b1092002e05c4c3c7a77..f53d88dd7de86d2893e903e4d0e12f325bab3bcb 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -8,6 +8,9 @@
#include "SkMorphologyImageFilter.h"
#include "SkBitmap.h"
#include "SkColorPriv.h"
+#include "SkImage.h"
+#include "SkImagePriv.h"
+#include "SkImage_Base.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkRect.h"
@@ -131,31 +134,29 @@ static void callProcY(SkMorphologyImageFilter::Proc procY, const SkBitmap& src,
bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc procX,
SkMorphologyImageFilter::Proc procY,
Proxy* proxy,
- const SkBitmap& source,
+ const SkImage* source,
const Context& ctx,
- SkBitmap* dst,
+ SkAutoTUnref<const SkImage>& dst,
SkIPoint* offset) const {
- SkBitmap src = source;
+ 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 bounds;
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) {
+ if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, 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(bounds.width(), bounds.height()))) {
+ SkBitmap dstBitmap;
+ if (!dstBitmap.tryAllocPixels(srcBitmap.info().makeWH(bounds.width(), bounds.height()))) {
return false;
}
@@ -173,34 +174,48 @@ bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p
srcBounds.offset(-srcOffset);
if (width == 0 && height == 0) {
- src.extractSubset(dst, srcBounds);
+ srcBitmap.extractSubset(&dstBitmap, srcBounds);
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
offset->fX = bounds.left();
offset->fY = bounds.top();
return true;
}
SkBitmap temp;
- if (!temp.tryAllocPixels(dst->info())) {
+ if (!temp.tryAllocPixels(dstBitmap.info())) {
return false;
}
if (width > 0 && height > 0) {
- callProcX(procX, src, &temp, width, srcBounds);
+ callProcX(procX, srcBitmap, &temp, width, srcBounds);
SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height());
- callProcY(procY, temp, dst, height, tmpBounds);
+ callProcY(procY, temp, &dstBitmap, height, tmpBounds);
} else if (width > 0) {
- callProcX(procX, src, dst, width, srcBounds);
+ callProcX(procX, srcBitmap, &dstBitmap, width, srcBounds);
} else if (height > 0) {
- callProcY(procY, src, dst, height, srcBounds);
+ callProcY(procY, srcBitmap, &dstBitmap, height, srcBounds);
}
+
+ srcBitmap = SkBitmap();
+ temp = SkBitmap();
+
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
offset->fX = bounds.left();
offset->fY = bounds.top();
return true;
}
bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source, const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
+ const SkImage* source, const Context& ctx,
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const {
Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType);
if (!erodeXProc) {
erodeXProc = erode<kX>;
@@ -213,8 +228,8 @@ bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
}
bool SkDilateImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source, const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
+ const SkImage* source, const Context& ctx,
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const {
Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType);
if (!dilateXProc) {
dilateXProc = dilate<kX>;
@@ -645,12 +660,12 @@ void apply_morphology_pass(GrContext* context,
}
}
-bool apply_morphology(const SkBitmap& input,
+bool apply_morphology(const SkImage* input,
const SkIRect& rect,
GrMorphologyEffect::MorphologyType morphType,
SkISize radius,
- SkBitmap* dst) {
- SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture()));
+ SkAutoTUnref<const SkImage>& dst) {
+ SkAutoTUnref<GrTexture> srcTexture(SkRef(input->getTexture()));
SkASSERT(srcTexture);
GrContext* context = srcTexture->getContext();
@@ -693,7 +708,9 @@ bool apply_morphology(const SkBitmap& input,
Gr1DKernelEffect::kY_Direction);
srcTexture.reset(texture);
}
- SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst);
+ if (!SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst)) {
+ return false;
+ }
return true;
}
@@ -701,17 +718,17 @@ bool apply_morphology(const SkBitmap& input,
bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
Proxy* proxy,
- const SkBitmap& src,
+ const SkImage* src,
const Context& ctx,
- SkBitmap* result,
+ SkAutoTUnref<const SkImage>& result,
SkIPoint* offset) const {
- 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 bounds;
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) {
+ if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, input)) {
return false;
}
SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()),
@@ -727,7 +744,11 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
SkIRect srcBounds = bounds;
srcBounds.offset(-srcOffset);
if (width == 0 && height == 0) {
- input.extractSubset(result, srcBounds);
+ SkImage* image = input->newImage(srcBounds.width(), srcBounds.height(), &srcBounds);
+ if (NULL == image) {
+ return false;
+ }
+ result.reset(image);
offset->fX = bounds.left();
offset->fY = bounds.top();
return true;
@@ -743,13 +764,13 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
return true;
}
-bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
+bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx,
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const {
return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset);
}
-bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
+bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx,
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const {
return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset);
}
« no previous file with comments | « src/effects/SkMergeImageFilter.cpp ('k') | src/effects/SkOffsetImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698