2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "resource-image-api.h"
23 #include <image/image-wrapper.h>
24 #include <image/image-attributes-wrapper.h>
25 #include <image/image-attributes-api.h>
34 ResourceImage ResourceImageApi::GetResourceImage( v8::Isolate* isolate, const v8::FunctionCallbackInfo< v8::Value >& args )
36 v8::HandleScope handleScope( isolate );
38 v8::Local<v8::Object> object = args.This();
39 v8::Local<v8::External> field = v8::Local<v8::External>::Cast( object->GetInternalField(0) );
40 void* ptr = field->Value();
42 ImageWrapper* wrapper = static_cast< ImageWrapper *>(ptr);
43 return ResourceImage::DownCast( wrapper->GetImage() );
47 * Create a new resource image object.
50 * @method ResourceImage
52 * @param {Object} options
53 * @param {String} options.url The URL of the image file to use.
54 * @param {Object} [option.imageAttributes] image attributes object
55 * @param {Integer} [options.loadPolicy] The LoadPolicy to apply when loading the image resource.
56 * @param {Integer} [options.releasePolicy] optionally release memory when image is not visible on screen.
57 * @return {Object} Image
59 Image ResourceImageApi::New( const v8::FunctionCallbackInfo< v8::Value >& args )
61 v8::Isolate* isolate = args.GetIsolate();
62 v8::HandleScope handleScope( isolate );
65 ResourceImage::LoadPolicy loadPolicy( ResourceImage::IMMEDIATE );
66 Image::ReleasePolicy releasePolicy( Image::NEVER);
67 ImageAttributes imageAttributes;
68 bool useImageAttributes = false;
70 v8::Local<v8::Value> options( args[0] );
72 if( !options->IsObject() )
74 DALI_SCRIPT_EXCEPTION( isolate, "Missing params" );
78 v8::Local<v8::Object> optionsObject = options->ToObject();
80 v8::Local<v8::Value> urlValue = optionsObject->Get( v8::String::NewFromUtf8( isolate, "url" ) );
81 if( urlValue->IsString() )
83 url = V8Utils::v8StringToStdString( urlValue );
87 DALI_SCRIPT_EXCEPTION( isolate, "Missing url");
91 v8::Local<v8::Value> imageAttribsValue= optionsObject->Get( v8::String::NewFromUtf8( isolate, "imageAttributes" ) );
92 if( imageAttribsValue->IsObject() )
94 imageAttributes = ImageAttributesApi::GetImageAttributesFromObject( isolate, imageAttribsValue->ToObject() );
99 v8::Local<v8::Value> releasePolicyValue = optionsObject->Get( v8::String::NewFromUtf8( isolate, "releasePolicy" ) );
100 if( releasePolicyValue->IsUint32() )
102 releasePolicy = static_cast<Image::ReleasePolicy>( releasePolicyValue->ToUint32()->Value() );
105 v8::Local<v8::Value> loadPolicyValue = optionsObject->Get( v8::String::NewFromUtf8( isolate, "loadPolicy" ) );
106 if( loadPolicyValue->IsUint32() )
108 loadPolicy = static_cast< ResourceImage::LoadPolicy >( loadPolicyValue->ToUint32()->Value());
111 if( useImageAttributes )
113 return ResourceImage::New( url, imageAttributes, loadPolicy, releasePolicy);
117 return ResourceImage::New( url, loadPolicy, releasePolicy);
122 * Get the load policy
124 * @method getLoadPolicy
126 * @return {Integer} load policy either dali.IMAGE_LOAD_POLICY_ON_DEMAND or dali.IMAGE_LOAD_POLICY_IMMEDIATE
128 void ResourceImageApi::GetLoadPolicy( const v8::FunctionCallbackInfo< v8::Value >& args )
130 v8::Isolate* isolate = args.GetIsolate();
131 v8::HandleScope handleScope( isolate );
133 ResourceImage image = GetResourceImage( isolate, args );
135 args.GetReturnValue().Set( v8::Integer::New( isolate, image.GetLoadPolicy() ) );
139 * Query whether the image data has loaded.
141 * The asynchronous loading begins when the Image object is created.
142 * After the Image object is discarded, the image data will be released from memory
143 * this will occur when the object is garbage collected.
144 * @method getLoadPolicy
146 * @return {Integer} loading state either dali.RESOURCE_LOADING, dali.RESOURCE_LOADING_SUCCEEDED or dali.RESOUCE_LOADING_FAILED
148 void ResourceImageApi::GetLoadingState( const v8::FunctionCallbackInfo< v8::Value >& args )
150 v8::Isolate* isolate = args.GetIsolate();
151 v8::HandleScope handleScope( isolate );
153 ResourceImage image = GetResourceImage( isolate, args );
155 args.GetReturnValue().Set( v8::Integer::New( isolate, image.GetLoadingState() ) );
159 * Return the image url
163 * @return {String} filename
165 void ResourceImageApi::GetUrl( const v8::FunctionCallbackInfo< v8::Value >& args )
167 v8::Isolate* isolate = args.GetIsolate();
168 v8::HandleScope handleScope( isolate );
170 ResourceImage image = GetResourceImage( isolate, args );
172 v8::Local<v8::String> v8String = v8::String::NewFromUtf8( isolate, image.GetUrl().c_str() );
173 args.GetReturnValue().Set( v8String );
179 * The set ImageAttributes are used when requesting the image again.
180 * @note if Image is offstage and OnDemand policy is set, reload request is ignored.
184 void ResourceImageApi::Reload( const v8::FunctionCallbackInfo< v8::Value >& args )
186 v8::Isolate* isolate = args.GetIsolate();
187 v8::HandleScope handleScope( isolate );
189 ResourceImage image = GetResourceImage( isolate, args );
195 * Return attributes for the image
196 * Only to be used after the image has finished loading.
197 * (Ticket's LoadingSucceeded callback was called)
198 * The returned value will reflect the true image dimensions once the asynchronous loading has finished.
200 * @method getAttributes
202 * @return {Object} ImageAttributes
204 void ResourceImageApi::GetAttributes( const v8::FunctionCallbackInfo< v8::Value >& args )
206 v8::Isolate* isolate = args.GetIsolate();
207 v8::HandleScope handleScope( isolate );
209 ResourceImage image = GetResourceImage( isolate, args );
211 v8::Local<v8::Object> localObject = ImageAttributesWrapper::WrapImageAttributes(isolate, image.GetAttributes());
213 args.GetReturnValue().Set( localObject );
215 } // namespace V8Plugin