Index: skia/sgl/SkBitmapSampler.cpp |
=================================================================== |
--- skia/sgl/SkBitmapSampler.cpp (revision 16859) |
+++ skia/sgl/SkBitmapSampler.cpp (working copy) |
@@ -1,423 +0,0 @@ |
-/* libs/graphics/sgl/SkBitmapSampler.cpp |
-** |
-** Copyright 2006, The Android Open Source Project |
-** |
-** 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 "SkBitmapSampler.h" |
- |
-static SkTileModeProc get_tilemode_proc(SkShader::TileMode mode) |
-{ |
- switch (mode) { |
- case SkShader::kClamp_TileMode: |
- return do_clamp; |
- case SkShader::kRepeat_TileMode: |
- return do_repeat_mod; |
- case SkShader::kMirror_TileMode: |
- return do_mirror_mod; |
- default: |
- SkASSERT(!"unknown mode"); |
- return NULL; |
- } |
-} |
- |
-SkBitmapSampler::SkBitmapSampler(const SkBitmap& bm, bool filter, |
- SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : fBitmap(bm), fFilterBitmap(filter), fTileModeX(tmx), fTileModeY(tmy) |
-{ |
- SkASSERT(bm.width() > 0 && bm.height() > 0); |
- |
- fMaxX = SkToU16(bm.width() - 1); |
- fMaxY = SkToU16(bm.height() - 1); |
- |
- fTileProcX = get_tilemode_proc(tmx); |
- fTileProcY = get_tilemode_proc(tmy); |
-} |
- |
-void SkBitmapSampler::setPaint(const SkPaint& paint) |
-{ |
-} |
- |
-class SkNullBitmapSampler : public SkBitmapSampler { |
-public: |
- SkNullBitmapSampler(const SkBitmap& bm, bool filter, |
- SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, filter, tmx, tmy) {} |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const { return 0; } |
-}; |
- |
-///////////////////////////////////////////////////////////////////////////////// |
-///////////////////////////////////////////////////////////////////////////////// |
- |
-#define BITMAP_CLASSNAME_PREFIX(name) ARGB32##name |
-#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y) *bitmap.getAddr32(x, y) |
-#include "SkBitmapSamplerTemplate.h" |
- |
-#include "SkColorPriv.h" |
- |
-#define BITMAP_CLASSNAME_PREFIX(name) RGB16##name |
-#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y) SkPixel16ToPixel32(*bitmap.getAddr16(x, y)) |
-#include "SkBitmapSamplerTemplate.h" |
- |
-#define BITMAP_CLASSNAME_PREFIX(name) Index8##name |
-#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y) bitmap.getIndex8Color(x, y) |
-#include "SkBitmapSamplerTemplate.h" |
- |
-///////////////////////////////////////////////////////////////////////////////// |
-///////////////////////////////////////////////////////////////////////////////// |
-///////////////// The Bilinear versions |
- |
-#include "SkFilterProc.h" |
- |
-class ARGB32_Bilinear_Sampler : public SkBitmapSampler { |
-public: |
- ARGB32_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, true, tmx, tmy) |
- { |
- fPtrProcTable = SkGetBilinearFilterPtrProcTable(); |
- } |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const |
- { |
- const uint32_t *p00, *p01, *p10, *p11; |
- |
- // turn pixel centers into the top-left of our filter-box |
- x -= SK_FixedHalf; |
- y -= SK_FixedHalf; |
- |
- // compute our pointers |
- { |
- const SkBitmap* bitmap = &fBitmap; |
- int ix = x >> 16; |
- int iy = y >> 16; |
- |
- int maxX = fMaxX; |
- SkTileModeProc procX = fTileProcX; |
- int maxY = fMaxY; |
- SkTileModeProc procY = fTileProcY; |
- |
- int tmpx = procX(ix, maxX); |
- int tmpy = procY(iy, maxY); |
- p00 = bitmap->getAddr32(tmpx, tmpy); |
- |
- int tmpx1 = procX(ix + 1, maxX); |
- p01 = bitmap->getAddr32(tmpx1, tmpy); |
- |
- int tmpy1 = procY(iy + 1, maxY); |
- p10 = bitmap->getAddr32(tmpx, tmpy1); |
- |
- p11 = bitmap->getAddr32(tmpx1, tmpy1); |
- } |
- |
- SkFilterPtrProc proc = SkGetBilinearFilterPtrProc(fPtrProcTable, x, y); |
- return proc(p00, p01, p10, p11); |
- } |
- |
-private: |
- const SkFilterPtrProc* fPtrProcTable; |
-}; |
- |
-class RGB16_Bilinear_Sampler : public SkBitmapSampler { |
-public: |
- RGB16_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, true, tmx, tmy) |
- { |
- fProcTable = SkGetBilinearFilterProcTable(); |
- } |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const |
- { |
- const uint16_t *p00, *p01, *p10, *p11; |
- |
- // turn pixel centers into the top-left of our filter-box |
- x -= SK_FixedHalf; |
- y -= SK_FixedHalf; |
- |
- // compute our pointers |
- { |
- const SkBitmap* bitmap = &fBitmap; |
- int ix = x >> 16; |
- int iy = y >> 16; |
- |
- int maxX = fMaxX; |
- SkTileModeProc procX = fTileProcX; |
- int maxY = fMaxY; |
- SkTileModeProc procY = fTileProcY; |
- |
- int tmpx = procX(ix, maxX); |
- int tmpy = procY(iy, maxY); |
- p00 = bitmap->getAddr16(tmpx, tmpy); |
- |
- int tmpx1 = procX(ix + 1, maxX); |
- p01 = bitmap->getAddr16(tmpx1, tmpy); |
- |
- int tmpy1 = procY(iy + 1, maxY); |
- p10 = bitmap->getAddr16(tmpx, tmpy1); |
- |
- p11 = bitmap->getAddr16(tmpx1, tmpy1); |
- } |
- |
- SkFilterProc proc = SkGetBilinearFilterProc(fProcTable, x, y); |
- uint32_t c = proc(SkExpand_rgb_16(*p00), SkExpand_rgb_16(*p01), |
- SkExpand_rgb_16(*p10), SkExpand_rgb_16(*p11)); |
- |
- return SkPixel16ToPixel32((uint16_t)SkCompact_rgb_16(c)); |
- } |
- |
-private: |
- const SkFilterProc* fProcTable; |
-}; |
- |
-// If we had a init/term method on sampler, we could avoid the per-pixel |
-// call to lockColors/unlockColors |
- |
-class Index8_Bilinear_Sampler : public SkBitmapSampler { |
-public: |
- Index8_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, true, tmx, tmy) |
- { |
- fPtrProcTable = SkGetBilinearFilterPtrProcTable(); |
- } |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const |
- { |
- const SkBitmap* bitmap = &fBitmap; |
- |
- const uint8_t *p00, *p01, *p10, *p11; |
- |
- // turn pixel centers into the top-left of our filter-box |
- x -= SK_FixedHalf; |
- y -= SK_FixedHalf; |
- |
- // compute our pointers |
- { |
- int ix = x >> 16; |
- int iy = y >> 16; |
- |
- int maxX = fMaxX; |
- SkTileModeProc procX = fTileProcX; |
- int maxY = fMaxY; |
- SkTileModeProc procY = fTileProcY; |
- |
- int tmpx = procX(ix, maxX); |
- int tmpy = procY(iy, maxY); |
- p00 = bitmap->getAddr8(tmpx, tmpy); |
- |
- int tmpx1 = procX(ix + 1, maxX); |
- p01 = bitmap->getAddr8(tmpx1, tmpy); |
- |
- int tmpy1 = procY(iy + 1, maxY); |
- p10 = bitmap->getAddr8(tmpx, tmpy1); |
- |
- p11 = bitmap->getAddr8(tmpx1, tmpy1); |
- } |
- |
- const SkPMColor* colors = bitmap->getColorTable()->lockColors(); |
- |
- SkFilterPtrProc proc = SkGetBilinearFilterPtrProc(fPtrProcTable, x, y); |
- uint32_t c = proc(&colors[*p00], &colors[*p01], &colors[*p10], &colors[*p11]); |
- |
- bitmap->getColorTable()->unlockColors(false); |
- |
- return c; |
- } |
- |
-private: |
- const SkFilterPtrProc* fPtrProcTable; |
-}; |
- |
-class A8_Bilinear_Sampler : public SkBitmapSampler { |
-public: |
- A8_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, true, tmx, tmy) |
- { |
- fProcTable = SkGetBilinearFilterProcTable(); |
- } |
- |
- virtual void setPaint(const SkPaint& paint) |
- { |
- fColor = SkPreMultiplyColor(paint.getColor()); |
- } |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const |
- { |
- const uint8_t *p00, *p01, *p10, *p11; |
- |
- // turn pixel centers into the top-left of our filter-box |
- x -= SK_FixedHalf; |
- y -= SK_FixedHalf; |
- |
- // compute our pointers |
- { |
- const SkBitmap* bitmap = &fBitmap; |
- int ix = x >> 16; |
- int iy = y >> 16; |
- |
- int maxX = fMaxX; |
- SkTileModeProc procX = fTileProcX; |
- int maxY = fMaxY; |
- SkTileModeProc procY = fTileProcY; |
- |
- int tmpx = procX(ix, maxX); |
- int tmpy = procY(iy, maxY); |
- p00 = bitmap->getAddr8(tmpx, tmpy); |
- |
- int tmpx1 = procX(ix + 1, maxX); |
- p01 = bitmap->getAddr8(tmpx1, tmpy); |
- |
- int tmpy1 = procY(iy + 1, maxY); |
- p10 = bitmap->getAddr8(tmpx, tmpy1); |
- |
- p11 = bitmap->getAddr8(tmpx1, tmpy1); |
- } |
- |
- SkFilterProc proc = SkGetBilinearFilterProc(fProcTable, x, y); |
- int alpha = proc(*p00, *p01, *p10, *p11); |
- return SkAlphaMulQ(fColor, SkAlpha255To256(alpha)); |
- } |
- |
-private: |
- const SkFilterProc* fProcTable; |
- SkPMColor fColor; |
-}; |
- |
-class A8_NoFilter_Sampler : public SkBitmapSampler { |
-public: |
- A8_NoFilter_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy) |
- : SkBitmapSampler(bm, false, tmx, tmy) |
- { |
- } |
- |
- virtual void setPaint(const SkPaint& paint) |
- { |
- fColor = SkPreMultiplyColor(paint.getColor()); |
- } |
- |
- virtual SkPMColor sample(SkFixed x, SkFixed y) const |
- { |
- int ix = SkFixedFloor(x); |
- int iy = SkFixedFloor(y); |
- |
- int alpha = *fBitmap.getAddr8(fTileProcX(ix, fMaxX), fTileProcY(iy, fMaxY)); |
- return SkAlphaMulQ(fColor, SkAlpha255To256(alpha)); |
- } |
- |
-private: |
- const SkFilterProc* fProcTable; |
- SkPMColor fColor; |
-}; |
- |
-/////////////////////////////////////////////////////////////////////////////// |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-SkBitmapSampler* SkBitmapSampler::Create(const SkBitmap& bm, bool doFilter, |
- SkShader::TileMode tmx, |
- SkShader::TileMode tmy) |
-{ |
- switch (bm.getConfig()) { |
- case SkBitmap::kARGB_8888_Config: |
- if (doFilter) |
- return SkNEW_ARGS(ARGB32_Bilinear_Sampler, (bm, tmx, tmy)); |
- |
- if (tmx == tmy) { |
- switch (tmx) { |
- case SkShader::kClamp_TileMode: |
- return SkNEW_ARGS(ARGB32_Point_Clamp_Sampler, (bm)); |
- case SkShader::kRepeat_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(ARGB32_Point_Repeat_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(ARGB32_Point_Repeat_Mod_Sampler, (bm)); |
- case SkShader::kMirror_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(ARGB32_Point_Mirror_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(ARGB32_Point_Mirror_Mod_Sampler, (bm)); |
- default: |
- SkASSERT(!"unknown mode"); |
- } |
- } |
- else { // tmx != tmy |
- return SkNEW_ARGS(ARGB32_Point_Sampler, (bm, tmx, tmy)); |
- } |
- break; |
- |
- case SkBitmap::kRGB_565_Config: |
- if (doFilter) |
- return SkNEW_ARGS(RGB16_Bilinear_Sampler, (bm, tmx, tmy)); |
- |
- if (tmx == tmy) { |
- switch (tmx) { |
- case SkShader::kClamp_TileMode: |
- return SkNEW_ARGS(RGB16_Point_Clamp_Sampler, (bm)); |
- case SkShader::kRepeat_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(RGB16_Point_Repeat_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(RGB16_Point_Repeat_Mod_Sampler, (bm)); |
- case SkShader::kMirror_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(RGB16_Point_Mirror_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(RGB16_Point_Mirror_Mod_Sampler, (bm)); |
- default: |
- SkASSERT(!"unknown mode"); |
- } |
- } |
- else { // tmx != tmy |
- return SkNEW_ARGS(RGB16_Point_Sampler, (bm, tmx, tmy)); |
- } |
- break; |
- |
- case SkBitmap::kIndex8_Config: |
- if (doFilter) |
- return SkNEW_ARGS(Index8_Bilinear_Sampler, (bm, tmx, tmy)); |
- |
- if (tmx == tmy) { |
- switch (tmx) { |
- case SkShader::kClamp_TileMode: |
- return SkNEW_ARGS(Index8_Point_Clamp_Sampler, (bm)); |
- case SkShader::kRepeat_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(Index8_Point_Repeat_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(Index8_Point_Repeat_Mod_Sampler, (bm)); |
- case SkShader::kMirror_TileMode: |
- if (is_pow2(bm.width()) && is_pow2(bm.height())) |
- return SkNEW_ARGS(Index8_Point_Mirror_Pow2_Sampler, (bm)); |
- else |
- return SkNEW_ARGS(Index8_Point_Mirror_Mod_Sampler, (bm)); |
- default: |
- SkASSERT(!"unknown mode"); |
- } |
- } |
- else { // tmx != tmy |
- return SkNEW_ARGS(Index8_Point_Sampler, (bm, tmx, tmy)); |
- } |
- break; |
- |
- case SkBitmap::kA8_Config: |
- if (doFilter) |
- return SkNEW_ARGS(A8_Bilinear_Sampler, (bm, tmx, tmy)); |
- else |
- return SkNEW_ARGS(A8_NoFilter_Sampler, (bm, tmx, tmy)); |
- break; |
- |
- default: |
- SkASSERT(!"unknown device"); |
- } |
- return SkNEW_ARGS(SkNullBitmapSampler, (bm, doFilter, tmx, tmy)); |
-} |
- |