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