/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_FactoryFunctions_DEFINED #define skgpu_graphite_FactoryFunctions_DEFINED #include "include/core/SkBlendMode.h" #include "include/core/SkRefCnt.h" #include "include/core/SkSpan.h" #include "include/effects/SkRuntimeEffect.h" namespace skgpu::graphite { class PrecompileBase; class PrecompileBlender; class PrecompileColorFilter; class PrecompileImageFilter; class PrecompileMaskFilter; class PrecompileShader; // All of these factory functions will be moved elsewhere once the pre-compile API becomes public //-------------------------------------------------------------------------------------------------- // This will move to be beside SkShaders in include/core/SkShader.h class PrecompileShaders { public: //TODO: Add Empty? - see skbug.com/12165 static sk_sp Color(); static sk_sp Blend(SkSpan> blenders, SkSpan> dsts, SkSpan> srcs); static sk_sp Blend(SkSpan blendModes, SkSpan> dsts, SkSpan> srcs); // TODO: add an SkShaders::Image to match this and SkImageFilters (skbug.com/13440) static sk_sp Image(); // TODO: make SkGradientShader match this convention (skbug.com/13438) static sk_sp LinearGradient(); static sk_sp RadialGradient(); static sk_sp TwoPointConicalGradient(); static sk_sp SweepGradient(); // TODO: hide these? The issue here is that, in the main Skia API, these are only accessed // via makeWithLocalMatrix and makeWithColorFilter. However, in the combination API, clients // may want to create a set of these (i.e., pass SkSpans to the factory functions vs // just single options). static sk_sp LocalMatrix(sk_sp wrapped); static sk_sp ColorFilter(sk_sp, sk_sp); private: PrecompileShaders() = delete; }; //-------------------------------------------------------------------------------------------------- // Initially this will go next to SkMaskFilter in include/core/SkMaskFilter.h but the // SkMaskFilter::MakeBlur factory should be split out or removed. This namespace will follow // where ever that factory goes. class PrecompileMaskFilters { public: // TODO: change SkMaskFilter::MakeBlur to match this and SkImageFilters::Blur (skbug.com/13441) static sk_sp Blur(); private: PrecompileMaskFilters() = delete; }; //-------------------------------------------------------------------------------------------------- // This will move to be beside SkColorFilters in include/core/SkColorFilter.h class PrecompileColorFilters { public: // This encompasses both variants of SkColorFilters::Blend static sk_sp Blend(); // This encompasses both variants of SkColorFilters::Matrix static sk_sp Matrix(); // This encompasses both variants of SkColorFilters::HSLAMatrix static sk_sp HSLAMatrix(); // TODO: Compose, LinearToSRGBGamma/SRGBToLinearGamma, Lerp, Table(ARGB), Lighting private: PrecompileColorFilters() = delete; }; //-------------------------------------------------------------------------------------------------- // This will move to be beside SkImageFilters in include/effects/SkImageFilters.h class PrecompileImageFilters { public: static sk_sp Blur(); static sk_sp Image(); // TODO: AlphaThreshold, Arithmetic, Blend (2 kinds), ColorFilter, Compose, DisplacementMap, // DropShadow, DropShadowOnly, Magnifier, MatrixConvolution, MatrixTransform, Merge, Offset, // Picture, Runtime, Shader, Tile, Dilate, Erode, DistantLitDiffuse, PointLitDiffuse, // SpotLitDiffuse, DistantLitSpecular, PointLitSpecular, SpotLitSpecular private: PrecompileImageFilters() = delete; }; //-------------------------------------------------------------------------------------------------- // Object that allows passing a SkPrecompileShader, SkPrecompileColorFilter or // SkPrecompileBlender as a child // // This will moved to be on SkRuntimeEffect class PrecompileChildPtr { public: PrecompileChildPtr() = default; PrecompileChildPtr(sk_sp); PrecompileChildPtr(sk_sp); PrecompileChildPtr(sk_sp); // Asserts that the SkPrecompileBase is either null, or one of the legal derived types PrecompileChildPtr(sk_sp); std::optional type() const; PrecompileShader* shader() const; PrecompileColorFilter* colorFilter() const; PrecompileBlender* blender() const; PrecompileBase* base() const { return fChild.get(); } private: sk_sp fChild; }; using PrecompileChildOptions = SkSpan; // TODO: the precompile RuntimeEffects are handling their child options different from the // rest of the precompile system! // These will move to be on SkRuntimeEffect to parallel makeShader, makeColorFilter and // makeBlender sk_sp MakePrecompileShader( sk_sp effect, SkSpan childOptions = {}); sk_sp MakePrecompileColorFilter( sk_sp effect, SkSpan childOptions = {}); sk_sp MakePrecompileBlender( sk_sp effect, SkSpan childOptions = {}); } // namespace skgpu::graphite #endif // skgpu_graphite_FactoryFunctions_DEFINED