12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #ifndef SkNormalSource_DEFINED
- #define SkNormalSource_DEFINED
- #include "include/core/SkFlattenable.h"
- #include "src/shaders/SkShaderBase.h"
- class SkMatrix;
- struct SkPoint3;
- #if SK_SUPPORT_GPU
- class GrFragmentProcessor;
- #endif
- /** Abstract class that generates or reads in normals for use by SkLightingShader.
- */
- class SK_API SkNormalSource : public SkFlattenable {
- public:
- virtual ~SkNormalSource() override;
- #if SK_SUPPORT_GPU
- /** Returns a fragment processor that takes no input and outputs a normal (already rotated)
- as its output color. To be used as a child fragment processor.
- */
- virtual std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const = 0;
- #endif
- class Provider {
- public:
- virtual ~Provider() {}
- /** Called for each span of the object being drawn on the CPU. Your subclass should set
- the appropriate normals that correspond to the specified device coordinates.
- */
- virtual void fillScanLine(int x, int y, SkPoint3 output[], int count) const = 0;
- };
- /** Returns an instance of 'Provider' that provides normals for the CPU pipeline. The
- necessary data will be initialized in place at 'storage'.
- */
- virtual Provider* asProvider(const SkShaderBase::ContextRec&, SkArenaAlloc*) const = 0;
- /** Returns a normal source that provides normals sourced from the the normal map argument.
- @param map a shader that outputs the normal map
- @param ctm the current canvas' total matrix, used to rotate normals when necessary.
- nullptr will be returned if 'map' is null
- The normal map is currently assumed to be an 8888 image where the normal at a texel
- is retrieved by:
- N.x = R-127;
- N.y = G-127;
- N.z = B-127;
- N.normalize();
- The +Z axis is thus encoded in RGB as (127, 127, 255) while the -Z axis is
- (127, 127, 0).
- */
- static sk_sp<SkNormalSource> MakeFromNormalMap(sk_sp<SkShader> map, const SkMatrix& ctm);
- /** Returns a normal source that provides straight-up normals only <0, 0, 1>.
- */
- static sk_sp<SkNormalSource> MakeFlat();
- static Type GetFlattenableType() { return kSkNormalSource_Type; }
- Type getFlattenableType() const override { return GetFlattenableType(); }
- static sk_sp<SkNormalSource> Deserialize(const void* data, size_t size,
- const SkDeserialProcs* procs = nullptr) {
- return sk_sp<SkNormalSource>(static_cast<SkNormalSource*>(
- SkFlattenable::Deserialize(GetFlattenableType(), data, size, procs).release()));
- }
- static void RegisterFlattenables();
- };
- #endif
|