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.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
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"
17 static v8::Isolate* GetIsolate(IFXJS_Context* cc) {
18 CJS_Context* pContext = (CJS_Context*)cc;
19 ASSERT(pContext != NULL);
21 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
22 ASSERT(pRuntime != NULL);
24 return pRuntime->GetIsolate();
26 /* -------------------------- color -------------------------- */
28 BEGIN_JS_STATIC_CONST(CJS_Color)
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)
46 BEGIN_JS_STATIC_METHOD(CJS_Color)
47 JS_STATIC_METHOD_ENTRY(convert)
48 JS_STATIC_METHOD_ENTRY(equal)
49 END_JS_STATIC_METHOD()
51 IMPLEMENT_JS_CLASS(CJS_Color, color)
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);
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"));
77 array.SetElement(0, CJS_Value(array.GetIsolate(), "G"));
78 array.SetElement(1, CJS_Value(array.GetIsolate(), color.fColor1));
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));
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));
96 void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color) {
97 int nArrayLen = array.GetLength();
101 CJS_Value value(array.GetIsolate());
102 array.GetElement(0, value);
103 CFX_ByteString sSpace = value.ToCFXByteString();
111 array.GetElement(1, value);
112 d1 = value.ToDouble();
116 array.GetElement(2, value);
117 d2 = value.ToDouble();
121 array.GetElement(3, value);
122 d3 = value.ToDouble();
126 array.GetElement(4, value);
127 d4 = value.ToDouble();
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,
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); \
152 CJS_Array array(isolate); \
153 if (!vp.ConvertToArray(array)) \
155 ConvertArrayToPWLColor(array, var); \
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)
173 FX_BOOL color::convert(IFXJS_Context* cc,
174 const CJS_Parameters& params,
176 CFX_WideString& sError) {
177 v8::Isolate* isolate = GetIsolate(cc);
178 int iSize = params.size();
181 CJS_Array aSource(isolate);
182 if (!params[0].ConvertToArray(aSource))
186 ConvertArrayToPWLColor(aSource, crSource);
188 CFX_ByteString sDestSpace = params[1].ToCFXByteString();
189 int nColorType = COLORTYPE_TRANSPARENT;
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;
201 CJS_Array aDest(isolate);
202 CPWL_Color crDest = crSource;
203 crDest.ConvertColorType(nColorType);
204 ConvertPWLColorToArray(crDest, aDest);
210 FX_BOOL color::equal(IFXJS_Context* cc,
211 const CJS_Parameters& params,
213 CFX_WideString& sError) {
214 v8::Isolate* isolate = GetIsolate(cc);
215 if (params.size() < 2)
218 CJS_Array array1(isolate), array2(isolate);
220 if (!params[0].ConvertToArray(array1))
222 if (!params[1].ConvertToArray(array2))
228 ConvertArrayToPWLColor(array1, color1);
229 ConvertArrayToPWLColor(array2, color2);
231 color1.ConvertColorType(color2.nColorType);
233 vRet = color1 == color2;