1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 // Define NAME_WRAP(x) before including this header to perform name-wrapping 10 // E.g. for ARM NEON, defined it as 'x ## _neon' to ensure all important 11 // identifiers have a _neon suffix. 12 #ifndef NAME_WRAP 13 #error "Please define NAME_WRAP() before including this file" 14 #endif 15 16 // returns expanded * 5bits 17 static inline uint32_t Filter_565_Expanded(unsigned x, unsigned y, 18 uint32_t a00, uint32_t a01, 19 uint32_t a10, uint32_t a11) { 20 SkASSERT((unsigned)x <= 0xF); 21 SkASSERT((unsigned)y <= 0xF); 22 23 a00 = SkExpand_rgb_16(a00); 24 a01 = SkExpand_rgb_16(a01); 25 a10 = SkExpand_rgb_16(a10); 26 a11 = SkExpand_rgb_16(a11); 27 28 int xy = x * y >> 3; 29 return a00 * (32 - 2*y - 2*x + xy) + 30 a01 * (2*x - xy) + 31 a10 * (2*y - xy) + 32 a11 * xy; 33 } 34 35 // turn an expanded 565 * 5bits into SkPMColor 36 // g:11 | r:10 | x:1 | b:10 37 static inline SkPMColor SkExpanded_565_To_PMColor(uint32_t c) { 38 unsigned r = (c >> 13) & 0xFF; 39 unsigned g = (c >> 24); 40 unsigned b = (c >> 2) & 0xFF; 41 return SkPackARGB32(0xFF, r, g, b); 42 } 43 44 // returns answer in SkPMColor format 45 static inline SkPMColor Filter_4444_D32(unsigned x, unsigned y, 46 uint32_t a00, uint32_t a01, 47 uint32_t a10, uint32_t a11) { 48 SkASSERT((unsigned)x <= 0xF); 49 SkASSERT((unsigned)y <= 0xF); 50 51 a00 = SkExpand_4444(a00); 52 a01 = SkExpand_4444(a01); 53 a10 = SkExpand_4444(a10); 54 a11 = SkExpand_4444(a11); 55 56 int xy = x * y >> 4; 57 uint32_t result = a00 * (16 - y - x + xy) + 58 a01 * (x - xy) + 59 a10 * (y - xy) + 60 a11 * xy; 61 62 return SkCompact_8888(result); 63 } 64 65 static inline U8CPU Filter_8(unsigned x, unsigned y, 66 U8CPU a00, U8CPU a01, 67 U8CPU a10, U8CPU a11) { 68 SkASSERT((unsigned)x <= 0xF); 69 SkASSERT((unsigned)y <= 0xF); 70 71 int xy = x * y; 72 unsigned result = a00 * (256 - 16*y - 16*x + xy) + 73 a01 * (16*x - xy) + 74 a10 * (16*y - xy) + 75 a11 * xy; 76 77 return result >> 8; 78 } 79 80 /***************************************************************************** 81 * 82 * D32 functions 83 * 84 */ 85 86 // SRC == 8888 87 88 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) 89 90 #define MAKENAME(suffix) NAME_WRAP(S32_opaque_D32 ## suffix) 91 #define DSTSIZE 32 92 #define SRCTYPE SkPMColor 93 #define CHECKSTATE(state) SkASSERT(4 == state.fBitmap->bytesPerPixel()); \ 94 SkASSERT(state.fAlphaScale == 256) 95 #define RETURNDST(src) src 96 #define SRC_TO_FILTER(src) src 97 #include "SkBitmapProcState_sample.h" 98 99 #undef FILTER_PROC 100 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_alpha)(x, y, a, b, c, d, dst, alphaScale) 101 102 #define MAKENAME(suffix) NAME_WRAP(S32_alpha_D32 ## suffix) 103 #define DSTSIZE 32 104 #define SRCTYPE SkPMColor 105 #define CHECKSTATE(state) SkASSERT(4 == state.fBitmap->bytesPerPixel()); \ 106 SkASSERT(state.fAlphaScale < 256) 107 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale 108 #define RETURNDST(src) SkAlphaMulQ(src, alphaScale) 109 #define SRC_TO_FILTER(src) src 110 #include "SkBitmapProcState_sample.h" 111 112 // SRC == 565 113 114 #undef FILTER_PROC 115 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 116 do { \ 117 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 118 *(dst) = SkExpanded_565_To_PMColor(tmp); \ 119 } while (0) 120 121 #define MAKENAME(suffix) NAME_WRAP(S16_opaque_D32 ## suffix) 122 #define DSTSIZE 32 123 #define SRCTYPE uint16_t 124 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()); \ 125 SkASSERT(state.fAlphaScale == 256) 126 #define RETURNDST(src) SkPixel16ToPixel32(src) 127 #define SRC_TO_FILTER(src) src 128 #include "SkBitmapProcState_sample.h" 129 130 #undef FILTER_PROC 131 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 132 do { \ 133 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 134 *(dst) = SkAlphaMulQ(SkExpanded_565_To_PMColor(tmp), alphaScale); \ 135 } while (0) 136 137 #define MAKENAME(suffix) NAME_WRAP(S16_alpha_D32 ## suffix) 138 #define DSTSIZE 32 139 #define SRCTYPE uint16_t 140 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()); \ 141 SkASSERT(state.fAlphaScale < 256) 142 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale 143 #define RETURNDST(src) SkAlphaMulQ(SkPixel16ToPixel32(src), alphaScale) 144 #define SRC_TO_FILTER(src) src 145 #include "SkBitmapProcState_sample.h" 146 147 // SRC == Index8 148 149 #undef FILTER_PROC 150 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) 151 152 #define MAKENAME(suffix) NAME_WRAP(SI8_opaque_D32 ## suffix) 153 #define DSTSIZE 32 154 #define SRCTYPE uint8_t 155 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \ 156 SkASSERT(state.fAlphaScale == 256) 157 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors() 158 #define RETURNDST(src) table[src] 159 #define SRC_TO_FILTER(src) table[src] 160 #define POSTAMBLE(state) 161 #include "SkBitmapProcState_sample.h" 162 163 #undef FILTER_PROC 164 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_alpha)(x, y, a, b, c, d, dst, alphaScale) 165 166 #define MAKENAME(suffix) NAME_WRAP(SI8_alpha_D32 ## suffix) 167 #define DSTSIZE 32 168 #define SRCTYPE uint8_t 169 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \ 170 SkASSERT(state.fAlphaScale < 256) 171 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale; \ 172 const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors() 173 #define RETURNDST(src) SkAlphaMulQ(table[src], alphaScale) 174 #define SRC_TO_FILTER(src) table[src] 175 #define POSTAMBLE(state) 176 #include "SkBitmapProcState_sample.h" 177 178 // SRC == 4444 179 180 #undef FILTER_PROC 181 #define FILTER_PROC(x, y, a, b, c, d, dst) *(dst) = Filter_4444_D32(x, y, a, b, c, d) 182 183 #define MAKENAME(suffix) NAME_WRAP(S4444_opaque_D32 ## suffix) 184 #define DSTSIZE 32 185 #define SRCTYPE SkPMColor16 186 #define CHECKSTATE(state) SkASSERT(kARGB_4444_SkColorType == state.fBitmap->colorType()); \ 187 SkASSERT(state.fAlphaScale == 256) 188 #define RETURNDST(src) SkPixel4444ToPixel32(src) 189 #define SRC_TO_FILTER(src) src 190 #include "SkBitmapProcState_sample.h" 191 192 #undef FILTER_PROC 193 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 194 do { \ 195 uint32_t tmp = Filter_4444_D32(x, y, a, b, c, d); \ 196 *(dst) = SkAlphaMulQ(tmp, alphaScale); \ 197 } while (0) 198 199 #define MAKENAME(suffix) NAME_WRAP(S4444_alpha_D32 ## suffix) 200 #define DSTSIZE 32 201 #define SRCTYPE SkPMColor16 202 #define CHECKSTATE(state) SkASSERT(kARGB_4444_SkColorType == state.fBitmap->colorType()); \ 203 SkASSERT(state.fAlphaScale < 256) 204 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale 205 #define RETURNDST(src) SkAlphaMulQ(SkPixel4444ToPixel32(src), alphaScale) 206 #define SRC_TO_FILTER(src) src 207 #include "SkBitmapProcState_sample.h" 208 209 // SRC == A8 210 211 #undef FILTER_PROC 212 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 213 do { \ 214 unsigned tmp = Filter_8(x, y, a, b, c, d); \ 215 *(dst) = SkAlphaMulQ(pmColor, SkAlpha255To256(tmp)); \ 216 } while (0) 217 218 #define MAKENAME(suffix) NAME_WRAP(SA8_alpha_D32 ## suffix) 219 #define DSTSIZE 32 220 #define SRCTYPE uint8_t 221 #define CHECKSTATE(state) SkASSERT(kAlpha_8_SkColorType == state.fBitmap->colorType()); 222 #define PREAMBLE(state) const SkPMColor pmColor = state.fPaintPMColor; 223 #define RETURNDST(src) SkAlphaMulQ(pmColor, SkAlpha255To256(src)) 224 #define SRC_TO_FILTER(src) src 225 #include "SkBitmapProcState_sample.h" 226 227 // SRC == Gray8 228 229 #undef FILTER_PROC 230 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 231 do { \ 232 unsigned tmp = Filter_8(x, y, a, b, c, d); \ 233 SkPMColor color = SkPackARGB32(0xFF, tmp, tmp, tmp); \ 234 *(dst) = SkAlphaMulQ(color, alphaScale); \ 235 } while (0) 236 237 #define MAKENAME(suffix) NAME_WRAP(SG8_alpha_D32 ## suffix) 238 #define DSTSIZE 32 239 #define SRCTYPE uint8_t 240 #define CHECKSTATE(state) SkASSERT(kGray_8_SkColorType == state.fBitmap->colorType()); 241 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale 242 #define RETURNDST(src) SkAlphaMulQ(SkPackARGB32(0xFF, src, src, src), alphaScale) 243 #define SRC_TO_FILTER(src) src 244 #include "SkBitmapProcState_sample.h" 245 246 /***************************************************************************** 247 * 248 * D16 functions 249 * 250 */ 251 252 // SRC == 8888 253 254 #undef FILTER_PROC 255 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 256 do { \ 257 SkPMColor dstColor; \ 258 NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, &dstColor); \ 259 (*dst) = SkPixel32ToPixel16(dstColor); \ 260 } while (0) 261 262 #define MAKENAME(suffix) NAME_WRAP(S32_D16 ## suffix) 263 #define DSTSIZE 16 264 #define SRCTYPE SkPMColor 265 #define CHECKSTATE(state) SkASSERT(4 == state.fBitmap->bytesPerPixel()); \ 266 SkASSERT(state.fBitmap->isOpaque()) 267 #define RETURNDST(src) SkPixel32ToPixel16(src) 268 #define SRC_TO_FILTER(src) src 269 #include "SkBitmapProcState_sample.h" 270 271 // SRC == 565 272 273 #undef FILTER_PROC 274 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 275 do { \ 276 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 277 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 278 } while (0) 279 280 #define MAKENAME(suffix) NAME_WRAP(S16_D16 ## suffix) 281 #define DSTSIZE 16 282 #define SRCTYPE uint16_t 283 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()) 284 #define RETURNDST(src) src 285 #define SRC_TO_FILTER(src) src 286 #include "SkBitmapProcState_sample.h" 287 288 // SRC == Index8 289 290 #undef FILTER_PROC 291 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 292 do { \ 293 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 294 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 295 } while (0) 296 297 #define MAKENAME(suffix) NAME_WRAP(SI8_D16 ## suffix) 298 #define DSTSIZE 16 299 #define SRCTYPE uint8_t 300 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()); \ 301 SkASSERT(state.fBitmap->isOpaque()) 302 #define PREAMBLE(state) const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->read16BitCache() 303 #define RETURNDST(src) table[src] 304 #define SRC_TO_FILTER(src) table[src] 305 #define POSTAMBLE(state) 306 #include "SkBitmapProcState_sample.h" 307 308 /////////////////////////////////////////////////////////////////////////////// 309 310 #undef FILTER_PROC 311 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 312 do { \ 313 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 314 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 315 } while (0) 316 317 318 // clamp 319 320 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 321 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 322 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 323 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 324 325 #define MAKENAME(suffix) NAME_WRAP(Clamp_S16_D16 ## suffix) 326 #define SRCTYPE uint16_t 327 #define DSTTYPE uint16_t 328 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()) 329 #define SRC_TO_FILTER(src) src 330 #include "SkBitmapProcState_shaderproc.h" 331 332 333 #define TILEX_PROCF(fx, max) (((fx) & 0xFFFF) * ((max) + 1) >> 16) 334 #define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16) 335 #define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 336 #define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 337 338 #define MAKENAME(suffix) NAME_WRAP(Repeat_S16_D16 ## suffix) 339 #define SRCTYPE uint16_t 340 #define DSTTYPE uint16_t 341 #define CHECKSTATE(state) SkASSERT(kRGB_565_SkColorType == state.fBitmap->colorType()) 342 #define SRC_TO_FILTER(src) src 343 #include "SkBitmapProcState_shaderproc.h" 344 345 346 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 347 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 348 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 349 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 350 351 #undef FILTER_PROC 352 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) 353 #define MAKENAME(suffix) NAME_WRAP(Clamp_SI8_opaque_D32 ## suffix) 354 #define SRCTYPE uint8_t 355 #define DSTTYPE uint32_t 356 #define CHECKSTATE(state) SkASSERT(kIndex_8_SkColorType == state.fBitmap->colorType()) 357 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->readColors() 358 #define SRC_TO_FILTER(src) table[src] 359 #define POSTAMBLE(state) 360 #include "SkBitmapProcState_shaderproc.h" 361 362 #undef NAME_WRAP 363