75bc2d36d542801091ebbdecb243382c6f5bf5fb
[platform/core/uifw/dali-toolkit.git] / plugins / dali-script-v8 / src / rendering / renderer-wrapper.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "renderer-wrapper.h"
20
21 // INTERNAL INCLUDES
22 #include <v8-utils.h>
23 #include <rendering/renderer-api.h>
24 #include <shared/api-function.h>
25 #include <shared/object-template-helper.h>
26 #include <dali-wrapper.h>
27
28 namespace Dali
29 {
30
31 namespace V8Plugin
32 {
33
34 v8::Persistent<v8::ObjectTemplate> RendererWrapper::mRendererTemplate;
35
36 namespace // un-named name space
37 {
38
39 /**
40  * Contains a list of all functions that can be called
41  */
42 const ApiFunction RendererFunctionTable[]=
43 {
44     /**************************************
45     * Renderer API (in order of Renderer.h)
46     **************************************/
47
48    { "SetGeometry"             , RendererApi::SetGeometry },
49    { "GetGeometry"             , RendererApi::GetGeometry },
50    { "SetTextures"             , RendererApi::SetTextures },
51    { "GetTextures"             , RendererApi::GetTextures },
52    { "SetBlendFunc"            , RendererApi::SetBlendFunc },
53    { "GetBlendFunc"            , RendererApi::GetBlendFunc },
54    { "SetBlendEquation"        , RendererApi::SetBlendEquation },
55    { "GetBlendEquation"        , RendererApi::GetBlendEquation },
56 };
57
58 const unsigned int RendererFunctionTableCount = sizeof(RendererFunctionTable)/sizeof(RendererFunctionTable[0]);
59 } //un-named space
60
61
62 RendererWrapper::RendererWrapper( const Dali::Renderer& renderer, GarbageCollectorInterface& gc )
63 :  HandleWrapper(  BaseWrappedObject::RENDERER , renderer, gc )
64 {
65     mRenderer = renderer;
66 }
67
68 v8::Handle<v8::Object> RendererWrapper::WrapRenderer(v8::Isolate* isolate, const Dali::Renderer& renderer )
69 {
70   v8::EscapableHandleScope handleScope( isolate );
71   v8::Local<v8::ObjectTemplate> objectTemplate;
72
73   objectTemplate = GetRendererTemplate( isolate);
74
75   // create an instance of the template
76   v8::Local<v8::Object> localObject = objectTemplate->NewInstance();
77
78   // create the Renderer wrapper
79   RendererWrapper* pointer =  new RendererWrapper( renderer, Dali::V8Plugin::DaliWrapper::Get().GetDaliGarbageCollector() );
80
81   // assign the JavaScript object to the wrapper.
82   pointer->SetJavascriptObject( isolate, localObject );
83
84   return handleScope.Escape( localObject );
85 }
86
87 v8::Local<v8::ObjectTemplate> RendererWrapper::GetRendererTemplate( v8::Isolate* isolate)
88 {
89   v8::EscapableHandleScope handleScope( isolate );
90   v8::Local<v8::ObjectTemplate> objectTemplate;
91
92   if( mRendererTemplate.IsEmpty() )
93   {
94     objectTemplate = MakeRendererTemplate( isolate );
95     mRendererTemplate.Reset( isolate, objectTemplate );
96   }
97   else
98   {
99     // get the object template
100     objectTemplate = v8::Local<v8::ObjectTemplate>::New( isolate, mRendererTemplate );
101   }
102   return handleScope.Escape( objectTemplate );
103 }
104
105 v8::Handle<v8::ObjectTemplate> RendererWrapper::MakeRendererTemplate( v8::Isolate* isolate )
106 {
107   v8::EscapableHandleScope handleScope( isolate );
108
109   v8::Local<v8::ObjectTemplate> objTemplate = v8::ObjectTemplate::New();
110
111   // property handle intercepts property getters and setters and signals
112   HandleWrapper::AddInterceptsToTemplate( isolate, objTemplate );
113
114   objTemplate->SetInternalFieldCount( BaseWrappedObject::FIELD_COUNT );
115
116   // add our function properties
117   ObjectTemplateHelper::InstallFunctions( isolate, objTemplate, RendererFunctionTable, RendererFunctionTableCount );
118
119   return handleScope.Escape( objTemplate );
120 }
121
122 void RendererWrapper::NewRenderer( const v8::FunctionCallbackInfo< v8::Value >& args)
123 {
124   v8::Isolate* isolate = args.GetIsolate();
125   v8::HandleScope handleScope( isolate);
126
127   if(!args.IsConstructCall())
128   {
129       DALI_SCRIPT_EXCEPTION( isolate, "Renderer constructor called without 'new'");
130       return;
131   }
132   Dali::Renderer renderer = RendererApi::New( args );
133
134   if(renderer)
135   {
136     v8::Local<v8::Object> localObject = WrapRenderer( isolate, renderer );
137     args.GetReturnValue().Set( localObject );
138   }
139 }
140
141
142 Renderer RendererWrapper::GetRenderer()
143 {
144   return mRenderer;
145 }
146
147
148 } // namespace V8Plugin
149
150 } // namespace Dali