1 // Copyright 2014 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_PAGEINT_H_ 8 #define CORE_FPDFAPI_PAGE_PAGEINT_H_ 9 10 #include <memory> 11 #include <vector> 12 13 #include "core/fpdfapi/page/cpdf_colorspace.h" 14 #include "core/fpdfapi/page/cpdf_countedobject.h" 15 16 class CPDF_ExpIntFunc; 17 class CPDF_Pattern; 18 class CPDF_SampledFunc; 19 class CPDF_StitchFunc; 20 class CPDF_StreamAcc; 21 22 class CPDF_Function { 23 public: 24 enum class Type { 25 kTypeInvalid = -1, 26 kType0Sampled = 0, 27 kType2ExpotentialInterpolation = 2, 28 kType3Stitching = 3, 29 kType4PostScript = 4, 30 }; 31 32 static std::unique_ptr<CPDF_Function> Load(CPDF_Object* pFuncObj); 33 static Type IntegerToFunctionType(int iType); 34 35 virtual ~CPDF_Function(); 36 bool Call(FX_FLOAT* inputs, 37 uint32_t ninputs, 38 FX_FLOAT* results, 39 int& nresults) const; CountInputs()40 uint32_t CountInputs() const { return m_nInputs; } CountOutputs()41 uint32_t CountOutputs() const { return m_nOutputs; } GetDomain(int i)42 FX_FLOAT GetDomain(int i) const { return m_pDomains[i]; } GetRange(int i)43 FX_FLOAT GetRange(int i) const { return m_pRanges[i]; } 44 45 const CPDF_SampledFunc* ToSampledFunc() const; 46 const CPDF_ExpIntFunc* ToExpIntFunc() const; 47 const CPDF_StitchFunc* ToStitchFunc() const; 48 49 protected: 50 explicit CPDF_Function(Type type); 51 52 bool Init(CPDF_Object* pObj); 53 virtual bool v_Init(CPDF_Object* pObj) = 0; 54 virtual bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0; 55 56 uint32_t m_nInputs; 57 uint32_t m_nOutputs; 58 FX_FLOAT* m_pDomains; 59 FX_FLOAT* m_pRanges; 60 const Type m_Type; 61 }; 62 63 class CPDF_ExpIntFunc : public CPDF_Function { 64 public: 65 CPDF_ExpIntFunc(); 66 ~CPDF_ExpIntFunc() override; 67 68 // CPDF_Function 69 bool v_Init(CPDF_Object* pObj) override; 70 bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 71 72 uint32_t m_nOrigOutputs; 73 FX_FLOAT m_Exponent; 74 FX_FLOAT* m_pBeginValues; 75 FX_FLOAT* m_pEndValues; 76 }; 77 78 class CPDF_SampledFunc : public CPDF_Function { 79 public: 80 struct SampleEncodeInfo { 81 FX_FLOAT encode_max; 82 FX_FLOAT encode_min; 83 uint32_t sizes; 84 }; 85 86 struct SampleDecodeInfo { 87 FX_FLOAT decode_max; 88 FX_FLOAT decode_min; 89 }; 90 91 CPDF_SampledFunc(); 92 ~CPDF_SampledFunc() override; 93 94 // CPDF_Function 95 bool v_Init(CPDF_Object* pObj) override; 96 bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 97 GetEncodeInfo()98 const std::vector<SampleEncodeInfo>& GetEncodeInfo() const { 99 return m_EncodeInfo; 100 } GetBitsPerSample()101 uint32_t GetBitsPerSample() const { return m_nBitsPerSample; } GetSampleStream()102 const CPDF_StreamAcc* GetSampleStream() const { 103 return m_pSampleStream.get(); 104 } 105 106 private: 107 std::vector<SampleEncodeInfo> m_EncodeInfo; 108 std::vector<SampleDecodeInfo> m_DecodeInfo; 109 uint32_t m_nBitsPerSample; 110 uint32_t m_SampleMax; 111 std::unique_ptr<CPDF_StreamAcc> m_pSampleStream; 112 }; 113 114 class CPDF_StitchFunc : public CPDF_Function { 115 public: 116 CPDF_StitchFunc(); 117 ~CPDF_StitchFunc() override; 118 119 // CPDF_Function 120 bool v_Init(CPDF_Object* pObj) override; 121 bool v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const override; 122 GetSubFunctions()123 const std::vector<std::unique_ptr<CPDF_Function>>& GetSubFunctions() const { 124 return m_pSubFunctions; 125 } GetBound(size_t i)126 FX_FLOAT GetBound(size_t i) const { return m_pBounds[i]; } 127 128 private: 129 std::vector<std::unique_ptr<CPDF_Function>> m_pSubFunctions; 130 FX_FLOAT* m_pBounds; 131 FX_FLOAT* m_pEncode; 132 133 static const uint32_t kRequiredNumInputs = 1; 134 }; 135 136 class CPDF_IccProfile { 137 public: 138 CPDF_IccProfile(const uint8_t* pData, uint32_t dwSize); 139 ~CPDF_IccProfile(); GetComponents()140 uint32_t GetComponents() const { return m_nSrcComponents; } 141 bool m_bsRGB; 142 void* m_pTransform; 143 144 private: 145 uint32_t m_nSrcComponents; 146 }; 147 148 class CPDF_DeviceCS : public CPDF_ColorSpace { 149 public: 150 CPDF_DeviceCS(CPDF_Document* pDoc, int family); 151 152 bool GetRGB(FX_FLOAT* pBuf, 153 FX_FLOAT& R, 154 FX_FLOAT& G, 155 FX_FLOAT& B) const override; 156 bool SetRGB(FX_FLOAT* pBuf, 157 FX_FLOAT R, 158 FX_FLOAT G, 159 FX_FLOAT B) const override; 160 bool v_GetCMYK(FX_FLOAT* pBuf, 161 FX_FLOAT& c, 162 FX_FLOAT& m, 163 FX_FLOAT& y, 164 FX_FLOAT& k) const override; 165 bool v_SetCMYK(FX_FLOAT* pBuf, 166 FX_FLOAT c, 167 FX_FLOAT m, 168 FX_FLOAT y, 169 FX_FLOAT k) const override; 170 void TranslateImageLine(uint8_t* pDestBuf, 171 const uint8_t* pSrcBuf, 172 int pixels, 173 int image_width, 174 int image_height, 175 bool bTransMask = false) const override; 176 }; 177 178 class CPDF_PatternCS : public CPDF_ColorSpace { 179 public: 180 explicit CPDF_PatternCS(CPDF_Document* pDoc); 181 ~CPDF_PatternCS() override; 182 bool v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) override; 183 bool GetRGB(FX_FLOAT* pBuf, 184 FX_FLOAT& R, 185 FX_FLOAT& G, 186 FX_FLOAT& B) const override; 187 CPDF_ColorSpace* GetBaseCS() const override; 188 189 private: 190 CPDF_ColorSpace* m_pBaseCS; 191 CPDF_CountedColorSpace* m_pCountedBaseCS; 192 }; 193 194 #define MAX_PATTERN_COLORCOMPS 16 195 struct PatternValue { 196 CPDF_Pattern* m_pPattern; 197 CPDF_CountedPattern* m_pCountedPattern; 198 int m_nComps; 199 FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS]; 200 }; 201 202 CFX_ByteStringC PDF_FindKeyAbbreviationForTesting(const CFX_ByteStringC& abbr); 203 CFX_ByteStringC PDF_FindValueAbbreviationForTesting( 204 const CFX_ByteStringC& abbr); 205 206 #endif // CORE_FPDFAPI_PAGE_PAGEINT_H_ 207