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 #include "SkXfermode.h" | 9 #include "SkXfermode.h" |
10 #include "SkXfermode_proccoeff.h" | 10 #include "SkXfermode_proccoeff.h" |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 | 1106 |
1107 bool SkXfermode::IsOpaque(const SkXfermode* xfer, SrcColorOpacity opacityType) { | 1107 bool SkXfermode::IsOpaque(const SkXfermode* xfer, SrcColorOpacity opacityType) { |
1108 // if xfer is NULL we treat it as srcOver which is opaque if our src is opaq
ue | 1108 // if xfer is NULL we treat it as srcOver which is opaque if our src is opaq
ue |
1109 if (!xfer) { | 1109 if (!xfer) { |
1110 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 1110 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
1111 } | 1111 } |
1112 | 1112 |
1113 return xfer->isOpaque(opacityType); | 1113 return xfer->isOpaque(opacityType); |
1114 } | 1114 } |
1115 | 1115 |
1116 /////////////////////////////////////////////////////////////////////////////// | |
1117 //////////// 16bit xfermode procs | |
1118 | |
1119 #ifdef SK_DEBUG | |
1120 static bool require_255(SkPMColor src) { return SkGetPackedA32(src) == 0xFF; } | |
1121 static bool require_0(SkPMColor src) { return SkGetPackedA32(src) == 0; } | |
1122 #endif | |
1123 | |
1124 static uint16_t src_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1125 SkASSERT(require_255(src)); | |
1126 return SkPixel32ToPixel16(src); | |
1127 } | |
1128 | |
1129 static uint16_t dst_modeproc16(SkPMColor src, uint16_t dst) { | |
1130 return dst; | |
1131 } | |
1132 | |
1133 static uint16_t srcover_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1134 SkASSERT(require_0(src)); | |
1135 return dst; | |
1136 } | |
1137 | |
1138 static uint16_t srcover_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1139 SkASSERT(require_255(src)); | |
1140 return SkPixel32ToPixel16(src); | |
1141 } | |
1142 | |
1143 static uint16_t dstover_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1144 SkASSERT(require_0(src)); | |
1145 return dst; | |
1146 } | |
1147 | |
1148 static uint16_t dstover_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1149 SkASSERT(require_255(src)); | |
1150 return dst; | |
1151 } | |
1152 | |
1153 static uint16_t srcin_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1154 SkASSERT(require_255(src)); | |
1155 return SkPixel32ToPixel16(src); | |
1156 } | |
1157 | |
1158 static uint16_t dstin_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1159 SkASSERT(require_255(src)); | |
1160 return dst; | |
1161 } | |
1162 | |
1163 static uint16_t dstout_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1164 SkASSERT(require_0(src)); | |
1165 return dst; | |
1166 } | |
1167 | |
1168 static uint16_t srcatop_modeproc16(SkPMColor src, uint16_t dst) { | |
1169 unsigned isa = 255 - SkGetPackedA32(src); | |
1170 | |
1171 return SkPackRGB16( | |
1172 SkPacked32ToR16(src) + SkAlphaMulAlpha(SkGetPackedR16(dst), isa), | |
1173 SkPacked32ToG16(src) + SkAlphaMulAlpha(SkGetPackedG16(dst), isa), | |
1174 SkPacked32ToB16(src) + SkAlphaMulAlpha(SkGetPackedB16(dst), isa)); | |
1175 } | |
1176 | |
1177 static uint16_t srcatop_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1178 SkASSERT(require_0(src)); | |
1179 return dst; | |
1180 } | |
1181 | |
1182 static uint16_t srcatop_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1183 SkASSERT(require_255(src)); | |
1184 return SkPixel32ToPixel16(src); | |
1185 } | |
1186 | |
1187 static uint16_t dstatop_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1188 SkASSERT(require_255(src)); | |
1189 return dst; | |
1190 } | |
1191 | |
1192 /********* | |
1193 darken and lighten boil down to this. | |
1194 | |
1195 darken = (1 - Sa) * Dc + min(Sc, Dc) | |
1196 lighten = (1 - Sa) * Dc + max(Sc, Dc) | |
1197 | |
1198 if (Sa == 0) these become | |
1199 darken = Dc + min(0, Dc) = 0 | |
1200 lighten = Dc + max(0, Dc) = Dc | |
1201 | |
1202 if (Sa == 1) these become | |
1203 darken = min(Sc, Dc) | |
1204 lighten = max(Sc, Dc) | |
1205 */ | |
1206 | |
1207 static uint16_t darken_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1208 SkASSERT(require_0(src)); | |
1209 return 0; | |
1210 } | |
1211 | |
1212 static uint16_t darken_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1213 SkASSERT(require_255(src)); | |
1214 unsigned r = SkFastMin32(SkPacked32ToR16(src), SkGetPackedR16(dst)); | |
1215 unsigned g = SkFastMin32(SkPacked32ToG16(src), SkGetPackedG16(dst)); | |
1216 unsigned b = SkFastMin32(SkPacked32ToB16(src), SkGetPackedB16(dst)); | |
1217 return SkPackRGB16(r, g, b); | |
1218 } | |
1219 | |
1220 static uint16_t lighten_modeproc16_0(SkPMColor src, uint16_t dst) { | |
1221 SkASSERT(require_0(src)); | |
1222 return dst; | |
1223 } | |
1224 | |
1225 static uint16_t lighten_modeproc16_255(SkPMColor src, uint16_t dst) { | |
1226 SkASSERT(require_255(src)); | |
1227 unsigned r = SkMax32(SkPacked32ToR16(src), SkGetPackedR16(dst)); | |
1228 unsigned g = SkMax32(SkPacked32ToG16(src), SkGetPackedG16(dst)); | |
1229 unsigned b = SkMax32(SkPacked32ToB16(src), SkGetPackedB16(dst)); | |
1230 return SkPackRGB16(r, g, b); | |
1231 } | |
1232 | |
1233 struct Proc16Rec { | |
1234 SkXfermodeProc16 fProc16_0; | |
1235 SkXfermodeProc16 fProc16_255; | |
1236 SkXfermodeProc16 fProc16_General; | |
1237 }; | |
1238 | |
1239 static const Proc16Rec gModeProcs16[] = { | |
1240 { NULL, NULL, NULL }, // CLEAR | |
1241 { NULL, src_modeproc16_255, NULL }, | |
1242 { dst_modeproc16, dst_modeproc16, dst_modeproc16 }, | |
1243 { srcover_modeproc16_0, srcover_modeproc16_255, NULL }, | |
1244 { dstover_modeproc16_0, dstover_modeproc16_255, NULL }, | |
1245 { NULL, srcin_modeproc16_255, NULL }, | |
1246 { NULL, dstin_modeproc16_255, NULL }, | |
1247 { NULL, NULL, NULL },// SRC_OUT | |
1248 { dstout_modeproc16_0, NULL, NULL }, | |
1249 { srcatop_modeproc16_0, srcatop_modeproc16_255, srcatop_modeproc16 }, | |
1250 { NULL, dstatop_modeproc16_255, NULL }, | |
1251 { NULL, NULL, NULL }, // XOR | |
1252 | |
1253 { NULL, NULL, NULL }, // plus | |
1254 { NULL, NULL, NULL }, // modula
te | |
1255 { NULL, NULL, NULL }, // screen | |
1256 { NULL, NULL, NULL }, // overla
y | |
1257 { darken_modeproc16_0, darken_modeproc16_255, NULL }, // darken | |
1258 { lighten_modeproc16_0, lighten_modeproc16_255, NULL }, // lighte
n | |
1259 { NULL, NULL, NULL }, // colord
odge | |
1260 { NULL, NULL, NULL }, // colorb
urn | |
1261 { NULL, NULL, NULL }, // hardli
ght | |
1262 { NULL, NULL, NULL }, // softli
ght | |
1263 { NULL, NULL, NULL }, // differ
ence | |
1264 { NULL, NULL, NULL }, // exclus
ion | |
1265 { NULL, NULL, NULL }, // multip
ly | |
1266 { NULL, NULL, NULL }, // hue | |
1267 { NULL, NULL, NULL }, // satura
tion | |
1268 { NULL, NULL, NULL }, // color | |
1269 { NULL, NULL, NULL }, // lumino
sity | |
1270 }; | |
1271 | |
1272 SkXfermodeProc16 SkXfermode::GetProc16(Mode mode, SkColor srcColor) { | |
1273 SkXfermodeProc16 proc16 = NULL; | |
1274 if ((unsigned)mode < kModeCount) { | |
1275 const Proc16Rec& rec = gModeProcs16[mode]; | |
1276 unsigned a = SkColorGetA(srcColor); | |
1277 | |
1278 if (0 == a) { | |
1279 proc16 = rec.fProc16_0; | |
1280 } else if (255 == a) { | |
1281 proc16 = rec.fProc16_255; | |
1282 } else { | |
1283 proc16 = rec.fProc16_General; | |
1284 } | |
1285 } | |
1286 return proc16; | |
1287 } | |
1288 | |
1289 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1116 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1290 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1117 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1291 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1118 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |