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 17static 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 37static 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 45static 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 65static 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()->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(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()->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(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/***************************************************************************** 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(4 == state.fBitmap->bytesPerPixel()); \ 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(kRGB_565_SkColorType == state.fBitmap->colorType()) 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(kIndex_8_SkColorType == state.fBitmap->colorType()); \ 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(kRGB_565_SkColorType == state.fBitmap->colorType()) 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(kRGB_565_SkColorType == state.fBitmap->colorType()) 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(kIndex_8_SkColorType == state.fBitmap->colorType()) 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