1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2006 The Android Open Source Project 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkSpriteBlitter.h" 11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source) 13d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org : fSource(&source) { 14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fSource->lockPixels(); 15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 17d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.orgSkSpriteBlitter::~SkSpriteBlitter() { 18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fSource->unlockPixels(); 19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkSpriteBlitter::setup(const SkBitmap& device, int left, int top, 22d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org const SkPaint& paint) { 23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fDevice = &device; 24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fLeft = left; 25bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fTop = top; 26bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com fPaint = &paint; 27bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 28bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 29bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG 30d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.orgvoid SkSpriteBlitter::blitH(int x, int y, int width) { 312d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com SkDEBUGFAIL("how did we get here?"); 32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 33bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 34d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.orgvoid SkSpriteBlitter::blitAntiH(int x, int y, const SkAlpha antialias[], 35d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org const int16_t runs[]) { 362d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com SkDEBUGFAIL("how did we get here?"); 37bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 38bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 39d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.orgvoid SkSpriteBlitter::blitV(int x, int y, int height, SkAlpha alpha) { 402d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com SkDEBUGFAIL("how did we get here?"); 41bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 42bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 43d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.orgvoid SkSpriteBlitter::blitMask(const SkMask&, const SkIRect& clip) { 442d7de2d243beab591671dfaf535a637b5d305735tomhudson@google.com SkDEBUGFAIL("how did we get here?"); 45bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 46bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif 47bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 48d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 49bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// returning null means the caller will call SkBlitter::Choose() and 51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com// have wrapped the source bitmap inside a shader 52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkBlitter* SkBlitter::ChooseSprite( const SkBitmap& device, 53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const SkPaint& paint, 54bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const SkBitmap& source, 55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com int left, int top, 56d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org void* storage, size_t storageSize) { 57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com /* We currently ignore antialiasing and filtertype, meaning we will take our 58bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com special blitters regardless of these settings. Ignoring filtertype seems fine 59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com since by definition there is no scale in the matrix. Ignoring antialiasing is 60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com a bit of a hack, since we "could" pass in the fractional left/top for the bitmap, 61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com and respect that by blending the edges of the bitmap against the device. To support 62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com this we could either add more special blitters here, or detect antialiasing in the 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com paint and return null if it is set, forcing the client to take the slow shader case 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com (which does respect soft edges). 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com */ 66bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkSpriteBlitter* blitter; 68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 69bb6a0d330cd7dae11f94aff99c001d4d1eca0716reed@google.com switch (device.config()) { 70d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org case SkBitmap::kRGB_565_Config: 71d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org blitter = SkSpriteBlitter::ChooseD16(source, paint, storage, 72d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org storageSize); 73d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org break; 74d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org case SkBitmap::kARGB_8888_Config: 75d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org blitter = SkSpriteBlitter::ChooseD32(source, paint, storage, 76d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org storageSize); 77d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org break; 78d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org default: 79d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org blitter = NULL; 80d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org break; 81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 83d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org if (blitter) { 84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com blitter->setup(device, left, top, paint); 85d6846333444517e04986bea72e721a77eac9abe3mike@reedtribe.org } 86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return blitter; 87bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 88