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