diff options
Diffstat (limited to 'skia/sgl/SkBlitter_Sprite.cpp')
-rw-r--r-- | skia/sgl/SkBlitter_Sprite.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/skia/sgl/SkBlitter_Sprite.cpp b/skia/sgl/SkBlitter_Sprite.cpp new file mode 100644 index 0000000..6ce8f13 --- /dev/null +++ b/skia/sgl/SkBlitter_Sprite.cpp @@ -0,0 +1,101 @@ +/* libs/graphics/sgl/SkBlitter_Sprite.cpp +** +** Copyright 2006, Google Inc. +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + +#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) +{ + SkASSERT(!"how did we get here?"); +} + +void SkSpriteBlitter::blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) +{ + SkASSERT(!"how did we get here?"); +} + +void SkSpriteBlitter::blitV(int x, int y, int height, SkAlpha alpha) +{ + SkASSERT(!"how did we get here?"); +} + +void SkSpriteBlitter::blitMask(const SkMask&, const SkIRect& clip) +{ + SkASSERT(!"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, + void* storage, size_t storageSize) +{ + /* 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). + */ + + SkSpriteBlitter* blitter; + + switch (device.getConfig()) { + case SkBitmap::kRGB_565_Config: + blitter = SkSpriteBlitter::ChooseD16(source, paint, storage, storageSize); + break; + case SkBitmap::kARGB_8888_Config: + blitter = SkSpriteBlitter::ChooseD32(source, paint, storage, storageSize); + break; + default: + blitter = NULL; + break; + } + + if (blitter) + blitter->setup(device, left, top, paint); + return blitter; +} + |