1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "bridge/declarative_frontend/jsview/js_canvas_image_data.h"
17 #include "bridge/declarative_frontend/jsview/js_rendering_context.h"
18
19 namespace OHOS::Ace::Framework {
Constructor(const JSCallbackInfo & args)20 void JSCanvasImageData::Constructor(const JSCallbackInfo& args)
21 {
22 auto jsCanvasImageData = Referenced::MakeRefPtr<JSCanvasImageData>();
23 jsCanvasImageData->IncRefCount();
24 args.SetReturnValue(Referenced::RawPtr(jsCanvasImageData));
25
26 if (args.Length() < 2) {
27 return;
28 }
29 int32_t width = 0;
30 int32_t height = 0;
31 if (args[0]->IsNumber() && args[1]->IsNumber()) {
32 JSViewAbstract::ParseJsInteger(args[0], width);
33 JSViewAbstract::ParseJsInteger(args[1], height);
34 width = PipelineBase::Vp2PxWithCurrentDensity(width);
35 height = PipelineBase::Vp2PxWithCurrentDensity(height);
36 jsCanvasImageData->width_ = width;
37 jsCanvasImageData->height_ = height;
38 }
39
40 if (args.Length() >= 3 && args[2]->IsArray()) {
41 std::vector<uint32_t> array;
42 JSViewAbstract::ParseJsIntegerArray(args[2], array);
43
44 uint32_t count = 0;
45 JSRef<JSArray> colorArray = JSRef<JSArray>::New();
46
47 int64_t tmp = static_cast<int64_t>(4) * ((int64_t)width * (int64_t)height + (int64_t)width)
48 + static_cast<int64_t>(3);
49 if ((int64_t)((int32_t)tmp) != tmp) {
50 return;
51 }
52
53 for (int32_t i = 0; i < height; ++i) {
54 for (int32_t j = 0; j < width; ++j) {
55 int32_t flag = j + width * i;
56 if (array.size() > static_cast<uint32_t>(4 * flag + 3)) {
57 colorArray->SetValueAt(count, JSRef<JSVal>::Make(ToJSValue(array[4 * flag])));
58 colorArray->SetValueAt(count + 1, JSRef<JSVal>::Make(ToJSValue(array[4 * flag + 1])));
59 colorArray->SetValueAt(count + 2, JSRef<JSVal>::Make(ToJSValue(array[4 * flag + 2])));
60 colorArray->SetValueAt(count + 3, JSRef<JSVal>::Make(ToJSValue(array[4 * flag + 3])));
61 count += 4;
62 }
63 }
64 }
65 jsCanvasImageData->colorArray_ = colorArray;
66 }
67 }
68
Destructor(JSCanvasImageData * controller)69 void JSCanvasImageData::Destructor(JSCanvasImageData* controller)
70 {
71 if (controller != nullptr) {
72 controller->DecRefCount();
73 }
74 }
75
JSBind(BindingTarget globalObj)76 void JSCanvasImageData::JSBind(BindingTarget globalObj)
77 {
78 JSClass<JSCanvasImageData>::Declare("ImageData");
79 JSClass<JSCanvasImageData>::CustomProperty("width", &JSCanvasImageData::JsGetWidth,
80 &JSCanvasImageData::JsSetWidth);
81 JSClass<JSCanvasImageData>::CustomProperty("height", &JSCanvasImageData::JsGetHeight,
82 &JSCanvasImageData::JsSetHeight);
83 JSClass<JSCanvasImageData>::CustomProperty("data", &JSCanvasImageData::JsGetData,
84 &JSCanvasImageData::JsSetData);
85 JSClass<JSCanvasImageData>::Bind(globalObj, JSCanvasImageData::Constructor, JSCanvasImageData::Destructor);
86 }
87
JsGetWidth(const JSCallbackInfo & info)88 void JSCanvasImageData::JsGetWidth(const JSCallbackInfo& info)
89 {
90 auto returnValue = JSVal(ToJSValue(width_));
91 auto returnPtr = JSRef<JSVal>::Make(returnValue);
92 info.SetReturnValue(returnPtr);
93 }
94
JsGetHeight(const JSCallbackInfo & info)95 void JSCanvasImageData::JsGetHeight(const JSCallbackInfo& info)
96 {
97 auto returnValue = JSVal(ToJSValue(height_));
98 auto returnPtr = JSRef<JSVal>::Make(returnValue);
99 info.SetReturnValue(returnPtr);
100 }
101
JsGetData(const JSCallbackInfo & info)102 void JSCanvasImageData::JsGetData(const JSCallbackInfo& info)
103 {
104 info.SetReturnValue(colorArray_);
105 }
106
JsSetWidth(const JSCallbackInfo & info)107 void JSCanvasImageData::JsSetWidth(const JSCallbackInfo& info)
108 {
109 return;
110 }
111
JsSetHeight(const JSCallbackInfo & info)112 void JSCanvasImageData::JsSetHeight(const JSCallbackInfo& info)
113 {
114 return;
115 }
116
JsSetData(const JSCallbackInfo & info)117 void JSCanvasImageData::JsSetData(const JSCallbackInfo& info)
118 {
119 return;
120 }
121 } // namespace OHOS::Ace::Framework
122