• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2024 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 */
15import image from '@ohos.multimedia.image';
16import taskpool from '@ohos.taskpool';
17import { BusinessError, Callback } from '@ohos.base';
18import util from '@ohos.util';
19import Logger from './LoggerUtils';
20import { execColorInfo } from './PixelUtil';
21
22/**
23 * 根据参数由TaskPool处理pixelMap
24 * @param pixelMap 源数据
25 * @param lastAdjustData 之前的饱和度值
26 * @param currentAdjustData 将要调整到饱和度值
27 * @param taskNum 开启的线程任务数
28 * @param isParamsByTransfer 参数是否通过传递方式传参
29 * @param callback 线程处理结束后的回调
30 * @returns
31 */
32export async function pixelMapProcessByTaskPool(pixelMap: image.PixelMap, lastAdjustData: number, currentAdjustData: number, taskNum: number, isParamsByTransfer: boolean, callback?: Callback<ArrayBuffer>): Promise<void> {
33  let arrayBuffer: ArrayBuffer = await convertPixelMapToArrayBuffer(pixelMap);
34  let taskPoolGroup: taskpool.TaskGroup = new taskpool.TaskGroup();
35  for (let i: number = 0; i < taskNum; i++) {
36    let arrayBufferSlice: ArrayBuffer = arrayBuffer.slice(arrayBuffer.byteLength / taskNum * i, arrayBuffer.byteLength / taskNum * (i + 1));
37    taskPoolGroup.addTask(createImageTask(arrayBufferSlice, lastAdjustData, currentAdjustData, isParamsByTransfer));
38  }
39  let start: number = new Date().getTime();
40  taskpool.execute(taskPoolGroup).then((data: Object[]) => {
41    if (callback !== undefined) {
42      let end: number = new Date().getTime();
43      AppStorage.set<String>('timeCost', util.format('%s s', ((end - start) / 1000).toFixed(2).toString()));
44      callback(concatenateArrayBuffers(data as ArrayBuffer[]));
45    }
46  }).catch((e: BusinessError) => {
47    Logger.error(e.message);
48  })
49}
50
51async function convertPixelMapToArrayBuffer(pixelMap: image.PixelMap): Promise<ArrayBuffer> {
52  let arrayBuffer: ArrayBuffer = new ArrayBuffer(pixelMap.getPixelBytesNumber());
53  await pixelMap.readPixelsToBuffer(arrayBuffer);
54  return arrayBuffer;
55}
56
57function createImageTask(arrayBuffer: ArrayBuffer, lastAdjustData: number, currentAdjustData: number, isParamsByTransfer: boolean): taskpool.Task {
58  let task: taskpool.Task = new taskpool.Task(adjustImageValue, arrayBuffer, lastAdjustData, currentAdjustData);
59  if (!isParamsByTransfer) {
60    task.setTransferList([]);
61  }
62  return task;
63}
64
65@Concurrent
66function adjustImageValue(arrayBuffer: ArrayBuffer, lastAdjustData: number, currentAdjustData: number): ArrayBuffer {
67  return execColorInfo(arrayBuffer, lastAdjustData, currentAdjustData);
68}
69
70function concatenateArrayBuffers(arrayBuffers: ArrayBuffer[]): ArrayBuffer {
71  let totalLen: number = 0;
72  arrayBuffers.forEach((array: ArrayBuffer) => {
73    totalLen += array.byteLength;
74  })
75
76  let res: Uint8Array = new Uint8Array(totalLen);
77  let offset: number = 0;
78  arrayBuffers.forEach((arrayBuffer: ArrayBuffer) => {
79    let uint8Arr: Uint8Array = new Uint8Array(arrayBuffer);
80    res.set(uint8Arr, offset);
81    offset += arrayBuffer.byteLength;
82  })
83  return res.buffer;
84}
85