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

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, 10 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
Index: src/effects/SkMorphologyImageFilter.cpp
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index 5e204183aba449b9491b14caae49d43cd1783798..1b8f51feb1884b313e710750292b91b32000d016 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"
@@ -132,31 +135,37 @@ static void callProcY(SkMorphologyImageFilter::Proc procY, const SkBitmap& src,
bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc procX,
SkMorphologyImageFilter::Proc procY,
Proxy* proxy,
- const SkBitmap& source,
+ SkImage& source,
const Context& ctx,
- SkBitmap* dst,
+ SkAutoTUnref<SkImage>& dst,
SkIPoint* offset) const {
- SkBitmap src = source;
+ SkAutoTUnref<SkImage> src(SkRef(&source));
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcOffset)) {
+ if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, src, &srcOffset)) {
return false;
}
-
+#if 0
if (src.colorType() != kN32_SkColorType) {
return false;
}
-
+#endif
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;
+ if (!as_IB(src)->getROPixels(&srcBitmap)) {
+ return false;
+ }
+ src.reset(NULL);
+ SkAutoLockPixels alp(srcBitmap);
+ if (!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;
}
@@ -174,34 +183,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, true, 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, true, 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 {
+ SkImage& source, const Context& ctx,
+ SkAutoTUnref<SkImage>& dst, SkIPoint* offset) const {
Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType);
if (!erodeXProc) {
erodeXProc = erode<kX>;
@@ -214,8 +237,8 @@ bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
}
bool SkDilateImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source, const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
+ SkImage& source, const Context& ctx,
+ SkAutoTUnref<SkImage>& dst, SkIPoint* offset) const {
Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType);
if (!dilateXProc) {
dilateXProc = dilate<kX>;
@@ -640,11 +663,11 @@ void apply_morphology_pass(GrContext* context,
}
}
-bool apply_morphology(const SkBitmap& input,
+bool apply_morphology(SkImage& input,
const SkIRect& rect,
GrMorphologyEffect::MorphologyType morphType,
SkISize radius,
- SkBitmap* dst) {
+ SkAutoTUnref<SkImage>& dst) {
SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture()));
SkASSERT(srcTexture);
GrContext* context = srcTexture->getContext();
@@ -687,7 +710,9 @@ bool apply_morphology(const SkBitmap& input,
morphType, 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;
}
@@ -695,17 +720,17 @@ bool apply_morphology(const SkBitmap& input,
bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
Proxy* proxy,
- const SkBitmap& src,
+ SkImage& src,
const Context& ctx,
- SkBitmap* result,
+ SkAutoTUnref<SkImage>& result,
SkIPoint* offset) const {
- SkBitmap input = src;
+ SkAutoTUnref<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()),
@@ -721,14 +746,18 @@ 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;
}
GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType : GrMorphologyEffect::kErode_MorphologyType;
- if (!apply_morphology(input, srcBounds, type,
+ if (!apply_morphology(*input, srcBounds, type,
SkISize::Make(width, height), result)) {
return false;
}
@@ -737,13 +766,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, SkImage& src, const Context& ctx,
+ SkAutoTUnref<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, SkImage& src, const Context& ctx,
+ SkAutoTUnref<SkImage>& result, SkIPoint* offset) const {
return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset);
}

Powered by Google App Engine
This is Rietveld 408576698