/* * 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 SkColorSpace_New_DEFINED #define SkColorSpace_New_DEFINED #include "SkColorSpace.h" #include "SkImageInfo.h" #include "SkRefCnt.h" class SkRasterPipeline; class SkColorSpace_New final : public SkColorSpace { public: class ICCProfile; // TODO: == SkICC? struct TransferFn : public SkRefCnt { virtual ~TransferFn() = default; // TODO: one day maybe we'd like to not need this call, // instead using the more active methods below instead. virtual SkColorSpaceTransferFn parameterize() const = 0; // Append stages to use this transfer function with SkRasterPipeline-based rendering. virtual void linearizeDst(SkRasterPipeline*) const = 0; virtual void linearizeSrc(SkRasterPipeline*) const = 0; virtual void encodeSrc(SkRasterPipeline*) const = 0; // TODO: Ganesh hooks. // May return false even when this is equivalent to TransferFn, // but must always be equivalent when this returns true. (No false positives.) // Implemented by default with parameterize(). virtual bool equals(const TransferFn&) const; // TODO: ??? // Implemented by default with parameterize(). virtual void updateICCProfile(ICCProfile*) const; static sk_sp MakeLinear(); static sk_sp MakeSRGB(); static sk_sp MakeGamma(float); }; enum class Blending { Linear, AsEncoded }; SkColorSpace_New(sk_sp, SkMatrix44 toXYZD50, Blending); const SkMatrix44& toXYZD50() const { return fToXYZD50; } const SkMatrix44& fromXYZD50() const { return fFromXYZD50; } const TransferFn& transferFn() const { return *fTransferFn; } Blending blending() const { return fBlending; } // Transfer-function-related overrides. sk_sp makeLinearGamma() const override; sk_sp makeSRGBGamma() const override; SkGammaNamed onGammaNamed() const override; bool onGammaCloseToSRGB() const override; bool onGammaIsLinear() const override; bool onIsNumericalTransferFn(SkColorSpaceTransferFn*) const override; // Gamut-related overrides. const SkMatrix44* onFromXYZD50() const override { return &fFromXYZD50; } const SkMatrix44* onToXYZD50() const override { return &fToXYZD50; } uint32_t onToXYZD50Hash() const override { return fToXYZD50Hash; } private: sk_sp fTransferFn; SkMatrix44 fFromXYZD50; SkMatrix44 fToXYZD50; uint32_t fToXYZD50Hash; Blending fBlending; }; #endif//SkColorSpace_New_DEFINED