| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| 11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
| 12 #include "SkOrderedReadBuffer.h" | 12 #include "SkOrderedReadBuffer.h" |
| 13 #include "SkOrderedWriteBuffer.h" | 13 #include "SkOrderedWriteBuffer.h" |
| 14 #include "SkTypes.h" | 14 #include "SkTypes.h" |
| 15 | 15 |
| 16 #if SK_SUPPORT_GPU | 16 #if SK_SUPPORT_GPU |
| 17 #include "effects/GrSingleTextureEffect.h" | 17 #include "effects/GrSingleTextureEffect.h" |
| 18 #include "gl/GrGLEffect.h" | 18 #include "gl/GrGLEffect.h" |
| 19 #include "gl/GrGLEffectMatrix.h" | |
| 20 #include "GrEffect.h" | 19 #include "GrEffect.h" |
| 21 #include "GrTBackendEffectFactory.h" | 20 #include "GrTBackendEffectFactory.h" |
| 22 | 21 |
| 23 class GrGLDiffuseLightingEffect; | 22 class GrGLDiffuseLightingEffect; |
| 24 class GrGLSpecularLightingEffect; | 23 class GrGLSpecularLightingEffect; |
| 25 | 24 |
| 26 // For brevity | 25 // For brevity |
| 27 typedef GrGLUniformManager::UniformHandle UniformHandle; | 26 typedef GrGLUniformManager::UniformHandle UniformHandle; |
| 28 #endif | 27 #endif |
| 29 | 28 |
| (...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 public: | 1067 public: |
| 1069 GrGLLightingEffect(const GrBackendEffectFactory& factory, | 1068 GrGLLightingEffect(const GrBackendEffectFactory& factory, |
| 1070 const GrDrawEffect& effect); | 1069 const GrDrawEffect& effect); |
| 1071 virtual ~GrGLLightingEffect(); | 1070 virtual ~GrGLLightingEffect(); |
| 1072 | 1071 |
| 1073 virtual void emitCode(GrGLShaderBuilder*, | 1072 virtual void emitCode(GrGLShaderBuilder*, |
| 1074 const GrDrawEffect&, | 1073 const GrDrawEffect&, |
| 1075 EffectKey, | 1074 EffectKey, |
| 1076 const char* outputColor, | 1075 const char* outputColor, |
| 1077 const char* inputColor, | 1076 const char* inputColor, |
| 1077 const TransformedCoordsArray&, |
| 1078 const TextureSamplerArray&) SK_OVERRIDE; | 1078 const TextureSamplerArray&) SK_OVERRIDE; |
| 1079 | 1079 |
| 1080 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); | 1080 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
| 1081 | 1081 |
| 1082 /** | 1082 /** |
| 1083 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 1083 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); |
| 1084 */ | 1084 */ |
| 1085 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1085 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
| 1086 | 1086 |
| 1087 protected: | 1087 protected: |
| 1088 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; | 1088 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; |
| 1089 | 1089 |
| 1090 private: | 1090 private: |
| 1091 typedef GrGLEffect INHERITED; | 1091 typedef GrGLEffect INHERITED; |
| 1092 | 1092 |
| 1093 UniformHandle fImageIncrementUni; | 1093 UniformHandle fImageIncrementUni; |
| 1094 UniformHandle fSurfaceScaleUni; | 1094 UniformHandle fSurfaceScaleUni; |
| 1095 GrGLLight* fLight; | 1095 GrGLLight* fLight; |
| 1096 GrGLEffectMatrix fEffectMatrix; | |
| 1097 }; | 1096 }; |
| 1098 | 1097 |
| 1099 /////////////////////////////////////////////////////////////////////////////// | 1098 /////////////////////////////////////////////////////////////////////////////// |
| 1100 | 1099 |
| 1101 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1100 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
| 1102 public: | 1101 public: |
| 1103 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, | 1102 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, |
| 1104 const GrDrawEffect& drawEffect); | 1103 const GrDrawEffect& drawEffect); |
| 1105 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; | 1104 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; |
| 1106 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1105 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1189 } | 1188 } |
| 1190 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], | 1189 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], |
| 1191 light, surfaceScale, matrix, kd); | 1190 light, surfaceScale, matrix, kd); |
| 1192 } | 1191 } |
| 1193 | 1192 |
| 1194 | 1193 |
| 1195 /////////////////////////////////////////////////////////////////////////////// | 1194 /////////////////////////////////////////////////////////////////////////////// |
| 1196 | 1195 |
| 1197 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, | 1196 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, |
| 1198 const GrDrawEffect& drawEffect) | 1197 const GrDrawEffect& drawEffect) |
| 1199 : INHERITED(factory) | 1198 : INHERITED(factory) { |
| 1200 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) { | |
| 1201 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); | 1199 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); |
| 1202 fLight = m.light()->createGLLight(); | 1200 fLight = m.light()->createGLLight(); |
| 1203 } | 1201 } |
| 1204 | 1202 |
| 1205 GrGLLightingEffect::~GrGLLightingEffect() { | 1203 GrGLLightingEffect::~GrGLLightingEffect() { |
| 1206 delete fLight; | 1204 delete fLight; |
| 1207 } | 1205 } |
| 1208 | 1206 |
| 1209 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, | 1207 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, |
| 1210 const GrDrawEffect&, | 1208 const GrDrawEffect&, |
| 1211 EffectKey key, | 1209 EffectKey key, |
| 1212 const char* outputColor, | 1210 const char* outputColor, |
| 1213 const char* inputColor, | 1211 const char* inputColor, |
| 1212 const TransformedCoordsArray& coords, |
| 1214 const TextureSamplerArray& samplers) { | 1213 const TextureSamplerArray& samplers) { |
| 1215 SkString coords; | 1214 SkString coords2D = builder->ensureFSCoords2D(coords, 0); |
| 1216 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | |
| 1217 | 1215 |
| 1218 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, | 1216 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, |
| 1219 kVec2f_GrSLType, | 1217 kVec2f_GrSLType, |
| 1220 "ImageIncrement"); | 1218 "ImageIncrement"); |
| 1221 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, | 1219 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, |
| 1222 kFloat_GrSLType, | 1220 kFloat_GrSLType, |
| 1223 "SurfaceScale"); | 1221 "SurfaceScale"); |
| 1224 fLight->emitLightColorUniform(builder); | 1222 fLight->emitLightColorUniform(builder); |
| 1225 SkString lightFunc; | 1223 SkString lightFunc; |
| 1226 this->emitLightFunc(builder, &lightFunc); | 1224 this->emitLightFunc(builder, &lightFunc); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 sobelFuncName.c_str(), | 1263 sobelFuncName.c_str(), |
| 1266 sobelFuncName.c_str()); | 1264 sobelFuncName.c_str()); |
| 1267 SkString interiorNormalName; | 1265 SkString interiorNormalName; |
| 1268 builder->fsEmitFunction(kVec3f_GrSLType, | 1266 builder->fsEmitFunction(kVec3f_GrSLType, |
| 1269 "interiorNormal", | 1267 "interiorNormal", |
| 1270 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1268 SK_ARRAY_COUNT(gInteriorNormalArgs), |
| 1271 gInteriorNormalArgs, | 1269 gInteriorNormalArgs, |
| 1272 interiorNormalBody.c_str(), | 1270 interiorNormalBody.c_str(), |
| 1273 &interiorNormalName); | 1271 &interiorNormalName); |
| 1274 | 1272 |
| 1275 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords.c_str()); | 1273 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
| 1276 builder->fsCodeAppend("\t\tfloat m[9];\n"); | 1274 builder->fsCodeAppend("\t\tfloat m[9];\n"); |
| 1277 | 1275 |
| 1278 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 1276 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
| 1279 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | 1277 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); |
| 1280 | 1278 |
| 1281 int index = 0; | 1279 int index = 0; |
| 1282 for (int dy = -1; dy <= 1; dy++) { | 1280 for (int dy = -1; dy <= 1; dy++) { |
| 1283 for (int dx = -1; dx <= 1; dx++) { | 1281 for (int dx = -1; dx <= 1; dx++) { |
| 1284 SkString texCoords; | 1282 SkString texCoords; |
| 1285 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1283 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1297 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); | 1295 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); |
| 1298 fLight->emitLightColor(builder, "surfaceToLight"); | 1296 fLight->emitLightColor(builder, "surfaceToLight"); |
| 1299 builder->fsCodeAppend(");\n"); | 1297 builder->fsCodeAppend(");\n"); |
| 1300 SkString modulate; | 1298 SkString modulate; |
| 1301 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 1299 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
| 1302 builder->fsCodeAppend(modulate.c_str()); | 1300 builder->fsCodeAppend(modulate.c_str()); |
| 1303 } | 1301 } |
| 1304 | 1302 |
| 1305 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, | 1303 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, |
| 1306 const GrGLCaps& caps) { | 1304 const GrGLCaps& caps) { |
| 1307 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1305 return drawEffect.castEffect<GrLightingEffect>().light()->type(); |
| 1308 EffectKey key = lighting.light()->type(); | |
| 1309 key <<= GrGLEffectMatrix::kKeyBits; | |
| 1310 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(), | |
| 1311 drawEffect, | |
| 1312 lighting.coordsType(), | |
| 1313 lighting.texture(0)); | |
| 1314 return key | matrixKey; | |
| 1315 } | 1306 } |
| 1316 | 1307 |
| 1317 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, | 1308 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, |
| 1318 const GrDrawEffect& drawEffect) { | 1309 const GrDrawEffect& drawEffect) { |
| 1319 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1310 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; |
| 1320 GrTexture* texture = lighting.texture(0); | 1311 GrTexture* texture = lighting.texture(0); |
| 1321 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1312 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
| 1322 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei
ght()); | 1313 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei
ght()); |
| 1323 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1314 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
| 1324 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); | 1315 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); |
| 1325 fLight->setData(uman, transformedLight); | 1316 fLight->setData(uman, transformedLight); |
| 1326 fEffectMatrix.setData(uman, | |
| 1327 lighting.getMatrix(), | |
| 1328 drawEffect, | |
| 1329 lighting.texture(0)); | |
| 1330 } | 1317 } |
| 1331 | 1318 |
| 1332 /////////////////////////////////////////////////////////////////////////////// | 1319 /////////////////////////////////////////////////////////////////////////////// |
| 1333 | 1320 |
| 1334 /////////////////////////////////////////////////////////////////////////////// | 1321 /////////////////////////////////////////////////////////////////////////////// |
| 1335 | 1322 |
| 1336 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, | 1323 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, |
| 1337 const GrDrawEffect& drawEff
ect) | 1324 const GrDrawEffect& drawEff
ect) |
| 1338 : INHERITED(factory, drawEffect) { | 1325 : INHERITED(factory, drawEffect) { |
| 1339 } | 1326 } |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1572 | 1559 |
| 1573 #endif | 1560 #endif |
| 1574 | 1561 |
| 1575 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1562 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
| 1576 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1563 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
| 1577 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
| 1578 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
| 1579 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
| 1580 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1567 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
| 1581 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1568 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |