• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/core/SkColorSpace.h"
9 #include "src/core/SkArenaAlloc.h"
10 #include "src/core/SkColorSpacePriv.h"
11 #include "src/core/SkColorSpaceXformSteps.h"
12 #include "src/core/SkRasterPipeline.h"
13 #include "src/core/SkReadBuffer.h"
14 #include "src/core/SkUtils.h"
15 #include "src/shaders/SkColorShader.h"
16 
SkColorShader(SkColor c)17 SkColorShader::SkColorShader(SkColor c) : fColor(c) {}
18 
isOpaque() const19 bool SkColorShader::isOpaque() const {
20     return SkColorGetA(fColor) == 255;
21 }
22 
CreateProc(SkReadBuffer & buffer)23 sk_sp<SkFlattenable> SkColorShader::CreateProc(SkReadBuffer& buffer) {
24     return sk_make_sp<SkColorShader>(buffer.readColor());
25 }
26 
flatten(SkWriteBuffer & buffer) const27 void SkColorShader::flatten(SkWriteBuffer& buffer) const {
28     buffer.writeColor(fColor);
29 }
30 
asAGradient(GradientInfo * info) const31 SkShader::GradientType SkColorShader::asAGradient(GradientInfo* info) const {
32     if (info) {
33         if (info->fColors && info->fColorCount >= 1) {
34             info->fColors[0] = fColor;
35         }
36         info->fColorCount = 1;
37         info->fTileMode = SkTileMode::kRepeat;
38     }
39     return kColor_GradientType;
40 }
41 
SkColor4Shader(const SkColor4f & color,sk_sp<SkColorSpace> space)42 SkColor4Shader::SkColor4Shader(const SkColor4f& color, sk_sp<SkColorSpace> space)
43     : fColorSpace(std::move(space))
44     , fColor(color)
45 {}
46 
CreateProc(SkReadBuffer & buffer)47 sk_sp<SkFlattenable> SkColor4Shader::CreateProc(SkReadBuffer& buffer) {
48     SkColor4f color;
49     sk_sp<SkColorSpace> colorSpace;
50     buffer.readColor4f(&color);
51     if (buffer.readBool()) {
52         sk_sp<SkData> data = buffer.readByteArrayAsData();
53         colorSpace = data ? SkColorSpace::Deserialize(data->data(), data->size()) : nullptr;
54     }
55     return SkShaders::Color(color, std::move(colorSpace));
56 }
57 
flatten(SkWriteBuffer & buffer) const58 void SkColor4Shader::flatten(SkWriteBuffer& buffer) const {
59     buffer.writeColor4f(fColor);
60     sk_sp<SkData> colorSpaceData = fColorSpace ? fColorSpace->serialize() : nullptr;
61     if (colorSpaceData) {
62         buffer.writeBool(true);
63         buffer.writeDataAsByteArray(colorSpaceData.get());
64     } else {
65         buffer.writeBool(false);
66     }
67 }
68 
69 
Color(const SkColor4f & color,sk_sp<SkColorSpace> space)70 sk_sp<SkShader> SkShaders::Color(const SkColor4f& color, sk_sp<SkColorSpace> space) {
71     if (!SkScalarsAreFinite(color.vec(), 4)) {
72         return nullptr;
73     }
74     return sk_make_sp<SkColor4Shader>(color, std::move(space));
75 }
76 
onAppendStages(const SkStageRec & rec) const77 bool SkColorShader::onAppendStages(const SkStageRec& rec) const {
78     SkColor4f color = SkColor4f::FromColor(fColor);
79     SkColorSpaceXformSteps(sk_srgb_singleton(), kUnpremul_SkAlphaType,
80                            rec.fDstCS,          kUnpremul_SkAlphaType).apply(color.vec());
81     rec.fPipeline->append_constant_color(rec.fAlloc, color.premul().vec());
82     return true;
83 }
84 
onAppendStages(const SkStageRec & rec) const85 bool SkColor4Shader::onAppendStages(const SkStageRec& rec) const {
86     SkColor4f color = fColor;
87     SkColorSpaceXformSteps(fColorSpace.get(), kUnpremul_SkAlphaType,
88                            rec.fDstCS,        kUnpremul_SkAlphaType).apply(color.vec());
89     rec.fPipeline->append_constant_color(rec.fAlloc, color.premul().vec());
90     return true;
91 }
92 
93 #if SK_SUPPORT_GPU
94 
95 #include "src/gpu/GrColorSpaceInfo.h"
96 #include "src/gpu/GrColorSpaceXform.h"
97 #include "src/gpu/SkGr.h"
98 #include "src/gpu/effects/generated/GrConstColorProcessor.h"
99 
asFragmentProcessor(const GrFPArgs & args) const100 std::unique_ptr<GrFragmentProcessor> SkColorShader::asFragmentProcessor(
101         const GrFPArgs& args) const {
102     SkPMColor4f color = SkColorToPMColor4f(fColor, *args.fDstColorSpaceInfo);
103     return GrConstColorProcessor::Make(color, GrConstColorProcessor::InputMode::kModulateA);
104 }
105 
asFragmentProcessor(const GrFPArgs & args) const106 std::unique_ptr<GrFragmentProcessor> SkColor4Shader::asFragmentProcessor(
107         const GrFPArgs& args) const {
108     SkColorSpaceXformSteps steps{ fColorSpace.get(),                     kUnpremul_SkAlphaType,
109                                   args.fDstColorSpaceInfo->colorSpace(), kUnpremul_SkAlphaType };
110     SkColor4f color = fColor;
111     steps.apply(color.vec());
112     return GrConstColorProcessor::Make(color.premul(),
113                                        GrConstColorProcessor::InputMode::kModulateA);
114 }
115 
116 #endif
117