// TODO: change Chooser virtual to take colorType, so we can stop calling SkColorTypeToBitmapConfig // bool SkImageDecoder::chooseFromOneChoice(SkColorType colorType, int width, int height) const { Chooser* chooser = fChooser; if (NULL == chooser) { // no chooser, we just say YES to decoding :) return true; } chooser->begin(1); chooser->inspect(0, SkColorTypeToBitmapConfig(colorType), width, height); return chooser->choose() == 0; }
bool DecodingImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) { if (NULL == pixels) { return false; } if (fInfo != info) { // The caller has specified a different info. This is an // error for this kind of SkImageGenerator. Use the Options // to change the settings. return false; } if (info.minRowBytes() > rowBytes) { // The caller has specified a bad rowBytes. return false; } SkAssertResult(fStream->rewind()); SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(fStream)); if (NULL == decoder.get()) { return false; } decoder->setDitherImage(fDitherImage); decoder->setSampleSize(fSampleSize); decoder->setRequireUnpremultipliedColors( info.fAlphaType == kUnpremul_SkAlphaType); SkBitmap bitmap; TargetAllocator allocator(fInfo, pixels, rowBytes); decoder->setAllocator(&allocator); // TODO: need to be able to pass colortype directly to decoder SkBitmap::Config legacyConfig = SkColorTypeToBitmapConfig(info.colorType()); bool success = decoder->decode(fStream, &bitmap, legacyConfig, SkImageDecoder::kDecodePixels_Mode); decoder->setAllocator(NULL); if (!success) { return false; } if (allocator.isReady()) { // Did not use pixels! SkBitmap bm; SkASSERT(bitmap.canCopyTo(info.colorType())); bool copySuccess = bitmap.copyTo(&bm, info.colorType(), &allocator); if (!copySuccess || allocator.isReady()) { SkDEBUGFAIL("bitmap.copyTo(requestedConfig) failed."); // Earlier we checked canCopyto(); we expect consistency. return false; } SkASSERT(check_alpha(info.alphaType(), bm.alphaType())); } else { SkASSERT(check_alpha(info.alphaType(), bitmap.alphaType())); } return true; }
SkBaseDevice* SkBaseDevice::createCompatibleDeviceForSaveLayer(const SkImageInfo& info) { #ifdef SK_SUPPORT_LEGACY_COMPATIBLEDEVICE_CONFIG // We call the old method to support older subclasses. // If they have, we return their device, else we use the new impl. SkBitmap::Config config = SkColorTypeToBitmapConfig(info.colorType()); SkBaseDevice* dev = this->onCreateCompatibleDevice(config, info.width(), info.height(), info.isOpaque(), kSaveLayer_Usage); if (dev) { return dev; } // fall through to new impl #endif return this->onCreateDevice(info, kSaveLayer_Usage); }
SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo& info) { return SkColorTypeToBitmapConfig(info.fColorType); }