Index: src/effects/gradients/Sk4fLinearGradient.cpp |
diff --git a/src/effects/gradients/Sk4fLinearGradient.cpp b/src/effects/gradients/Sk4fLinearGradient.cpp |
index 8478cb0be327b33ed0bd20e4c1f2b1444014c685..4a20a28b1f581886b3a4e39e8978be06160e66ae 100644 |
--- a/src/effects/gradients/Sk4fLinearGradient.cpp |
+++ b/src/effects/gradients/Sk4fLinearGradient.cpp |
@@ -161,6 +161,19 @@ float dst_component_scale<SkPMColor>() { |
return 255; |
} |
+template<typename DstType> |
+Sk4f dst_swizzle(const SkPM4f&); |
+ |
+template<> |
+Sk4f dst_swizzle<SkPM4f>(const SkPM4f& c) { |
+ return c.to4f(); |
+} |
+ |
+template<> |
+Sk4f dst_swizzle<SkPMColor>(const SkPM4f& c) { |
+ return c.to4f_pmorder(); |
+} |
+ |
SkPMColor pack_color(SkColor c, bool premul) { |
return premul |
? SkPreMultiplyColor(c) |
@@ -304,11 +317,10 @@ LinearGradient4fContext::LinearGradient4fContext(const SkLinearGradient& shader, |
SkASSERT(shader.fColorCount > 1); |
SkASSERT(shader.fOrigColors); |
- const float kInv255Float = 1.0f / 255; |
- const float paintAlpha = rec.fPaint->getAlpha() * kInv255Float; |
+ const float paintAlpha = rec.fPaint->getAlpha() * (1.0f / 255); |
const Sk4f componentScale = fColorsArePremul |
- ? Sk4f(paintAlpha * kInv255Float) |
- : Sk4f(kInv255Float, kInv255Float, kInv255Float, paintAlpha * kInv255Float); |
+ ? Sk4f(paintAlpha) |
+ : Sk4f(1.0f, 1.0f, 1.0f, paintAlpha); |
const bool dx_is_pos = fDstToPos.getScaleX() >= 0; |
const int first_index = dx_is_pos ? 0 : shader.fColorCount - 1; |
const int last_index = shader.fColorCount - 1 - first_index; |
@@ -562,8 +574,8 @@ public: |
private: |
void compute_interval_props(SkScalar t) { |
- fDc = Sk4f::Load(fInterval->fDc.fVec); |
- fCc = Sk4f::Load(fInterval->fC0.fVec); |
+ fDc = dst_swizzle<DstType>(fInterval->fDc); |
+ fCc = dst_swizzle<DstType>(fInterval->fC0); |
fCc = fCc + fDc * Sk4f(t); |
fCc = fCc * fDstComponentScale; |
fDcDx = fDc * fDstComponentScale * Sk4f(fDx); |