diff options
-rw-r--r-- | gn/effects.gni | 2 | ||||
-rw-r--r-- | include/effects/SkToSRGBColorFilter.h | 42 | ||||
-rw-r--r-- | src/effects/SkToSRGBColorFilter.cpp | 59 |
3 files changed, 103 insertions, 0 deletions
diff --git a/gn/effects.gni b/gn/effects.gni index 1e86d2fd9f..f3a480d2cc 100644 --- a/gn/effects.gni +++ b/gn/effects.gni @@ -56,6 +56,7 @@ skia_effects_sources = [ "$_src/effects/SkTableColorFilter.cpp", "$_src/effects/SkTableMaskFilter.cpp", "$_src/effects/SkTileImageFilter.cpp", + "$_src/effects/SkToSRGBColorFilter.cpp", "$_src/effects/SkXfermodeImageFilter.cpp", "$_src/shaders/SkPerlinNoiseShader.cpp", @@ -112,5 +113,6 @@ skia_effects_sources = [ "$_include/effects/SkTableColorFilter.h", "$_include/effects/SkTableMaskFilter.h", "$_include/effects/SkTileImageFilter.h", + "$_include/effects/SkToSRGBColorFilter.h", "$_include/effects/SkXfermodeImageFilter.h", ] diff --git a/include/effects/SkToSRGBColorFilter.h b/include/effects/SkToSRGBColorFilter.h new file mode 100644 index 0000000000..c4d51446ef --- /dev/null +++ b/include/effects/SkToSRGBColorFilter.h @@ -0,0 +1,42 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkToSRGBColorFilter_DEFINED +#define SkToSRGBColorFilter_DEFINED + +#include "SkColorFilter.h" +#include "SkRefCnt.h" + +class SkColorSpace; +class SkRasterPipeline; + +/** + * Color filter that converts from supplied color space to sRGB (both gamut and transfer function). + */ +class SK_API SkToSRGBColorFilter : public SkColorFilter { +public: + static sk_sp<SkColorFilter> Make(sk_sp<SkColorSpace> srcColorSpace); + +#if SK_SUPPORT_GPU + sk_sp<GrFragmentProcessor> asFragmentProcessor(GrContext*, SkColorSpace*) const override; +#endif + + SK_TO_STRING_OVERRIDE() + SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkToSRGBColorFilter) + +private: + void flatten(SkWriteBuffer&) const override; + SkToSRGBColorFilter(sk_sp<SkColorSpace>); + void onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, + bool shaderIsOpaque) const override; + + sk_sp<SkColorSpace> fSrcColorSpace; + + typedef SkColorFilter INHERITED; +}; + +#endif diff --git a/src/effects/SkToSRGBColorFilter.cpp b/src/effects/SkToSRGBColorFilter.cpp new file mode 100644 index 0000000000..7b6b3e6b84 --- /dev/null +++ b/src/effects/SkToSRGBColorFilter.cpp @@ -0,0 +1,59 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkToSRGBColorFilter.h" +#include "SkPM4f.h" +#include "SkColorPriv.h" +#include "SkColorSpace.h" +#include "SkColorSpace_Base.h" +#include "SkRasterPipeline.h" +#include "SkString.h" + +#if SK_SUPPORT_GPU +#include "GrContext.h" +#include "effects/GrNonlinearColorSpaceXformEffect.h" +#include "glsl/GrGLSLFragmentProcessor.h" +#include "glsl/GrGLSLFragmentShaderBuilder.h" +#endif + +void SkToSRGBColorFilter::onAppendStages(SkRasterPipeline* p, + SkColorSpace* dst, + SkArenaAlloc* scratch, + bool shaderIsOpaque) const { + // TODO +} + +sk_sp<SkColorFilter> SkToSRGBColorFilter::Make(sk_sp<SkColorSpace> srcColorSpace) { + return sk_sp<SkColorFilter>(new SkToSRGBColorFilter(std::move(srcColorSpace))); +} + +SkToSRGBColorFilter::SkToSRGBColorFilter(sk_sp<SkColorSpace> srcColorSpace) + : fSrcColorSpace(std::move(srcColorSpace)) {} + +sk_sp<SkFlattenable> SkToSRGBColorFilter::CreateProc(SkReadBuffer&) { + // TODO + return nullptr; +} + +void SkToSRGBColorFilter::flatten(SkWriteBuffer&) const { + // TODO +} + +#ifndef SK_IGNORE_TO_STRING +void SkToSRGBColorFilter::toString(SkString* str) const { + // TODO + str->append("SkToSRGBColorFilter "); +} +#endif + +#if SK_SUPPORT_GPU +sk_sp<GrFragmentProcessor> SkToSRGBColorFilter::asFragmentProcessor(GrContext*, + SkColorSpace*) const { + return GrNonlinearColorSpaceXformEffect::Make(fSrcColorSpace.get(), + SkColorSpace::MakeSRGB().get()); +} +#endif |