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

Unified Diff: src/effects/SkLightingImageFilter.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/SkDropShadowImageFilter.cpp ('k') | src/effects/SkMagnifierImageFilter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkLightingImageFilter.cpp
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 115776707ddc6445004a54daf0748cc506a5da57..d546b56edaee7dea5b545e8353c05a97321ba2c4 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -8,12 +8,13 @@
#include "SkLightingImageFilter.h"
#include "SkBitmap.h"
#include "SkColorPriv.h"
+#include "SkImagePriv.h"
+#include "SkImage_Base.h"
#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
#include "SkTypes.h"
-
+#include "SkWriteBuffer.h"
+#include "SkWriteBuffer.h"
#if SK_SUPPORT_GPU
#include "GrFragmentProcessor.h"
#include "GrInvariantOutput.h"
@@ -290,8 +291,8 @@ protected:
SkDiffuseLightingImageFilter(SkLight* light, SkScalar surfaceScale,
SkScalar kd, SkImageFilter* input, const CropRect* cropRect);
void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE;
- virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
- SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
+ virtual bool onFilterImage(Proxy*, const SkImage* src, const Context&,
+ SkAutoTUnref<const SkImage>&, SkIPoint* offset) const SK_OVERRIDE;
#if SK_SUPPORT_GPU
virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix&,
const SkIRect& bounds) const SK_OVERRIDE;
@@ -318,8 +319,8 @@ protected:
SkSpecularLightingImageFilter(SkLight* light, SkScalar surfaceScale, SkScalar ks,
SkScalar shininess, SkImageFilter* input, const CropRect*);
void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE;
- virtual bool onFilterImage(Proxy*, const SkBitmap& src, const Context&,
- SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
+ virtual bool onFilterImage(Proxy*, const SkImage* src, const Context&,
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const SK_OVERRIDE;
#if SK_SUPPORT_GPU
virtual bool asFragmentProcessor(GrFragmentProcessor**, GrTexture*, const SkMatrix&,
const SkIRect& bounds) const SK_OVERRIDE;
@@ -980,56 +981,68 @@ void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const {
}
bool SkDiffuseLightingImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source,
+ const SkImage* source,
const Context& ctx,
- SkBitmap* dst,
+ SkAutoTUnref<const SkImage>& dst,
SkIPoint* offset) const {
SkImageFilter* input = getInput(0);
- SkBitmap src = source;
+ SkAutoTUnref<const SkImage> src(SkRef(source));
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (input && !input->filterImage(proxy, source, ctx, &src, &srcOffset)) {
- return false;
- }
-
- if (src.colorType() != kN32_SkColorType) {
+ if (input && !input->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;
}
if (bounds.width() < 2 || bounds.height() < 2) {
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;
}
SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm()));
DiffuseLightingType lightingType(fKD);
- offset->fX = bounds.left();
- offset->fY = bounds.top();
+ int32_t resultX = bounds.left();
+ int32_t resultY = bounds.top();
+
bounds.offset(-srcOffset);
switch (transformedLight->type()) {
case SkLight::kDistant_LightType:
- lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<DiffuseLightingType, SkDistantLight>(lightingType, transformedLight,
+ srcBitmap, &dstBitmap, surfaceScale(),
+ bounds);
break;
case SkLight::kPoint_LightType:
- lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<DiffuseLightingType, SkPointLight>(lightingType, transformedLight,
+ srcBitmap, &dstBitmap, surfaceScale(),
+ bounds);
break;
case SkLight::kSpot_LightType:
- lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<DiffuseLightingType, SkSpotLight>(lightingType, transformedLight, srcBitmap,
+ &dstBitmap, surfaceScale(), bounds);
break;
}
+ srcBitmap = SkBitmap();
+
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
+ offset->fX = resultX;
+ offset->fY = resultY;
return true;
}
@@ -1096,23 +1109,18 @@ void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const {
}
bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy,
- const SkBitmap& source,
+ const SkImage* source,
const Context& ctx,
- SkBitmap* dst,
+ SkAutoTUnref<const SkImage>& dst,
SkIPoint* offset) const {
SkImageFilter* input = getInput(0);
- SkBitmap src = source;
+ SkAutoTUnref<const SkImage> src(SkRef(source));
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (input && !input->filterImage(proxy, source, ctx, &src, &srcOffset)) {
- return false;
- }
-
- if (src.colorType() != kN32_SkColorType) {
+ if (input && !input->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;
}
@@ -1120,31 +1128,47 @@ bool SkSpecularLightingImageFilter::onFilterImage(Proxy* proxy,
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;
}
SpecularLightingType lightingType(fKS, fShininess);
- offset->fX = bounds.left();
- offset->fY = bounds.top();
+ int32_t resultX = bounds.left();
+ int32_t resultY = bounds.top();
+
bounds.offset(-srcOffset);
SkAutoTUnref<SkLight> transformedLight(light()->transform(ctx.ctm()));
switch (transformedLight->type()) {
case SkLight::kDistant_LightType:
- lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<SpecularLightingType, SkDistantLight>(lightingType, transformedLight,
+ srcBitmap, &dstBitmap, surfaceScale(),
+ bounds);
break;
case SkLight::kPoint_LightType:
- lightBitmap<SpecularLightingType, SkPointLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<SpecularLightingType, SkPointLight>(lightingType, transformedLight,
+ srcBitmap, &dstBitmap, surfaceScale(),
+ bounds);
break;
case SkLight::kSpot_LightType:
- lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, transformedLight, src, dst, surfaceScale(), bounds);
+ lightBitmap<SpecularLightingType, SkSpotLight>(lightingType, transformedLight,
+ srcBitmap, &dstBitmap, surfaceScale(),
+ bounds);
break;
}
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
+ offset->fX = resultX;
+ offset->fY = resultY;
return true;
}
« no previous file with comments | « src/effects/SkDropShadowImageFilter.cpp ('k') | src/effects/SkMagnifierImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698