GrPaint grPaint;
return shader->asFragmentProcessor(d->fContext,
GrTest::TestMatrix(d->fRandom), nullptr,
- kNone_SkFilterQuality);
+ kNone_SkFilterQuality, SkSourceGammaTreatment::kRespect);
}
void GrGLPerlinNoise2::emitCode(EmitArgs& args) {
GrPaint grPaint;
return shader->asFragmentProcessor(d->fContext,
GrTest::TestMatrix(d->fRandom), nullptr,
- kNone_SkFilterQuality);
+ kNone_SkFilterQuality, SkSourceGammaTreatment::kRespect);
}
void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) {
GrContext* context,
const SkMatrix& viewM,
const SkMatrix* externalLocalMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment gammaTreatment) const {
SkASSERT(context);
SkMatrix localMatrix = this->getLocalMatrix();
GrTextureParams::FilterMode::kNone_FilterMode);
SkAutoTUnref<GrTexture> permutationsTexture(
GrRefCachedBitmapTexture(context, paintingData->getImprovedPermutationsBitmap(),
- textureParams));
+ textureParams, gammaTreatment));
SkAutoTUnref<GrTexture> gradientTexture(
GrRefCachedBitmapTexture(context, paintingData->getGradientBitmap(),
- textureParams));
+ textureParams, gammaTreatment));
return GrImprovedPerlinNoiseEffect::Create(fNumOctaves, fSeed, paintingData,
permutationsTexture, gradientTexture, m);
}
SkAutoTUnref<GrTexture> permutationsTexture(
GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(),
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(), gammaTreatment));
SkAutoTUnref<GrTexture> noiseTexture(
GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(),
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(), gammaTreatment));
if ((permutationsTexture) && (noiseTexture)) {
SkAutoTUnref<GrFragmentProcessor> inner(
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext* context, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#ifndef SK_IGNORE_TO_STRING
void toString(SkString* str) const override {
const GrFragmentProcessor* DCShader::asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
SkAutoTUnref<const GrFragmentProcessor> inner(new DCFP(fDeviceMatrix));
return GrFragmentProcessor::MulOutputByInputAlpha(inner);
}
#if SK_SUPPORT_GPU
SkAutoTUnref<GrTexture> texture(cache->lockAsTexture(canvas->getGrContext(),
GrTextureParams::ClampBilerp(),
+ SkSourceGammaTreatment::kRespect,
nullptr));
if (!texture) {
// show placeholder if we have no texture
}
SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, fBmp,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
if (!texture) {
return;
}
SkAutoTUnref<GrTexture> texture[3];
texture[0].reset(GrRefCachedBitmapTexture(context, fBmp[0],
- GrTextureParams::ClampBilerp()));
+ GrTextureParams::ClampBilerp(),
+ SkSourceGammaTreatment::kRespect));
texture[1].reset(GrRefCachedBitmapTexture(context, fBmp[1],
- GrTextureParams::ClampBilerp()));
+ GrTextureParams::ClampBilerp(),
+ SkSourceGammaTreatment::kRespect));
texture[2].reset(GrRefCachedBitmapTexture(context, fBmp[2],
- GrTextureParams::ClampBilerp()));
+ GrTextureParams::ClampBilerp(),
+ SkSourceGammaTreatment::kRespect));
if (!texture[0] || !texture[1] || !texture[2]) {
return;
kLastEnum_SkColorProfileType = kSRGB_SkColorProfileType
};
+enum class SkSourceGammaTreatment {
+ kRespect,
+ kIgnore,
+};
+
/**
* Describe an image's dimensions and pixel type.
* Used for both src images and render-targets (surfaces).
virtual const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewMatrix,
const SkMatrix* localMatrix,
- SkFilterQuality) const;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const;
/**
* If the shader can represent its "average" luminance in a single color, return true and
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext* context, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
/** Returns a texture representing the bitmap that is compatible with the GrTextureParams. The
texture is inserted into the cache (unless the bitmap is marked volatile) and can be
retrieved again via this function. */
-GrTexture* GrRefCachedBitmapTexture(GrContext*, const SkBitmap&, const GrTextureParams&);
+GrTexture* GrRefCachedBitmapTexture(GrContext*, const SkBitmap&, const GrTextureParams&,
+ SkSourceGammaTreatment);
// TODO: Move SkImageInfo2GrPixelConfig to SkGrPriv.h (requires cleanup to SkWindow its subclasses).
GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType, SkAlphaType, SkColorProfileType, const GrCaps&);
const GrFragmentProcessor* SkBitmapProcShader::asFragmentProcessor(GrContext* context,
const SkMatrix& viewM, const SkMatrix* localMatrix,
- SkFilterQuality filterQuality) const {
+ SkFilterQuality filterQuality,
+ SkSourceGammaTreatment gammaTreatment) const {
SkMatrix matrix;
matrix.setIDiv(fRawBitmap.width(), fRawBitmap.height());
GrSkFilterQualityToGrFilterMode(filterQuality, viewM, this->getLocalMatrix(),
&doBicubic);
GrTextureParams params(tm, textureFilterMode);
- SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, fRawBitmap, params));
+ SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(context, fRawBitmap, params,
+ gammaTreatment));
if (!texture) {
SkErrorInternals::SetError( kInternalError_SkError,
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext*, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
protected:
/////////////////////////////////////////////////////////////////////
const GrFragmentProcessor* SkColorFilterShader::asFragmentProcessor(
- GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality fq) const {
+ GrContext* context,
+ const SkMatrix& viewM,
+ const SkMatrix* localMatrix,
+ SkFilterQuality fq,
+ SkSourceGammaTreatment gammaTreatment) const {
SkAutoTUnref<const GrFragmentProcessor> fp1(fShader->asFragmentProcessor(context, viewM,
- localMatrix, fq));
+ localMatrix, fq,
+ gammaTreatment));
if (!fp1.get()) {
return nullptr;
}
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
class FilterShaderContext : public SkShader::Context {
#include "effects/GrConstColorProcessor.h"
const GrFragmentProcessor* SkColorShader::asFragmentProcessor(GrContext*, const SkMatrix&,
const SkMatrix*,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
GrColor color = SkColorToPremulGrColor(fColor);
return GrConstColorProcessor::Create(color, GrConstColorProcessor::kModulateA_InputMode);
}
#include "effects/GrConstColorProcessor.h"
const GrFragmentProcessor* SkColor4Shader::asFragmentProcessor(GrContext*, const SkMatrix&,
const SkMatrix*,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
// TODO: how to communicate color4f to Gr
GrColor color = SkColorToPremulGrColor(fCachedByteColor);
return GrConstColorProcessor::Create(color, GrConstColorProcessor::kModulateA_InputMode);
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext*, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext*, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
/////////////////////////////////////////////////////////////////////
-const GrFragmentProcessor* SkComposeShader::asFragmentProcessor(GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality fq) const {
+const GrFragmentProcessor* SkComposeShader::asFragmentProcessor(
+ GrContext* context,
+ const SkMatrix& viewM,
+ const SkMatrix* localMatrix,
+ SkFilterQuality fq,
+ SkSourceGammaTreatment gammaTreatment) const {
// Fragment processor will only support SkXfermode::Mode modes currently.
SkXfermode::Mode mode;
if (!(SkXfermode::AsMode(fMode, &mode))) {
GrConstColorProcessor::kIgnore_InputMode);
break;
case SkXfermode::kSrc_Mode:
- return fShaderB->asFragmentProcessor(context, viewM, localMatrix, fq);
+ return fShaderB->asFragmentProcessor(context, viewM, localMatrix, fq, gammaTreatment);
break;
case SkXfermode::kDst_Mode:
- return fShaderA->asFragmentProcessor(context, viewM, localMatrix, fq);
+ return fShaderA->asFragmentProcessor(context, viewM, localMatrix, fq, gammaTreatment);
break;
default:
SkAutoTUnref<const GrFragmentProcessor> fpA(fShaderA->asFragmentProcessor(context,
- viewM, localMatrix, fq));
+ viewM, localMatrix, fq, gammaTreatment));
if (!fpA.get()) {
return nullptr;
}
SkAutoTUnref<const GrFragmentProcessor> fpB(fShaderB->asFragmentProcessor(context,
- viewM, localMatrix, fq));
+ viewM, localMatrix, fq, gammaTreatment));
if (!fpB.get()) {
return nullptr;
}
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
class ComposeShaderContext : public SkShader::Context {
*/
GrTexture* SkImageCacherator::lockTexture(GrContext* ctx, const GrUniqueKey& key,
const SkImage* client, SkImage::CachingHint chint,
- bool willBeMipped) {
+ bool willBeMipped,
+ SkSourceGammaTreatment gammaTreatment) {
// Values representing the various texture lock paths we can take. Used for logging the path
// taken to a histogram.
enum LockTexturePath {
if (this->tryLockAsBitmap(&bitmap, client, chint)) {
GrTexture* tex = nullptr;
if (willBeMipped) {
- tex = GrGenerateMipMapsAndUploadToTexture(ctx, bitmap);
+ tex = GrGenerateMipMapsAndUploadToTexture(ctx, bitmap, gammaTreatment);
}
if (!tex) {
tex = GrUploadBitmapToTexture(ctx, bitmap);
///////////////////////////////////////////////////////////////////////////////////////////////////
GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment,
const SkImage* client, SkImage::CachingHint chint) {
if (!ctx) {
return nullptr;
}
- return GrImageTextureMaker(ctx, this, client, chint).refTextureForParams(params);
+ return GrImageTextureMaker(ctx, this, client, chint).refTextureForParams(params,
+ gammaTreatment);
}
#else
GrTexture* SkImageCacherator::lockAsTexture(GrContext* ctx, const GrTextureParams&,
+ SkSourceGammaTreatment gammaTreatment,
const SkImage* client, SkImage::CachingHint) {
return nullptr;
}
*
* The caller is responsible for calling texture->unref() when they are done.
*/
- GrTexture* lockAsTexture(GrContext*, const GrTextureParams&, const SkImage* client,
+ GrTexture* lockAsTexture(GrContext*, const GrTextureParams&,
+ SkSourceGammaTreatment gammaTreatment, const SkImage* client,
SkImage::CachingHint = SkImage::kAllow_CachingHint);
/**
// Returns the texture. If the cacherator is generating the texture and wants to cache it,
// it should use the passed in key (if the key is valid).
GrTexture* lockTexture(GrContext*, const GrUniqueKey& key, const SkImage* client,
- SkImage::CachingHint, bool willBeMipped);
+ SkImage::CachingHint, bool willBeMipped, SkSourceGammaTreatment);
#endif
class ScopedGenerator {
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
class LightingShaderContext : public SkShader::Context {
}
const GrFragmentProcessor* SkLightingShaderImpl::asFragmentProcessor(
- GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality filterQuality) const {
+ GrContext* context,
+ const SkMatrix& viewM,
+ const SkMatrix* localMatrix,
+ SkFilterQuality filterQuality,
+ SkSourceGammaTreatment gammaTreatment) const {
// we assume diffuse and normal maps have same width and height
// TODO: support different sizes
SkASSERT(fDiffuseMap.width() == fNormalMap.width() &&
// TODO: support other tile modes
GrTextureParams diffParams(kClamp_TileMode, diffFilterMode);
SkAutoTUnref<GrTexture> diffuseTexture(GrRefCachedBitmapTexture(context,
- fDiffuseMap, diffParams));
+ fDiffuseMap, diffParams,
+ gammaTreatment));
if (!diffuseTexture) {
SkErrorInternals::SetError(kInternalError_SkError, "Couldn't convert bitmap to texture.");
return nullptr;
GrTextureParams normParams(kClamp_TileMode, normFilterMode);
SkAutoTUnref<GrTexture> normalTexture(GrRefCachedBitmapTexture(context,
- fNormalMap, normParams));
+ fNormalMap, normParams,
+ gammaTreatment));
if (!normalTexture) {
SkErrorInternals::SetError(kInternalError_SkError, "Couldn't convert bitmap to texture.");
return nullptr;
}
#if SK_SUPPORT_GPU
- const GrFragmentProcessor* asFragmentProcessor(GrContext* context, const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality fq) const override {
+ const GrFragmentProcessor* asFragmentProcessor(
+ GrContext* context, const SkMatrix& viewM,
+ const SkMatrix* localMatrix, SkFilterQuality fq,
+ SkSourceGammaTreatment gammaTreatment) const override {
SkMatrix tmp = this->getLocalMatrix();
if (localMatrix) {
tmp.preConcat(*localMatrix);
}
- return fProxyShader->asFragmentProcessor(context, viewM, &tmp, fq);
+ return fProxyShader->asFragmentProcessor(context, viewM, &tmp, fq, gammaTreatment);
}
#endif
#if SK_SUPPORT_GPU
const GrFragmentProcessor* SkPictureShader::asFragmentProcessor(
- GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality fq) const {
+ GrContext* context, const SkMatrix& viewM,
+ const SkMatrix* localMatrix,
+ SkFilterQuality fq,
+ SkSourceGammaTreatment gammaTreatment) const {
int maxTextureSize = 0;
if (context) {
maxTextureSize = context->caps()->maxTextureSize();
if (!bitmapShader) {
return nullptr;
}
- return bitmapShader->asFragmentProcessor(context, viewM, nullptr, fq);
+ return bitmapShader->asFragmentProcessor(context, viewM, nullptr, fq, gammaTreatment);
}
#endif
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix*,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
protected:
}
const GrFragmentProcessor* SkShader::asFragmentProcessor(GrContext*, const SkMatrix&,
- const SkMatrix*, SkFilterQuality) const {
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const {
return nullptr;
}
sk_sp<GrTexture> resultTex(GrRefCachedBitmapTexture(context,
bmp,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
if (!resultTex) {
return nullptr;
}
#if SK_SUPPORT_GPU
sk_sp<GrTexture> onAsTextureRef(GrContext* context) const override {
return sk_sp<GrTexture>(as_IB(fImage)->asTextureRef(context,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
}
#endif
if (context) {
return sk_ref_sp(GrRefCachedBitmapTexture(context,
fBitmap,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
}
return nullptr;
return shader->asFragmentProcessor(d->fContext,
GrTest::TestMatrix(d->fRandom), nullptr,
- kNone_SkFilterQuality);
+ kNone_SkFilterQuality, SkSourceGammaTreatment::kRespect);
}
void GrGLPerlinNoise::emitCode(EmitArgs& args) {
/////////////////////////////////////////////////////////////////////
const GrFragmentProcessor* SkPerlinNoiseShader::asFragmentProcessor(
- GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* externalLocalMatrix,
- SkFilterQuality) const {
+ GrContext* context,
+ const SkMatrix& viewM,
+ const SkMatrix* externalLocalMatrix,
+ SkFilterQuality,
+ SkSourceGammaTreatment gammaTreatment) const {
SkASSERT(context);
SkMatrix localMatrix = this->getLocalMatrix();
new PaintingData(fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY, matrix);
SkAutoTUnref<GrTexture> permutationsTexture(
GrRefCachedBitmapTexture(context, paintingData->getPermutationsBitmap(),
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(), gammaTreatment));
SkAutoTUnref<GrTexture> noiseTexture(
GrRefCachedBitmapTexture(context, paintingData->getNoiseBitmap(),
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(), gammaTreatment));
SkMatrix m = viewM;
m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1);
SkAutoTUnref<GrTexture> texture;
if (-1 == row) {
atlas = nullptr;
- texture.reset(GrRefCachedBitmapTexture(context, bitmap, GrTextureParams::ClampNoFilter()));
+ texture.reset(GrRefCachedBitmapTexture(context, bitmap, GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
} else {
texture.reset(SkRef(atlas->getTexture()));
}
fCoordTransform.reset(kCoordSet, matrix, fAtlas->getTexture(), params.filterMode());
fTextureAccess.reset(fAtlas->getTexture(), params);
} else {
- SkAutoTUnref<GrTexture> texture(GrRefCachedBitmapTexture(ctx, bitmap, params));
+ SkAutoTUnref<GrTexture> texture(
+ GrRefCachedBitmapTexture(ctx, bitmap, params, SkSourceGammaTreatment::kRespect));
if (!texture) {
return;
}
int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
auto shader = SkGradientShader::MakeLinear(points, colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
GrContext* context,
const SkMatrix& viewm,
const SkMatrix* localMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
SkASSERT(context);
SkMatrix matrix;
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix*,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
auto shader = SkGradientShader::MakeRadial(center, radius, colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
GrContext* context,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
SkASSERT(context);
SkMatrix matrix;
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix*,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
colorCount));
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
GrTest::TestMatrix(d->fRandom),
- NULL, kNone_SkFilterQuality);
+ NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
GrContext* context,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
SkMatrix matrix;
if (!this->getLocalMatrix().invert(&matrix)) {
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix& viewM,
const SkMatrix*,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
SK_TO_STRING_OVERRIDE()
GrContext* context,
const SkMatrix& viewM,
const SkMatrix* localMatrix,
- SkFilterQuality) const {
+ SkFilterQuality,
+ SkSourceGammaTreatment) const {
SkASSERT(context);
SkASSERT(fPtsToUnit.isIdentity());
SkAutoTUnref<const GrFragmentProcessor> inner(
const GrFragmentProcessor* asFragmentProcessor(GrContext*,
const SkMatrix&,
const SkMatrix*,
- SkFilterQuality) const override;
+ SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
bool isOpaque() const override;
auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext,
- GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center2, radius2,
colors, stops, colorCount, tm);
const GrFragmentProcessor* fp = shader->asFragmentProcessor(
- d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality);
+ d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
+ SkSourceGammaTreatment::kRespect);
GrAlwaysAssert(fp);
return fp;
}
}
}
-GrTexture* GrBitmapTextureMaker::refOriginalTexture(bool willBeMipped) {
+GrTexture* GrBitmapTextureMaker::refOriginalTexture(bool willBeMipped,
+ SkSourceGammaTreatment gammaTreatment) {
GrTexture* tex = nullptr;
if (fOriginalKey.isValid()) {
}
}
if (willBeMipped) {
- tex = GrGenerateMipMapsAndUploadToTexture(this->context(), fBitmap);
+ tex = GrGenerateMipMapsAndUploadToTexture(this->context(), fBitmap, gammaTreatment);
}
if (!tex) {
tex = GrUploadBitmapToTexture(this->context(), fBitmap);
}
}
-GrTexture* GrImageTextureMaker::refOriginalTexture(bool willBeMipped) {
- return fCacher->lockTexture(this->context(), fOriginalKey, fClient, fCachingHint, willBeMipped);
+GrTexture* GrImageTextureMaker::refOriginalTexture(bool willBeMipped,
+ SkSourceGammaTreatment gammaTreatment) {
+ return fCacher->lockTexture(this->context(), fOriginalKey, fClient, fCachingHint, willBeMipped,
+ gammaTreatment);
}
void GrImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) {
GrBitmapTextureMaker(GrContext* context, const SkBitmap& bitmap);
protected:
- GrTexture* refOriginalTexture(bool willBeMipped) override;
+ GrTexture* refOriginalTexture(bool willBeMipped, SkSourceGammaTreatment) override;
void makeCopyKey(const CopyParams& copyParams, GrUniqueKey* copyKey) override;
// able to efficiently produce a "stretched" texture natively (e.g. picture-backed)
// GrTexture* generateTextureForParams(const CopyParams&) override;
- GrTexture* refOriginalTexture(bool willBeMipped) override;
+ GrTexture* refOriginalTexture(bool willBeMipped, SkSourceGammaTreatment) override;
void makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) override;
void didCacheCopy(const GrUniqueKey& copyKey) override;
}
GrTexture* GrTextureAdjuster::refTextureSafeForParams(const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment,
SkIPoint* outOffset) {
GrTexture* texture = this->originalTexture();
GrContext* context = texture->getContext();
const SkRect& origConstraintRect,
FilterConstraint filterConstraint,
bool coordsLimitedToConstraintRect,
- const GrTextureParams::FilterMode* filterOrNullForBicubic) {
+ const GrTextureParams::FilterMode* filterOrNullForBicubic,
+ SkSourceGammaTreatment gammaTreatment) {
SkMatrix textureMatrix = origTextureMatrix;
const SkIRect* contentArea = this->contentAreaOrNull();
if (filterOrNullForBicubic) {
params.setFilterMode(*filterOrNullForBicubic);
}
- SkAutoTUnref<GrTexture> texture(this->refTextureSafeForParams(params, nullptr));
+ SkAutoTUnref<GrTexture> texture(this->refTextureSafeForParams(params, gammaTreatment, nullptr));
if (!texture) {
return nullptr;
}
//////////////////////////////////////////////////////////////////////////////
-GrTexture* GrTextureMaker::refTextureForParams(const GrTextureParams& params) {
+GrTexture* GrTextureMaker::refTextureForParams(const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) {
CopyParams copyParams;
bool willBeMipped = params.filterMode() == GrTextureParams::kMipMap_FilterMode;
if (!fContext->getGpu()->makeCopyForTextureParams(this->width(), this->height(), params,
©Params)) {
- return this->refOriginalTexture(willBeMipped);
+ return this->refOriginalTexture(willBeMipped, gammaTreatment);
}
GrUniqueKey copyKey;
this->makeCopyKey(copyParams, ©Key);
}
}
- GrTexture* result = this->generateTextureForParams(copyParams, willBeMipped);
+ GrTexture* result = this->generateTextureForParams(copyParams, willBeMipped, gammaTreatment);
if (!result) {
return nullptr;
}
const SkRect& constraintRect,
FilterConstraint filterConstraint,
bool coordsLimitedToConstraintRect,
- const GrTextureParams::FilterMode* filterOrNullForBicubic) {
+ const GrTextureParams::FilterMode* filterOrNullForBicubic,
+ SkSourceGammaTreatment gammaTreatment) {
const GrTextureParams::FilterMode* fmForDetermineDomain = filterOrNullForBicubic;
if (filterOrNullForBicubic && GrTextureParams::kMipMap_FilterMode == *filterOrNullForBicubic &&
// Bicubic doesn't use filtering for it's texture accesses.
params.reset(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode);
}
- SkAutoTUnref<GrTexture> texture(this->refTextureForParams(params));
+ SkAutoTUnref<GrTexture> texture(this->refTextureForParams(params, gammaTreatment));
if (!texture) {
return nullptr;
}
filterOrNullForBicubic);
}
-GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams,
- bool willBeMipped) {
- SkAutoTUnref<GrTexture> original(this->refOriginalTexture(willBeMipped));
+GrTexture* GrTextureMaker::generateTextureForParams(const CopyParams& copyParams, bool willBeMipped,
+ SkSourceGammaTreatment gammaTreatment) {
+ SkAutoTUnref<GrTexture> original(this->refOriginalTexture(willBeMipped, gammaTreatment));
if (!original) {
return nullptr;
}
const SkRect& constraintRect,
FilterConstraint filterConstraint,
bool coordsLimitedToConstraintRect,
- const GrTextureParams::FilterMode* filterOrNullForBicubic) = 0;
+ const GrTextureParams::FilterMode* filterOrNullForBicubic,
+ SkSourceGammaTreatment) = 0;
virtual ~GrTextureProducer() {}
outOffset will be the top-left corner of the subset if a copy is not made. Otherwise,
the copy will be tight to the contents and outOffset will be (0, 0). If the copy's size
does not match subset's dimensions then the contents are scaled to fit the copy.*/
- GrTexture* refTextureSafeForParams(const GrTextureParams&, SkIPoint* outOffset);
+ GrTexture* refTextureSafeForParams(const GrTextureParams&, SkSourceGammaTreatment,
+ SkIPoint* outOffset);
const GrFragmentProcessor* createFragmentProcessor(
const SkMatrix& textureMatrix,
const SkRect& constraintRect,
FilterConstraint,
bool coordsLimitedToConstraintRect,
- const GrTextureParams::FilterMode* filterOrNullForBicubic) override;
+ const GrTextureParams::FilterMode* filterOrNullForBicubic,
+ SkSourceGammaTreatment) override;
protected:
/** The whole texture is content. */
/** Returns a texture that is safe for use with the params. If the size of the returned texture
does not match width()/height() then the contents of the original must be scaled to fit
the texture. */
- GrTexture* refTextureForParams(const GrTextureParams&);
+ GrTexture* refTextureForParams(const GrTextureParams&, SkSourceGammaTreatment);
const GrFragmentProcessor* createFragmentProcessor(
const SkMatrix& textureMatrix,
const SkRect& constraintRect,
FilterConstraint filterConstraint,
bool coordsLimitedToConstraintRect,
- const GrTextureParams::FilterMode* filterOrNullForBicubic) override;
+ const GrTextureParams::FilterMode* filterOrNullForBicubic,
+ SkSourceGammaTreatment) override;
protected:
GrTextureMaker(GrContext* context, int width, int height, bool isAlphaOnly)
* Return the maker's "original" texture. It is the responsibility of the maker to handle any
* caching of the original if desired.
*/
- virtual GrTexture* refOriginalTexture(bool willBeMipped) = 0;
+ virtual GrTexture* refOriginalTexture(bool willBeMipped, SkSourceGammaTreatment) = 0;
/**
* Return a new (uncached) texture that is the stretch of the maker's original.
* Subclass may override this if they can handle creating the texture more directly than
* by copying.
*/
- virtual GrTexture* generateTextureForParams(const CopyParams&, bool willBeMipped);
+ virtual GrTexture* generateTextureForParams(const CopyParams&, bool willBeMipped,
+ SkSourceGammaTreatment);
GrContext* context() const { return fContext; }
AutoBitmapTexture(GrContext* context,
const SkBitmap& bitmap,
const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment,
GrTexture** texture) {
SkASSERT(texture);
- *texture = this->set(context, bitmap, params);
+ *texture = this->set(context, bitmap, params, gammaTreatment);
}
GrTexture* set(GrContext* context,
const SkBitmap& bitmap,
- const GrTextureParams& params) {
+ const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) {
// Either get the texture directly from the bitmap, or else use the cache and
// remember to unref it.
if (GrTexture* bmpTexture = bitmap.getTexture()) {
fTexture.reset(nullptr);
return bmpTexture;
} else {
- fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params));
+ fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params, gammaTreatment));
return fTexture.get();
}
}
GrTexture* texture;
// draw sprite neither filters nor tiles.
- AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(), &texture);
+ AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect, &texture);
if (!texture) {
return;
}
bitmap.height() <= fContext->caps()->maxTileSize()));
GrTexture* texture;
- AutoBitmapTexture abt(fContext, bitmap, params, &texture);
+ SkSourceGammaTreatment gammaTreatment = this->surfaceProps().isGammaCorrect()
+ ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore;
+ AutoBitmapTexture abt(fContext, bitmap, params, gammaTreatment, &texture);
if (nullptr == texture) {
return;
}
GrTexture* texture;
// draw sprite neither filters nor tiles.
- AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(), &texture);
+ AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect, &texture);
if (!texture) {
return;
}
}
static const GrTextureParams::FilterMode kMode = GrTextureParams::kNone_FilterMode;
+ bool gammaCorrect = this->surfaceProps().isGammaCorrect();
+ SkSourceGammaTreatment gammaTreatment = gammaCorrect
+ ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore;
SkAutoTUnref<const GrFragmentProcessor> fp(
producer->createFragmentProcessor(SkMatrix::I(),
SkRect::MakeIWH(producer->width(), producer->height()),
GrTextureProducer::kNo_FilterConstraint, true,
- &kMode));
+ &kMode, gammaTreatment));
GrPaint grPaint;
if (!SkPaintToGrPaintWithTexture(this->context(), paint, *draw.fMatrix, fp,
- producer->isAlphaOnly(),
- this->surfaceProps().isGammaCorrect(), &grPaint)) {
+ producer->isAlphaOnly(), gammaCorrect, &grPaint)) {
return;
}
}
textureMatrix = &tempMatrix;
}
+ bool gammaCorrect = this->surfaceProps().isGammaCorrect();
+ SkSourceGammaTreatment gammaTreatment = gammaCorrect
+ ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore;
SkAutoTUnref<const GrFragmentProcessor> fp(producer->createFragmentProcessor(
- *textureMatrix, clippedSrcRect, constraintMode, coordsAllInsideSrcRect, filterMode));
+ *textureMatrix, clippedSrcRect, constraintMode, coordsAllInsideSrcRect, filterMode,
+ gammaTreatment));
if (!fp) {
return;
}
GrPaint grPaint;
if (!SkPaintToGrPaintWithTexture(fContext, paint, viewMatrix, fp, producer->isAlphaOnly(),
- this->surfaceProps().isGammaCorrect(), &grPaint)) {
+ gammaCorrect, &grPaint)) {
return;
}
pixelRef->addGenIDChangeListener(new Invalidator(key));
}
-GrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext* ctx, const SkBitmap& bitmap)
+GrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext* ctx, const SkBitmap& bitmap,
+ SkSourceGammaTreatment gammaTreatment)
{
GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap.info(), *ctx->caps());
if (kIndex_8_SkColorType != bitmap.colorType() && !bitmap.readyToDraw()) {
}
GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap,
- const GrTextureParams& params) {
+ const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) {
if (bitmap.getTexture()) {
- return GrBitmapTextureAdjuster(&bitmap).refTextureSafeForParams(params, nullptr);
+ return GrBitmapTextureAdjuster(&bitmap).refTextureSafeForParams(params, gammaTreatment,
+ nullptr);
}
- return GrBitmapTextureMaker(ctx, bitmap).refTextureForParams(params);
+ return GrBitmapTextureMaker(ctx, bitmap).refTextureForParams(params, gammaTreatment);
}
///////////////////////////////////////////////////////////////////////////////
if (shaderProcessor) {
shaderFP = *shaderProcessor;
} else if (const SkShader* shader = skPaint.getShader()) {
+ SkSourceGammaTreatment gammaTreatment = allowSRGBInputs
+ ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore;
aufp.reset(shader->asFragmentProcessor(context, viewM, nullptr,
- skPaint.getFilterQuality()));
+ skPaint.getFilterQuality(), gammaTreatment));
shaderFP = aufp;
if (!shaderFP) {
return false;
SkAutoTUnref<const GrFragmentProcessor> shaderFP;
if (textureIsAlphaOnly) {
if (const SkShader* shader = paint.getShader()) {
+ SkSourceGammaTreatment gammaTreatment = allowSRGBInputs
+ ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore;
shaderFP.reset(shader->asFragmentProcessor(context,
viewM,
nullptr,
- paint.getFilterQuality()));
+ paint.getFilterQuality(),
+ gammaTreatment));
if (!shaderFP) {
return false;
}
*/
GrTexture* GrUploadBitmapToTexture(GrContext*, const SkBitmap&);
-GrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext*, const SkBitmap&);
+GrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext*, const SkBitmap&, SkSourceGammaTreatment);
/**
* Creates a new texture for the pixmap.
#include "effects/GrBicubicEffect.h"
#include "effects/GrSimpleTextureEffect.h"
-const GrFragmentProcessor* SkImageShader::asFragmentProcessor(GrContext* context,
- const SkMatrix& viewM,
- const SkMatrix* localMatrix,
- SkFilterQuality filterQuality) const {
+const GrFragmentProcessor* SkImageShader::asFragmentProcessor(
+ GrContext* context,
+ const SkMatrix& viewM,
+ const SkMatrix* localMatrix,
+ SkFilterQuality filterQuality,
+ SkSourceGammaTreatment gammaTreatment) const {
SkMatrix matrix;
matrix.setIDiv(fImage->width(), fImage->height());
GrTextureParams::FilterMode textureFilterMode =
GrSkFilterQualityToGrFilterMode(filterQuality, viewM, this->getLocalMatrix(), &doBicubic);
GrTextureParams params(tm, textureFilterMode);
- SkAutoTUnref<GrTexture> texture(as_IB(fImage)->asTextureRef(context, params));
+ SkAutoTUnref<GrTexture> texture(as_IB(fImage)->asTextureRef(context, params, gammaTreatment));
if (!texture) {
return nullptr;
}
#if SK_SUPPORT_GPU
const GrFragmentProcessor* asFragmentProcessor(GrContext*, const SkMatrix& viewM,
- const SkMatrix*, SkFilterQuality) const override;
+ const SkMatrix*, SkFilterQuality,
+ SkSourceGammaTreatment) const override;
#endif
protected:
}
// Caller must call unref when they are done.
- virtual GrTexture* asTextureRef(GrContext*, const GrTextureParams&) const = 0;
+ virtual GrTexture* asTextureRef(GrContext*, const GrTextureParams&,
+ SkSourceGammaTreatment) const = 0;
virtual sk_sp<SkImage> onMakeSubset(const SkIRect&) const = 0;
bool isOpaque() const override { return fCache->info().isOpaque(); }
sk_sp<SkImage> onMakeSubset(const SkIRect&) const override;
bool getROPixels(SkBitmap*, CachingHint) const override;
- GrTexture* asTextureRef(GrContext*, const GrTextureParams&) const override;
+ GrTexture* asTextureRef(GrContext*, const GrTextureParams&,
+ SkSourceGammaTreatment) const override;
bool onIsLazyGenerated() const override { return true; }
private:
return fCache->lockAsBitmap(bitmap, this, chint);
}
-GrTexture* SkImage_Generator::asTextureRef(GrContext* ctx, const GrTextureParams& params) const {
- return fCache->lockAsTexture(ctx, params, this);
+GrTexture* SkImage_Generator::asTextureRef(GrContext* ctx, const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) const {
+ return fCache->lockAsTexture(ctx, params, gammaTreatment, this);
}
sk_sp<SkImage> SkImage_Generator::onMakeSubset(const SkIRect& subset) const {
return true;
}
-GrTexture* SkImage_Gpu::asTextureRef(GrContext* ctx, const GrTextureParams& params) const {
- return GrImageTextureAdjuster(as_IB(this)).refTextureSafeForParams(params, nullptr);
+GrTexture* SkImage_Gpu::asTextureRef(GrContext* ctx, const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) const {
+ return GrImageTextureAdjuster(as_IB(this)).refTextureSafeForParams(params, gammaTreatment,
+ nullptr);
}
bool SkImage_Gpu::isOpaque() const {
}
static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType at, uint32_t id) {
- SkAutoTUnref<GrTexture> texture(maker->refTextureForParams(GrTextureParams::ClampNoFilter()));
+ SkAutoTUnref<GrTexture> texture(maker->refTextureForParams(GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
if (!texture) {
return nullptr;
}
}
bool getROPixels(SkBitmap*, CachingHint) const override;
- GrTexture* asTextureRef(GrContext* ctx, const GrTextureParams& params) const override;
+ GrTexture* asTextureRef(GrContext* ctx, const GrTextureParams& params,
+ SkSourceGammaTreatment) const override;
sk_sp<SkImage> onMakeSubset(const SkIRect&) const override;
GrTexture* peekTexture() const override { return fTexture; }
bool onPeekPixels(SkPixmap*) const override;
SkData* onRefEncoded(GrContext*) const override;
bool getROPixels(SkBitmap*, CachingHint) const override;
- GrTexture* asTextureRef(GrContext*, const GrTextureParams&) const override;
+ GrTexture* asTextureRef(GrContext*, const GrTextureParams&,
+ SkSourceGammaTreatment) const override;
sk_sp<SkImage> onMakeSubset(const SkIRect&) const override;
// exposed for SkSurface_Raster via SkNewImageFromPixelRef
return true;
}
-GrTexture* SkImage_Raster::asTextureRef(GrContext* ctx, const GrTextureParams& params) const {
+GrTexture* SkImage_Raster::asTextureRef(GrContext* ctx, const GrTextureParams& params,
+ SkSourceGammaTreatment gammaTreatment) const {
#if SK_SUPPORT_GPU
if (!ctx) {
return nullptr;
}
- return GrRefCachedBitmapTexture(ctx, fBitmap, params);
+ return GrRefCachedBitmapTexture(ctx, fBitmap, params, gammaTreatment);
#endif
return nullptr;
// ... one from a texture-subset
SkAutoTUnref<GrTexture> fullTx(GrRefCachedBitmapTexture(ctxInfo.grContext(), bitmap,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
SkBitmap tx_full;
GrWrapTextureInBitmap(fullTx, bitmap.width(), bitmap.height(), true, &tx_full);
tx_full.extractSubset(&tx_subset, subset);
SkBitmap tmp_subset;
bitmap.extractSubset(&tmp_subset, subset);
SkAutoTUnref<GrTexture> subsetTx(GrRefCachedBitmapTexture(ctxInfo.grContext(), tmp_subset,
- GrTextureParams::ClampNoFilter()));
+ GrTextureParams::ClampNoFilter(),
+ SkSourceGammaTreatment::kRespect));
GrWrapTextureInBitmap(subsetTx, tmp_subset.width(), tmp_subset.height(), true, &bm_subset);
// did we get the same subset?