diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:36 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:36 -0800 |
commit | 6eb364108744656fcd23a96a478aa772cd4e85bc (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /src/images/SkScaledBitmapSampler.cpp | |
parent | a23c4e24d873b11674987f97f1946e1c4d97e782 (diff) | |
download | external_skia-6eb364108744656fcd23a96a478aa772cd4e85bc.zip external_skia-6eb364108744656fcd23a96a478aa772cd4e85bc.tar.gz external_skia-6eb364108744656fcd23a96a478aa772cd4e85bc.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'src/images/SkScaledBitmapSampler.cpp')
-rw-r--r-- | src/images/SkScaledBitmapSampler.cpp | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/src/images/SkScaledBitmapSampler.cpp b/src/images/SkScaledBitmapSampler.cpp deleted file mode 100644 index 15f4432..0000000 --- a/src/images/SkScaledBitmapSampler.cpp +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright 2007, 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 "SkScaledBitmapSampler.h" -#include "SkBitmap.h" -#include "SkColorPriv.h" -#include "SkDither.h" - -// 8888 - -static bool Sample_Gray_D8888(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = SkPackARGB32(0xFF, src[0], src[0], src[0]); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBx_D8888(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBA_D8888(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; - unsigned alphaMask = 0xFF; - for (int x = 0; x < width; x++) { - unsigned alpha = src[3]; - dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); - src += deltaSrc; - alphaMask &= alpha; - } - return alphaMask != 0xFF; -} - -// 565 - -static bool Sample_Gray_D565(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]); - src += deltaSrc; - } - return false; -} - -static bool Sample_Gray_D565_D(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int y) { - uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; - DITHER_565_SCAN(y); - for (int x = 0; x < width; x++) { - dst[x] = SkDitherRGBTo565(src[0], src[0], src[0], DITHER_VALUE(x)); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBx_D565(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBx_D565_D(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int y) { - uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; - DITHER_565_SCAN(y); - for (int x = 0; x < width; x++) { - dst[x] = SkDitherRGBTo565(src[0], src[1], src[2], DITHER_VALUE(x)); - src += deltaSrc; - } - return false; -} - -// 4444 - -static bool Sample_Gray_D4444(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; - for (int x = 0; x < width; x++) { - unsigned gray = src[0] >> 4; - dst[x] = SkPackARGB4444(0xF, gray, gray, gray); - src += deltaSrc; - } - return false; -} - -static bool Sample_Gray_D4444_D(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int y) { - SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; - DITHER_4444_SCAN(y); - for (int x = 0; x < width; x++) { - dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[0], src[0], - DITHER_VALUE(x)); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBx_D4444(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = SkPackARGB4444(0xF, src[0] >> 4, src[1] >> 4, src[2] >> 4); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBx_D4444_D(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int y) { - SkPMColor16* dst = (SkPMColor16*)dstRow; - DITHER_4444_SCAN(y); - - for (int x = 0; x < width; x++) { - dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[1], src[2], - DITHER_VALUE(x)); - src += deltaSrc; - } - return false; -} - -static bool Sample_RGBA_D4444(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; - unsigned alphaMask = 0xFF; - - for (int x = 0; x < width; x++) { - unsigned alpha = src[3]; - SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); - dst[x] = SkPixel32ToPixel4444(c); - src += deltaSrc; - alphaMask &= alpha; - } - return alphaMask != 0xFF; -} - -static bool Sample_RGBA_D4444_D(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int y) { - SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow; - unsigned alphaMask = 0xFF; - DITHER_4444_SCAN(y); - - for (int x = 0; x < width; x++) { - unsigned alpha = src[3]; - SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]); - dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x)); - src += deltaSrc; - alphaMask &= alpha; - } - return alphaMask != 0xFF; -} - -// Index - -static bool Sample_Index_DI(void* SK_RESTRICT dstRow, - const uint8_t* SK_RESTRICT src, - int width, int deltaSrc, int) { - if (1 == deltaSrc) { - memcpy(dstRow, src, width); - } else { - uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow; - for (int x = 0; x < width; x++) { - dst[x] = src[0]; - src += deltaSrc; - } - } - return false; -} - -/////////////////////////////////////////////////////////////////////////////// - -#include "SkScaledBitmapSampler.h" - -SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, - int sampleSize) { - if (width <= 0 || height <= 0) { - sk_throw(); - } - - if (sampleSize <= 1) { - fScaledWidth = width; - fScaledHeight = height; - fX0 = fY0 = 0; - fDX = fDY = 1; - return; - } - - int dx = SkMin32(sampleSize, width); - int dy = SkMin32(sampleSize, height); - - fScaledWidth = width / dx; - fScaledHeight = height / dy; - - SkASSERT(fScaledWidth > 0); - SkASSERT(fScaledHeight > 0); - - fX0 = dx >> 1; - fY0 = dy >> 1; - - SkASSERT(fX0 >= 0 && fX0 < width); - SkASSERT(fY0 >= 0 && fY0 < height); - - fDX = dx; - fDY = dy; - - SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width); - SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height); - - fRowProc = NULL; -} - -bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, bool dither) { - static const RowProc gProcs[] = { - // 8888 (no dither distinction) - Sample_Gray_D8888, Sample_Gray_D8888, - Sample_RGBx_D8888, Sample_RGBx_D8888, - Sample_RGBA_D8888, Sample_RGBA_D8888, - NULL, NULL, - // 565 (no alpha distinction) - Sample_Gray_D565, Sample_Gray_D565_D, - Sample_RGBx_D565, Sample_RGBx_D565_D, - Sample_RGBx_D565, Sample_RGBx_D565_D, - NULL, NULL, - // 4444 - Sample_Gray_D4444, Sample_Gray_D4444_D, - Sample_RGBx_D4444, Sample_RGBx_D4444_D, - Sample_RGBA_D4444, Sample_RGBA_D4444_D, - NULL, NULL, - // Index8 - NULL, NULL, - NULL, NULL, - NULL, NULL, - Sample_Index_DI, Sample_Index_DI, - }; - - - int index = 0; - if (dither) { - index += 1; - } - switch (sc) { - case SkScaledBitmapSampler::kGray: - fSrcPixelSize = 1; - index += 0; - break; - case SkScaledBitmapSampler::kRGB: - fSrcPixelSize = 3; - index += 2; - break; - case SkScaledBitmapSampler::kRGBX: - fSrcPixelSize = 4; - index += 2; - break; - case SkScaledBitmapSampler::kRGBA: - fSrcPixelSize = 4; - index += 4; - break; - case SkScaledBitmapSampler::kIndex: - fSrcPixelSize = 1; - index += 6; - break; - default: - return false; - } - - switch (dst->config()) { - case SkBitmap::kARGB_8888_Config: - index += 0; - break; - case SkBitmap::kRGB_565_Config: - index += 8; - break; - case SkBitmap::kARGB_4444_Config: - index += 16; - break; - case SkBitmap::kIndex8_Config: - index += 24; - break; - default: - return false; - } - - fRowProc = gProcs[index]; - fDstRow = (char*)dst->getPixels(); - fDstRowBytes = dst->rowBytes(); - fCurrY = 0; - return fRowProc != NULL; -} - -bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { - SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight); - - bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth, - fDX * fSrcPixelSize, fCurrY); - fDstRow += fDstRowBytes; - fCurrY += 1; - return hadAlpha; -} |