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_opts_SSE2.h" | 10 #include "SkXfermode_opts_SSE2.h" |
(...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1229 #ifdef SK_DEBUG | 1229 #ifdef SK_DEBUG |
1230 (void)pm.round(); | 1230 (void)pm.round(); |
1231 #endif | 1231 #endif |
1232 return pm; | 1232 return pm; |
1233 } | 1233 } |
1234 | 1234 |
1235 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] | 1235 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] |
1236 struct SrcATop4f { | 1236 struct SrcATop4f { |
1237 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1237 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1238 const Sk4f inv255(gInv255); | 1238 const Sk4f inv255(gInv255); |
1239 Sk4f s4 = src; | 1239 return check_as_pmfloat(dst + (src * Sk4f(dst.a()) - dst * Sk4f(src.a())
) * inv255); |
1240 Sk4f d4 = dst; | |
1241 return check_as_pmfloat(d4 + (s4 * Sk4f(dst.a()) - d4 * Sk4f(src.a())) *
inv255); | |
1242 } | 1240 } |
1243 static const bool kFoldCoverageIntoSrcAlpha = true; | 1241 static const bool kFoldCoverageIntoSrcAlpha = true; |
1244 static const SkXfermode::Mode kMode = SkXfermode::kSrcATop_Mode; | 1242 static const SkXfermode::Mode kMode = SkXfermode::kSrcATop_Mode; |
1245 }; | 1243 }; |
1246 | 1244 |
1247 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] | 1245 // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] |
1248 struct DstATop4f { | 1246 struct DstATop4f { |
1249 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1247 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1250 const Sk4f inv255(gInv255); | 1248 const Sk4f inv255(gInv255); |
1251 Sk4f s4 = src; | 1249 return check_as_pmfloat(src + (dst * Sk4f(src.a()) - src * Sk4f(dst.a())
) * inv255); |
1252 Sk4f d4 = dst; | |
1253 return check_as_pmfloat(s4 + (d4 * Sk4f(src.a()) - s4 * Sk4f(dst.a())) *
inv255); | |
1254 } | 1250 } |
1255 static const bool kFoldCoverageIntoSrcAlpha = false; | 1251 static const bool kFoldCoverageIntoSrcAlpha = false; |
1256 static const SkXfermode::Mode kMode = SkXfermode::kDstATop_Mode; | 1252 static const SkXfermode::Mode kMode = SkXfermode::kDstATop_Mode; |
1257 }; | 1253 }; |
1258 | 1254 |
1259 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] | 1255 // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] |
1260 struct Xor4f { | 1256 struct Xor4f { |
1261 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1257 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1262 const Sk4f inv255(gInv255); | 1258 const Sk4f inv255(gInv255); |
1263 Sk4f s4 = src; | 1259 return check_as_pmfloat(src + dst - (src * Sk4f(dst.a()) + dst * Sk4f(sr
c.a())) * inv255); |
1264 Sk4f d4 = dst; | |
1265 return check_as_pmfloat(s4 + d4 - (s4 * Sk4f(dst.a()) + d4 * Sk4f(src.a(
))) * inv255); | |
1266 } | 1260 } |
1267 static const bool kFoldCoverageIntoSrcAlpha = true; | 1261 static const bool kFoldCoverageIntoSrcAlpha = true; |
1268 static const SkXfermode::Mode kMode = SkXfermode::kXor_Mode; | 1262 static const SkXfermode::Mode kMode = SkXfermode::kXor_Mode; |
1269 }; | 1263 }; |
1270 | 1264 |
1271 // kPlus_Mode [Sa + Da, Sc + Dc] | 1265 // kPlus_Mode [Sa + Da, Sc + Dc] |
1272 struct Plus4f { | 1266 struct Plus4f { |
1273 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1267 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1274 Sk4f s4 = src; | 1268 return check_as_pmfloat(clamp_255(src + dst)); |
1275 Sk4f d4 = dst; | |
1276 return check_as_pmfloat(clamp_255(s4 + d4)); | |
1277 } | 1269 } |
1278 static const bool kFoldCoverageIntoSrcAlpha = true; | 1270 static const bool kFoldCoverageIntoSrcAlpha = true; |
1279 static const SkXfermode::Mode kMode = SkXfermode::kPlus_Mode; | 1271 static const SkXfermode::Mode kMode = SkXfermode::kPlus_Mode; |
1280 }; | 1272 }; |
1281 | 1273 |
1282 // kModulate_Mode [Sa * Da, Sc * Dc] | 1274 // kModulate_Mode [Sa * Da, Sc * Dc] |
1283 struct Modulate4f { | 1275 struct Modulate4f { |
1284 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1276 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1285 const Sk4f inv255(gInv255); | 1277 const Sk4f inv255(gInv255); |
1286 Sk4f s4 = src; | 1278 return check_as_pmfloat(src * dst * inv255); |
1287 Sk4f d4 = dst; | |
1288 return check_as_pmfloat(s4 * d4 * inv255); | |
1289 } | 1279 } |
1290 static const bool kFoldCoverageIntoSrcAlpha = false; | 1280 static const bool kFoldCoverageIntoSrcAlpha = false; |
1291 static const SkXfermode::Mode kMode = SkXfermode::kModulate_Mode; | 1281 static const SkXfermode::Mode kMode = SkXfermode::kModulate_Mode; |
1292 }; | 1282 }; |
1293 | 1283 |
1294 // kScreen_Mode [S + D - S * D] | 1284 // kScreen_Mode [S + D - S * D] |
1295 struct Screen4f { | 1285 struct Screen4f { |
1296 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1286 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1297 const Sk4f inv255(gInv255); | 1287 const Sk4f inv255(gInv255); |
1298 Sk4f s4 = src; | 1288 return check_as_pmfloat(src + dst - src * dst * inv255); |
1299 Sk4f d4 = dst; | |
1300 return check_as_pmfloat(s4 + d4 - s4 * d4 * inv255); | |
1301 } | 1289 } |
1302 static const bool kFoldCoverageIntoSrcAlpha = true; | 1290 static const bool kFoldCoverageIntoSrcAlpha = true; |
1303 static const SkXfermode::Mode kMode = SkXfermode::kScreen_Mode; | 1291 static const SkXfermode::Mode kMode = SkXfermode::kScreen_Mode; |
1304 }; | 1292 }; |
1305 | 1293 |
1306 struct Multiply4f { | 1294 struct Multiply4f { |
1307 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1295 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1308 const Sk4f inv255(gInv255); | 1296 const Sk4f inv255(gInv255); |
1309 Sk4f sa = Sk4f(src.a()); | 1297 Sk4f sa = Sk4f(src.a()); |
1310 Sk4f da = Sk4f(dst.a()); | 1298 Sk4f da = Sk4f(dst.a()); |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 } else { | 1773 } else { |
1786 proc16 = rec.fProc16_General; | 1774 proc16 = rec.fProc16_General; |
1787 } | 1775 } |
1788 } | 1776 } |
1789 return proc16; | 1777 return proc16; |
1790 } | 1778 } |
1791 | 1779 |
1792 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1780 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1793 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1781 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1794 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1782 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |