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