gfx/skia/trunk/src/core/SkSpriteBlitter_RGB16.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1
michael@0 2 /*
michael@0 3 * Copyright 2006 The Android Open Source Project
michael@0 4 *
michael@0 5 * Use of this source code is governed by a BSD-style license that can be
michael@0 6 * found in the LICENSE file.
michael@0 7 */
michael@0 8
michael@0 9
michael@0 10 #include "SkSpriteBlitter.h"
michael@0 11 #include "SkBlitRow.h"
michael@0 12 #include "SkTemplates.h"
michael@0 13 #include "SkUtils.h"
michael@0 14 #include "SkColorPriv.h"
michael@0 15
michael@0 16 #define D16_S32A_Opaque_Pixel(dst, sc) \
michael@0 17 do { \
michael@0 18 if (sc) { \
michael@0 19 *dst = SkSrcOver32To16(sc, *dst); \
michael@0 20 } \
michael@0 21 } while (0)
michael@0 22
michael@0 23 static inline void D16_S32A_Blend_Pixel_helper(uint16_t* dst, SkPMColor sc,
michael@0 24 unsigned src_scale) {
michael@0 25 uint16_t dc = *dst;
michael@0 26 unsigned sa = SkGetPackedA32(sc);
michael@0 27 unsigned dr, dg, db;
michael@0 28
michael@0 29 if (255 == sa) {
michael@0 30 dr = SkAlphaBlend(SkPacked32ToR16(sc), SkGetPackedR16(dc), src_scale);
michael@0 31 dg = SkAlphaBlend(SkPacked32ToG16(sc), SkGetPackedG16(dc), src_scale);
michael@0 32 db = SkAlphaBlend(SkPacked32ToB16(sc), SkGetPackedB16(dc), src_scale);
michael@0 33 } else {
michael@0 34 unsigned dst_scale = 255 - SkAlphaMul(sa, src_scale);
michael@0 35 dr = (SkPacked32ToR16(sc) * src_scale +
michael@0 36 SkGetPackedR16(dc) * dst_scale) >> 8;
michael@0 37 dg = (SkPacked32ToG16(sc) * src_scale +
michael@0 38 SkGetPackedG16(dc) * dst_scale) >> 8;
michael@0 39 db = (SkPacked32ToB16(sc) * src_scale +
michael@0 40 SkGetPackedB16(dc) * dst_scale) >> 8;
michael@0 41 }
michael@0 42 *dst = SkPackRGB16(dr, dg, db);
michael@0 43 }
michael@0 44
michael@0 45 #define D16_S32A_Blend_Pixel(dst, sc, src_scale) \
michael@0 46 do { if (sc) D16_S32A_Blend_Pixel_helper(dst, sc, src_scale); } while (0)
michael@0 47
michael@0 48
michael@0 49 ///////////////////////////////////////////////////////////////////////////////
michael@0 50
michael@0 51 class Sprite_D16_S16_Opaque : public SkSpriteBlitter {
michael@0 52 public:
michael@0 53 Sprite_D16_S16_Opaque(const SkBitmap& source)
michael@0 54 : SkSpriteBlitter(source) {}
michael@0 55
michael@0 56 // overrides
michael@0 57 virtual void blitRect(int x, int y, int width, int height) {
michael@0 58 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y);
michael@0 59 const uint16_t* SK_RESTRICT src = fSource->getAddr16(x - fLeft,
michael@0 60 y - fTop);
michael@0 61 size_t dstRB = fDevice->rowBytes();
michael@0 62 size_t srcRB = fSource->rowBytes();
michael@0 63
michael@0 64 while (--height >= 0) {
michael@0 65 memcpy(dst, src, width << 1);
michael@0 66 dst = (uint16_t*)((char*)dst + dstRB);
michael@0 67 src = (const uint16_t*)((const char*)src + srcRB);
michael@0 68 }
michael@0 69 }
michael@0 70 };
michael@0 71
michael@0 72 #define D16_S16_Blend_Pixel(dst, sc, scale) \
michael@0 73 do { \
michael@0 74 uint16_t dc = *dst; \
michael@0 75 *dst = SkBlendRGB16(sc, dc, scale); \
michael@0 76 } while (0)
michael@0 77
michael@0 78 #define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend
michael@0 79 #define SkSPRITE_ARGS , uint8_t alpha
michael@0 80 #define SkSPRITE_FIELDS uint8_t fSrcAlpha;
michael@0 81 #define SkSPRITE_INIT fSrcAlpha = alpha;
michael@0 82 #define SkSPRITE_DST_TYPE uint16_t
michael@0 83 #define SkSPRITE_SRC_TYPE uint16_t
michael@0 84 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 85 #define SkSPRITE_SRC_GETADDR getAddr16
michael@0 86 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlpha);
michael@0 87 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale)
michael@0 88 #define SkSPRITE_NEXT_ROW
michael@0 89 #define SkSPRITE_POSTAMBLE(srcBM)
michael@0 90 #include "SkSpriteBlitterTemplate.h"
michael@0 91
michael@0 92 ///////////////////////////////////////////////////////////////////////////////
michael@0 93
michael@0 94 #define D16_S4444_Opaque(dst, sc) \
michael@0 95 do { \
michael@0 96 uint16_t dc = *dst; \
michael@0 97 *dst = SkSrcOver4444To16(sc, dc); \
michael@0 98 } while (0)
michael@0 99
michael@0 100 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque
michael@0 101 #define SkSPRITE_ARGS
michael@0 102 #define SkSPRITE_FIELDS
michael@0 103 #define SkSPRITE_INIT
michael@0 104 #define SkSPRITE_DST_TYPE uint16_t
michael@0 105 #define SkSPRITE_SRC_TYPE SkPMColor16
michael@0 106 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 107 #define SkSPRITE_SRC_GETADDR getAddr16
michael@0 108 #define SkSPRITE_PREAMBLE(srcBM, x, y)
michael@0 109 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src)
michael@0 110 #define SkSPRITE_NEXT_ROW
michael@0 111 #define SkSPRITE_POSTAMBLE(srcBM)
michael@0 112 #include "SkSpriteBlitterTemplate.h"
michael@0 113
michael@0 114 #define D16_S4444_Blend(dst, sc, scale16) \
michael@0 115 do { \
michael@0 116 uint16_t dc = *dst; \
michael@0 117 *dst = SkBlend4444To16(sc, dc, scale16); \
michael@0 118 } while (0)
michael@0 119
michael@0 120
michael@0 121 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend
michael@0 122 #define SkSPRITE_ARGS , uint8_t alpha
michael@0 123 #define SkSPRITE_FIELDS uint8_t fSrcAlpha;
michael@0 124 #define SkSPRITE_INIT fSrcAlpha = alpha;
michael@0 125 #define SkSPRITE_DST_TYPE uint16_t
michael@0 126 #define SkSPRITE_SRC_TYPE uint16_t
michael@0 127 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 128 #define SkSPRITE_SRC_GETADDR getAddr16
michael@0 129 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha);
michael@0 130 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale)
michael@0 131 #define SkSPRITE_NEXT_ROW
michael@0 132 #define SkSPRITE_POSTAMBLE(srcBM)
michael@0 133 #include "SkSpriteBlitterTemplate.h"
michael@0 134
michael@0 135 ///////////////////////////////////////////////////////////////////////////////
michael@0 136
michael@0 137 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque
michael@0 138 #define SkSPRITE_ARGS
michael@0 139 #define SkSPRITE_FIELDS
michael@0 140 #define SkSPRITE_INIT
michael@0 141 #define SkSPRITE_DST_TYPE uint16_t
michael@0 142 #define SkSPRITE_SRC_TYPE uint8_t
michael@0 143 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 144 #define SkSPRITE_SRC_GETADDR getAddr8
michael@0 145 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors()
michael@0 146 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[src])
michael@0 147 #define SkSPRITE_NEXT_ROW
michael@0 148 #define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors()
michael@0 149 #include "SkSpriteBlitterTemplate.h"
michael@0 150
michael@0 151 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend
michael@0 152 #define SkSPRITE_ARGS , uint8_t alpha
michael@0 153 #define SkSPRITE_FIELDS uint8_t fSrcAlpha;
michael@0 154 #define SkSPRITE_INIT fSrcAlpha = alpha;
michael@0 155 #define SkSPRITE_DST_TYPE uint16_t
michael@0 156 #define SkSPRITE_SRC_TYPE uint8_t
michael@0 157 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 158 #define SkSPRITE_SRC_GETADDR getAddr8
michael@0 159 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.getColorTable()->lockColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
michael@0 160 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src], src_scale)
michael@0 161 #define SkSPRITE_NEXT_ROW
michael@0 162 #define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlockColors();
michael@0 163 #include "SkSpriteBlitterTemplate.h"
michael@0 164
michael@0 165 ///////////////////////////////////////////////////////////////////////////////
michael@0 166
michael@0 167 static intptr_t asint(const void* ptr) {
michael@0 168 return reinterpret_cast<const char*>(ptr) - (const char*)0;
michael@0 169 }
michael@0 170
michael@0 171 static void blitrow_d16_si8(uint16_t* SK_RESTRICT dst,
michael@0 172 const uint8_t* SK_RESTRICT src, int count,
michael@0 173 const uint16_t* SK_RESTRICT ctable) {
michael@0 174 if (count <= 8) {
michael@0 175 do {
michael@0 176 *dst++ = ctable[*src++];
michael@0 177 } while (--count);
michael@0 178 return;
michael@0 179 }
michael@0 180
michael@0 181 // eat src until we're on a 4byte boundary
michael@0 182 while (asint(src) & 3) {
michael@0 183 *dst++ = ctable[*src++];
michael@0 184 count -= 1;
michael@0 185 }
michael@0 186
michael@0 187 int qcount = count >> 2;
michael@0 188 SkASSERT(qcount > 0);
michael@0 189 const uint32_t* qsrc = reinterpret_cast<const uint32_t*>(src);
michael@0 190 if (asint(dst) & 2) {
michael@0 191 do {
michael@0 192 uint32_t s4 = *qsrc++;
michael@0 193 #ifdef SK_CPU_LENDIAN
michael@0 194 *dst++ = ctable[s4 & 0xFF];
michael@0 195 *dst++ = ctable[(s4 >> 8) & 0xFF];
michael@0 196 *dst++ = ctable[(s4 >> 16) & 0xFF];
michael@0 197 *dst++ = ctable[s4 >> 24];
michael@0 198 #else // BENDIAN
michael@0 199 *dst++ = ctable[s4 >> 24];
michael@0 200 *dst++ = ctable[(s4 >> 16) & 0xFF];
michael@0 201 *dst++ = ctable[(s4 >> 8) & 0xFF];
michael@0 202 *dst++ = ctable[s4 & 0xFF];
michael@0 203 #endif
michael@0 204 } while (--qcount);
michael@0 205 } else { // dst is on a 4byte boundary
michael@0 206 uint32_t* ddst = reinterpret_cast<uint32_t*>(dst);
michael@0 207 do {
michael@0 208 uint32_t s4 = *qsrc++;
michael@0 209 #ifdef SK_CPU_LENDIAN
michael@0 210 *ddst++ = (ctable[(s4 >> 8) & 0xFF] << 16) | ctable[s4 & 0xFF];
michael@0 211 *ddst++ = (ctable[s4 >> 24] << 16) | ctable[(s4 >> 16) & 0xFF];
michael@0 212 #else // BENDIAN
michael@0 213 *ddst++ = (ctable[s4 >> 24] << 16) | ctable[(s4 >> 16) & 0xFF];
michael@0 214 *ddst++ = (ctable[(s4 >> 8) & 0xFF] << 16) | ctable[s4 & 0xFF];
michael@0 215 #endif
michael@0 216 } while (--qcount);
michael@0 217 dst = reinterpret_cast<uint16_t*>(ddst);
michael@0 218 }
michael@0 219 src = reinterpret_cast<const uint8_t*>(qsrc);
michael@0 220 count &= 3;
michael@0 221 // catch any remaining (will be < 4)
michael@0 222 while (--count >= 0) {
michael@0 223 *dst++ = ctable[*src++];
michael@0 224 }
michael@0 225 }
michael@0 226
michael@0 227 #define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable)
michael@0 228
michael@0 229 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque
michael@0 230 #define SkSPRITE_ARGS
michael@0 231 #define SkSPRITE_FIELDS
michael@0 232 #define SkSPRITE_INIT
michael@0 233 #define SkSPRITE_DST_TYPE uint16_t
michael@0 234 #define SkSPRITE_SRC_TYPE uint8_t
michael@0 235 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 236 #define SkSPRITE_SRC_GETADDR getAddr8
michael@0 237 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache()
michael@0 238 #define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src]
michael@0 239 #define SkSPRITE_NEXT_ROW
michael@0 240 #define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache()
michael@0 241 #include "SkSpriteBlitterTemplate.h"
michael@0 242
michael@0 243 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend
michael@0 244 #define SkSPRITE_ARGS , uint8_t alpha
michael@0 245 #define SkSPRITE_FIELDS uint8_t fSrcAlpha;
michael@0 246 #define SkSPRITE_INIT fSrcAlpha = alpha;
michael@0 247 #define SkSPRITE_DST_TYPE uint16_t
michael@0 248 #define SkSPRITE_SRC_TYPE uint8_t
michael@0 249 #define SkSPRITE_DST_GETADDR getAddr16
michael@0 250 #define SkSPRITE_SRC_GETADDR getAddr8
michael@0 251 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.getColorTable()->lock16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha);
michael@0 252 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src], src_scale)
michael@0 253 #define SkSPRITE_NEXT_ROW
michael@0 254 #define SkSPRITE_POSTAMBLE(srcBM) srcBM.getColorTable()->unlock16BitCache();
michael@0 255 #include "SkSpriteBlitterTemplate.h"
michael@0 256
michael@0 257 ///////////////////////////////////////////////////////////////////////////////
michael@0 258
michael@0 259 class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter {
michael@0 260 public:
michael@0 261 Sprite_D16_S32_BlitRowProc(const SkBitmap& source)
michael@0 262 : SkSpriteBlitter(source) {}
michael@0 263
michael@0 264 // overrides
michael@0 265
michael@0 266 virtual void setup(const SkBitmap& device, int left, int top,
michael@0 267 const SkPaint& paint) {
michael@0 268 this->INHERITED::setup(device, left, top, paint);
michael@0 269
michael@0 270 unsigned flags = 0;
michael@0 271
michael@0 272 if (paint.getAlpha() < 0xFF) {
michael@0 273 flags |= SkBlitRow::kGlobalAlpha_Flag;
michael@0 274 }
michael@0 275 if (!fSource->isOpaque()) {
michael@0 276 flags |= SkBlitRow::kSrcPixelAlpha_Flag;
michael@0 277 }
michael@0 278 if (paint.isDither()) {
michael@0 279 flags |= SkBlitRow::kDither_Flag;
michael@0 280 }
michael@0 281 fProc = SkBlitRow::Factory(flags, SkBitmap::kRGB_565_Config);
michael@0 282 }
michael@0 283
michael@0 284 virtual void blitRect(int x, int y, int width, int height) {
michael@0 285 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y);
michael@0 286 const SkPMColor* SK_RESTRICT src = fSource->getAddr32(x - fLeft,
michael@0 287 y - fTop);
michael@0 288 size_t dstRB = fDevice->rowBytes();
michael@0 289 size_t srcRB = fSource->rowBytes();
michael@0 290 SkBlitRow::Proc proc = fProc;
michael@0 291 U8CPU alpha = fPaint->getAlpha();
michael@0 292
michael@0 293 while (--height >= 0) {
michael@0 294 proc(dst, src, width, alpha, x, y);
michael@0 295 y += 1;
michael@0 296 dst = (uint16_t* SK_RESTRICT)((char*)dst + dstRB);
michael@0 297 src = (const SkPMColor* SK_RESTRICT)((const char*)src + srcRB);
michael@0 298 }
michael@0 299 }
michael@0 300
michael@0 301 private:
michael@0 302 SkBlitRow::Proc fProc;
michael@0 303
michael@0 304 typedef SkSpriteBlitter INHERITED;
michael@0 305 };
michael@0 306
michael@0 307 ///////////////////////////////////////////////////////////////////////////////
michael@0 308
michael@0 309 SkSpriteBlitter* SkSpriteBlitter::ChooseD16(const SkBitmap& source, const SkPaint& paint,
michael@0 310 SkTBlitterAllocator* allocator) {
michael@0 311
michael@0 312 SkASSERT(allocator != NULL);
michael@0 313
michael@0 314 if (paint.getMaskFilter() != NULL) { // may add cases for this
michael@0 315 return NULL;
michael@0 316 }
michael@0 317 if (paint.getXfermode() != NULL) { // may add cases for this
michael@0 318 return NULL;
michael@0 319 }
michael@0 320 if (paint.getColorFilter() != NULL) { // may add cases for this
michael@0 321 return NULL;
michael@0 322 }
michael@0 323
michael@0 324 SkSpriteBlitter* blitter = NULL;
michael@0 325 unsigned alpha = paint.getAlpha();
michael@0 326
michael@0 327 switch (source.colorType()) {
michael@0 328 case kPMColor_SkColorType: {
michael@0 329 blitter = allocator->createT<Sprite_D16_S32_BlitRowProc>(source);
michael@0 330 break;
michael@0 331 }
michael@0 332 case kARGB_4444_SkColorType:
michael@0 333 if (255 == alpha) {
michael@0 334 blitter = allocator->createT<Sprite_D16_S4444_Opaque>(source);
michael@0 335 } else {
michael@0 336 blitter = allocator->createT<Sprite_D16_S4444_Blend>(source, alpha >> 4);
michael@0 337 }
michael@0 338 break;
michael@0 339 case kRGB_565_SkColorType:
michael@0 340 if (255 == alpha) {
michael@0 341 blitter = allocator->createT<Sprite_D16_S16_Opaque>(source);
michael@0 342 } else {
michael@0 343 blitter = allocator->createT<Sprite_D16_S16_Blend>(source, alpha);
michael@0 344 }
michael@0 345 break;
michael@0 346 case kIndex_8_SkColorType:
michael@0 347 if (paint.isDither()) {
michael@0 348 // we don't support dither yet in these special cases
michael@0 349 break;
michael@0 350 }
michael@0 351 if (source.isOpaque()) {
michael@0 352 if (255 == alpha) {
michael@0 353 blitter = allocator->createT<Sprite_D16_SIndex8_Opaque>(source);
michael@0 354 } else {
michael@0 355 blitter = allocator->createT<Sprite_D16_SIndex8_Blend>(source, alpha);
michael@0 356 }
michael@0 357 } else {
michael@0 358 if (255 == alpha) {
michael@0 359 blitter = allocator->createT<Sprite_D16_SIndex8A_Opaque>(source);
michael@0 360 } else {
michael@0 361 blitter = allocator->createT<Sprite_D16_SIndex8A_Blend>(source, alpha);
michael@0 362 }
michael@0 363 }
michael@0 364 break;
michael@0 365 default:
michael@0 366 break;
michael@0 367 }
michael@0 368 return blitter;
michael@0 369 }

mercurial