11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkUtils.h"
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if DSTSIZE==32
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define DSTTYPE SkPMColor
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#elif DSTSIZE==16
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define DSTTYPE uint16_t
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #error "need DSTSIZE to be 32 or 16"
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if (DSTSIZE == 32)
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset32(ptr, value, n)
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#elif (DSTSIZE == 16)
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #define BITMAPPROC_MEMSET(ptr, value, n) sk_memset16(ptr, value, n)
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #error "unsupported DSTSIZE"
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
26030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s,
27030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                              const uint32_t* SK_RESTRICT xy,
28030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                              int count, DSTTYPE* SK_RESTRICT colors) {
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count > 0 && colors != NULL);
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fDoFilter == false);
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(CHECKSTATE(s);)
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef PREAMBLE
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int i, rb = s.fBitmap->rowBytes();
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    uint32_t XY;
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SRCTYPE src;
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (i = (count >> 1); i > 0; --i) {
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        XY = *xy++;
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *colors++ = RETURNDST(src);
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        XY = *xy++;
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *colors++ = RETURNDST(src);
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (count & 1) {
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        XY = *xy++;
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() &&
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                 (XY & 0xFFFF) < (unsigned)s.fBitmap->width());
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF];
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        *colors++ = RETURNDST(src);
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef POSTAMBLE
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    POSTAMBLE(s);
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
68030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid MAKENAME(_nofilter_DX)(const SkBitmapProcState& s,
69030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                            const uint32_t* SK_RESTRICT xy,
70030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                            int count, DSTTYPE* SK_RESTRICT colors) {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count > 0 && colors != NULL);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask));
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fDoFilter == false);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(CHECKSTATE(s);)
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef PREAMBLE
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels();
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // buffer is y32, x16, x16, x16, x16, x16
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // bump srcAddr to the proper row, since we're told Y never changes
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height());
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    srcAddr = (const SRCTYPE*)((const char*)srcAddr +
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                                xy[0] * s.fBitmap->rowBytes());
8646402f8ee247238d734cdd90b8770caa46862a06Mike Reed    xy += 1;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SRCTYPE src;
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    if (1 == s.fBitmap->width()) {
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        src = srcAddr[0];
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        DSTTYPE dstValue = RETURNDST(src);
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        BITMAPPROC_MEMSET(colors, dstValue, count);
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } else {
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int i;
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (i = (count >> 2); i > 0; --i) {
9746402f8ee247238d734cdd90b8770caa46862a06Mike Reed            uint32_t xx0 = *xy++;
9846402f8ee247238d734cdd90b8770caa46862a06Mike Reed            uint32_t xx1 = *xy++;
9946402f8ee247238d734cdd90b8770caa46862a06Mike Reed            SRCTYPE x0 = srcAddr[UNPACK_PRIMARY_SHORT(xx0)];
10046402f8ee247238d734cdd90b8770caa46862a06Mike Reed            SRCTYPE x1 = srcAddr[UNPACK_SECONDARY_SHORT(xx0)];
10146402f8ee247238d734cdd90b8770caa46862a06Mike Reed            SRCTYPE x2 = srcAddr[UNPACK_PRIMARY_SHORT(xx1)];
10246402f8ee247238d734cdd90b8770caa46862a06Mike Reed            SRCTYPE x3 = srcAddr[UNPACK_SECONDARY_SHORT(xx1)];
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
10446402f8ee247238d734cdd90b8770caa46862a06Mike Reed            *colors++ = RETURNDST(x0);
10546402f8ee247238d734cdd90b8770caa46862a06Mike Reed            *colors++ = RETURNDST(x1);
10646402f8ee247238d734cdd90b8770caa46862a06Mike Reed            *colors++ = RETURNDST(x2);
10746402f8ee247238d734cdd90b8770caa46862a06Mike Reed            *colors++ = RETURNDST(x3);
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
10946402f8ee247238d734cdd90b8770caa46862a06Mike Reed        const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy);
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        for (i = (count & 3); i > 0; --i) {
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkASSERT(*xx < (unsigned)s.fBitmap->width());
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            src = srcAddr[*xx++]; *colors++ = RETURNDST(src);
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef POSTAMBLE
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    POSTAMBLE(s);
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
123030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid MAKENAME(_filter_DX)(const SkBitmapProcState& s,
124030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                          const uint32_t* SK_RESTRICT xy,
125030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                           int count, DSTTYPE* SK_RESTRICT colors) {
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count > 0 && colors != NULL);
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fDoFilter);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(CHECKSTATE(s);)
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef PREAMBLE
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    PREAMBLE(s);
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned rb = s.fBitmap->rowBytes();
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    unsigned subY;
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SRCTYPE* SK_RESTRICT row0;
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SRCTYPE* SK_RESTRICT row1;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // setup row ptrs and update proc_table
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint32_t XY = *xy++;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned y0 = XY >> 14;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        row0 = (const SRCTYPE*)(srcAddr + (y0 >> 4) * rb);
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        row1 = (const SRCTYPE*)(srcAddr + (XY & 0x3FFF) * rb);
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        subY = y0 & 0xF;
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint32_t XX = *xy++;    // x0:14 | 4 | x1:14
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned x0 = XX >> 14;
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned x1 = XX & 0x3FFF;
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned subX = x0 & 0xF;
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x0 >>= 4;
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
15546402f8ee247238d734cdd90b8770caa46862a06Mike Reed        FILTER_PROC(subX, subY,
15646402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row0[x0]),
15746402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row0[x1]),
15846402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row1[x0]),
15946402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row1[x1]),
16046402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    colors);
16146402f8ee247238d734cdd90b8770caa46862a06Mike Reed        colors += 1;
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (--count != 0);
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef POSTAMBLE
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    POSTAMBLE(s);
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
169030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid MAKENAME(_filter_DXDY)(const SkBitmapProcState& s,
170030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                            const uint32_t* SK_RESTRICT xy,
171030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reed                            int count, DSTTYPE* SK_RESTRICT colors) {
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(count > 0 && colors != NULL);
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(s.fDoFilter);
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDEBUGCODE(CHECKSTATE(s);)
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef PREAMBLE
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        PREAMBLE(s);
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels();
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    int rb = s.fBitmap->rowBytes();
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint32_t data = *xy++;
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned y0 = data >> 14;
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned y1 = data & 0x3FFF;
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned subY = y0 & 0xF;
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        y0 >>= 4;
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        data = *xy++;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned x0 = data >> 14;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned x1 = data & 0x3FFF;
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        unsigned subX = x0 & 0xF;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x0 >>= 4;
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SRCTYPE* SK_RESTRICT row0 = (const SRCTYPE*)(srcAddr + y0 * rb);
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SRCTYPE* SK_RESTRICT row1 = (const SRCTYPE*)(srcAddr + y1 * rb);
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
19846402f8ee247238d734cdd90b8770caa46862a06Mike Reed        FILTER_PROC(subX, subY,
19946402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row0[x0]),
20046402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row0[x1]),
20146402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row1[x0]),
20246402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    SRC_TO_FILTER(row1[x1]),
20346402f8ee247238d734cdd90b8770caa46862a06Mike Reed                    colors);
20446402f8ee247238d734cdd90b8770caa46862a06Mike Reed        colors += 1;
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (--count != 0);
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef POSTAMBLE
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    POSTAMBLE(s);
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef MAKENAME
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef DSTSIZE
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef DSTTYPE
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SRCTYPE
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef CHECKSTATE
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef RETURNDST
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SRC_TO_FILTER
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_TO_DST
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef PREAMBLE
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #undef PREAMBLE
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef POSTAMBLE
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    #undef POSTAMBLE
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef FILTER_PROC_TYPE
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef GET_FILTER_TABLE
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef GET_FILTER_ROW
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef GET_FILTER_ROW_PROC
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef GET_FILTER_PROC
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef BITMAPPROC_MEMSET
234