1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2006 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h" 9cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 10cb93a386Sopenharmony_ci#include "include/private/SkColorData.h" 11cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h" 12cb93a386Sopenharmony_ci#include "src/core/SkArenaAlloc.h" 13cb93a386Sopenharmony_ci#include "src/core/SkBlitRow.h" 14cb93a386Sopenharmony_ci#include "src/core/SkSpriteBlitter.h" 15cb93a386Sopenharmony_ci#include "src/core/SkXfermodePriv.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciclass Sprite_D32_S32 : public SkSpriteBlitter { 20cb93a386Sopenharmony_cipublic: 21cb93a386Sopenharmony_ci Sprite_D32_S32(const SkPixmap& src, U8CPU alpha) : INHERITED(src) { 22cb93a386Sopenharmony_ci SkASSERT(src.colorType() == kN32_SkColorType); 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci unsigned flags32 = 0; 25cb93a386Sopenharmony_ci if (255 != alpha) { 26cb93a386Sopenharmony_ci flags32 |= SkBlitRow::kGlobalAlpha_Flag32; 27cb93a386Sopenharmony_ci } 28cb93a386Sopenharmony_ci if (!src.isOpaque()) { 29cb93a386Sopenharmony_ci flags32 |= SkBlitRow::kSrcPixelAlpha_Flag32; 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci fProc32 = SkBlitRow::Factory32(flags32); 33cb93a386Sopenharmony_ci fAlpha = alpha; 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci void blitRect(int x, int y, int width, int height) override { 37cb93a386Sopenharmony_ci SkASSERT(width > 0 && height > 0); 38cb93a386Sopenharmony_ci uint32_t* SK_RESTRICT dst = fDst.writable_addr32(x, y); 39cb93a386Sopenharmony_ci const uint32_t* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); 40cb93a386Sopenharmony_ci size_t dstRB = fDst.rowBytes(); 41cb93a386Sopenharmony_ci size_t srcRB = fSource.rowBytes(); 42cb93a386Sopenharmony_ci SkBlitRow::Proc32 proc = fProc32; 43cb93a386Sopenharmony_ci U8CPU alpha = fAlpha; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci do { 46cb93a386Sopenharmony_ci proc(dst, src, width, alpha); 47cb93a386Sopenharmony_ci dst = (uint32_t* SK_RESTRICT)((char*)dst + dstRB); 48cb93a386Sopenharmony_ci src = (const uint32_t* SK_RESTRICT)((const char*)src + srcRB); 49cb93a386Sopenharmony_ci } while (--height != 0); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ciprivate: 53cb93a386Sopenharmony_ci SkBlitRow::Proc32 fProc32; 54cb93a386Sopenharmony_ci U8CPU fAlpha; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci using INHERITED = SkSpriteBlitter; 57cb93a386Sopenharmony_ci}; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ciclass Sprite_D32_S32A_Xfer: public SkSpriteBlitter { 62cb93a386Sopenharmony_cipublic: 63cb93a386Sopenharmony_ci Sprite_D32_S32A_Xfer(const SkPixmap& source, const SkPaint& paint) : SkSpriteBlitter(source) { 64cb93a386Sopenharmony_ci fXfermode = SkXfermode::Peek(paint.getBlendMode_or(SkBlendMode::kSrcOver)); 65cb93a386Sopenharmony_ci SkASSERT(fXfermode); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci void blitRect(int x, int y, int width, int height) override { 69cb93a386Sopenharmony_ci SkASSERT(width > 0 && height > 0); 70cb93a386Sopenharmony_ci uint32_t* SK_RESTRICT dst = fDst.writable_addr32(x, y); 71cb93a386Sopenharmony_ci const uint32_t* SK_RESTRICT src = fSource.addr32(x - fLeft, y - fTop); 72cb93a386Sopenharmony_ci size_t dstRB = fDst.rowBytes(); 73cb93a386Sopenharmony_ci size_t srcRB = fSource.rowBytes(); 74cb93a386Sopenharmony_ci SkXfermode* xfermode = fXfermode; 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci do { 77cb93a386Sopenharmony_ci xfermode->xfer32(dst, src, width, nullptr); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci dst = (uint32_t* SK_RESTRICT)((char*)dst + dstRB); 80cb93a386Sopenharmony_ci src = (const uint32_t* SK_RESTRICT)((const char*)src + srcRB); 81cb93a386Sopenharmony_ci } while (--height != 0); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ciprotected: 85cb93a386Sopenharmony_ci SkXfermode* fXfermode; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ciprivate: 88cb93a386Sopenharmony_ci using INHERITED = SkSpriteBlitter; 89cb93a386Sopenharmony_ci}; 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ciSkSpriteBlitter* SkSpriteBlitter::ChooseL32(const SkPixmap& source, const SkPaint& paint, 94cb93a386Sopenharmony_ci SkArenaAlloc* allocator) { 95cb93a386Sopenharmony_ci SkASSERT(allocator != nullptr); 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci if (paint.getColorFilter() != nullptr) { 98cb93a386Sopenharmony_ci return nullptr; 99cb93a386Sopenharmony_ci } 100cb93a386Sopenharmony_ci if (paint.getMaskFilter() != nullptr) { 101cb93a386Sopenharmony_ci return nullptr; 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci if (!paint.asBlendMode()) { 104cb93a386Sopenharmony_ci return nullptr; 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci U8CPU alpha = paint.getAlpha(); 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci if (source.colorType() == kN32_SkColorType) { 110cb93a386Sopenharmony_ci if (paint.isSrcOver()) { 111cb93a386Sopenharmony_ci // this can handle alpha, but not xfermode 112cb93a386Sopenharmony_ci return allocator->make<Sprite_D32_S32>(source, alpha); 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci if (255 == alpha) { 115cb93a386Sopenharmony_ci // this can handle an xfermode, but not alpha 116cb93a386Sopenharmony_ci return allocator->make<Sprite_D32_S32A_Xfer>(source, paint); 117cb93a386Sopenharmony_ci } 118cb93a386Sopenharmony_ci } 119cb93a386Sopenharmony_ci return nullptr; 120cb93a386Sopenharmony_ci} 121