OLD | NEW |
| (Empty) |
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 #include "fpdfsdk/src/javascript/color.h" | |
8 | |
9 #include <vector> | |
10 | |
11 #include "fpdfsdk/include/javascript/IJavaScript.h" | |
12 #include "fpdfsdk/src/javascript/JS_Context.h" | |
13 #include "fpdfsdk/src/javascript/JS_Define.h" | |
14 #include "fpdfsdk/src/javascript/JS_EventHandler.h" | |
15 #include "fpdfsdk/src/javascript/JS_Object.h" | |
16 #include "fpdfsdk/src/javascript/JS_Runtime.h" | |
17 #include "fpdfsdk/src/javascript/JS_Value.h" | |
18 | |
19 /* -------------------------- color -------------------------- */ | |
20 | |
21 BEGIN_JS_STATIC_CONST(CJS_Color) | |
22 END_JS_STATIC_CONST() | |
23 | |
24 BEGIN_JS_STATIC_PROP(CJS_Color) | |
25 JS_STATIC_PROP_ENTRY(black) | |
26 JS_STATIC_PROP_ENTRY(blue) | |
27 JS_STATIC_PROP_ENTRY(cyan) | |
28 JS_STATIC_PROP_ENTRY(dkGray) | |
29 JS_STATIC_PROP_ENTRY(gray) | |
30 JS_STATIC_PROP_ENTRY(green) | |
31 JS_STATIC_PROP_ENTRY(ltGray) | |
32 JS_STATIC_PROP_ENTRY(magenta) | |
33 JS_STATIC_PROP_ENTRY(red) | |
34 JS_STATIC_PROP_ENTRY(transparent) | |
35 JS_STATIC_PROP_ENTRY(white) | |
36 JS_STATIC_PROP_ENTRY(yellow) | |
37 END_JS_STATIC_PROP() | |
38 | |
39 BEGIN_JS_STATIC_METHOD(CJS_Color) | |
40 JS_STATIC_METHOD_ENTRY(convert) | |
41 JS_STATIC_METHOD_ENTRY(equal) | |
42 END_JS_STATIC_METHOD() | |
43 | |
44 IMPLEMENT_JS_CLASS(CJS_Color, color) | |
45 | |
46 color::color(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) { | |
47 m_crTransparent = CPWL_Color(COLORTYPE_TRANSPARENT); | |
48 m_crBlack = CPWL_Color(COLORTYPE_GRAY, 0); | |
49 m_crWhite = CPWL_Color(COLORTYPE_GRAY, 1); | |
50 m_crRed = CPWL_Color(COLORTYPE_RGB, 1, 0, 0); | |
51 m_crGreen = CPWL_Color(COLORTYPE_RGB, 0, 1, 0); | |
52 m_crBlue = CPWL_Color(COLORTYPE_RGB, 0, 0, 1); | |
53 m_crCyan = CPWL_Color(COLORTYPE_CMYK, 1, 0, 0, 0); | |
54 m_crMagenta = CPWL_Color(COLORTYPE_CMYK, 0, 1, 0, 0); | |
55 m_crYellow = CPWL_Color(COLORTYPE_CMYK, 0, 0, 1, 0); | |
56 m_crDKGray = CPWL_Color(COLORTYPE_GRAY, 0.25); | |
57 m_crGray = CPWL_Color(COLORTYPE_GRAY, 0.5); | |
58 m_crLTGray = CPWL_Color(COLORTYPE_GRAY, 0.75); | |
59 } | |
60 | |
61 color::~color() { | |
62 } | |
63 | |
64 void color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array) { | |
65 switch (color.nColorType) { | |
66 case COLORTYPE_TRANSPARENT: | |
67 array.SetElement(0, CJS_Value(array.GetJSRuntime(), "T")); | |
68 break; | |
69 case COLORTYPE_GRAY: | |
70 array.SetElement(0, CJS_Value(array.GetJSRuntime(), "G")); | |
71 array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); | |
72 break; | |
73 case COLORTYPE_RGB: | |
74 array.SetElement(0, CJS_Value(array.GetJSRuntime(), "RGB")); | |
75 array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); | |
76 array.SetElement(2, CJS_Value(array.GetJSRuntime(), color.fColor2)); | |
77 array.SetElement(3, CJS_Value(array.GetJSRuntime(), color.fColor3)); | |
78 break; | |
79 case COLORTYPE_CMYK: | |
80 array.SetElement(0, CJS_Value(array.GetJSRuntime(), "CMYK")); | |
81 array.SetElement(1, CJS_Value(array.GetJSRuntime(), color.fColor1)); | |
82 array.SetElement(2, CJS_Value(array.GetJSRuntime(), color.fColor2)); | |
83 array.SetElement(3, CJS_Value(array.GetJSRuntime(), color.fColor3)); | |
84 array.SetElement(4, CJS_Value(array.GetJSRuntime(), color.fColor4)); | |
85 break; | |
86 } | |
87 } | |
88 | |
89 void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color) { | |
90 int nArrayLen = array.GetLength(); | |
91 if (nArrayLen < 1) | |
92 return; | |
93 | |
94 CJS_Value value(array.GetJSRuntime()); | |
95 array.GetElement(0, value); | |
96 CFX_ByteString sSpace = value.ToCFXByteString(); | |
97 | |
98 double d1 = 0; | |
99 double d2 = 0; | |
100 double d3 = 0; | |
101 double d4 = 0; | |
102 | |
103 if (nArrayLen > 1) { | |
104 array.GetElement(1, value); | |
105 d1 = value.ToDouble(); | |
106 } | |
107 | |
108 if (nArrayLen > 2) { | |
109 array.GetElement(2, value); | |
110 d2 = value.ToDouble(); | |
111 } | |
112 | |
113 if (nArrayLen > 3) { | |
114 array.GetElement(3, value); | |
115 d3 = value.ToDouble(); | |
116 } | |
117 | |
118 if (nArrayLen > 4) { | |
119 array.GetElement(4, value); | |
120 d4 = value.ToDouble(); | |
121 } | |
122 | |
123 if (sSpace == "T") { | |
124 color = CPWL_Color(COLORTYPE_TRANSPARENT); | |
125 } else if (sSpace == "G") { | |
126 color = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1); | |
127 } else if (sSpace == "RGB") { | |
128 color = CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3); | |
129 } else if (sSpace == "CMYK") { | |
130 color = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3, | |
131 (FX_FLOAT)d4); | |
132 } | |
133 } | |
134 | |
135 #define JS_IMPLEMENT_COLORPROP(prop, var) \ | |
136 FX_BOOL color::prop(IJS_Context* cc, CJS_PropValue& vp, \ | |
137 CFX_WideString& sError) { \ | |
138 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); \ | |
139 CJS_Array array(pRuntime); \ | |
140 if (vp.IsGetting()) { \ | |
141 ConvertPWLColorToArray(var, array); \ | |
142 vp << array; \ | |
143 } else { \ | |
144 if (!vp.ConvertToArray(array)) \ | |
145 return FALSE; \ | |
146 ConvertArrayToPWLColor(array, var); \ | |
147 } \ | |
148 return TRUE; \ | |
149 } | |
150 | |
151 JS_IMPLEMENT_COLORPROP(transparent, m_crTransparent) | |
152 JS_IMPLEMENT_COLORPROP(black, m_crBlack) | |
153 JS_IMPLEMENT_COLORPROP(white, m_crWhite) | |
154 JS_IMPLEMENT_COLORPROP(red, m_crRed) | |
155 JS_IMPLEMENT_COLORPROP(green, m_crGreen) | |
156 JS_IMPLEMENT_COLORPROP(blue, m_crBlue) | |
157 JS_IMPLEMENT_COLORPROP(cyan, m_crCyan) | |
158 JS_IMPLEMENT_COLORPROP(magenta, m_crMagenta) | |
159 JS_IMPLEMENT_COLORPROP(yellow, m_crYellow) | |
160 JS_IMPLEMENT_COLORPROP(dkGray, m_crDKGray) | |
161 JS_IMPLEMENT_COLORPROP(gray, m_crGray) | |
162 JS_IMPLEMENT_COLORPROP(ltGray, m_crLTGray) | |
163 | |
164 FX_BOOL color::convert(IJS_Context* cc, | |
165 const std::vector<CJS_Value>& params, | |
166 CJS_Value& vRet, | |
167 CFX_WideString& sError) { | |
168 int iSize = params.size(); | |
169 if (iSize < 2) | |
170 return FALSE; | |
171 | |
172 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); | |
173 CJS_Array aSource(pRuntime); | |
174 if (!params[0].ConvertToArray(aSource)) | |
175 return FALSE; | |
176 | |
177 CPWL_Color crSource; | |
178 ConvertArrayToPWLColor(aSource, crSource); | |
179 | |
180 CFX_ByteString sDestSpace = params[1].ToCFXByteString(); | |
181 int nColorType = COLORTYPE_TRANSPARENT; | |
182 | |
183 if (sDestSpace == "T") { | |
184 nColorType = COLORTYPE_TRANSPARENT; | |
185 } else if (sDestSpace == "G") { | |
186 nColorType = COLORTYPE_GRAY; | |
187 } else if (sDestSpace == "RGB") { | |
188 nColorType = COLORTYPE_RGB; | |
189 } else if (sDestSpace == "CMYK") { | |
190 nColorType = COLORTYPE_CMYK; | |
191 } | |
192 | |
193 CJS_Array aDest(pRuntime); | |
194 CPWL_Color crDest = crSource; | |
195 crDest.ConvertColorType(nColorType); | |
196 ConvertPWLColorToArray(crDest, aDest); | |
197 vRet = aDest; | |
198 | |
199 return TRUE; | |
200 } | |
201 | |
202 FX_BOOL color::equal(IJS_Context* cc, | |
203 const std::vector<CJS_Value>& params, | |
204 CJS_Value& vRet, | |
205 CFX_WideString& sError) { | |
206 if (params.size() < 2) | |
207 return FALSE; | |
208 | |
209 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); | |
210 CJS_Array array1(pRuntime); | |
211 CJS_Array array2(pRuntime); | |
212 if (!params[0].ConvertToArray(array1)) | |
213 return FALSE; | |
214 if (!params[1].ConvertToArray(array2)) | |
215 return FALSE; | |
216 | |
217 CPWL_Color color1; | |
218 CPWL_Color color2; | |
219 ConvertArrayToPWLColor(array1, color1); | |
220 ConvertArrayToPWLColor(array2, color2); | |
221 color1.ConvertColorType(color2.nColorType); | |
222 vRet = color1 == color2; | |
223 return TRUE; | |
224 } | |
OLD | NEW |