| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 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 "SkAvoidXfermode.h" | 8 #include "SkAvoidXfermode.h" |
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
| 10 #include "SkFlattenableBuffers.h" | 10 #include "SkFlattenableBuffers.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 SkASSERT(g <= SK_G16_MASK); | 41 SkASSERT(g <= SK_G16_MASK); |
| 42 SkASSERT(b <= SK_B16_MASK); | 42 SkASSERT(b <= SK_B16_MASK); |
| 43 | 43 |
| 44 unsigned dr = SkAbs32(SkGetPackedR16(c) - r); | 44 unsigned dr = SkAbs32(SkGetPackedR16(c) - r); |
| 45 unsigned dg = SkAbs32(SkGetPackedG16(c) - g) >> (SK_G16_BITS - SK_R16_BITS); | 45 unsigned dg = SkAbs32(SkGetPackedG16(c) - g) >> (SK_G16_BITS - SK_R16_BITS); |
| 46 unsigned db = SkAbs32(SkGetPackedB16(c) - b); | 46 unsigned db = SkAbs32(SkGetPackedB16(c) - b); |
| 47 | 47 |
| 48 return SkMax32(dr, SkMax32(dg, db)); | 48 return SkMax32(dr, SkMax32(dg, db)); |
| 49 } | 49 } |
| 50 | 50 |
| 51 // returns 0..15 | |
| 52 static unsigned color_dist4444(uint16_t c, unsigned r, unsigned g, unsigned b) { | |
| 53 SkASSERT(r <= 0xF); | |
| 54 SkASSERT(g <= 0xF); | |
| 55 SkASSERT(b <= 0xF); | |
| 56 | |
| 57 unsigned dr = SkAbs32(SkGetPackedR4444(c) - r); | |
| 58 unsigned dg = SkAbs32(SkGetPackedG4444(c) - g); | |
| 59 unsigned db = SkAbs32(SkGetPackedB4444(c) - b); | |
| 60 | |
| 61 return SkMax32(dr, SkMax32(dg, db)); | |
| 62 } | |
| 63 | |
| 64 // returns 0..255 | 51 // returns 0..255 |
| 65 static unsigned color_dist32(SkPMColor c, U8CPU r, U8CPU g, U8CPU b) { | 52 static unsigned color_dist32(SkPMColor c, U8CPU r, U8CPU g, U8CPU b) { |
| 66 SkASSERT(r <= 0xFF); | 53 SkASSERT(r <= 0xFF); |
| 67 SkASSERT(g <= 0xFF); | 54 SkASSERT(g <= 0xFF); |
| 68 SkASSERT(b <= 0xFF); | 55 SkASSERT(b <= 0xFF); |
| 69 | 56 |
| 70 unsigned dr = SkAbs32(SkGetPackedR32(c) - r); | 57 unsigned dr = SkAbs32(SkGetPackedR32(c) - r); |
| 71 unsigned dg = SkAbs32(SkGetPackedG32(c) - g); | 58 unsigned dg = SkAbs32(SkGetPackedG32(c) - g); |
| 72 unsigned db = SkAbs32(SkGetPackedB32(c) - b); | 59 unsigned db = SkAbs32(SkGetPackedB32(c) - b); |
| 73 | 60 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 d = SkAlphaMul(d, Accurate255To256(*aa++)); | 154 d = SkAlphaMul(d, Accurate255To256(*aa++)); |
| 168 if (0 == d) { | 155 if (0 == d) { |
| 169 continue; | 156 continue; |
| 170 } | 157 } |
| 171 } | 158 } |
| 172 dst[i] = SkBlend3216(src[i], dst[i], d); | 159 dst[i] = SkBlend3216(src[i], dst[i], d); |
| 173 } | 160 } |
| 174 } | 161 } |
| 175 } | 162 } |
| 176 | 163 |
| 177 void SkAvoidXfermode::xfer4444(uint16_t dst[], const SkPMColor src[], int count, | |
| 178 const SkAlpha aa[]) const { | |
| 179 unsigned opR = SkColorGetR(fOpColor) >> 4; | |
| 180 unsigned opG = SkColorGetG(fOpColor) >> 4; | |
| 181 unsigned opB = SkColorGetB(fOpColor) >> 4; | |
| 182 uint32_t mul = fDistMul; | |
| 183 uint32_t sub = (fDistMul - (1 << 14)) << 4; | |
| 184 | |
| 185 int MAX, mask; | |
| 186 | |
| 187 if (kTargetColor_Mode == fMode) { | |
| 188 mask = -1; | |
| 189 MAX = 15; | |
| 190 } else { | |
| 191 mask = 0; | |
| 192 MAX = 0; | |
| 193 } | |
| 194 | |
| 195 for (int i = 0; i < count; i++) { | |
| 196 int d = color_dist4444(dst[i], opR, opG, opB); | |
| 197 // now reverse d if we need to | |
| 198 d = MAX + (d ^ mask) - mask; | |
| 199 SkASSERT((unsigned)d <= 15); | |
| 200 // convert from 0..15 to 0..16 | |
| 201 d += d >> 3; | |
| 202 d = scale_dist_14(d, mul, sub); | |
| 203 SkASSERT(d <= 16); | |
| 204 | |
| 205 if (d > 0) { | |
| 206 if (NULL != aa) { | |
| 207 d = SkAlphaMul(d, Accurate255To256(*aa++)); | |
| 208 if (0 == d) { | |
| 209 continue; | |
| 210 } | |
| 211 } | |
| 212 dst[i] = SkBlend4444(SkPixel32ToPixel4444(src[i]), dst[i], d); | |
| 213 } | |
| 214 } | |
| 215 } | |
| 216 | |
| 217 void SkAvoidXfermode::xferA8(SkAlpha dst[], const SkPMColor src[], int count, | 164 void SkAvoidXfermode::xferA8(SkAlpha dst[], const SkPMColor src[], int count, |
| 218 const SkAlpha aa[]) const { | 165 const SkAlpha aa[]) const { |
| 219 // override in subclass | 166 // override in subclass |
| 220 } | 167 } |
| 221 | 168 |
| 222 #ifdef SK_DEVELOPER | 169 #ifdef SK_DEVELOPER |
| 223 void SkAvoidXfermode::toString(SkString* str) const { | 170 void SkAvoidXfermode::toString(SkString* str) const { |
| 224 str->append("SkAvoidXfermode: opColor: "); | 171 str->append("SkAvoidXfermode: opColor: "); |
| 225 str->appendHex(fOpColor); | 172 str->appendHex(fOpColor); |
| 226 str->appendf("distMul: %d ", fDistMul); | 173 str->appendf("distMul: %d ", fDistMul); |
| 227 | 174 |
| 228 static const char* gModeStrings[] = { "Avoid", "Target" }; | 175 static const char* gModeStrings[] = { "Avoid", "Target" }; |
| 229 | 176 |
| 230 str->appendf("mode: %s", gModeStrings[fMode]); | 177 str->appendf("mode: %s", gModeStrings[fMode]); |
| 231 } | 178 } |
| 232 #endif | 179 #endif |
| OLD | NEW |