11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
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 */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapSampler.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkTileModeProc get_tilemode_proc(SkShader::TileMode mode)
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (mode) {
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkShader::kClamp_TileMode:
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return do_clamp;
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkShader::kRepeat_TileMode:
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return do_repeat_mod;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkShader::kMirror_TileMode:
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return do_mirror_mod;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    default:
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkDEBUGFAIL("unknown mode");
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return NULL;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBitmapSampler::SkBitmapSampler(const SkBitmap& bm, bool filter,
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                 SkShader::TileMode tmx, SkShader::TileMode tmy)
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    : fBitmap(bm), fFilterBitmap(filter), fTileModeX(tmx), fTileModeY(tmy)
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(bm.width() > 0 && bm.height() > 0);
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fMaxX = SkToU16(bm.width() - 1);
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fMaxY = SkToU16(bm.height() - 1);
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTileProcX = get_tilemode_proc(tmx);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    fTileProcY = get_tilemode_proc(tmy);
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkBitmapSampler::setPaint(const SkPaint& paint)
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkNullBitmapSampler : public SkBitmapSampler {
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkNullBitmapSampler(const SkBitmap& bm, bool filter,
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        SkShader::TileMode tmx, SkShader::TileMode tmy)
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, filter, tmx, tmy) {}
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const { return 0; }
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_CLASSNAME_PREFIX(name)           ARGB32##name
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y)   *bitmap.getAddr32(x, y)
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapSamplerTemplate.h"
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkColorPriv.h"
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_CLASSNAME_PREFIX(name)           RGB16##name
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y)   SkPixel16ToPixel32(*bitmap.getAddr16(x, y))
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapSamplerTemplate.h"
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_CLASSNAME_PREFIX(name)           Index8##name
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define BITMAP_PIXEL_TO_PMCOLOR(bitmap, x, y)   bitmap.getIndex8Color(x, y)
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkBitmapSamplerTemplate.h"
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////// The Bilinear versions
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFilterProc.h"
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass ARGB32_Bilinear_Sampler : public SkBitmapSampler {
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    ARGB32_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy)
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, true, tmx, tmy)
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPtrProcTable = SkGetBilinearFilterPtrProcTable();
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const uint32_t *p00, *p01, *p10, *p11;
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // turn pixel centers into the top-left of our filter-box
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x -= SK_FixedHalf;
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        y -= SK_FixedHalf;
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // compute our pointers
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            const SkBitmap* bitmap = &fBitmap;
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int ix = x >> 16;
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int iy = y >> 16;
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxX = fMaxX;
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procX = fTileProcX;
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxY = fMaxY;
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procY = fTileProcY;
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx = procX(ix, maxX);
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy = procY(iy, maxY);
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p00 = bitmap->getAddr32(tmpx, tmpy);
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx1 = procX(ix + 1, maxX);
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p01 = bitmap->getAddr32(tmpx1, tmpy);
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy1 = procY(iy + 1, maxY);
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p10 = bitmap->getAddr32(tmpx, tmpy1);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p11 = bitmap->getAddr32(tmpx1, tmpy1);
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkFilterPtrProc proc = SkGetBilinearFilterPtrProc(fPtrProcTable, x, y);
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return proc(p00, p01, p10, p11);
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFilterPtrProc* fPtrProcTable;
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass RGB16_Bilinear_Sampler : public SkBitmapSampler {
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    RGB16_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy)
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, true, tmx, tmy)
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fProcTable = SkGetBilinearFilterProcTable();
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const uint16_t *p00, *p01, *p10, *p11;
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // turn pixel centers into the top-left of our filter-box
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x -= SK_FixedHalf;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        y -= SK_FixedHalf;
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // compute our pointers
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            const SkBitmap* bitmap = &fBitmap;
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int ix = x >> 16;
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int iy = y >> 16;
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxX = fMaxX;
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procX = fTileProcX;
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxY = fMaxY;
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procY = fTileProcY;
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx = procX(ix, maxX);
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy = procY(iy, maxY);
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p00 = bitmap->getAddr16(tmpx, tmpy);
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx1 = procX(ix + 1, maxX);
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p01 = bitmap->getAddr16(tmpx1, tmpy);
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy1 = procY(iy + 1, maxY);
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p10 = bitmap->getAddr16(tmpx, tmpy1);
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p11 = bitmap->getAddr16(tmpx1, tmpy1);
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkFilterProc proc = SkGetBilinearFilterProc(fProcTable, x, y);
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint32_t c = proc(SkExpand_rgb_16(*p00), SkExpand_rgb_16(*p01),
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkExpand_rgb_16(*p10), SkExpand_rgb_16(*p11));
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkPixel16ToPixel32((uint16_t)SkCompact_rgb_16(c));
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFilterProc* fProcTable;
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// If we had a init/term method on sampler, we could avoid the per-pixel
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// call to lockColors/unlockColors
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass Index8_Bilinear_Sampler : public SkBitmapSampler {
1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Index8_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy)
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, true, tmx, tmy)
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fPtrProcTable = SkGetBilinearFilterPtrProcTable();
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkBitmap* bitmap = &fBitmap;
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const uint8_t *p00, *p01, *p10, *p11;
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project         // turn pixel centers into the top-left of our filter-box
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x -= SK_FixedHalf;
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        y -= SK_FixedHalf;
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project       // compute our pointers
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int ix = x >> 16;
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int iy = y >> 16;
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxX = fMaxX;
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procX = fTileProcX;
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxY = fMaxY;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procY = fTileProcY;
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx = procX(ix, maxX);
2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy = procY(iy, maxY);
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p00 = bitmap->getAddr8(tmpx, tmpy);
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx1 = procX(ix + 1, maxX);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p01 = bitmap->getAddr8(tmpx1, tmpy);
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy1 = procY(iy + 1, maxY);
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p10 = bitmap->getAddr8(tmpx, tmpy1);
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p11 = bitmap->getAddr8(tmpx1, tmpy1);
2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const SkPMColor* colors = bitmap->getColorTable()->lockColors();
2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkFilterPtrProc proc = SkGetBilinearFilterPtrProc(fPtrProcTable, x, y);
2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        uint32_t c = proc(&colors[*p00], &colors[*p01], &colors[*p10], &colors[*p11]);
2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        bitmap->getColorTable()->unlockColors(false);
2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return c;
2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFilterPtrProc* fPtrProcTable;
2310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass A8_Bilinear_Sampler : public SkBitmapSampler {
2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    A8_Bilinear_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy)
2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, true, tmx, tmy)
2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fProcTable = SkGetBilinearFilterProcTable();
2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void setPaint(const SkPaint& paint)
2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fColor = SkPreMultiplyColor(paint.getColor());
2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const
2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        const uint8_t *p00, *p01, *p10, *p11;
2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // turn pixel centers into the top-left of our filter-box
2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        x -= SK_FixedHalf;
2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        y -= SK_FixedHalf;
2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // compute our pointers
2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        {
2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            const SkBitmap* bitmap = &fBitmap;
2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int ix = x >> 16;
2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int iy = y >> 16;
2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxX = fMaxX;
2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procX = fTileProcX;
2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int             maxY = fMaxY;
2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkTileModeProc  procY = fTileProcY;
2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx = procX(ix, maxX);
2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy = procY(iy, maxY);
2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p00 = bitmap->getAddr8(tmpx, tmpy);
2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpx1 = procX(ix + 1, maxX);
2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p01 = bitmap->getAddr8(tmpx1, tmpy);
2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int tmpy1 = procY(iy + 1, maxY);
2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p10 = bitmap->getAddr8(tmpx, tmpy1);
2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            p11 = bitmap->getAddr8(tmpx1, tmpy1);
2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkFilterProc proc = SkGetBilinearFilterProc(fProcTable, x, y);
2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int alpha = proc(*p00, *p01, *p10, *p11);
2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkAlphaMulQ(fColor, SkAlpha255To256(alpha));
2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFilterProc* fProcTable;
2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor           fColor;
2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass A8_NoFilter_Sampler : public SkBitmapSampler {
2890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
2900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    A8_NoFilter_Sampler(const SkBitmap& bm, SkShader::TileMode tmx, SkShader::TileMode tmy)
2910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        : SkBitmapSampler(bm, false, tmx, tmy)
2920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void setPaint(const SkPaint& paint)
2960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
2970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        fColor = SkPreMultiplyColor(paint.getColor());
2980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual SkPMColor sample(SkFixed x, SkFixed y) const
3010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    {
3020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int ix = SkFixedFloor(x);
3030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int iy = SkFixedFloor(y);
3040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        int alpha = *fBitmap.getAddr8(fTileProcX(ix, fMaxX), fTileProcY(iy, fMaxY));
3060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return SkAlphaMulQ(fColor, SkAlpha255To256(alpha));
3070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
3080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
3100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const SkFilterProc* fProcTable;
3110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkPMColor           fColor;
3120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
3130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
3150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project///////////////////////////////////////////////////////////////////////////////
3160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBitmapSampler* SkBitmapSampler::Create(const SkBitmap& bm, bool doFilter,
3180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                         SkShader::TileMode tmx,
3190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                         SkShader::TileMode tmy)
3200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
3210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    switch (bm.getConfig()) {
3220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkBitmap::kARGB_8888_Config:
3230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doFilter)
3240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(ARGB32_Bilinear_Sampler, (bm, tmx, tmy));
3250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (tmx == tmy) {
3270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            switch (tmx) {
3280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kClamp_TileMode:
3290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                return SkNEW_ARGS(ARGB32_Point_Clamp_Sampler, (bm));
3300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kRepeat_TileMode:
3310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(ARGB32_Point_Repeat_Pow2_Sampler, (bm));
3330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(ARGB32_Point_Repeat_Mod_Sampler, (bm));
3350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kMirror_TileMode:
3360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(ARGB32_Point_Mirror_Pow2_Sampler, (bm));
3380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(ARGB32_Point_Mirror_Mod_Sampler, (bm));
3400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
3411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkDEBUGFAIL("unknown mode");
3420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else {  // tmx != tmy
3450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(ARGB32_Point_Sampler, (bm, tmx, tmy));
3460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkBitmap::kRGB_565_Config:
3500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doFilter)
3510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(RGB16_Bilinear_Sampler, (bm, tmx, tmy));
3520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (tmx == tmy) {
3540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            switch (tmx) {
3550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kClamp_TileMode:
3560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                return SkNEW_ARGS(RGB16_Point_Clamp_Sampler, (bm));
3570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kRepeat_TileMode:
3580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(RGB16_Point_Repeat_Pow2_Sampler, (bm));
3600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(RGB16_Point_Repeat_Mod_Sampler, (bm));
3620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kMirror_TileMode:
3630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(RGB16_Point_Mirror_Pow2_Sampler, (bm));
3650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(RGB16_Point_Mirror_Mod_Sampler, (bm));
3670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
3681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkDEBUGFAIL("unknown mode");
3690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else {  // tmx != tmy
3720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(RGB16_Point_Sampler, (bm, tmx, tmy));
3730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
3750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkBitmap::kIndex8_Config:
3770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doFilter)
3780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(Index8_Bilinear_Sampler, (bm, tmx, tmy));
3790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (tmx == tmy) {
3810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            switch (tmx) {
3820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kClamp_TileMode:
3830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                return SkNEW_ARGS(Index8_Point_Clamp_Sampler, (bm));
3840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kRepeat_TileMode:
3850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(Index8_Point_Repeat_Pow2_Sampler, (bm));
3870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(Index8_Point_Repeat_Mod_Sampler, (bm));
3890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            case SkShader::kMirror_TileMode:
3900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                if (is_pow2(bm.width()) && is_pow2(bm.height()))
3910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(Index8_Point_Mirror_Pow2_Sampler, (bm));
3920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                else
3930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    return SkNEW_ARGS(Index8_Point_Mirror_Mod_Sampler, (bm));
3940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            default:
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkDEBUGFAIL("unknown mode");
3960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
3970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
3980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else {  // tmx != tmy
3990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(Index8_Point_Sampler, (bm, tmx, tmy));
4000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        }
4010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
4020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    case SkBitmap::kA8_Config:
4040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        if (doFilter)
4050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(A8_Bilinear_Sampler, (bm, tmx, tmy));
4060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        else
4070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            return SkNEW_ARGS(A8_NoFilter_Sampler, (bm, tmx, tmy));
4080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        break;
4090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
4100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    default:
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkDEBUGFAIL("unknown device");
4120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
4130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkNEW_ARGS(SkNullBitmapSampler, (bm, doFilter, tmx, tmy));
4140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
4150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
416