| /* | 
 |  * Copyright 2006 The Android Open Source Project | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "SkSmallAllocator.h" | 
 | #include "SkSpriteBlitter.h" | 
 |  | 
 | SkSpriteBlitter::SkSpriteBlitter(const SkBitmap& source) | 
 |         : fSource(&source) { | 
 |     fSource->lockPixels(); | 
 | } | 
 |  | 
 | SkSpriteBlitter::~SkSpriteBlitter() { | 
 |     fSource->unlockPixels(); | 
 | } | 
 |  | 
 | void SkSpriteBlitter::setup(const SkBitmap& device, int left, int top, | 
 |                             const SkPaint& paint) { | 
 |     fDevice = &device; | 
 |     fLeft = left; | 
 |     fTop = top; | 
 |     fPaint = &paint; | 
 | } | 
 |  | 
 | #ifdef SK_DEBUG | 
 | void SkSpriteBlitter::blitH(int x, int y, int width) { | 
 |     SkDEBUGFAIL("how did we get here?"); | 
 | } | 
 |  | 
 | void SkSpriteBlitter::blitAntiH(int x, int y, const SkAlpha antialias[], | 
 |                                 const int16_t runs[]) { | 
 |     SkDEBUGFAIL("how did we get here?"); | 
 | } | 
 |  | 
 | void SkSpriteBlitter::blitV(int x, int y, int height, SkAlpha alpha) { | 
 |     SkDEBUGFAIL("how did we get here?"); | 
 | } | 
 |  | 
 | void SkSpriteBlitter::blitMask(const SkMask&, const SkIRect& clip) { | 
 |     SkDEBUGFAIL("how did we get here?"); | 
 | } | 
 | #endif | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | // returning null means the caller will call SkBlitter::Choose() and | 
 | // have wrapped the source bitmap inside a shader | 
 | SkBlitter* SkBlitter::ChooseSprite(const SkBitmap& device, const SkPaint& paint, | 
 |         const SkBitmap& source, int left, int top, SkTBlitterAllocator* allocator) { | 
 |     /*  We currently ignore antialiasing and filtertype, meaning we will take our | 
 |         special blitters regardless of these settings. Ignoring filtertype seems fine | 
 |         since by definition there is no scale in the matrix. Ignoring antialiasing is | 
 |         a bit of a hack, since we "could" pass in the fractional left/top for the bitmap, | 
 |         and respect that by blending the edges of the bitmap against the device. To support | 
 |         this we could either add more special blitters here, or detect antialiasing in the | 
 |         paint and return null if it is set, forcing the client to take the slow shader case | 
 |         (which does respect soft edges). | 
 |     */ | 
 |     SkASSERT(allocator != NULL); | 
 |  | 
 |     SkSpriteBlitter* blitter; | 
 |  | 
 |     switch (device.colorType()) { | 
 |         case kRGB_565_SkColorType: | 
 |             blitter = SkSpriteBlitter::ChooseD16(source, paint, allocator); | 
 |             break; | 
 |         case kN32_SkColorType: | 
 |             blitter = SkSpriteBlitter::ChooseD32(source, paint, allocator); | 
 |             break; | 
 |         default: | 
 |             blitter = NULL; | 
 |             break; | 
 |     } | 
 |  | 
 |     if (blitter) { | 
 |         blitter->setup(device, left, top, paint); | 
 |     } | 
 |     return blitter; | 
 | } |