1// Copyright 2017 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef CORE_FPDFAPI_PAGE_CPDF_FUNCTION_H_
8#define CORE_FPDFAPI_PAGE_CPDF_FUNCTION_H_
9
10#include <memory>
11
12class CPDF_ExpIntFunc;
13class CPDF_Object;
14class CPDF_SampledFunc;
15class CPDF_StitchFunc;
16
17class CPDF_Function {
18 public:
19  enum class Type {
20    kTypeInvalid = -1,
21    kType0Sampled = 0,
22    kType2ExpotentialInterpolation = 2,
23    kType3Stitching = 3,
24    kType4PostScript = 4,
25  };
26
27  static std::unique_ptr<CPDF_Function> Load(CPDF_Object* pFuncObj);
28  static Type IntegerToFunctionType(int iType);
29
30  virtual ~CPDF_Function();
31
32  bool Call(float* inputs,
33            uint32_t ninputs,
34            float* results,
35            int* nresults) const;
36  uint32_t CountInputs() const { return m_nInputs; }
37  uint32_t CountOutputs() const { return m_nOutputs; }
38  float GetDomain(int i) const { return m_pDomains[i]; }
39  float GetRange(int i) const { return m_pRanges[i]; }
40  float Interpolate(float x,
41                    float xmin,
42                    float xmax,
43                    float ymin,
44                    float ymax) const;
45
46  const CPDF_SampledFunc* ToSampledFunc() const;
47  const CPDF_ExpIntFunc* ToExpIntFunc() const;
48  const CPDF_StitchFunc* ToStitchFunc() const;
49
50 protected:
51  explicit CPDF_Function(Type type);
52
53  bool Init(CPDF_Object* pObj);
54  virtual bool v_Init(CPDF_Object* pObj) = 0;
55  virtual bool v_Call(float* inputs, float* results) const = 0;
56
57  uint32_t m_nInputs;
58  uint32_t m_nOutputs;
59  float* m_pDomains;
60  float* m_pRanges;
61  const Type m_Type;
62};
63
64#endif  // CORE_FPDFAPI_PAGE_CPDF_FUNCTION_H_
65