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