void draw(SkCanvas* canvas) { SkBitmap bitmap; bitmap.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear())); SkColorSpace* colorSpace = bitmap.colorSpace(); SkDebugf("gammaCloseToSRGB: %s gammaIsLinear: %s isSRGB: %s\n", colorSpace->gammaCloseToSRGB() ? "true" : "false", colorSpace->gammaIsLinear() ? "true" : "false", colorSpace->isSRGB() ? "true" : "false"); }
SkImageCacherator::CachedFormat SkImage_Lazy::chooseCacheFormat(SkColorSpace* dstColorSpace, const GrCaps* grCaps) const { SkColorSpace* cs = fInfo.colorSpace(); if (!cs || !dstColorSpace) { return kLegacy_CachedFormat; } CacheCaps caps(grCaps); switch (fInfo.colorType()) { case kUnknown_SkColorType: case kAlpha_8_SkColorType: case kRGB_565_SkColorType: case kARGB_4444_SkColorType: case kRGB_888x_SkColorType: case kRGBA_1010102_SkColorType: case kRGB_101010x_SkColorType: // We don't support color space on these formats, so always decode in legacy mode: // TODO: Ask the codec to decode these to something else (at least sRGB 8888)? return kLegacy_CachedFormat; case kGray_8_SkColorType: // TODO: What do we do with grayscale sources that have strange color spaces attached? // The codecs and color space xform don't handle this correctly (yet), so drop it on // the floor. (Also, inflating by a factor of 8 is going to be unfortunate). // As it is, we don't directly support sRGB grayscale, so ask the codec to convert // it for us. This bypasses some really sketchy code GrUploadPixmapToTexture. if (cs->gammaCloseToSRGB() && caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else { return kLegacy_CachedFormat; } case kRGBA_8888_SkColorType: if (cs->gammaCloseToSRGB()) { if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else { return kLegacy_CachedFormat; } } else { if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else { return kLegacy_CachedFormat; } } case kBGRA_8888_SkColorType: // Odd case. sBGRA isn't a real thing, so we may not have this texturable. if (caps.supportsSBGR()) { if (cs->gammaCloseToSRGB()) { return kSBGR8888_CachedFormat; } else if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else { // sBGRA support without sRGBA is highly unlikely (impossible?) Nevertheless. return kLegacy_CachedFormat; } } else { if (cs->gammaCloseToSRGB()) { if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else { return kLegacy_CachedFormat; } } else { if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else { return kLegacy_CachedFormat; } } } case kRGBA_F16_SkColorType: if (caps.supportsHalfFloat()) { return kLinearF16_CachedFormat; } else if (caps.supportsSRGB()) { return kSRGB8888_CachedFormat; } else { return kLegacy_CachedFormat; } } SkDEBUGFAIL("Unreachable"); return kLegacy_CachedFormat; }