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/core/SkShadowShader.cpp

Issue 2248493002: raster shadows (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: made req changes 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 | « gyp/common_variables.gypi ('k') | 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 5fc992acc14dd790ab86e43e6a761ecc7b7db8bc..470df08ed7cc34205207ad97c545752079f7fea0 100644
--- a/src/core/SkShadowShader.cpp
+++ b/src/core/SkShadowShader.cpp
@@ -61,6 +61,10 @@ public:
void* fHeapAllocated;
+ int fNonAmbLightCnt;
+ SkPixmap* fShadowMapPixels[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
+
+
typedef SkShader::Context INHERITED;
};
@@ -500,6 +504,21 @@ SkShadowShaderImpl::ShadowShaderContext::ShadowShaderContext(
}
fFlags = flags;
+
+ const SkShadowShaderImpl& lightShader = static_cast<const SkShadowShaderImpl&>(fShader);
+
+ fNonAmbLightCnt = 0;
+
robertphillips 2016/08/24 14:48:53 Since you're densely packing the pixmaps, let's ad
vjiaoblack 2016/08/29 15:45:48 Done.
+ for (int i = 0; i < lightShader.fLights->numLights(); i++) {
+ if (lightShader.fLights->light(i).type() == SkLights::Light::kDirectional_LightType) {
+ fShadowMapPixels[fNonAmbLightCnt] = new SkPixmap();
+ if (!lightShader.fLights->light(i).getShadowMap()->
+ peekPixels(fShadowMapPixels[fNonAmbLightCnt])) {
robertphillips 2016/08/24 14:48:53 this assignment doesn't seem so good ...
vjiaoblack 2016/08/29 15:45:48 Done.
+ fShadowMapPixels[fNonAmbLightCnt] = nullptr;
+ }
+ fNonAmbLightCnt++;
+ }
+ }
}
SkShadowShaderImpl::ShadowShaderContext::~ShadowShaderContext() {
@@ -509,6 +528,12 @@ SkShadowShaderImpl::ShadowShaderContext::~ShadowShaderContext() {
fDiffuseContext->~Context();
sk_free(fHeapAllocated);
+
+ for (int i = 0; i < SkShadowShader::kMaxNonAmbientLights; i++) {
+ if (fShadowMapPixels[i]) {
+ delete fShadowMapPixels[i];
+ }
+ }
}
static inline SkPMColor convert(SkColor3f color, U8CPU a) {
@@ -541,35 +566,70 @@ 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 = SkColor3f::Make(0.0f, 0.0f, 0.0f);
// This is all done in linear unpremul color space (each component 0..255.0f though)
+
+ fNonAmbLightCnt = 0;
for (int l = 0; l < lightShader.fLights->numLights(); ++l) {
const SkLights::Light& light = lightShader.fLights->light(l);
- if (SkLights::Light::kAmbient_LightType == light.type()) {
- accum.fX += light.color().fX * SkColorGetR(diffColor);
- accum.fY += light.color().fY * SkColorGetG(diffColor);
- accum.fZ += light.color().fZ * SkColorGetB(diffColor);
- } else {
- // 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]) {
+ 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 if (light.type() == SkLights::Light::kAmbient_LightType) {
+ 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 | « gyp/common_variables.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698