Chromium Code Reviews| 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; |