OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 const char* inputColor, | 945 const char* inputColor, |
946 const TextureSamplerArray& samplers) SK_OVERRIDE { | 946 const TextureSamplerArray& samplers) SK_OVERRIDE { |
947 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode(); | 947 SkXfermode::Mode mode = drawEffect.castEffect<XferEffect>().mode(); |
948 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>()
.backgroundAccess().getTexture(); | 948 const GrTexture* backgroundTex = drawEffect.castEffect<XferEffect>()
.backgroundAccess().getTexture(); |
949 const char* dstColor; | 949 const char* dstColor; |
950 if (backgroundTex) { | 950 if (backgroundTex) { |
951 SkString bgCoords; | 951 SkString bgCoords; |
952 GrSLType bgCoordsType = fBackgroundEffectMatrix.emitCode(builder
, key, &bgCoords, NULL, "BG"); | 952 GrSLType bgCoordsType = fBackgroundEffectMatrix.emitCode(builder
, key, &bgCoords, NULL, "BG"); |
953 dstColor = "bgColor"; | 953 dstColor = "bgColor"; |
954 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor); | 954 builder->fsCodeAppendf("\t\tvec4 %s = ", dstColor); |
955 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_Shader
Type, | 955 builder->fsAppendTextureLookup(samplers[0], bgCoords.c_str(), bg
CoordsType); |
956 samplers[0], | |
957 bgCoords.c_str(), | |
958 bgCoordsType); | |
959 builder->fsCodeAppendf(";\n"); | 956 builder->fsCodeAppendf(";\n"); |
960 } else { | 957 } else { |
961 dstColor = builder->dstColor(); | 958 dstColor = builder->dstColor(); |
962 } | 959 } |
963 SkASSERT(NULL != dstColor); | 960 SkASSERT(NULL != dstColor); |
964 | 961 |
965 // We don't try to optimize for this case at all | 962 // We don't try to optimize for this case at all |
966 if (NULL == inputColor) { | 963 if (NULL == inputColor) { |
967 builder->fsCodeAppendf("\t\tconst vec4 ones = %s;\n", GrGLSLOnes
Vecf(4)); | 964 builder->fsCodeAppendf("\t\tconst vec4 ones = %s;\n", GrGLSLOnes
Vecf(4)); |
968 inputColor = "ones"; | 965 inputColor = "ones"; |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 // hue and saturation of the first color, the luminosity of the second c
olor, and the input | 1215 // hue and saturation of the first color, the luminosity of the second c
olor, and the input |
1219 // alpha. It has this signature: | 1216 // alpha. It has this signature: |
1220 // vec3 set_luminance(vec3 hueSatColor, float alpha, vec3 lumColor)
. | 1217 // vec3 set_luminance(vec3 hueSatColor, float alpha, vec3 lumColor)
. |
1221 static void AddLumFunction(GrGLShaderBuilder* builder, SkString* setLumF
unction) { | 1218 static void AddLumFunction(GrGLShaderBuilder* builder, SkString* setLumF
unction) { |
1222 // Emit a helper that gets the luminance of a color. | 1219 // Emit a helper that gets the luminance of a color. |
1223 SkString getFunction; | 1220 SkString getFunction; |
1224 GrGLShaderVar getLumArgs[] = { | 1221 GrGLShaderVar getLumArgs[] = { |
1225 GrGLShaderVar("color", kVec3f_GrSLType), | 1222 GrGLShaderVar("color", kVec3f_GrSLType), |
1226 }; | 1223 }; |
1227 SkString getLumBody("\treturn dot(vec3(0.3, 0.59, 0.11), color);\n")
; | 1224 SkString getLumBody("\treturn dot(vec3(0.3, 0.59, 0.11), color);\n")
; |
1228 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1225 builder->fsEmitFunction(kFloat_GrSLType, |
1229 kFloat_GrSLType, | 1226 "luminance", |
1230 "luminance", | 1227 SK_ARRAY_COUNT(getLumArgs), getLumArgs, |
1231 SK_ARRAY_COUNT(getLumArgs), getLumArgs, | 1228 getLumBody.c_str(), |
1232 getLumBody.c_str(), | 1229 &getFunction); |
1233 &getFunction); | |
1234 | 1230 |
1235 // Emit the set luminance function. | 1231 // Emit the set luminance function. |
1236 GrGLShaderVar setLumArgs[] = { | 1232 GrGLShaderVar setLumArgs[] = { |
1237 GrGLShaderVar("hueSat", kVec3f_GrSLType), | 1233 GrGLShaderVar("hueSat", kVec3f_GrSLType), |
1238 GrGLShaderVar("alpha", kFloat_GrSLType), | 1234 GrGLShaderVar("alpha", kFloat_GrSLType), |
1239 GrGLShaderVar("lumColor", kVec3f_GrSLType), | 1235 GrGLShaderVar("lumColor", kVec3f_GrSLType), |
1240 }; | 1236 }; |
1241 SkString setLumBody; | 1237 SkString setLumBody; |
1242 setLumBody.printf("\tfloat diff = %s(lumColor - hueSat);\n", getFunc
tion.c_str()); | 1238 setLumBody.printf("\tfloat diff = %s(lumColor - hueSat);\n", getFunc
tion.c_str()); |
1243 setLumBody.append("\tvec3 outColor = hueSat + diff;\n"); | 1239 setLumBody.append("\tvec3 outColor = hueSat + diff;\n"); |
1244 setLumBody.appendf("\tfloat outLum = %s(outColor);\n", getFunction.c
_str()); | 1240 setLumBody.appendf("\tfloat outLum = %s(outColor);\n", getFunction.c
_str()); |
1245 setLumBody.append("\tfloat minComp = min(min(outColor.r, outColor.g)
, outColor.b);\n" | 1241 setLumBody.append("\tfloat minComp = min(min(outColor.r, outColor.g)
, outColor.b);\n" |
1246 "\tfloat maxComp = max(max(outColor.r, outColor.g)
, outColor.b);\n" | 1242 "\tfloat maxComp = max(max(outColor.r, outColor.g)
, outColor.b);\n" |
1247 "\tif (minComp < 0.0) {\n" | 1243 "\tif (minComp < 0.0) {\n" |
1248 "\t\toutColor = outLum + ((outColor - vec3(outLum,
outLum, outLum)) * outLum) / (outLum - minComp);\n" | 1244 "\t\toutColor = outLum + ((outColor - vec3(outLum,
outLum, outLum)) * outLum) / (outLum - minComp);\n" |
1249 "\t}\n" | 1245 "\t}\n" |
1250 "\tif (maxComp > alpha) {\n" | 1246 "\tif (maxComp > alpha) {\n" |
1251 "\t\toutColor = outLum + ((outColor - vec3(outLum,
outLum, outLum)) * (alpha - outLum)) / (maxComp - outLum);\n" | 1247 "\t\toutColor = outLum + ((outColor - vec3(outLum,
outLum, outLum)) * (alpha - outLum)) / (maxComp - outLum);\n" |
1252 "\t}\n" | 1248 "\t}\n" |
1253 "\treturn outColor;\n"); | 1249 "\treturn outColor;\n"); |
1254 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1250 builder->fsEmitFunction(kVec3f_GrSLType, |
1255 kVec3f_GrSLType, | 1251 "set_luminance", |
1256 "set_luminance", | 1252 SK_ARRAY_COUNT(setLumArgs), setLumArgs, |
1257 SK_ARRAY_COUNT(setLumArgs), setLumArgs, | 1253 setLumBody.c_str(), |
1258 setLumBody.c_str(), | 1254 setLumFunction); |
1259 setLumFunction); | |
1260 } | 1255 } |
1261 | 1256 |
1262 // Adds a function that creates a color with the hue and luminosity of o
ne input color and | 1257 // Adds a function that creates a color with the hue and luminosity of o
ne input color and |
1263 // the saturation of another color. It will have this signature: | 1258 // the saturation of another color. It will have this signature: |
1264 // float set_saturation(vec3 hueLumColor, vec3 satColor) | 1259 // float set_saturation(vec3 hueLumColor, vec3 satColor) |
1265 static void AddSatFunction(GrGLShaderBuilder* builder, SkString* setSatF
unction) { | 1260 static void AddSatFunction(GrGLShaderBuilder* builder, SkString* setSatF
unction) { |
1266 // Emit a helper that gets the saturation of a color | 1261 // Emit a helper that gets the saturation of a color |
1267 SkString getFunction; | 1262 SkString getFunction; |
1268 GrGLShaderVar getSatArgs[] = { GrGLShaderVar("color", kVec3f_GrSLTyp
e) }; | 1263 GrGLShaderVar getSatArgs[] = { GrGLShaderVar("color", kVec3f_GrSLTyp
e) }; |
1269 SkString getSatBody; | 1264 SkString getSatBody; |
1270 getSatBody.printf("\treturn max(max(color.r, color.g), color.b) - " | 1265 getSatBody.printf("\treturn max(max(color.r, color.g), color.b) - " |
1271 "min(min(color.r, color.g), color.b);\n"); | 1266 "min(min(color.r, color.g), color.b);\n"); |
1272 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1267 builder->fsEmitFunction(kFloat_GrSLType, |
1273 kFloat_GrSLType, | 1268 "saturation", |
1274 "saturation", | 1269 SK_ARRAY_COUNT(getSatArgs), getSatArgs, |
1275 SK_ARRAY_COUNT(getSatArgs), getSatArgs, | 1270 getSatBody.c_str(), |
1276 getSatBody.c_str(), | 1271 &getFunction); |
1277 &getFunction); | |
1278 | 1272 |
1279 // Emit a helper that sets the saturation given sorted input channel
s. This used | 1273 // Emit a helper that sets the saturation given sorted input channel
s. This used |
1280 // to use inout params for min, mid, and max components but that see
ms to cause | 1274 // to use inout params for min, mid, and max components but that see
ms to cause |
1281 // problems on PowerVR drivers. So instead it returns a vec3 where r
, g ,b are the | 1275 // problems on PowerVR drivers. So instead it returns a vec3 where r
, g ,b are the |
1282 // adjusted min, mid, and max inputs, respectively. | 1276 // adjusted min, mid, and max inputs, respectively. |
1283 SkString helperFunction; | 1277 SkString helperFunction; |
1284 GrGLShaderVar helperArgs[] = { | 1278 GrGLShaderVar helperArgs[] = { |
1285 GrGLShaderVar("minComp", kFloat_GrSLType), | 1279 GrGLShaderVar("minComp", kFloat_GrSLType), |
1286 GrGLShaderVar("midComp", kFloat_GrSLType), | 1280 GrGLShaderVar("midComp", kFloat_GrSLType), |
1287 GrGLShaderVar("maxComp", kFloat_GrSLType), | 1281 GrGLShaderVar("maxComp", kFloat_GrSLType), |
1288 GrGLShaderVar("sat", kFloat_GrSLType), | 1282 GrGLShaderVar("sat", kFloat_GrSLType), |
1289 }; | 1283 }; |
1290 static const char kHelperBody[] = "\tif (minComp < maxComp) {\n" | 1284 static const char kHelperBody[] = "\tif (minComp < maxComp) {\n" |
1291 "\t\tvec3 result;\n" | 1285 "\t\tvec3 result;\n" |
1292 "\t\tresult.r = 0.0;\n" | 1286 "\t\tresult.r = 0.0;\n" |
1293 "\t\tresult.g = sat * (midComp - m
inComp) / (maxComp - minComp);\n" | 1287 "\t\tresult.g = sat * (midComp - m
inComp) / (maxComp - minComp);\n" |
1294 "\t\tresult.b = sat;\n" | 1288 "\t\tresult.b = sat;\n" |
1295 "\t\treturn result;\n" | 1289 "\t\treturn result;\n" |
1296 "\t} else {\n" | 1290 "\t} else {\n" |
1297 "\t\treturn vec3(0, 0, 0);\n" | 1291 "\t\treturn vec3(0, 0, 0);\n" |
1298 "\t}\n"; | 1292 "\t}\n"; |
1299 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1293 builder->fsEmitFunction(kVec3f_GrSLType, |
1300 kVec3f_GrSLType, | 1294 "set_saturation_helper", |
1301 "set_saturation_helper", | 1295 SK_ARRAY_COUNT(helperArgs), helperArgs, |
1302 SK_ARRAY_COUNT(helperArgs), helperArgs, | 1296 kHelperBody, |
1303 kHelperBody, | 1297 &helperFunction); |
1304 &helperFunction); | |
1305 | 1298 |
1306 GrGLShaderVar setSatArgs[] = { | 1299 GrGLShaderVar setSatArgs[] = { |
1307 GrGLShaderVar("hueLumColor", kVec3f_GrSLType), | 1300 GrGLShaderVar("hueLumColor", kVec3f_GrSLType), |
1308 GrGLShaderVar("satColor", kVec3f_GrSLType), | 1301 GrGLShaderVar("satColor", kVec3f_GrSLType), |
1309 }; | 1302 }; |
1310 const char* helpFunc = helperFunction.c_str(); | 1303 const char* helpFunc = helperFunction.c_str(); |
1311 SkString setSatBody; | 1304 SkString setSatBody; |
1312 setSatBody.appendf("\tfloat sat = %s(satColor);\n" | 1305 setSatBody.appendf("\tfloat sat = %s(satColor);\n" |
1313 "\tif (hueLumColor.r <= hueLumColor.g) {\n" | 1306 "\tif (hueLumColor.r <= hueLumColor.g) {\n" |
1314 "\t\tif (hueLumColor.g <= hueLumColor.b) {\n" | 1307 "\t\tif (hueLumColor.g <= hueLumColor.b) {\n" |
1315 "\t\t\thueLumColor.rgb = %s(hueLumColor.r, hueLum
Color.g, hueLumColor.b, sat);\n" | 1308 "\t\t\thueLumColor.rgb = %s(hueLumColor.r, hueLum
Color.g, hueLumColor.b, sat);\n" |
1316 "\t\t} else if (hueLumColor.r <= hueLumColor.b) {
\n" | 1309 "\t\t} else if (hueLumColor.r <= hueLumColor.b) {
\n" |
1317 "\t\t\thueLumColor.rbg = %s(hueLumColor.r, hueLum
Color.b, hueLumColor.g, sat);\n" | 1310 "\t\t\thueLumColor.rbg = %s(hueLumColor.r, hueLum
Color.b, hueLumColor.g, sat);\n" |
1318 "\t\t} else {\n" | 1311 "\t\t} else {\n" |
1319 "\t\t\thueLumColor.brg = %s(hueLumColor.b, hueLum
Color.r, hueLumColor.g, sat);\n" | 1312 "\t\t\thueLumColor.brg = %s(hueLumColor.b, hueLum
Color.r, hueLumColor.g, sat);\n" |
1320 "\t\t}\n" | 1313 "\t\t}\n" |
1321 "\t} else if (hueLumColor.r <= hueLumColor.b) {\n
" | 1314 "\t} else if (hueLumColor.r <= hueLumColor.b) {\n
" |
1322 "\t\thueLumColor.grb = %s(hueLumColor.g, hueLumCo
lor.r, hueLumColor.b, sat);\n" | 1315 "\t\thueLumColor.grb = %s(hueLumColor.g, hueLumCo
lor.r, hueLumColor.b, sat);\n" |
1323 "\t} else if (hueLumColor.g <= hueLumColor.b) {\n
" | 1316 "\t} else if (hueLumColor.g <= hueLumColor.b) {\n
" |
1324 "\t\thueLumColor.gbr = %s(hueLumColor.g, hueLumCo
lor.b, hueLumColor.r, sat);\n" | 1317 "\t\thueLumColor.gbr = %s(hueLumColor.g, hueLumCo
lor.b, hueLumColor.r, sat);\n" |
1325 "\t} else {\n" | 1318 "\t} else {\n" |
1326 "\t\thueLumColor.bgr = %s(hueLumColor.b, hueLumCo
lor.g, hueLumColor.r, sat);\n" | 1319 "\t\thueLumColor.bgr = %s(hueLumColor.b, hueLumCo
lor.g, hueLumColor.r, sat);\n" |
1327 "\t}\n" | 1320 "\t}\n" |
1328 "\treturn hueLumColor;\n", | 1321 "\treturn hueLumColor;\n", |
1329 getFunction.c_str(), helpFunc, helpFunc, helpFunc
, helpFunc, | 1322 getFunction.c_str(), helpFunc, helpFunc, helpFunc
, helpFunc, |
1330 helpFunc, helpFunc); | 1323 helpFunc, helpFunc); |
1331 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, | 1324 builder->fsEmitFunction(kVec3f_GrSLType, |
1332 kVec3f_GrSLType, | 1325 "set_saturation", |
1333 "set_saturation", | 1326 SK_ARRAY_COUNT(setSatArgs), setSatArgs, |
1334 SK_ARRAY_COUNT(setSatArgs), setSatArgs, | 1327 setSatBody.c_str(), |
1335 setSatBody.c_str(), | 1328 setSatFunction); |
1336 setSatFunction); | |
1337 | 1329 |
1338 } | 1330 } |
1339 | 1331 |
1340 static const GrEffect::CoordsType kCoordsType = GrEffect::kLocal_CoordsT
ype; | 1332 static const GrEffect::CoordsType kCoordsType = GrEffect::kLocal_CoordsT
ype; |
1341 GrGLEffectMatrix fBackgroundEffectMatrix; | 1333 GrGLEffectMatrix fBackgroundEffectMatrix; |
1342 typedef GrGLEffect INHERITED; | 1334 typedef GrGLEffect INHERITED; |
1343 }; | 1335 }; |
1344 | 1336 |
1345 GR_DECLARE_EFFECT_TEST; | 1337 GR_DECLARE_EFFECT_TEST; |
1346 | 1338 |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1971 return proc16; | 1963 return proc16; |
1972 } | 1964 } |
1973 | 1965 |
1974 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1966 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1975 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1976 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) | 1968 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkClearXfermode) |
1977 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) | 1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) |
1978 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) | 1970 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) |
1979 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) | 1971 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) |
1980 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |