Cleanup dead code in CPDF_DIBSource::LoadJpxBitmap() and friends.
[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() {
69 }
70
71 void color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array) {
72   switch (color.nColorType) {
73     case COLORTYPE_TRANSPARENT:
74       array.SetElement(0, CJS_Value(array.GetIsolate(), "T"));
75       break;
76     case COLORTYPE_GRAY:
77       array.SetElement(0, CJS_Value(array.GetIsolate(), "G"));
78       array.SetElement(1, CJS_Value(array.GetIsolate(), color.fColor1));
79       break;
80     case COLORTYPE_RGB:
81       array.SetElement(0, CJS_Value(array.GetIsolate(), "RGB"));
82       array.SetElement(1, CJS_Value(array.GetIsolate(), color.fColor1));
83       array.SetElement(2, CJS_Value(array.GetIsolate(), color.fColor2));
84       array.SetElement(3, CJS_Value(array.GetIsolate(), color.fColor3));
85       break;
86     case COLORTYPE_CMYK:
87       array.SetElement(0, CJS_Value(array.GetIsolate(), "CMYK"));
88       array.SetElement(1, CJS_Value(array.GetIsolate(), color.fColor1));
89       array.SetElement(2, CJS_Value(array.GetIsolate(), color.fColor2));
90       array.SetElement(3, CJS_Value(array.GetIsolate(), color.fColor3));
91       array.SetElement(4, CJS_Value(array.GetIsolate(), color.fColor4));
92       break;
93   }
94 }
95
96 void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color) {
97   int nArrayLen = array.GetLength();
98   if (nArrayLen < 1)
99     return;
100
101   CJS_Value value(array.GetIsolate());
102   array.GetElement(0, value);
103   CFX_ByteString sSpace = value.ToCFXByteString();
104
105   double d1 = 0;
106   double d2 = 0;
107   double d3 = 0;
108   double d4 = 0;
109
110   if (nArrayLen > 1) {
111     array.GetElement(1, value);
112     d1 = value.ToDouble();
113   }
114
115   if (nArrayLen > 2) {
116     array.GetElement(2, value);
117     d2 = value.ToDouble();
118   }
119
120   if (nArrayLen > 3) {
121     array.GetElement(3, value);
122     d3 = value.ToDouble();
123   }
124
125   if (nArrayLen > 4) {
126     array.GetElement(4, value);
127     d4 = value.ToDouble();
128   }
129
130   if (sSpace == "T") {
131     color = CPWL_Color(COLORTYPE_TRANSPARENT);
132   } else if (sSpace == "G") {
133     color = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1);
134   } else if (sSpace == "RGB") {
135     color = CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3);
136   } else if (sSpace == "CMYK") {
137     color = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3,
138                        (FX_FLOAT)d4);
139   }
140 }
141
142 #define JS_IMPLEMENT_COLORPROP(prop, var)                          \
143   FX_BOOL color::prop(IFXJS_Context* cc, CJS_PropValue& vp,        \
144                       CFX_WideString& sError) {                    \
145     CJS_Context* pContext = (CJS_Context*)cc;                      \
146     v8::Isolate* isolate = pContext->GetJSRuntime()->GetIsolate(); \
147     if (vp.IsGetting()) {                                          \
148       CJS_Array array(isolate);                                    \
149       ConvertPWLColorToArray(var, array);                          \
150       vp << array;                                                 \
151     } else {                                                       \
152       CJS_Array array(isolate);                                    \
153       if (!vp.ConvertToArray(array))                               \
154         return FALSE;                                              \
155       ConvertArrayToPWLColor(array, var);                          \
156     }                                                              \
157     return TRUE;                                                   \
158   }
159
160 JS_IMPLEMENT_COLORPROP(transparent, m_crTransparent)
161 JS_IMPLEMENT_COLORPROP(black, m_crBlack)
162 JS_IMPLEMENT_COLORPROP(white, m_crWhite)
163 JS_IMPLEMENT_COLORPROP(red, m_crRed)
164 JS_IMPLEMENT_COLORPROP(green, m_crGreen)
165 JS_IMPLEMENT_COLORPROP(blue, m_crBlue)
166 JS_IMPLEMENT_COLORPROP(cyan, m_crCyan)
167 JS_IMPLEMENT_COLORPROP(magenta, m_crMagenta)
168 JS_IMPLEMENT_COLORPROP(yellow, m_crYellow)
169 JS_IMPLEMENT_COLORPROP(dkGray, m_crDKGray)
170 JS_IMPLEMENT_COLORPROP(gray, m_crGray)
171 JS_IMPLEMENT_COLORPROP(ltGray, m_crLTGray)
172
173 FX_BOOL color::convert(IFXJS_Context* cc,
174                        const CJS_Parameters& params,
175                        CJS_Value& vRet,
176                        CFX_WideString& sError) {
177   v8::Isolate* isolate = GetIsolate(cc);
178   int iSize = params.size();
179   if (iSize < 2)
180     return FALSE;
181   CJS_Array aSource(isolate);
182   if (!params[0].ConvertToArray(aSource))
183     return FALSE;
184
185   CPWL_Color crSource;
186   ConvertArrayToPWLColor(aSource, crSource);
187
188   CFX_ByteString sDestSpace = params[1].ToCFXByteString();
189   int nColorType = COLORTYPE_TRANSPARENT;
190
191   if (sDestSpace == "T") {
192     nColorType = COLORTYPE_TRANSPARENT;
193   } else if (sDestSpace == "G") {
194     nColorType = COLORTYPE_GRAY;
195   } else if (sDestSpace == "RGB") {
196     nColorType = COLORTYPE_RGB;
197   } else if (sDestSpace == "CMYK") {
198     nColorType = COLORTYPE_CMYK;
199   }
200
201   CJS_Array aDest(isolate);
202   CPWL_Color crDest = crSource;
203   crDest.ConvertColorType(nColorType);
204   ConvertPWLColorToArray(crDest, aDest);
205   vRet = aDest;
206
207   return TRUE;
208 }
209
210 FX_BOOL color::equal(IFXJS_Context* cc,
211                      const CJS_Parameters& params,
212                      CJS_Value& vRet,
213                      CFX_WideString& sError) {
214   v8::Isolate* isolate = GetIsolate(cc);
215   if (params.size() < 2)
216     return FALSE;
217
218   CJS_Array array1(isolate), array2(isolate);
219
220   if (!params[0].ConvertToArray(array1))
221     return FALSE;
222   if (!params[1].ConvertToArray(array2))
223     return FALSE;
224
225   CPWL_Color color1;
226   CPWL_Color color2;
227
228   ConvertArrayToPWLColor(array1, color1);
229   ConvertArrayToPWLColor(array2, color2);
230
231   color1.ConvertColorType(color2.nColorType);
232
233   vRet = color1 == color2;
234   return TRUE;
235 }