11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2007 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScaledBitmapSampler.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmap.h"
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColorPriv.h"
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDither.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// 8888
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Gray_D8888(void* SK_RESTRICT dstRow,
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
19e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPackARGB32(0xFF, src[0], src[0], src[0]);
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBx_D8888(void* SK_RESTRICT dstRow,
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
30e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPackARGB32(0xFF, src[0], src[1], src[2]);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBA_D8888(void* SK_RESTRICT dstRow,
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
41e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned alphaMask = 0xFF;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned alpha = src[3];
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]);
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        alphaMask &= alpha;
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return alphaMask != 0xFF;
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// 565
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Gray_D565(void* SK_RESTRICT dstRow,
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const uint8_t* SK_RESTRICT src,
57e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                             int width, int deltaSrc, int, const SkPMColor[]) {
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Gray_D565_D(void* SK_RESTRICT dstRow,
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                               const uint8_t* SK_RESTRICT src,
68e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                           int width, int deltaSrc, int y, const SkPMColor[]) {
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DITHER_565_SCAN(y);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkDitherRGBTo565(src[0], src[0], src[0], DITHER_VALUE(x));
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBx_D565(void* SK_RESTRICT dstRow,
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const uint8_t* SK_RESTRICT src,
80e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                             int width, int deltaSrc, int, const SkPMColor[]) {
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPack888ToRGB16(src[0], src[1], src[2]);
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
8958693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chenstatic bool Sample_D565_D565(void* SK_RESTRICT dstRow,
9058693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen                             const uint8_t* SK_RESTRICT src,
9158693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen                             int width, int deltaSrc, int, const SkPMColor[]) {
9258693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
9358693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen    uint16_t* SK_RESTRICT castedSrc = (uint16_t*) src;
9458693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen    for (int x = 0; x < width; x++) {
9558693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        dst[x] = castedSrc[0];
9658693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        castedSrc += deltaSrc >> 1;
9758693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen    }
9858693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen    return false;
9958693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen}
10058693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBx_D565_D(void* SK_RESTRICT dstRow,
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                               const uint8_t* SK_RESTRICT src,
103e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                           int width, int deltaSrc, int y, const SkPMColor[]) {
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DITHER_565_SCAN(y);
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkDitherRGBTo565(src[0], src[1], src[2], DITHER_VALUE(x));
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// 4444
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Gray_D4444(void* SK_RESTRICT dstRow,
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
117e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned gray = src[0] >> 4;
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPackARGB4444(0xF, gray, gray, gray);
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Gray_D4444_D(void* SK_RESTRICT dstRow,
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const uint8_t* SK_RESTRICT src,
129e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                            int width, int deltaSrc, int y, const SkPMColor[]) {
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DITHER_4444_SCAN(y);
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[0], src[0],
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                      DITHER_VALUE(x));
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBx_D4444(void* SK_RESTRICT dstRow,
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
142e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPackARGB4444(0xF, src[0] >> 4, src[1] >> 4, src[2] >> 4);
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBx_D4444_D(void* SK_RESTRICT dstRow,
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const uint8_t* SK_RESTRICT src,
153e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                            int width, int deltaSrc, int y, const SkPMColor[]) {
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* dst = (SkPMColor16*)dstRow;
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DITHER_4444_SCAN(y);
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkDitherARGB32To4444(0xFF, src[0], src[1], src[2],
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                      DITHER_VALUE(x));
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBA_D4444(void* SK_RESTRICT dstRow,
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint8_t* SK_RESTRICT src,
167e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                              int width, int deltaSrc, int, const SkPMColor[]) {
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned alphaMask = 0xFF;
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned alpha = src[3];
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]);
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkPixel32ToPixel4444(c);
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        alphaMask &= alpha;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return alphaMask != 0xFF;
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_RGBA_D4444_D(void* SK_RESTRICT dstRow,
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const uint8_t* SK_RESTRICT src,
183e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                            int width, int deltaSrc, int y, const SkPMColor[]) {
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned alphaMask = 0xFF;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    DITHER_4444_SCAN(y);
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (int x = 0; x < width; x++) {
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned alpha = src[3];
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkPMColor c = SkPreMultiplyARGB(alpha, src[0], src[1], src[2]);
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x));
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src += deltaSrc;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        alphaMask &= alpha;
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return alphaMask != 0xFF;
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// Index
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2003026a9ec59b285412941d278a570e382088f8adaMike Reed#define A32_MASK_IN_PLACE   (SkPMColor)(SK_A32_MASK << SK_A32_SHIFT)
201e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
202e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedstatic bool Sample_Index_D8888(void* SK_RESTRICT dstRow,
203e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                               const uint8_t* SK_RESTRICT src,
204e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                       int width, int deltaSrc, int, const SkPMColor ctable[]) {
205e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
206e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow;
207e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor cc = A32_MASK_IN_PLACE;
208e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    for (int x = 0; x < width; x++) {
209e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        SkPMColor c = ctable[*src];
210e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        cc &= c;
211e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        dst[x] = c;
212e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        src += deltaSrc;
213e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
214e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    return cc != A32_MASK_IN_PLACE;
215e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed}
216e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
217e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedstatic bool Sample_Index_D565(void* SK_RESTRICT dstRow,
218e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                               const uint8_t* SK_RESTRICT src,
219e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                       int width, int deltaSrc, int, const SkPMColor ctable[]) {
220e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
221e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
222e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    for (int x = 0; x < width; x++) {
223e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        dst[x] = SkPixel32ToPixel16(ctable[*src]);
224e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        src += deltaSrc;
225e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
226e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    return false;
227e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed}
228e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
229e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedstatic bool Sample_Index_D565_D(void* SK_RESTRICT dstRow,
230e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                const uint8_t* SK_RESTRICT src, int width,
231e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                int deltaSrc, int y, const SkPMColor ctable[]) {
232e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
233e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow;
234e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    DITHER_565_SCAN(y);
235e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
236e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    for (int x = 0; x < width; x++) {
237e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        SkPMColor c = ctable[*src];
238e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        dst[x] = SkDitherRGBTo565(SkGetPackedR32(c), SkGetPackedG32(c),
239e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                  SkGetPackedB32(c), DITHER_VALUE(x));
240e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        src += deltaSrc;
241e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
242e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    return false;
243e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed}
244e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
245e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedstatic bool Sample_Index_D4444(void* SK_RESTRICT dstRow,
246e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                               const uint8_t* SK_RESTRICT src, int width,
247e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                               int deltaSrc, int y, const SkPMColor ctable[]) {
248e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
249e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
250e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor cc = A32_MASK_IN_PLACE;
251e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    for (int x = 0; x < width; x++) {
252e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        SkPMColor c = ctable[*src];
253e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        cc &= c;
254e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        dst[x] = SkPixel32ToPixel4444(c);
255e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        src += deltaSrc;
256e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
257e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    return cc != A32_MASK_IN_PLACE;
258e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed}
259e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
260e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedstatic bool Sample_Index_D4444_D(void* SK_RESTRICT dstRow,
261e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                 const uint8_t* SK_RESTRICT src, int width,
262e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                int deltaSrc, int y, const SkPMColor ctable[]) {
263e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
264e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor16* SK_RESTRICT dst = (SkPMColor16*)dstRow;
265e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    SkPMColor cc = A32_MASK_IN_PLACE;
266e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    DITHER_4444_SCAN(y);
267e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
268e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    for (int x = 0; x < width; x++) {
269e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        SkPMColor c = ctable[*src];
270e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        cc &= c;
271e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        dst[x] = SkDitherARGB32To4444(c, DITHER_VALUE(x));
272e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        src += deltaSrc;
273e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    }
274e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    return cc != A32_MASK_IN_PLACE;
275e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed}
276e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic bool Sample_Index_DI(void* SK_RESTRICT dstRow,
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const uint8_t* SK_RESTRICT src,
279e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                            int width, int deltaSrc, int, const SkPMColor[]) {
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (1 == deltaSrc) {
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        memcpy(dstRow, src, width);
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint8_t* SK_RESTRICT dst = (uint8_t*)dstRow;
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (int x = 0; x < width; x++) {
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            dst[x] = src[0];
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            src += deltaSrc;
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return false;
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScaledBitmapSampler.h"
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height,
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                             int sampleSize) {
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (width <= 0 || height <= 0) {
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        sk_throw();
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (sampleSize <= 1) {
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fScaledWidth = width;
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fScaledHeight = height;
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fX0 = fY0 = 0;
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fDX = fDY = 1;
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return;
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int dx = SkMin32(sampleSize, width);
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int dy = SkMin32(sampleSize, height);
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fScaledWidth = width / dx;
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fScaledHeight = height / dy;
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fScaledWidth > 0);
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fScaledHeight > 0);
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fX0 = dx >> 1;
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fY0 = dy >> 1;
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fX0 >= 0 && fX0 < width);
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fY0 >= 0 && fY0 < height);
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDX = dx;
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDY = dy;
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fDX > 0 && (fX0 + fDX * (fScaledWidth - 1)) < width);
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(fDY > 0 && (fY0 + fDY * (fScaledHeight - 1)) < height);
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRowProc = NULL;
332e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    fCTable = NULL;
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
335e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reedbool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, bool dither,
336e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                                  const SkPMColor ctable[]) {
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static const RowProc gProcs[] = {
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // 8888 (no dither distinction)
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_Gray_D8888,  Sample_Gray_D8888,
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBx_D8888,  Sample_RGBx_D8888,
3410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBA_D8888,  Sample_RGBA_D8888,
342e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        Sample_Index_D8888, Sample_Index_D8888,
34358693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        NULL,               NULL,
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // 565 (no alpha distinction)
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_Gray_D565,   Sample_Gray_D565_D,
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBx_D565,   Sample_RGBx_D565_D,
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBx_D565,   Sample_RGBx_D565_D,
348e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        Sample_Index_D565,  Sample_Index_D565_D,
34958693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        Sample_D565_D565,   Sample_D565_D565,
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // 4444
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_Gray_D4444,  Sample_Gray_D4444_D,
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBx_D4444,  Sample_RGBx_D4444_D,
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_RGBA_D4444,  Sample_RGBA_D4444_D,
354e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed        Sample_Index_D4444, Sample_Index_D4444_D,
35558693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        NULL,               NULL,
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // Index8
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL,               NULL,
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL,               NULL,
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        NULL,               NULL,
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        Sample_Index_DI,    Sample_Index_DI,
36158693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        NULL,               NULL,
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
364e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed    fCTable = ctable;
365e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int index = 0;
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (dither) {
3680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        index += 1;
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (sc) {
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScaledBitmapSampler::kGray:
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSrcPixelSize = 1;
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 0;
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScaledBitmapSampler::kRGB:
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSrcPixelSize = 3;
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 2;
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScaledBitmapSampler::kRGBX:
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSrcPixelSize = 4;
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 2;
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScaledBitmapSampler::kRGBA:
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSrcPixelSize = 4;
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 4;
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScaledBitmapSampler::kIndex:
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            fSrcPixelSize = 1;
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 6;
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
39158693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen        case SkScaledBitmapSampler::kRGB_565:
39258693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            fSrcPixelSize = 2;
39358693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            index += 8;
39458693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            break;
3950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (dst->config()) {
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_8888_Config:
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            index += 0;
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kRGB_565_Config:
40458693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            index += 10;
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kARGB_4444_Config:
40758693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            index += 20;
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkBitmap::kIndex8_Config:
41058693709950812bc0d8213647485789aa15cb5e5Wei-Ta Chen            index += 30;
4110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            break;
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        default:
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return false;
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fRowProc = gProcs[index];
4170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDstRow = (char*)dst->getPixels();
4180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDstRowBytes = dst->rowBytes();
4190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCurrY = 0;
4200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return fRowProc != NULL;
4210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) {
4240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight);
4250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth,
427e762975133c7c9f529b996b3b1fee8b8910dc650Mike Reed                             fDX * fSrcPixelSize, fCurrY, fCTable);
4280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fDstRow += fDstRowBytes;
4290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fCurrY += 1;
4300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return hadAlpha;
4310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
432