Index: src/core/SkBitmapProcShader.cpp |
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp |
index 4813e01d543200f692bf9721d4237b84f24acb85..fb58f542cc7b7c708426ec129ac28e231bbce644 100644 |
--- a/src/core/SkBitmapProcShader.cpp |
+++ b/src/core/SkBitmapProcShader.cpp |
@@ -46,7 +46,7 @@ public: |
~BitmapProcInfoContext() override { |
fInfo->~SkBitmapProcInfo(); |
} |
- |
+ |
uint32_t getFlags() const override { return fFlags; } |
private: |
@@ -123,8 +123,10 @@ public: |
{ |
// Need to ensure that our pipeline is created at a 16byte aligned address |
fPipeline = (SkLinearBitmapPipeline*)SkAlign16((intptr_t)fStorage); |
- new (fPipeline) SkLinearBitmapPipeline(info->fInvMatrix, info->fFilterQuality, |
+ float alpha = SkColorGetA(info->fPaintColor) / 255.0f; |
+ new (fPipeline) SkLinearBitmapPipeline(info->fRealInvMatrix, info->fFilterQuality, |
info->fTileModeX, info->fTileModeY, |
+ alpha, |
info->fPixmap); |
// To implement the old shadeSpan entry-point, we need to efficiently convert our native |
@@ -175,7 +177,8 @@ static bool choose_linear_pipeline(const SkShader::ContextRec& rec, const SkImag |
// These src attributes are not supported in the new 4f context (yet) |
// |
if (srcInfo.bytesPerPixel() < 4 || |
- kRGBA_F16_SkColorType == srcInfo.colorType()) { |
+ kRGBA_F16_SkColorType == srcInfo.colorType() || |
+ kIndex_8_SkColorType == srcInfo.colorType()) { |
return false; |
} |
@@ -211,25 +214,13 @@ SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, |
return nullptr; |
} |
- // Decide if we can/want to use the new linear pipeine |
+ // Decide if we can/want to use the new linear pipeline |
bool useLinearPipeline = choose_linear_pipeline(rec, provider.info()); |
- // New code doesn't support Mirror (YET), so we detect that here. |
- // |
- if (SkShader::kMirror_TileMode == tmx || SkShader::kMirror_TileMode == tmy) { |
- useLinearPipeline = false; |
- } |
- |
- // New code doesn't support Mirror (YET), so we detect that here. |
- // |
- if (totalInverse.hasPerspective()) { |
- useLinearPipeline = false; |
- } |
- |
// |
// For now, only enable locally since we are hitting some crashers on the test bots |
// |
- useLinearPipeline = false; |
+ //useLinearPipeline = false; |
if (useLinearPipeline) { |
void* infoStorage = (char*)storage + sizeof(LinearPipelineContext); |
@@ -238,6 +229,10 @@ SkShader::Context* SkBitmapProcShader::MakeContext(const SkShader& shader, |
info->~SkBitmapProcInfo(); |
return nullptr; |
} |
+ if (info->fPixmap.colorType() != kRGBA_8888_SkColorType |
+ && info->fPixmap.colorType() != kBGRA_8888_SkColorType) { |
+ return nullptr; |
+ } |
return new (storage) LinearPipelineContext(shader, rec, info); |
} else { |
void* stateStorage = (char*)storage + sizeof(BitmapProcShaderContext); |