aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-04-20 10:09:23 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-21 19:55:23 +0000
commit72266eeca036b5216a9bfa0bb68cb0fbb9bbb57b (patch)
tree5a956833c922f9157822feb3714dc794f954df6f
parent28a7ad2ba78551c1d666dcea0bfe2fb595d8a1b0 (diff)
makeColorSpace() for SkColorFilterShader and SkLightingShader
Fixes 4 gms in gbr-8888 config. Bug: skia:6516 Change-Id: I9da839eb0211910989be35db0e13c0e1bbfa185d Reviewed-on: https://skia-review.googlesource.com/13964 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Matt Sarett <msarett@google.com>
-rw-r--r--include/core/SkLights.h6
-rw-r--r--include/core/SkShader.h2
-rw-r--r--src/core/SkColorFilterShader.cpp4
-rw-r--r--src/core/SkColorFilterShader.h1
-rw-r--r--src/core/SkLightingShader.cpp8
-rw-r--r--src/core/SkLights.cpp23
6 files changed, 44 insertions, 0 deletions
diff --git a/include/core/SkLights.h b/include/core/SkLights.h
index d91d91935d..5c6648751d 100644
--- a/include/core/SkLights.h
+++ b/include/core/SkLights.h
@@ -113,6 +113,8 @@ public:
bool operator!= (const Light& b) { return !(this->operator==(b)); }
private:
+ friend class SkLights;
+
LightType fType;
SkColor3f fColor; // linear (unpremul) color. Range is 0..1 in each channel.
@@ -191,6 +193,10 @@ private:
SkLights() {
fAmbientLightColor.set(0.0f, 0.0f, 0.0f);
}
+
+ friend class SkLightingShaderImpl;
+ sk_sp<SkLights> makeColorSpace(SkColorSpaceXformer* xformer) const;
+
SkTArray<Light> fLights;
SkColor3f fAmbientLightColor;
typedef SkRefCnt INHERITED;
diff --git a/include/core/SkShader.h b/include/core/SkShader.h
index b3b5faaa1f..ba61314f77 100644
--- a/include/core/SkShader.h
+++ b/include/core/SkShader.h
@@ -517,7 +517,9 @@ private:
friend class SkLocalMatrixShader;
friend class SkBitmapProcLegacyShader; // for computeTotalInverse()
friend class SkComposeShader;
+ friend class SkColorFilterShader;
friend class SkColorSpaceXformer;
+ friend class SkLightingShaderImpl;
typedef SkFlattenable INHERITED;
};
diff --git a/src/core/SkColorFilterShader.cpp b/src/core/SkColorFilterShader.cpp
index 5e96b24b41..bfe74611cd 100644
--- a/src/core/SkColorFilterShader.cpp
+++ b/src/core/SkColorFilterShader.cpp
@@ -7,6 +7,7 @@
#include "SkArenaAlloc.h"
#include "SkColorFilterShader.h"
+#include "SkColorSpaceXformer.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkShader.h"
@@ -62,6 +63,9 @@ SkShader::Context* SkColorFilterShader::onMakeContext(const ContextRec& rec,
return alloc->make<FilterShaderContext>(*this, shaderContext, rec);
}
+sk_sp<SkShader> SkColorFilterShader::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
+ return fShader->makeColorSpace(xformer)->makeWithColorFilter(xformer->apply(fFilter.get()));
+}
SkColorFilterShader::FilterShaderContext::FilterShaderContext(
const SkColorFilterShader& filterShader,
diff --git a/src/core/SkColorFilterShader.h b/src/core/SkColorFilterShader.h
index e697736ae8..18f65ba67f 100644
--- a/src/core/SkColorFilterShader.h
+++ b/src/core/SkColorFilterShader.h
@@ -48,6 +48,7 @@ public:
protected:
void flatten(SkWriteBuffer&) const override;
Context* onMakeContext(const ContextRec&, SkArenaAlloc* alloc) const override;
+ sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
private:
sk_sp<SkShader> fShader;
diff --git a/src/core/SkLightingShader.cpp b/src/core/SkLightingShader.cpp
index 1c8b1b4f58..600134ded3 100644
--- a/src/core/SkLightingShader.cpp
+++ b/src/core/SkLightingShader.cpp
@@ -83,6 +83,7 @@ public:
protected:
void flatten(SkWriteBuffer&) const override;
Context* onMakeContext(const ContextRec&, SkArenaAlloc*) const override;
+ sk_sp<SkShader> onMakeColorSpace(SkColorSpaceXformer* xformer) const override;
private:
sk_sp<SkShader> fDiffuseShader;
@@ -455,6 +456,13 @@ SkShader::Context* SkLightingShaderImpl::onMakeContext(
return alloc->make<LightingShaderContext>(*this, rec, diffuseContext, normalProvider, nullptr);
}
+sk_sp<SkShader> SkLightingShaderImpl::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
+ sk_sp<SkShader> xformedDiffuseShader =
+ fDiffuseShader ? fDiffuseShader->makeColorSpace(xformer) : nullptr;
+ return SkLightingShader::Make(std::move(xformedDiffuseShader), fNormalSource,
+ fLights->makeColorSpace(xformer));
+}
+
///////////////////////////////////////////////////////////////////////////////
sk_sp<SkShader> SkLightingShader::Make(sk_sp<SkShader> diffuseShader,
diff --git a/src/core/SkLights.cpp b/src/core/SkLights.cpp
index 56c9299437..1073ba0b82 100644
--- a/src/core/SkLights.cpp
+++ b/src/core/SkLights.cpp
@@ -6,6 +6,7 @@
* found in the LICENSE file.
*/
+#include "SkColorSpaceXformer.h"
#include "SkLights.h"
#include "SkReadBuffer.h"
@@ -59,6 +60,28 @@ sk_sp<SkLights> SkLights::MakeFromBuffer(SkReadBuffer& buf) {
return builder.finish();
}
+static SkColor3f xform_color(const SkColor3f& color, SkColorSpaceXformer* xformer) {
+ SkColor origColor = SkColorSetARGBInline(0xFF,
+ SkScalarRoundToInt(color.fX),
+ SkScalarRoundToInt(color.fY),
+ SkScalarRoundToInt(color.fZ));
+ SkColor xformedColor = xformer->apply(origColor);
+ return SkColor3f::Make(SkIntToScalar(SkGetPackedR32(xformedColor)),
+ SkIntToScalar(SkGetPackedG32(xformedColor)),
+ SkIntToScalar(SkGetPackedB32(xformedColor)));
+}
+
+sk_sp<SkLights> SkLights::makeColorSpace(SkColorSpaceXformer* xformer) const {
+ SkLights::Builder builder;
+ for (int i = 0; i < this->numLights(); i++) {
+ Light light(fLights[i].type(), xform_color(fLights[i].color(), xformer),
+ fLights[i].fDirOrPos, fLights[i].fIntensity, fLights[i].isRadial());
+ builder.add(light);
+ }
+ builder.setAmbientLightColor(xform_color(fAmbientLightColor, xformer));
+ return builder.finish();
+}
+
void SkLights::flatten(SkWriteBuffer& buf) const {
buf.writeScalarArray(&this->ambientLightColor().fX, 3);