105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 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.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkGr.h"
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/*  Fill out buffer with the compressed format Ganesh expects from a colortable
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger based bitmap. [palette (colortable) + indices].
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger At the moment Ganesh only supports 8bit version. If Ganesh allowed we others
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger we could detect that the colortable.count is <= 16, and then repack the
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger indices as nibbles to save RAM, but it would take more time (i.e. a lot
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger slower than memcpy), so skipping that for now.
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger as the colortable.count says it is.
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void build_compressed_data(void* buffer, const SkBitmap& bitmap) {
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkASSERT(SkBitmap::kIndex8_Config == bitmap.config());
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoLockPixels apl(bitmap);
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (!bitmap.readyToDraw()) {
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkDEBUGFAIL("bitmap not ready to draw!");
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return;
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkColorTable* ctable = bitmap.getColorTable();
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    char* dst = (char*)buffer;
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    memcpy(dst, ctable->lockColors(), ctable->count() * sizeof(SkPMColor));
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    ctable->unlockColors(false);
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // always skip a full 256 number of entries, even if we memcpy'd fewer
4035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    dst += kGrColorTableSize;
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (bitmap.width() == bitmap.rowBytes()) {
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        memcpy(dst, bitmap.getPixels(), bitmap.getSize());
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    } else {
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // need to trim off the extra bytes per row
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        size_t width = bitmap.width();
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        size_t rowBytes = bitmap.rowBytes();
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        const char* src = (const char*)bitmap.getPixels();
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        for (int y = 0; y < bitmap.height(); y++) {
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            memcpy(dst, src, width);
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            src += rowBytes;
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            dst += width;
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
591cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrContext::TextureCacheEntry sk_gr_create_bitmap_texture(GrContext* ctx,
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                GrContext::TextureKey key,
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                const GrSamplerState* sampler,
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                const SkBitmap& origBitmap) {
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkAutoLockPixels alp(origBitmap);
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrContext::TextureCacheEntry entry;
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (!origBitmap.readyToDraw()) {
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return entry;
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkBitmap tmpBitmap;
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkBitmap* bitmap = &origBitmap;
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    GrTextureDesc desc = {
7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        kNone_GrTextureFlags,
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        bitmap->width(),
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        bitmap->height(),
784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkGr::Bitmap2PixelConfig(*bitmap),
794f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        {0} // samples
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    if (SkBitmap::kIndex8_Config == bitmap->config()) {
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // build_compressed_data doesn't do npot->pot expansion
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // and paletted textures can't be sub-updated
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (ctx->supportsIndex8PixelConfig(sampler,
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                           bitmap->width(), bitmap->height())) {
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            size_t imagesize = bitmap->width() * bitmap->height() +
8835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger                                kGrColorTableSize;
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            SkAutoMalloc storage(imagesize);
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            build_compressed_data(storage.get(), origBitmap);
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            // our compressed data will be trimmed, so pass width() for its
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            // "rowBytes", since they are the same now.
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (gUNCACHED_KEY != key) {
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                return ctx->createAndLockTexture(key, sampler, desc, storage.get(),
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 bitmap->width());
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                entry = ctx->lockScratchTexture(desc,
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GrContext::kExact_ScratchTexMatch);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                entry.texture()->writePixels(0, 0, bitmap->width(),
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             bitmap->height(), desc.fConfig,
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             storage.get(), 0);
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                return entry;
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        } else {
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            origBitmap.copyTo(&tmpBitmap, SkBitmap::kARGB_8888_Config);
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            // now bitmap points to our temp, which has been promoted to 32bits
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            bitmap = &tmpBitmap;
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fConfig = SkGr::Bitmap2PixelConfig(*bitmap);
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (gUNCACHED_KEY != key) {
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return ctx->createAndLockTexture(key, sampler, desc,
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         bitmap->getPixels(),
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         bitmap->rowBytes());
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        entry = ctx->lockScratchTexture(desc,
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GrContext::kExact_ScratchTexMatch);
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        entry.texture()->writePixels(0, 0,
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     bitmap->width(), bitmap->height(),
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     desc.fConfig,
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     bitmap->getPixels(),
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                     bitmap->rowBytes());
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return entry;
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergervoid SkGrClipIterator::reset(const SkClipStack& clipStack) {
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fClipStack = &clipStack;
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fIter.reset(clipStack);
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // Gr has no notion of replace, skip to the
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // last replace in the clip stack.
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int lastReplace = 0;
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    int curr = 0;
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    while (NULL != (fCurr = fIter.next())) {
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        if (SkRegion::kReplace_Op == fCurr->fOp) {
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            lastReplace = curr;
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        }
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        ++curr;
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    fIter.reset(clipStack);
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    for (int i = 0; i < lastReplace+1; ++i) {
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fCurr = fIter.next();
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGrClipType SkGrClipIterator::getType() const {
15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrAssert(!this->isDone());
15587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    if (NULL == fCurr->fPath) {
15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return kRect_ClipType;
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    } else {
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return kPath_ClipType;
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGrSetOp SkGrClipIterator::getOp() const {
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // we skipped to the last "replace" op
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // when this iter was reset.
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // GrClip doesn't allow replace, so treat it as
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // intersect.
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrSetOp skToGrOps[] = {
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kDifference_SetOp,         // kDifference_Op
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kIntersect_SetOp,          // kIntersect_Op
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kUnion_SetOp,              // kUnion_Op
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kXor_SetOp,                // kXOR_Op
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kReverseDifference_SetOp,  // kReverseDifference_Op
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kIntersect_SetOp           // kReplace_op
17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(0 == SkRegion::kDifference_Op);
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(1 == SkRegion::kIntersect_Op);
17705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(2 == SkRegion::kUnion_Op);
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(3 == SkRegion::kXOR_Op);
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(4 == SkRegion::kReverseDifference_Op);
18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(5 == SkRegion::kReplace_Op);
18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return skToGrOps[fCurr->fOp];
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGrPathFill SkGrClipIterator::getPathFill() const {
18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    switch (fCurr->fPath->getFillType()) {
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkPath::kWinding_FillType:
18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            return kWinding_PathFill;
18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkPath::kEvenOdd_FillType:
18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            return  kEvenOdd_PathFill;
19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkPath::kInverseWinding_FillType:
19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            return kInverseWinding_PathFill;
19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkPath::kInverseEvenOdd_FillType:
19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            return kInverseEvenOdd_PathFill;
19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        default:
19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            GrCrash("Unsupported path fill in clip.");
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger            return kWinding_PathFill; // suppress warning
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20287b8e645865f9633f410c02252a0fd3feb18f09bDerek SollenbergerGrPixelConfig SkGr::BitmapConfig2PixelConfig(SkBitmap::Config config,
20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                    bool isOpaque) {
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    switch (config) {
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkBitmap::kA8_Config:
20687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return kAlpha_8_GrPixelConfig;
20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkBitmap::kIndex8_Config:
20887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return kIndex_8_GrPixelConfig;
20905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkBitmap::kRGB_565_Config:
21087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return kRGB_565_GrPixelConfig;
21105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkBitmap::kARGB_4444_Config:
21287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return kRGBA_4444_GrPixelConfig;
21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        case SkBitmap::kARGB_8888_Config:
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kSkia8888_PM_GrPixelConfig;
21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        default:
21687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return kUnknown_GrPixelConfig;
21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
220