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(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ 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(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ 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(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \ 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(state.fBitmap->config() == SkBitmap::kRGB_565_Config); \ 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(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ 156 SkASSERT(state.fAlphaScale == 256) 157 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() 158 #define RETURNDST(src) table[src] 159 #define SRC_TO_FILTER(src) table[src] 160 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() 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(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ 170 SkASSERT(state.fAlphaScale < 256) 171 #define PREAMBLE(state) unsigned alphaScale = state.fAlphaScale; \ 172 const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() 173 #define RETURNDST(src) SkAlphaMulQ(table[src], alphaScale) 174 #define SRC_TO_FILTER(src) table[src] 175 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() 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(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \ 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(state.fBitmap->config() == SkBitmap::kARGB_4444_Config); \ 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(state.fBitmap->config() == SkBitmap::kA8_Config); 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 /***************************************************************************** 228 * 229 * D16 functions 230 * 231 */ 232 233 // SRC == 8888 234 235 #undef FILTER_PROC 236 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 237 do { \ 238 SkPMColor dstColor; \ 239 NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, &dstColor); \ 240 (*dst) = SkPixel32ToPixel16(dstColor); \ 241 } while (0) 242 243 #define MAKENAME(suffix) NAME_WRAP(S32_D16 ## suffix) 244 #define DSTSIZE 16 245 #define SRCTYPE SkPMColor 246 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kARGB_8888_Config); \ 247 SkASSERT(state.fBitmap->isOpaque()) 248 #define RETURNDST(src) SkPixel32ToPixel16(src) 249 #define SRC_TO_FILTER(src) src 250 #include "SkBitmapProcState_sample.h" 251 252 // SRC == 565 253 254 #undef FILTER_PROC 255 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 256 do { \ 257 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 258 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 259 } while (0) 260 261 #define MAKENAME(suffix) NAME_WRAP(S16_D16 ## suffix) 262 #define DSTSIZE 16 263 #define SRCTYPE uint16_t 264 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) 265 #define RETURNDST(src) src 266 #define SRC_TO_FILTER(src) src 267 #include "SkBitmapProcState_sample.h" 268 269 // SRC == Index8 270 271 #undef FILTER_PROC 272 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 273 do { \ 274 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 275 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 276 } while (0) 277 278 #define MAKENAME(suffix) NAME_WRAP(SI8_D16 ## suffix) 279 #define DSTSIZE 16 280 #define SRCTYPE uint8_t 281 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config); \ 282 SkASSERT(state.fBitmap->isOpaque()) 283 #define PREAMBLE(state) const uint16_t* SK_RESTRICT table = state.fBitmap->getColorTable()->lock16BitCache() 284 #define RETURNDST(src) table[src] 285 #define SRC_TO_FILTER(src) table[src] 286 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlock16BitCache() 287 #include "SkBitmapProcState_sample.h" 288 289 /////////////////////////////////////////////////////////////////////////////// 290 291 #undef FILTER_PROC 292 #define FILTER_PROC(x, y, a, b, c, d, dst) \ 293 do { \ 294 uint32_t tmp = Filter_565_Expanded(x, y, a, b, c, d); \ 295 *(dst) = SkCompact_rgb_16((tmp) >> 5); \ 296 } while (0) 297 298 299 // clamp 300 301 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 302 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 303 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 304 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 305 306 #define MAKENAME(suffix) NAME_WRAP(Clamp_S16_D16 ## suffix) 307 #define SRCTYPE uint16_t 308 #define DSTTYPE uint16_t 309 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) 310 #define SRC_TO_FILTER(src) src 311 #include "SkBitmapProcState_shaderproc.h" 312 313 314 #define TILEX_PROCF(fx, max) (((fx) & 0xFFFF) * ((max) + 1) >> 16) 315 #define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16) 316 #define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 317 #define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) 318 319 #define MAKENAME(suffix) NAME_WRAP(Repeat_S16_D16 ## suffix) 320 #define SRCTYPE uint16_t 321 #define DSTTYPE uint16_t 322 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kRGB_565_Config) 323 #define SRC_TO_FILTER(src) src 324 #include "SkBitmapProcState_shaderproc.h" 325 326 327 #define TILEX_PROCF(fx, max) SkClampMax((fx) >> 16, max) 328 #define TILEY_PROCF(fy, max) SkClampMax((fy) >> 16, max) 329 #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) 330 #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) 331 332 #undef FILTER_PROC 333 #define FILTER_PROC(x, y, a, b, c, d, dst) NAME_WRAP(Filter_32_opaque)(x, y, a, b, c, d, dst) 334 #define MAKENAME(suffix) NAME_WRAP(Clamp_SI8_opaque_D32 ## suffix) 335 #define SRCTYPE uint8_t 336 #define DSTTYPE uint32_t 337 #define CHECKSTATE(state) SkASSERT(state.fBitmap->config() == SkBitmap::kIndex8_Config) 338 #define PREAMBLE(state) const SkPMColor* SK_RESTRICT table = state.fBitmap->getColorTable()->lockColors() 339 #define SRC_TO_FILTER(src) table[src] 340 #define POSTAMBLE(state) state.fBitmap->getColorTable()->unlockColors() 341 #include "SkBitmapProcState_shaderproc.h" 342 343 #undef NAME_WRAP 344