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

Unified Diff: src/core/SkShadowShader.cpp

Issue 2248493002: raster shadows (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: allocated pixmaps with new[] Created 4 years, 4 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkShadowShader.cpp
diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp
index b1f49b851d775877d6c711db3089a5456abf44a6..d42800deb91e9382deced17aa6e2f414f5dd7cf3 100644
--- a/src/core/SkShadowShader.cpp
+++ b/src/core/SkShadowShader.cpp
@@ -61,6 +61,10 @@ public:
void* fHeapAllocated;
+ int fNonAmbLightCnt;
robertphillips 2016/08/29 18:03:40 This should be SkPixmap*
vjiaoblack 2016/08/29 18:22:07 Done.
+ SkPixmap** fShadowMapPixels;
+
+
typedef SkShader::Context INHERITED;
};
@@ -642,6 +646,18 @@ SkShadowShaderImpl::ShadowShaderContext::ShadowShaderContext(
}
fFlags = flags;
+
+ const SkShadowShaderImpl& lightShader = static_cast<const SkShadowShaderImpl&>(fShader);
+
robertphillips 2016/08/29 18:03:39 fShadowMapPixels = new SkPixmap[fNonAmbLightCnt];
vjiaoblack 2016/08/29 18:22:07 Done.
+ fShadowMapPixels = new SkPixmap*[SkShadowShader::kMaxNonAmbientLights];
+
+ fNonAmbLightCnt = lightShader.fLights->numLights();
+ for (int i = 0; i < fNonAmbLightCnt; i++) {
+ if (lightShader.fLights->light(i).type() == SkLights::Light::kDirectional_LightType) {
+ lightShader.fLights->light(i).getShadowMap()->
robertphillips 2016/08/29 18:03:39 shouldn't fNonAmbLightCnt be i here ?
vjiaoblack 2016/08/29 18:22:07 Done.
+ peekPixels(fShadowMapPixels[fNonAmbLightCnt]);
+ }
robertphillips 2016/08/29 18:03:39 else { fShadowMapPixels[i].reset(); } - this i
vjiaoblack 2016/08/29 18:22:07 Yeah, because the uninitialized ones just will be
+ }
}
SkShadowShaderImpl::ShadowShaderContext::~ShadowShaderContext() {
@@ -651,6 +667,12 @@ SkShadowShaderImpl::ShadowShaderContext::~ShadowShaderContext() {
fDiffuseContext->~Context();
sk_free(fHeapAllocated);
+
robertphillips 2016/08/29 18:03:39 This can then become "delete [] fShadowMapPixels;"
vjiaoblack 2016/08/29 18:22:07 Done.
+ for (int i = 0; i < SkShadowShader::kMaxNonAmbientLights; i++) {
+ if (fShadowMapPixels[i] && fShadowMapPixels[i]->height() > 0) {
+ delete fShadowMapPixels[i];
+ }
+ }
robertphillips 2016/08/29 18:03:39 as is, you're leaking fShadowMapPixels itself here
vjiaoblack 2016/08/29 18:22:07 Done.
}
static inline SkPMColor convert(SkColor3f color, U8CPU a) {
@@ -683,44 +705,71 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y,
const SkShadowShaderImpl& lightShader = static_cast<const SkShadowShaderImpl&>(fShader);
SkPMColor diffuse[BUFFER_MAX];
+ SkPMColor povDepth[BUFFER_MAX];
do {
int n = SkTMin(count, BUFFER_MAX);
- fPovDepthContext->shadeSpan(x, y, diffuse, n);
fDiffuseContext->shadeSpan(x, y, diffuse, n);
+ fPovDepthContext->shadeSpan(x, y, povDepth, n);
for (int i = 0; i < n; ++i) {
-
SkColor diffColor = SkUnPreMultiply::PMColorToColor(diffuse[i]);
+ SkColor povDepthColor = povDepth[i];
- SkColor3f accum = SkColor3f::Make(0.0f, 0.0f, 0.0f);
+ SkColor3f totalColor = SkColor3f::Make(0.0f, 0.0f, 0.0f);
+ SkColor3f totalLight = lightShader.fLights->ambientLightColor();
// This is all done in linear unpremul color space (each component 0..255.0f though)
robertphillips 2016/08/29 18:03:40 Do you intend to be changing fNonAmbLightCnt in th
vjiaoblack 2016/08/29 18:22:07 nope, good catch. Thanks.
- accum.fX += lightShader.fLights->ambientLightColor().fX * SkColorGetR(diffColor);
- accum.fY += lightShader.fLights->ambientLightColor().fY * SkColorGetG(diffColor);
- accum.fZ += lightShader.fLights->ambientLightColor().fZ * SkColorGetB(diffColor);
-
+ fNonAmbLightCnt = 0;
for (int l = 0; l < lightShader.fLights->numLights(); ++l) {
const SkLights::Light& light = lightShader.fLights->light(l);
- if (SkLights::Light::kDirectional_LightType == light.type()) {
- // scaling by fZ accounts for lighting direction
- accum.fX += light.color().makeScale(light.dir().fZ).fX *
- SkColorGetR(diffColor);
- accum.fY += light.color().makeScale(light.dir().fZ).fY *
- SkColorGetG(diffColor);
- accum.fZ += light.color().makeScale(light.dir().fZ).fZ *
- SkColorGetB(diffColor);
+ if (light.type() == SkLights::Light::kDirectional_LightType) {
+ int xOffset = SkScalarRoundToInt(light.dir().fX *
+ SkIntToScalar(SkColorGetB(povDepthColor)));
+ int yOffset = SkScalarRoundToInt(light.dir().fY *
+ SkIntToScalar(SkColorGetB(povDepthColor)));
+
+ int shX = (x + i + xOffset);
+ int shY = (y + yOffset);
+
+ shX = SkClampPos(shX);
+ shY = SkClampPos(shY);
+
+ shX = SkClampMax(shX, light.getShadowMap()->width() - 1);
+ shY = SkClampMax(shY, light.getShadowMap()->height() - 1);
+
+ int shDepth = 0;
+ int pvDepth = SkColorGetB(povDepthColor); // depth stored in blue channel
+
+ if (fShadowMapPixels[fNonAmbLightCnt] &&
+ fShadowMapPixels[fNonAmbLightCnt]->height() > 0) {
+ uint32_t pix = *fShadowMapPixels[fNonAmbLightCnt]->addr32(shX, shY);
+ SkColor shColor(pix);
+
+ shDepth += SkColorGetB(shColor);
+ } else {
+ // TODO: handle not being able to read shadow map pixels
+ }
+
+ if (pvDepth >= shDepth) {
+ // assume object normals are pointing straight up
+ totalLight.fX += light.dir().fZ * light.color().fX;
+ totalLight.fY += light.dir().fZ * light.color().fY;
+ totalLight.fZ += light.dir().fZ * light.color().fZ;
+ }
+ fNonAmbLightCnt++;
} else {
- accum.fX += light.color().fX * SkColorGetR(diffColor);
- accum.fY += light.color().fY * SkColorGetG(diffColor);
- accum.fZ += light.color().fZ * SkColorGetB(diffColor);
+ totalLight += light.color();
}
-
}
- result[i] = convert(accum, SkColorGetA(diffColor));
+ totalColor.fX += SkColorGetR(diffColor) * totalLight.fX;
+ totalColor.fY += SkColorGetG(diffColor) * totalLight.fY;
+ totalColor.fZ += SkColorGetB(diffColor) * totalLight.fZ;
+
+ result[i] = convert(totalColor, SkColorGetA(diffColor));
}
result += n;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698