binding/v8/jsi/geometry/Envelope.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file Envelope.cpp
22 
23  \brief Utility functions to register the Envelope class into Google JavaScript V8 engine.
24  */
25 
26 // TerraLib
27 #include "../../../../geometry/Envelope.h"
28 #include "../../common/Utils.h"
29 #include "Geometry.h"
30 
31 // STL
32 #include <memory>
33 
34 ::v8::Handle<::v8::Value> Envelope_LLXGetter(::v8::Local<::v8::String> /*prop*/, const ::v8::AccessorInfo& info)
35 {
36  ::v8::HandleScope hs;
37 
38  if(info.Holder().IsEmpty())
39  return ::v8::ThrowException(::v8::String::New("Missing object in Envelope llx getter!"));
40 
41  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
42 
43  return ::v8::Number::New(e->m_llx);
44 }
45 
46 void Envelope_LLXSetter(::v8::Local<::v8::String> /*prop*/, ::v8::Local<::v8::Value> value, const ::v8::AccessorInfo& info)
47 {
48  ::v8::HandleScope hs;
49 
50  if(info.Holder().IsEmpty())
51  {
52  ::v8::ThrowException(::v8::String::New("Missing object in Envelope llx setter!"));
53  return;
54  }
55 
56  if(value.IsEmpty() || !value->IsNumber())
57  {
58  ::v8::ThrowException(::v8::String::New("Missing value or wrong type in Envelope llx setter!"));
59  return;
60  }
61 
62  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
63 
64  double llx = value->ToNumber()->Value();
65 
66  e->m_llx = llx;
67 
68  return;
69 }
70 
71 ::v8::Handle<::v8::Value> Envelope_LLYGetter(::v8::Local<::v8::String> /*prop*/, const ::v8::AccessorInfo& info)
72 {
73  ::v8::HandleScope hs;
74 
75  if(info.Holder().IsEmpty())
76  return ::v8::ThrowException(::v8::String::New("Missing object in Envelope lly getter!"));
77 
78  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
79 
80  return ::v8::Number::New(e->m_lly);
81 }
82 
83 void Envelope_LLYSetter(::v8::Local<::v8::String> /*prop*/, ::v8::Local<::v8::Value> value, const ::v8::AccessorInfo& info)
84 {
85  ::v8::HandleScope hs;
86 
87  if(info.Holder().IsEmpty())
88  {
89  ::v8::ThrowException(::v8::String::New("Missing object in Envelope lly setter!"));
90  return;
91  }
92 
93  if(value.IsEmpty() || !value->IsNumber())
94  {
95  ::v8::ThrowException(::v8::String::New("Missing value or wrong type in Envelope lly setter!"));
96  return;
97  }
98 
99  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
100 
101  double lly = value->ToNumber()->Value();
102 
103  e->m_lly = lly;
104 
105  return;
106 }
107 
108 ::v8::Handle<::v8::Value> Envelope_URXGetter(::v8::Local<::v8::String> /*prop*/, const ::v8::AccessorInfo& info)
109 {
110  ::v8::HandleScope hs;
111 
112  if(info.Holder().IsEmpty())
113  return ::v8::ThrowException(::v8::String::New("Missing object in Envelope urx getter!"));
114 
115  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
116 
117  return ::v8::Number::New(e->m_urx);
118 }
119 
120 void Envelope_URXSetter(::v8::Local<::v8::String> /*prop*/, ::v8::Local<::v8::Value> value, const ::v8::AccessorInfo& info)
121 {
122  ::v8::HandleScope hs;
123 
124  if(info.Holder().IsEmpty())
125  {
126  ::v8::ThrowException(::v8::String::New("Missing object in Envelope urx setter!"));
127  return;
128  }
129 
130  if(value.IsEmpty() || !value->IsNumber())
131  {
132  ::v8::ThrowException(::v8::String::New("Missing value or wrong type in Envelope urx setter!"));
133  return;
134  }
135 
136  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
137 
138  double urx = value->ToNumber()->Value();
139 
140  e->m_urx = urx;
141 
142  return;
143 }
144 
145 ::v8::Handle<::v8::Value> Envelope_URYGetter(::v8::Local<::v8::String> /*prop*/, const ::v8::AccessorInfo& info)
146 {
147  ::v8::HandleScope hs;
148 
149  if(info.Holder().IsEmpty())
150  return ::v8::ThrowException(::v8::String::New("Missing object in Envelope ury getter!"));
151 
152  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
153 
154  return ::v8::Number::New(e->m_ury);
155 }
156 
157 void Envelope_URYSetter(::v8::Local<::v8::String> /*prop*/, ::v8::Local<::v8::Value> value, const ::v8::AccessorInfo& info)
158 {
159  ::v8::HandleScope hs;
160 
161  if(info.Holder().IsEmpty())
162  {
163  ::v8::ThrowException(::v8::String::New("Missing object in Envelope ury setter!"));
164  return;
165  }
166 
167  if(value.IsEmpty() || !value->IsNumber())
168  {
169  ::v8::ThrowException(::v8::String::New("Missing value or wrong type in Envelope ury setter!"));
170  return;
171  }
172 
173  te::gm::Envelope* e = te::v8::common::Unwrap<te::gm::Envelope>(info.Holder());
174 
175  double ury = value->ToNumber()->Value();
176 
177  e->m_ury = ury;
178 
179  return;
180 }
181 
182 ::v8::Handle<::v8::Value> Envelope_Constructor(const ::v8::Arguments& args)
183 {
184  ::v8::HandleScope hs;
185 
186  if(!args.IsConstructCall())
187  return ::v8::ThrowException(::v8::String::New("In order to create an envelope you need call its constructor like: var e = new TeEnvelope(1.0, 1.0, 5.0, 5.0);"));
188 
189  if(args.Holder().IsEmpty())
190  return ::v8::ThrowException(::v8::String::New("Envelope constructor must use object notation!"));
191 
192  if((args.Length() != 4) || !args[0]->IsNumber() || !args[1]->IsNumber() || !args[2]->IsNumber() || !args[3]->IsNumber())
193  return ::v8::ThrowException(::v8::String::New("Missing parameter in Envelope constructor or wrong parameter type!"));
194 
195  double llx = args[0]->ToNumber()->Value();
196  double lly = args[1]->ToNumber()->Value();
197  double urx = args[2]->ToNumber()->Value();
198  double ury = args[3]->ToNumber()->Value();
199 
200  std::auto_ptr<te::gm::Envelope> e(new te::gm::Envelope(llx, lly, urx, ury));
201 
202  ::v8::Local<::v8::Object> je = te::v8::common::Make(e.get(), te::v8::jsi::GetEnvelopeTemplate, true);
203 
204  e.release();
205 
206  return hs.Close(je);
207 }
208 
209 //prototype->Set(::v8::String::NewSymbol("init"), ::v8::FunctionTemplate::New(Envelope_));
210 //prototype->Set(::v8::String::NewSymbol("getLowerLeftX"), ::v8::FunctionTemplate::New(Envelope_));
211 //prototype->Set(::v8::String::NewSymbol("getLowerLeftY"), ::v8::FunctionTemplate::New(Envelope_));
212 //prototype->Set(::v8::String::NewSymbol("getUpperRightX"), ::v8::FunctionTemplate::New(Envelope_));
213 //prototype->Set(::v8::String::NewSymbol("getUpperRightY"), ::v8::FunctionTemplate::New(Envelope_));
214 //prototype->Set(::v8::String::NewSymbol("getLowerLeft"), ::v8::FunctionTemplate::New(Envelope_));
215 //prototype->Set(::v8::String::NewSymbol("getUpperRight"), ::v8::FunctionTemplate::New(Envelope_));
216 //prototype->Set(::v8::String::NewSymbol("makeInvalid"), ::v8::FunctionTemplate::New(Envelope_));
217 //prototype->Set(::v8::String::NewSymbol("isValid"), ::v8::FunctionTemplate::New(Envelope_));
218 //prototype->Set(::v8::String::NewSymbol("getWidth"), ::v8::FunctionTemplate::New(Envelope_));
219 //prototype->Set(::v8::String::NewSymbol("getHeight"), ::v8::FunctionTemplate::New(Envelope_));
220 //prototype->Set(::v8::String::NewSymbol("getArea"), ::v8::FunctionTemplate::New(Envelope_));
221 //prototype->Set(::v8::String::NewSymbol("equals"), ::v8::FunctionTemplate::New(Envelope_));
222 //prototype->Set(::v8::String::NewSymbol("disjoint"), ::v8::FunctionTemplate::New(Envelope_));
223 //prototype->Set(::v8::String::NewSymbol("intersects"), ::v8::FunctionTemplate::New(Envelope_));
224 //prototype->Set(::v8::String::NewSymbol("touches"), ::v8::FunctionTemplate::New(Envelope_));
225 //prototype->Set(::v8::String::NewSymbol("within"), ::v8::FunctionTemplate::New(Envelope_));
226 //prototype->Set(::v8::String::NewSymbol("contains"), ::v8::FunctionTemplate::New(Envelope_));
227 //prototype->Set(::v8::String::NewSymbol("distance"), ::v8::FunctionTemplate::New(Envelope_));
228 //prototype->Set(::v8::String::NewSymbol("intersection"), ::v8::FunctionTemplate::New(Envelope_));
229 //prototype->Set(::v8::String::NewSymbol("union"), ::v8::FunctionTemplate::New(Envelope_));
230 //prototype->Set(::v8::String::NewSymbol("transform"), ::v8::FunctionTemplate::New(Envelope_));
231 
232 void te::v8::jsi::RegisterEnvelope(::v8::Local<::v8::Object>& global)
233 {
234  ::v8::HandleScope hs;
235 
236  ::v8::Local<::v8::FunctionTemplate> jsc = ::v8::FunctionTemplate::New(Envelope_Constructor);
237 
238  global->Set(::v8::String::New("TeEnvelope"), jsc->GetFunction());
239 }
240 
241 static ::v8::Persistent<::v8::FunctionTemplate> sg_envelope_template;
242 
243 ::v8::Persistent<::v8::FunctionTemplate>& te::v8::jsi::GetEnvelopeTemplate()
244 {
245  if(sg_envelope_template.IsEmpty())
246  {
247  ::v8::Local<::v8::FunctionTemplate> result = ::v8::FunctionTemplate::New();
248 
249  ::v8::Handle<::v8::ObjectTemplate> prototype = result->PrototypeTemplate();
250 
251  prototype->SetAccessor(::v8::String::NewSymbol("llx"), Envelope_LLXGetter, Envelope_LLXSetter);
252  prototype->SetAccessor(::v8::String::NewSymbol("lly"), Envelope_LLYGetter, Envelope_LLYSetter);
253  prototype->SetAccessor(::v8::String::NewSymbol("urx"), Envelope_URXGetter, Envelope_URXSetter);
254  prototype->SetAccessor(::v8::String::NewSymbol("ury"), Envelope_URYGetter, Envelope_URYSetter);
255 
256  //prototype->Set(::v8::String::NewSymbol("init"), ::v8::FunctionTemplate::New(Envelope_));
257  //prototype->Set(::v8::String::NewSymbol("getLowerLeftX"), ::v8::FunctionTemplate::New(Envelope_));
258  //prototype->Set(::v8::String::NewSymbol("getLowerLeftY"), ::v8::FunctionTemplate::New(Envelope_));
259  //prototype->Set(::v8::String::NewSymbol("getUpperRightX"), ::v8::FunctionTemplate::New(Envelope_));
260  //prototype->Set(::v8::String::NewSymbol("getUpperRightY"), ::v8::FunctionTemplate::New(Envelope_));
261  //prototype->Set(::v8::String::NewSymbol("getLowerLeft"), ::v8::FunctionTemplate::New(Envelope_));
262  //prototype->Set(::v8::String::NewSymbol("getUpperRight"), ::v8::FunctionTemplate::New(Envelope_));
263  //prototype->Set(::v8::String::NewSymbol("makeInvalid"), ::v8::FunctionTemplate::New(Envelope_));
264  //prototype->Set(::v8::String::NewSymbol("isValid"), ::v8::FunctionTemplate::New(Envelope_));
265  //prototype->Set(::v8::String::NewSymbol("getWidth"), ::v8::FunctionTemplate::New(Envelope_));
266  //prototype->Set(::v8::String::NewSymbol("getHeight"), ::v8::FunctionTemplate::New(Envelope_));
267  //prototype->Set(::v8::String::NewSymbol("getArea"), ::v8::FunctionTemplate::New(Envelope_));
268  //prototype->Set(::v8::String::NewSymbol("equals"), ::v8::FunctionTemplate::New(Envelope_));
269  //prototype->Set(::v8::String::NewSymbol("disjoint"), ::v8::FunctionTemplate::New(Envelope_));
270  //prototype->Set(::v8::String::NewSymbol("intersects"), ::v8::FunctionTemplate::New(Envelope_));
271  //prototype->Set(::v8::String::NewSymbol("touches"), ::v8::FunctionTemplate::New(Envelope_));
272  //prototype->Set(::v8::String::NewSymbol("within"), ::v8::FunctionTemplate::New(Envelope_));
273  //prototype->Set(::v8::String::NewSymbol("contains"), ::v8::FunctionTemplate::New(Envelope_));
274  //prototype->Set(::v8::String::NewSymbol("distance"), ::v8::FunctionTemplate::New(Envelope_));
275  //prototype->Set(::v8::String::NewSymbol("intersection"), ::v8::FunctionTemplate::New(Envelope_));
276  //prototype->Set(::v8::String::NewSymbol("union"), ::v8::FunctionTemplate::New(Envelope_));
277  //prototype->Set(::v8::String::NewSymbol("transform"), ::v8::FunctionTemplate::New(Envelope_));
278 
279  sg_envelope_template = ::v8::Persistent<::v8::FunctionTemplate>::New(result);
280  }
281 
282  return sg_envelope_template;
283 }
284 
::v8::Local<::v8::Object > Make(T *obj, TF tfunc, const bool isOwner)
It creates a new JavaScript object from a C++ object (obj).
double m_urx
Upper right corner x-coordinate.
::v8::Persistent<::v8::FunctionTemplate > & GetEnvelopeTemplate()
It returns a reference to the persistent template of a Envelope object.
void Envelope_URYSetter(::v8::Local<::v8::String >,::v8::Local<::v8::Value > value, const ::v8::AccessorInfo &info)
double m_llx
Lower left corner x-coordinate.
An Envelope defines a 2D rectangular region.
static::v8::Persistent<::v8::FunctionTemplate > sg_envelope_template
void Envelope_URXSetter(::v8::Local<::v8::String >,::v8::Local<::v8::Value > value, const ::v8::AccessorInfo &info)
::v8::Handle<::v8::Value > Envelope_Constructor(const ::v8::Arguments &args)
::v8::Handle<::v8::Value > Envelope_LLXGetter(::v8::Local<::v8::String >, const ::v8::AccessorInfo &info)
double m_lly
Lower left corner y-coordinate.
::v8::Handle<::v8::Value > Envelope_URXGetter(::v8::Local<::v8::String >, const ::v8::AccessorInfo &info)
double m_ury
Upper right corner y-coordinate.
::v8::Handle<::v8::Value > Envelope_URYGetter(::v8::Local<::v8::String >, const ::v8::AccessorInfo &info)
void RegisterEnvelope(::v8::Local<::v8::Object > &global)
It register the Envelope class.
void Envelope_LLXSetter(::v8::Local<::v8::String >,::v8::Local<::v8::Value > value, const ::v8::AccessorInfo &info)
::v8::Handle<::v8::Value > Envelope_LLYGetter(::v8::Local<::v8::String >, const ::v8::AccessorInfo &info)
void Envelope_LLYSetter(::v8::Local<::v8::String >,::v8::Local<::v8::Value > value, const ::v8::AccessorInfo &info)