| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkSpriteBlitter.h" | 10 #include "SkSpriteBlitter.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 | 45 |
| 46 /////////////////////////////////////////////////////////////////////////////// | 46 /////////////////////////////////////////////////////////////////////////////// |
| 47 | 47 |
| 48 class Sprite_D16_S16_Opaque : public SkSpriteBlitter { | 48 class Sprite_D16_S16_Opaque : public SkSpriteBlitter { |
| 49 public: | 49 public: |
| 50 Sprite_D16_S16_Opaque(const SkPixmap& source) : SkSpriteBlitter(source) {} | 50 Sprite_D16_S16_Opaque(const SkPixmap& source) : SkSpriteBlitter(source) {} |
| 51 | 51 |
| 52 // overrides | 52 // overrides |
| 53 void blitRect(int x, int y, int width, int height) override { | 53 void blitRect(int x, int y, int width, int height) override { |
| 54 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y); | 54 uint16_t* SK_RESTRICT dst = fDst.writable_addr16(x, y); |
| 55 const uint16_t* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop); | 55 const uint16_t* SK_RESTRICT src = fSource.addr16(x - fLeft, y - fTop); |
| 56 size_t dstRB = fDevice->rowBytes(); | 56 size_t dstRB = fDst.rowBytes(); |
| 57 size_t srcRB = fSource.rowBytes(); | 57 size_t srcRB = fSource.rowBytes(); |
| 58 | 58 |
| 59 while (--height >= 0) { | 59 while (--height >= 0) { |
| 60 memcpy(dst, src, width << 1); | 60 memcpy(dst, src, width << 1); |
| 61 dst = (uint16_t*)((char*)dst + dstRB); | 61 dst = (uint16_t*)((char*)dst + dstRB); |
| 62 src = (const uint16_t*)((const char*)src + srcRB); | 62 src = (const uint16_t*)((const char*)src + srcRB); |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 }; | 65 }; |
| 66 | 66 |
| 67 #define D16_S16_Blend_Pixel(dst, sc, scale) \ | 67 #define D16_S16_Blend_Pixel(dst, sc, scale) \ |
| 68 do { \ | 68 do { \ |
| 69 uint16_t dc = *dst; \ | 69 uint16_t dc = *dst; \ |
| 70 *dst = SkBlendRGB16(sc, dc, scale); \ | 70 *dst = SkBlendRGB16(sc, dc, scale); \ |
| 71 } while (0) | 71 } while (0) |
| 72 | 72 |
| 73 #define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend | 73 #define SkSPRITE_CLASSNAME Sprite_D16_S16_Blend |
| 74 #define SkSPRITE_ARGS , uint8_t alpha | 74 #define SkSPRITE_ARGS , uint8_t alpha |
| 75 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 75 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
| 76 #define SkSPRITE_INIT fSrcAlpha = alpha; | 76 #define SkSPRITE_INIT fSrcAlpha = alpha; |
| 77 #define SkSPRITE_DST_TYPE uint16_t | 77 #define SkSPRITE_DST_TYPE uint16_t |
| 78 #define SkSPRITE_SRC_TYPE uint16_t | 78 #define SkSPRITE_SRC_TYPE uint16_t |
| 79 #define SkSPRITE_DST_GETADDR getAddr16 | 79 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 80 #define SkSPRITE_SRC_GETADDR addr16 | 80 #define SkSPRITE_SRC_GETADDR addr16 |
| 81 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlph
a); | 81 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha255To256(fSrcAlph
a); |
| 82 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale) | 82 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, src, scale) |
| 83 #define SkSPRITE_NEXT_ROW | 83 #define SkSPRITE_NEXT_ROW |
| 84 #define SkSPRITE_POSTAMBLE(srcBM) | 84 #define SkSPRITE_POSTAMBLE(srcBM) |
| 85 #include "SkSpriteBlitterTemplate.h" | 85 #include "SkSpriteBlitterTemplate.h" |
| 86 | 86 |
| 87 /////////////////////////////////////////////////////////////////////////////// | 87 /////////////////////////////////////////////////////////////////////////////// |
| 88 | 88 |
| 89 #define D16_S4444_Opaque(dst, sc) \ | 89 #define D16_S4444_Opaque(dst, sc) \ |
| 90 do { \ | 90 do { \ |
| 91 uint16_t dc = *dst; \ | 91 uint16_t dc = *dst; \ |
| 92 *dst = SkSrcOver4444To16(sc, dc); \ | 92 *dst = SkSrcOver4444To16(sc, dc); \ |
| 93 } while (0) | 93 } while (0) |
| 94 | 94 |
| 95 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque | 95 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Opaque |
| 96 #define SkSPRITE_ARGS | 96 #define SkSPRITE_ARGS |
| 97 #define SkSPRITE_FIELDS | 97 #define SkSPRITE_FIELDS |
| 98 #define SkSPRITE_INIT | 98 #define SkSPRITE_INIT |
| 99 #define SkSPRITE_DST_TYPE uint16_t | 99 #define SkSPRITE_DST_TYPE uint16_t |
| 100 #define SkSPRITE_SRC_TYPE SkPMColor16 | 100 #define SkSPRITE_SRC_TYPE SkPMColor16 |
| 101 #define SkSPRITE_DST_GETADDR getAddr16 | 101 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 102 #define SkSPRITE_SRC_GETADDR addr16 | 102 #define SkSPRITE_SRC_GETADDR addr16 |
| 103 #define SkSPRITE_PREAMBLE(srcBM, x, y) | 103 #define SkSPRITE_PREAMBLE(srcBM, x, y) |
| 104 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src) | 104 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Opaque(dst, src) |
| 105 #define SkSPRITE_NEXT_ROW | 105 #define SkSPRITE_NEXT_ROW |
| 106 #define SkSPRITE_POSTAMBLE(srcBM) | 106 #define SkSPRITE_POSTAMBLE(srcBM) |
| 107 #include "SkSpriteBlitterTemplate.h" | 107 #include "SkSpriteBlitterTemplate.h" |
| 108 | 108 |
| 109 #define D16_S4444_Blend(dst, sc, scale16) \ | 109 #define D16_S4444_Blend(dst, sc, scale16) \ |
| 110 do { \ | 110 do { \ |
| 111 uint16_t dc = *dst; \ | 111 uint16_t dc = *dst; \ |
| 112 *dst = SkBlend4444To16(sc, dc, scale16); \ | 112 *dst = SkBlend4444To16(sc, dc, scale16); \ |
| 113 } while (0) | 113 } while (0) |
| 114 | 114 |
| 115 | 115 |
| 116 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend | 116 #define SkSPRITE_CLASSNAME Sprite_D16_S4444_Blend |
| 117 #define SkSPRITE_ARGS , uint8_t alpha | 117 #define SkSPRITE_ARGS , uint8_t alpha |
| 118 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 118 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
| 119 #define SkSPRITE_INIT fSrcAlpha = alpha; | 119 #define SkSPRITE_INIT fSrcAlpha = alpha; |
| 120 #define SkSPRITE_DST_TYPE uint16_t | 120 #define SkSPRITE_DST_TYPE uint16_t |
| 121 #define SkSPRITE_SRC_TYPE uint16_t | 121 #define SkSPRITE_SRC_TYPE uint16_t |
| 122 #define SkSPRITE_DST_GETADDR getAddr16 | 122 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 123 #define SkSPRITE_SRC_GETADDR addr16 | 123 #define SkSPRITE_SRC_GETADDR addr16 |
| 124 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha)
; | 124 #define SkSPRITE_PREAMBLE(srcBM, x, y) int scale = SkAlpha15To16(fSrcAlpha)
; |
| 125 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale) | 125 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S4444_Blend(dst, src, scale) |
| 126 #define SkSPRITE_NEXT_ROW | 126 #define SkSPRITE_NEXT_ROW |
| 127 #define SkSPRITE_POSTAMBLE(srcBM) | 127 #define SkSPRITE_POSTAMBLE(srcBM) |
| 128 #include "SkSpriteBlitterTemplate.h" | 128 #include "SkSpriteBlitterTemplate.h" |
| 129 | 129 |
| 130 /////////////////////////////////////////////////////////////////////////////// | 130 /////////////////////////////////////////////////////////////////////////////// |
| 131 | 131 |
| 132 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque | 132 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Opaque |
| 133 #define SkSPRITE_ARGS | 133 #define SkSPRITE_ARGS |
| 134 #define SkSPRITE_FIELDS | 134 #define SkSPRITE_FIELDS |
| 135 #define SkSPRITE_INIT | 135 #define SkSPRITE_INIT |
| 136 #define SkSPRITE_DST_TYPE uint16_t | 136 #define SkSPRITE_DST_TYPE uint16_t |
| 137 #define SkSPRITE_SRC_TYPE uint8_t | 137 #define SkSPRITE_SRC_TYPE uint8_t |
| 138 #define SkSPRITE_DST_GETADDR getAddr16 | 138 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 139 #define SkSPRITE_SRC_GETADDR addr8 | 139 #define SkSPRITE_SRC_GETADDR addr8 |
| 140 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors() | 140 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors() |
| 141 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[sr
c]) | 141 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Opaque_Pixel(dst, ctable[sr
c]) |
| 142 #define SkSPRITE_NEXT_ROW | 142 #define SkSPRITE_NEXT_ROW |
| 143 #define SkSPRITE_POSTAMBLE(srcBM) | 143 #define SkSPRITE_POSTAMBLE(srcBM) |
| 144 #include "SkSpriteBlitterTemplate.h" | 144 #include "SkSpriteBlitterTemplate.h" |
| 145 | 145 |
| 146 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend | 146 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8A_Blend |
| 147 #define SkSPRITE_ARGS , uint8_t alpha | 147 #define SkSPRITE_ARGS , uint8_t alpha |
| 148 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 148 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
| 149 #define SkSPRITE_INIT fSrcAlpha = alpha; | 149 #define SkSPRITE_INIT fSrcAlpha = alpha; |
| 150 #define SkSPRITE_DST_TYPE uint16_t | 150 #define SkSPRITE_DST_TYPE uint16_t |
| 151 #define SkSPRITE_SRC_TYPE uint8_t | 151 #define SkSPRITE_SRC_TYPE uint8_t |
| 152 #define SkSPRITE_DST_GETADDR getAddr16 | 152 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 153 #define SkSPRITE_SRC_GETADDR addr8 | 153 #define SkSPRITE_SRC_GETADDR addr8 |
| 154 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); | 154 #define SkSPRITE_PREAMBLE(srcBM, x, y) const SkPMColor* ctable = srcBM.ctab
le()->readColors(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); |
| 155 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src
], src_scale) | 155 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S32A_Blend_Pixel(dst, ctable[src
], src_scale) |
| 156 #define SkSPRITE_NEXT_ROW | 156 #define SkSPRITE_NEXT_ROW |
| 157 #define SkSPRITE_POSTAMBLE(srcBM) | 157 #define SkSPRITE_POSTAMBLE(srcBM) |
| 158 #include "SkSpriteBlitterTemplate.h" | 158 #include "SkSpriteBlitterTemplate.h" |
| 159 | 159 |
| 160 /////////////////////////////////////////////////////////////////////////////// | 160 /////////////////////////////////////////////////////////////////////////////// |
| 161 | 161 |
| 162 static intptr_t asint(const void* ptr) { | 162 static intptr_t asint(const void* ptr) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 220 } |
| 221 | 221 |
| 222 #define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable) | 222 #define SkSPRITE_ROW_PROC(d, s, n, x, y) blitrow_d16_si8(d, s, n, ctable) |
| 223 | 223 |
| 224 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque | 224 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Opaque |
| 225 #define SkSPRITE_ARGS | 225 #define SkSPRITE_ARGS |
| 226 #define SkSPRITE_FIELDS | 226 #define SkSPRITE_FIELDS |
| 227 #define SkSPRITE_INIT | 227 #define SkSPRITE_INIT |
| 228 #define SkSPRITE_DST_TYPE uint16_t | 228 #define SkSPRITE_DST_TYPE uint16_t |
| 229 #define SkSPRITE_SRC_TYPE uint8_t | 229 #define SkSPRITE_SRC_TYPE uint8_t |
| 230 #define SkSPRITE_DST_GETADDR getAddr16 | 230 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 231 #define SkSPRITE_SRC_GETADDR addr8 | 231 #define SkSPRITE_SRC_GETADDR addr8 |
| 232 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache() | 232 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache() |
| 233 #define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src] | 233 #define SkSPRITE_BLIT_PIXEL(dst, src) *dst = ctable[src] |
| 234 #define SkSPRITE_NEXT_ROW | 234 #define SkSPRITE_NEXT_ROW |
| 235 #define SkSPRITE_POSTAMBLE(srcBM) | 235 #define SkSPRITE_POSTAMBLE(srcBM) |
| 236 #include "SkSpriteBlitterTemplate.h" | 236 #include "SkSpriteBlitterTemplate.h" |
| 237 | 237 |
| 238 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend | 238 #define SkSPRITE_CLASSNAME Sprite_D16_SIndex8_Blend |
| 239 #define SkSPRITE_ARGS , uint8_t alpha | 239 #define SkSPRITE_ARGS , uint8_t alpha |
| 240 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; | 240 #define SkSPRITE_FIELDS uint8_t fSrcAlpha; |
| 241 #define SkSPRITE_INIT fSrcAlpha = alpha; | 241 #define SkSPRITE_INIT fSrcAlpha = alpha; |
| 242 #define SkSPRITE_DST_TYPE uint16_t | 242 #define SkSPRITE_DST_TYPE uint16_t |
| 243 #define SkSPRITE_SRC_TYPE uint8_t | 243 #define SkSPRITE_SRC_TYPE uint8_t |
| 244 #define SkSPRITE_DST_GETADDR getAddr16 | 244 #define SkSPRITE_DST_GETADDR writable_addr16 |
| 245 #define SkSPRITE_SRC_GETADDR addr8 | 245 #define SkSPRITE_SRC_GETADDR addr8 |
| 246 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); | 246 #define SkSPRITE_PREAMBLE(srcBM, x, y) const uint16_t* ctable = srcBM.ctabl
e()->read16BitCache(); unsigned src_scale = SkAlpha255To256(fSrcAlpha); |
| 247 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src]
, src_scale) | 247 #define SkSPRITE_BLIT_PIXEL(dst, src) D16_S16_Blend_Pixel(dst, ctable[src]
, src_scale) |
| 248 #define SkSPRITE_NEXT_ROW | 248 #define SkSPRITE_NEXT_ROW |
| 249 #define SkSPRITE_POSTAMBLE(srcBM) | 249 #define SkSPRITE_POSTAMBLE(srcBM) |
| 250 #include "SkSpriteBlitterTemplate.h" | 250 #include "SkSpriteBlitterTemplate.h" |
| 251 | 251 |
| 252 /////////////////////////////////////////////////////////////////////////////// | 252 /////////////////////////////////////////////////////////////////////////////// |
| 253 | 253 |
| 254 class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter { | 254 class Sprite_D16_S32_BlitRowProc : public SkSpriteBlitter { |
| 255 public: | 255 public: |
| 256 Sprite_D16_S32_BlitRowProc(const SkPixmap& source) : SkSpriteBlitter(source)
{} | 256 Sprite_D16_S32_BlitRowProc(const SkPixmap& source) : SkSpriteBlitter(source)
{} |
| 257 | 257 |
| 258 void setup(const SkBitmap& device, int left, int top, const SkPaint& paint)
override { | 258 void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) ove
rride { |
| 259 this->INHERITED::setup(device, left, top, paint); | 259 this->INHERITED::setup(dst, left, top, paint); |
| 260 | 260 |
| 261 unsigned flags = 0; | 261 unsigned flags = 0; |
| 262 | 262 |
| 263 if (paint.getAlpha() < 0xFF) { | 263 if (paint.getAlpha() < 0xFF) { |
| 264 flags |= SkBlitRow::kGlobalAlpha_Flag; | 264 flags |= SkBlitRow::kGlobalAlpha_Flag; |
| 265 } | 265 } |
| 266 if (!fSource.isOpaque()) { | 266 if (!fSource.isOpaque()) { |
| 267 flags |= SkBlitRow::kSrcPixelAlpha_Flag; | 267 flags |= SkBlitRow::kSrcPixelAlpha_Flag; |
| 268 } | 268 } |
| 269 if (paint.isDither()) { | 269 if (paint.isDither()) { |
| 270 flags |= SkBlitRow::kDither_Flag; | 270 flags |= SkBlitRow::kDither_Flag; |
| 271 } | 271 } |
| 272 fProc = SkBlitRow::Factory16(flags); | 272 fProc = SkBlitRow::Factory16(flags); |
| 273 } | 273 } |
| 274 | 274 |
| 275 void blitRect(int x, int y, int width, int height) override { | 275 void blitRect(int x, int y, int width, int height) override { |
| 276 uint16_t* SK_RESTRICT dst = fDevice->getAddr16(x, y); | 276 uint16_t* SK_RESTRICT dst = fDst.writable_addr16(x, y); |
| 277 const SkPMColor* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); | 277 const SkPMColor* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); |
| 278 size_t dstRB = fDevice->rowBytes(); | 278 size_t dstRB = fDst.rowBytes(); |
| 279 size_t srcRB = fSource.rowBytes(); | 279 size_t srcRB = fSource.rowBytes(); |
| 280 SkBlitRow::Proc16 proc = fProc; | 280 SkBlitRow::Proc16 proc = fProc; |
| 281 U8CPU alpha = fPaint->getAlpha(); | 281 U8CPU alpha = fPaint->getAlpha(); |
| 282 | 282 |
| 283 while (--height >= 0) { | 283 while (--height >= 0) { |
| 284 proc(dst, src, width, alpha, x, y); | 284 proc(dst, src, width, alpha, x, y); |
| 285 y += 1; | 285 y += 1; |
| 286 dst = (uint16_t* SK_RESTRICT)((char*)dst + dstRB); | 286 dst = (uint16_t* SK_RESTRICT)((char*)dst + dstRB); |
| 287 src = (const SkPMColor* SK_RESTRICT)((const char*)src + srcRB); | 287 src = (const SkPMColor* SK_RESTRICT)((const char*)src + srcRB); |
| 288 } | 288 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 } else { | 361 } else { |
| 362 blitter = allocator->createT<Sprite_D16_SIndex8A_Blend>(sour
ce, alpha); | 362 blitter = allocator->createT<Sprite_D16_SIndex8A_Blend>(sour
ce, alpha); |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 break; | 365 break; |
| 366 default: | 366 default: |
| 367 break; | 367 break; |
| 368 } | 368 } |
| 369 return blitter; | 369 return blitter; |
| 370 } | 370 } |
| OLD | NEW |