11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorPriv.h"
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTableColorFilter.h"
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkUnPreMultiply.h"
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkTable_ColorFilter : public SkColorFilter {
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTable_ColorFilter(const uint8_t tableA[], const uint8_t tableR[],
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        const uint8_t tableG[], const uint8_t tableB[]) {
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fBitmap = NULL;
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFlags = 0;
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        uint8_t* dst = fStorage;
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (tableA) {
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(dst, tableA, 256);
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            dst += 256;
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fFlags |= kA_Flag;
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (tableR) {
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(dst, tableR, 256);
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            dst += 256;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fFlags |= kR_Flag;
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (tableG) {
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(dst, tableG, 256);
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            dst += 256;
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fFlags |= kG_Flag;
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (tableB) {
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(dst, tableB, 256);
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fFlags |= kB_Flag;
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool asComponentTable(SkBitmap* table) SK_OVERRIDE;
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void filterSpan(const SkPMColor src[], int count,
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            SkPMColor dst[]) SK_OVERRIDE;
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void flatten(SkFlattenableWriteBuffer&) SK_OVERRIDE;
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual Factory getFactory() SK_OVERRIDE;
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkNEW_ARGS(SkTable_ColorFilter, (buffer));
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkTable_ColorFilter(SkFlattenableReadBuffer& buffer);
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap* fBitmap;
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum {
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kA_Flag = 1 << 0,
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kR_Flag = 1 << 1,
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kG_Flag = 1 << 2,
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kB_Flag = 1 << 3,
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint8_t fStorage[256 * 4];
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    unsigned fFlags;
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkColorFilter INHERITED;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const uint8_t gIdentityTable[] = {
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count,
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     SkPMColor dst[]) {
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint8_t* table = fStorage;
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint8_t* tableA = gIdentityTable;
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint8_t* tableR = gIdentityTable;
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint8_t* tableG = gIdentityTable;
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const uint8_t* tableB = gIdentityTable;
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFlags & kA_Flag) {
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tableA = table; table += 256;
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFlags & kR_Flag) {
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tableR = table; table += 256;
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFlags & kG_Flag) {
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tableG = table; table += 256;
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fFlags & kB_Flag) {
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tableB = table;
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkUnPreMultiply::Scale* scaleTable = SkUnPreMultiply::GetScaleTable();
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < count; ++i) {
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPMColor c = src[i];
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        unsigned a, r, g, b;
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (0 == c) {
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            a = r = g = b = 0;
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            a = SkGetPackedA32(c);
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            r = SkGetPackedR32(c);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            g = SkGetPackedG32(c);
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            b = SkGetPackedB32(c);
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (a < 255) {
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkUnPreMultiply::Scale scale = scaleTable[a];
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                r = SkUnPreMultiply::ApplyScale(scale, r);
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                g = SkUnPreMultiply::ApplyScale(scale, g);
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                b = SkUnPreMultiply::ApplyScale(scale, b);
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        dst[i] = SkPremultiplyARGBInline(tableA[a], tableR[r],
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         tableG[g], tableB[b]);
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1421cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkFlattenable::Factory SkTable_ColorFilter::getFactory() {
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return CreateProc;
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const uint8_t gCountNibBits[] = {
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    0, 1, 1, 2,
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    1, 2, 2, 3,
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    1, 2, 2, 3,
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    2, 3, 3, 4
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPackBits.h"
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid SkTable_ColorFilter::flatten(SkFlattenableWriteBuffer& buffer) {
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->INHERITED::flatten(buffer);
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint8_t storage[5*256];
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int count = gCountNibBits[fFlags & 0xF];
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t size = SkPackBits::Pack8(fStorage, count * 256, storage);
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(size <= sizeof(storage));
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//    SkDebugf("raw %d packed %d\n", count * 256, size);
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    buffer.writeInt(fFlags);
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    buffer.writeInt(size);
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    buffer.write(storage, size);
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1701cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkTable_ColorFilter::SkTable_ColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fBitmap = NULL;
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    uint8_t storage[5*256];
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fFlags = buffer.readInt();
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t size = buffer.readInt();
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    buffer.read(storage, size);
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t raw = SkPackBits::Unpack8(storage, size, fStorage);
1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(raw <= sizeof(fStorage));
1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t count = gCountNibBits[fFlags & 0xF];
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkASSERT(raw == count * 256);
1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkTable_ColorFilter::asComponentTable(SkBitmap* table) {
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (table) {
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (NULL == fBitmap) {
1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fBitmap = new SkBitmap;
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fBitmap->setConfig(SkBitmap::kA8_Config, 256, 4, 256);
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fBitmap->allocPixels();
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(fBitmap->getAddr8(0, 0), fStorage, 256 * 4);
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *table = *fBitmap;
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_CPU_BENDIAN
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define SK_A32_INDEX    (3 - (SK_A32_SHIFT >> 3))
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define SK_R32_INDEX    (3 - (SK_R32_SHIFT >> 3))
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define SK_G32_INDEX    (3 - (SK_G32_SHIFT >> 3))
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define SK_B32_INDEX    (3 - (SK_B32_SHIFT >> 3))
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2111cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkColorFilter* SkTableColorFilter::Create(const uint8_t table[256]) {
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return SkNEW_ARGS(SkTable_ColorFilter, (table, table, table, table));
2131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2151cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkColorFilter* SkTableColorFilter::CreateARGB(const uint8_t tableA[256],
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              const uint8_t tableR[256],
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              const uint8_t tableG[256],
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              const uint8_t tableB[256]) {
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return SkNEW_ARGS(SkTable_ColorFilter, (tableA, tableR, tableG, tableB));
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
221