1.ArkTs整改13 整改imageknife->util

Signed-off-by: zhoulisheng1 <zhoulisheng1@huawei.com>
This commit is contained in:
zhoulisheng1 2023-09-20 14:39:59 +08:00
parent ca0e3fe968
commit 9fedc69e8e
11 changed files with 170 additions and 112 deletions

View File

@ -17,6 +17,7 @@ import { AsyncTransform } from "../transform/AsyncTransform"
import { ColorUtils } from "./ColorUtils" import { ColorUtils } from "./ColorUtils"
import { GPUImageSketchFilter } from '@ohos/gpu_transform' import { GPUImageSketchFilter } from '@ohos/gpu_transform'
import image from '@ohos.multimedia.image' import image from '@ohos.multimedia.image'
import { Size } from '../RequestOption'
export namespace CalculatePixelUtils { export namespace CalculatePixelUtils {
export async function sketch(p: PixelMap, func?: AsyncTransform<PixelMap>) { export async function sketch(p: PixelMap, func?: AsyncTransform<PixelMap>) {
@ -26,16 +27,19 @@ export namespace CalculatePixelUtils {
height: imageInfo.size.height height: imageInfo.size.height
} }
if (!size) { if (!size) {
func.asyncTransform("sketch The image size does not exist.", null) func?.asyncTransform("sketch The image size does not exist.", null)
return; return;
} }
let pos, row, col, clr: number; let pos: number = 0
let width = size.width; let row: number = 0
let height = size.height; let col: number = 0
var pixEntry: Array<PixelEntry> = new Array() let clr: number = 0
var pixSrc: Array<number> = new Array() let width: number = size.width;
var pixNvt: Array<number> = new Array() let height: number = size.height;
let pixEntry: Array<PixelEntry> = new Array()
let pixSrc: Array<number> = new Array()
let pixNvt: Array<number> = new Array()
let bufferData = new ArrayBuffer(p.getPixelBytesNumber()); let bufferData = new ArrayBuffer(p.getPixelBytesNumber());
await p.readPixelsToBuffer(bufferData); await p.readPixelsToBuffer(bufferData);
@ -97,10 +101,32 @@ export namespace CalculatePixelUtils {
} }
} }
var gaussGray = (psrc: Array<number>, horz: number, vert: number, let gaussGray = (psrc: Array<number>, horz: number, vert: number,
width: number, height: number): number => { width: number, height: number): number => {
let dst, src, n_p, n_m, d_p, d_m, bd_p, bd_m, val_p, val_m, initial_p, initial_m: Array<number>; let dst: Array<number>;
let i, j, t, k, row, col, terms, std_dev, sp_p_idx, sp_m_idx, vp_idx, vm_idx: number; let src: Array<number>;
let n_p: Array<number>;
let n_m: Array<number>;
let d_p: Array<number>;
let d_m: Array<number>;
let bd_p: Array<number>;
let bd_m: Array<number>;
let val_p: Array<number>;
let val_m: Array<number>;
let initial_p: Array<number>;
let initial_m: Array<number>;
let i: number;
let j: number;
let t: number;
let k: number;
let row: number;
let col: number;
let terms: number;
let std_dev: number;
let sp_p_idx: number;
let sp_m_idx: number;
let vp_idx: number;
let vm_idx: number;
let row_stride = width; let row_stride = width;
let max_len = Math.max(width, height); let max_len = Math.max(width, height);
val_p = createIntArray(max_len); val_p = createIntArray(max_len);
@ -205,7 +231,7 @@ export namespace CalculatePixelUtils {
return 0; return 0;
} }
var findConstants = (n_p: Array<number>, n_m: Array<number>, d_p: Array<number>, let findConstants = (n_p: Array<number>, n_m: Array<number>, d_p: Array<number>,
d_m: Array<number>, bd_p: Array<number> d_m: Array<number>, bd_p: Array<number>
, bd_m: Array<number>, std_dev: number) => { , bd_m: Array<number>, std_dev: number) => {
let div = Math.sqrt(2 * 3.141593) * std_dev; let div = Math.sqrt(2 * 3.141593) * std_dev;
@ -217,7 +243,7 @@ export namespace CalculatePixelUtils {
let x5 = 3.735 / div; let x5 = 3.735 / div;
let x6 = -0.6803 / div; let x6 = -0.6803 / div;
let x7 = -0.2598 / div; let x7 = -0.2598 / div;
let i; let i: number;
n_p[0] = x4 + x6; n_p[0] = x4 + x6;
n_p[1] = (Math.exp(x1) n_p[1] = (Math.exp(x1)
* (x7 * Math.sin(x3) - (x6 + 2 * x4) * Math.cos(x3)) + Math * (x7 * Math.sin(x3) - (x6 + 2 * x4) * Math.cos(x3)) + Math
@ -247,7 +273,11 @@ export namespace CalculatePixelUtils {
for (i = 1; i <= 4; i++) { for (i = 1; i <= 4; i++) {
n_m[i] = n_p[i] - d_p[i] * n_p[0]; n_m[i] = n_p[i] - d_p[i] * n_p[0];
} }
let sum_n_p, sum_n_m, sum_d, a, b: number; let sum_n_p: number;
let sum_n_m: number;
let sum_d: number;
let a: number;
let b: number;
sum_n_p = 0.0; sum_n_p = 0.0;
sum_n_m = 0.0; sum_n_m = 0.0;
sum_d = 0.0; sum_d = 0.0;
@ -264,9 +294,13 @@ export namespace CalculatePixelUtils {
} }
} }
var transferGaussPixels = (src1: Array<number>, src2: Array<number>, let transferGaussPixels = (src1: Array<number>, src2: Array<number>,
dest: Array<number>, bytes: number, width: number) => { dest: Array<number>, bytes: number, width: number) => {
let i, j, k, b, sum: number; let i: number;
let j: number;
let k: number;
let b: number;
let sum: number;
let bend = bytes * width; let bend = bytes * width;
i = j = k = 0; i = j = k = 0;
for (b = 0; b < bend; b++) { for (b = 0; b < bend; b++) {
@ -281,7 +315,7 @@ export namespace CalculatePixelUtils {
export function createIntArray(len: number): Array<number> { export function createIntArray(len: number): Array<number> {
let array = new Array<number>(); let array = new Array<number>();
for (var index = 0; index < len; index++) { for (let index = 0; index < len; index++) {
array.push(0); array.push(0);
} }
return array; return array;
@ -300,8 +334,8 @@ export namespace CalculatePixelUtils {
} }
export async function sketchGpu(p: PixelMap, func?: AsyncTransform<PixelMap>) { export async function sketchGpu(p: PixelMap, func?: AsyncTransform<PixelMap>) {
let imageInfo:image.ImageInfo = await p.getImageInfo(); let imageInfo: image.ImageInfo = await p.getImageInfo();
let size = { let size:Size = {
width: imageInfo.size.width, width: imageInfo.size.width,
height: imageInfo.size.height height: imageInfo.size.height
} }
@ -319,7 +353,7 @@ export namespace CalculatePixelUtils {
filter.setImageData(bufferData, w, h); filter.setImageData(bufferData, w, h);
filter.getPixelMapBuf(0, 0, w, h).then((buf) => { filter.getPixelMapBuf(0, 0, w, h).then((buf) => {
p.writeBufferToPixels(buf); p.writeBufferToPixels(buf);
if (func!=undefined) { if (func != undefined) {
func.asyncTransform("success", p); func.asyncTransform("success", p);
} }
}) })

View File

@ -14,7 +14,7 @@
*/ */
import resourceManager from '@ohos.resourceManager'; import resourceManager from '@ohos.resourceManager';
import { ImageKnifeGlobal } from '../ImageKnifeGlobal'; import { ImageKnifeGlobal } from '../ImageKnifeGlobal';
import type {DataCallBack} from "../interface/DataCallBack" import {DataCallBack} from "../interface/DataCallBack"
export namespace ColorUtils { export namespace ColorUtils {
@ -24,11 +24,11 @@ export namespace ColorUtils {
*/ */
export function parseColor(c: string, callback: DataCallBack<string>) { export function parseColor(c: string, callback: DataCallBack<string>) {
var reColor = 'sys.color.' + c; let reColor = 'sys.color.' + c;
((ImageKnifeGlobal.getInstance().getHapContext() as Record<string,Object>).resourceManager as resourceManager.ResourceManager).getString($r(reColor) ((ImageKnifeGlobal.getInstance().getHapContext() as Record<string,Object>).resourceManager as resourceManager.ResourceManager).getString($r(reColor)
.id, (err, color) => { .id, (err, color) => {
if (!err) { if (!err) {
var cos = JSON.stringify(color); let cos = JSON.stringify(color);
callback.callback(cos) callback.callback(cos)
} else { } else {
callback.callback(err.message) callback.callback(err.message)

View File

@ -14,8 +14,8 @@
*/ */
import {LogUtil} from '../../imageknife/utils/LogUtil' import {LogUtil} from '../../imageknife/utils/LogUtil'
export class FileTypeUtil { export class FileTypeUtil {
private map = new Map(); private map:Map<string,string> = new Map<string,string>();
private READ_MIN_LENGTH; private READ_MIN_LENGTH:number = 0;
private SUPPORT_FORMATS = [ private SUPPORT_FORMATS = [
PhotoFormat.jpg, PhotoFormat.jpg,
PhotoFormat.png, PhotoFormat.png,
@ -45,11 +45,14 @@ export class FileTypeUtil {
let dataView = new DataView(arraybuffer); let dataView = new DataView(arraybuffer);
LogUtil.log('dataView +'+this.getDataViewAt(dataView,0)+this.getDataViewAt(dataView,1)) LogUtil.log('dataView +'+this.getDataViewAt(dataView,0)+this.getDataViewAt(dataView,1))
let entries: IterableIterator<Object[]> = this.map.entries();
for(var [key,value] of this.map){ for (let i = 0; i < this.map.size; i++) {
let entry:Object[] = entries.next().value;
let key = entry[0] as string
let value = entry[1] as string
let keySplit = key.split(',') let keySplit = key.split(',')
if(keySplit.length == 2){ if(keySplit.length == 2){
let offset = parseInt(keySplit[0]) let offset = Number(keySplit[0])
let magicStringLength = keySplit[1].length; let magicStringLength = keySplit[1].length;
let readLength = magicStringLength/2; let readLength = magicStringLength/2;
let start = 0; let start = 0;
@ -58,8 +61,6 @@ export class FileTypeUtil {
fileMagic+=this.getDataViewAt(dataView,offset+start) fileMagic+=this.getDataViewAt(dataView,offset+start)
start++; start++;
} }
// LogUtil.log('magic='+fileMagic+' keySplit[1]='+keySplit[1]+' fileMagic == keySplit[1] ='+(fileMagic == keySplit[1])+
// ' fileMagic type ='+typeof(fileMagic) + ' keySplit[1]='+typeof(keySplit[1]))
if(fileMagic == keySplit[1]){ if(fileMagic == keySplit[1]){
LogUtil.log('匹配到了 fileType='+value) LogUtil.log('匹配到了 fileType='+value)
fileType = value fileType = value
@ -104,9 +105,14 @@ export class FileTypeUtil {
} }
private printMapContent(){ private printMapContent(){
for(var [key,value] of this.map){
let entries: IterableIterator<Object[]> = this.map.entries();
for (let i = 0; i < this.map.size; i++) {
let entry:Object[] = entries.next().value;
let key = entry[0] as string
let value = entry[1] as string
LogUtil.log('key='+key+'---value='+value) LogUtil.log('key='+key+'---value='+value)
} }
} }
private initReadMinLength(){ private initReadMinLength(){
@ -114,7 +120,7 @@ export class FileTypeUtil {
this.map.forEach((value,key,map)=>{ this.map.forEach((value,key,map)=>{
let keySplit = key.split(','); let keySplit = key.split(',');
if(keySplit.length == 2){ if(keySplit.length == 2){
let offset = parseInt(keySplit[0]) let offset = Number(keySplit[0])
let magicStringLength = keySplit[1].length; let magicStringLength = keySplit[1].length;
let tempMax = offset + magicStringLength/2; let tempMax = offset + magicStringLength/2;
if(tempMax > max){ if(tempMax > max){

View File

@ -31,7 +31,7 @@ export class K2DArray {
if (row < 1) { if (row < 1) {
return; return;
} }
for (var i = 0; i < row; i++) { for (let i = 0; i < row; i++) {
this._2dArray.push(new Array<number>()) this._2dArray.push(new Array<number>())
} }
} }
@ -40,8 +40,8 @@ export class K2DArray {
if (c < 1) { if (c < 1) {
return; return;
} }
for (var i = 0; i < this._2dArray.length; i++) { for (let i = 0; i < this._2dArray.length; i++) {
for (var j = 0; j < c; j++) { for (let j = 0; j < c; j++) {
this._2dArray[i].push(value); this._2dArray[i].push(value);
} }
} }
@ -57,7 +57,7 @@ export class K2DArray {
/** /**
* 获取数组 * 获取数组
*/ */
public getColumnsArray(r: number): Array<number>{ public getColumnsArray(r: number): Array<number>|null{
if (r < 0 || r >= this.rows) { if (r < 0 || r >= this.rows) {
return null; return null;
} }

View File

@ -22,32 +22,32 @@ export class LogUtil {
public static ALL: number = 7 public static ALL: number = 7
public static mLogLevel:number = LogUtil.OFF; public static mLogLevel:number = LogUtil.OFF;
public static debug(message: string, ...args: any[]) { public static debug(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.DEBUG) { if (LogUtil.mLogLevel >= LogUtil.DEBUG) {
console.debug(message, args) console.debug(message, args)
} }
} }
public static info(message: string, ...args: any[]) { public static info(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.INFO) { if (LogUtil.mLogLevel >= LogUtil.INFO) {
console.info(message, args) console.info(message, args)
} }
} }
public static log(message: string, ...args: any[]) { public static log(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.LOG) { if (LogUtil.mLogLevel >= LogUtil.LOG) {
console.log(message, args) console.log(message, args)
} }
} }
public static warn(message: string, ...args: any[]) { public static warn(message: string, ...args: Object[]) {
if (LogUtil.mLogLevel >= LogUtil.WARN) { if (LogUtil.mLogLevel >= LogUtil.WARN) {
console.warn(message, args) console.warn(message, args)
} }
} }
// error 不做拦截 // error 不做拦截
public static error(message: string, ...args: any[]) { public static error(message: string, ...args: Object[]) {
if(LogUtil.mLogLevel >= LogUtil.ERROR) { if(LogUtil.mLogLevel >= LogUtil.ERROR) {
console.error(message, args) console.error(message, args)
} }

View File

@ -16,11 +16,12 @@ import {PixelEntry} from "../entry/PixelEntry"
import {AsyncTransform} from "../transform/AsyncTransform" import {AsyncTransform} from "../transform/AsyncTransform"
import {ColorUtils} from "./ColorUtils" import {ColorUtils} from "./ColorUtils"
import {CalculatePixelUtils} from "./CalculatePixelUtils" import {CalculatePixelUtils} from "./CalculatePixelUtils"
import {Size} from '../RequestOption'
export class MaskUtils { export class MaskUtils {
static async mask(bitmap: any, maskBitmap: any, func?: AsyncTransform<PixelMap>) { static async mask(bitmap: PixelMap, maskBitmap: PixelMap, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo(); let imageInfo = await bitmap.getImageInfo();
let size = { let size:Size = {
width: imageInfo.size.width, width: imageInfo.size.width,
height: imageInfo.size.height height: imageInfo.size.height
} }
@ -62,7 +63,7 @@ export class MaskUtils {
let imageInfoMask = await maskBitmap.getImageInfo(); let imageInfoMask = await maskBitmap.getImageInfo();
let sizeMask = { let sizeMask:Size = {
width: imageInfoMask.size.width, width: imageInfoMask.size.width,
height: imageInfoMask.size.height height: imageInfoMask.size.height
} }
@ -137,8 +138,8 @@ export class MaskUtils {
index++; index++;
} }
await maskBitmap.writeBufferToPixels(bufferNewData); await maskBitmap.writeBufferToPixels(bufferNewData);
if (func) { if (func != undefined) {
func("", maskBitmap); func?.asyncTransform("", maskBitmap);
} }
} }
} }

View File

@ -31,9 +31,9 @@ export class ParseImageUtil implements IParseImage<PixelMap> {
} }
let hValue = Math.round(value.size.height * scale); let hValue = Math.round(value.size.height * scale);
let wValue = Math.round(value.size.width * scale); let wValue = Math.round(value.size.width * scale);
let defaultSize = { let defaultSize:image.Size = {
'height': hValue, height: hValue,
'width': wValue width: wValue
}; };
let opts:image.DecodingOptions = { let opts:image.DecodingOptions = {

View File

@ -37,7 +37,7 @@ export namespace pixelUtils {
let targetWidth:number = size.width; let targetWidth:number = size.width;
let targetHeight:number = size.height; let targetHeight:number = size.height;
var pixEntry: Array<PixelEntry> = new Array() let pixEntry: Array<PixelEntry> = new Array()
let inPixels: Array<Array<number>> = CalculatePixelUtils.createInt2DArray(targetHeight, targetWidth); let inPixels: Array<Array<number>> = CalculatePixelUtils.createInt2DArray(targetHeight, targetWidth);
let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber()); let bufferData = new ArrayBuffer(bitmap.getPixelBytesNumber());
@ -71,13 +71,13 @@ export namespace pixelUtils {
} }
} }
var realPixel_W = pixel > targetWidth ? targetWidth : pixel; let realPixel_W = pixel > targetWidth ? targetWidth : pixel;
var realPixel_H = pixel > targetHeight ? targetHeight : pixel; let realPixel_H = pixel > targetHeight ? targetHeight : pixel;
//横排的正方形个数 //横排的正方形个数
var x_index = Math.floor(targetWidth / realPixel_W); let x_index = Math.floor(targetWidth / realPixel_W);
//纵排的正方形个数 //纵排的正方形个数
var y_index = Math.floor(targetHeight / realPixel_H); let y_index = Math.floor(targetHeight / realPixel_H);
for (let ch = 0; ch < y_index; ch++) { for (let ch = 0; ch < y_index; ch++) {
for (let cw = 0; cw < x_index; cw++) { for (let cw = 0; cw < x_index; cw++) {
@ -132,9 +132,9 @@ export namespace pixelUtils {
func?.asyncTransform("success", bitmap); func?.asyncTransform("success", bitmap);
} }
} }
export async function pixelGPU(bitmap: any, pixel: number, func?: AsyncTransform<PixelMap>) { export async function pixelGPU(bitmap: PixelMap, pixel: number, func?: AsyncTransform<PixelMap>) {
let imageInfo = await bitmap.getImageInfo(); let imageInfo:image.ImageInfo = await bitmap.getImageInfo();
let size:Size = { let size:Size = {
width: imageInfo.size.width, width: imageInfo.size.width,
height: imageInfo.size.height height: imageInfo.size.height

View File

@ -12,15 +12,17 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import image from '@ohos.multimedia.image';
export interface Dims{
width: number;
height: number;
top: number;
left: number
}
export class GIFFrame { export class GIFFrame {
// 显示帧 width 宽 height 高 top上边距 left左边距 // 显示帧 width 宽 height 高 top上边距 left左边距
dims: { dims: Dims
width: number;
height: number;
top: number;
left: number
}
// 当前帧的像素数据指向的颜色数组 只为了生成patch,非必要 // 当前帧的像素数据指向的颜色数组 只为了生成patch,非必要
colorTable?: [number, number, number][] colorTable?: [number, number, number][]
@ -35,7 +37,7 @@ export class GIFFrame {
patch?: Uint8ClampedArray patch?: Uint8ClampedArray
// drawPixelMap 如果像素转换为PixelMap后使用PixelMap展示 patch和drawPixelMap 2选1 // drawPixelMap 如果像素转换为PixelMap后使用PixelMap展示 patch和drawPixelMap 2选1
drawPixelMap? drawPixelMap?:image.PixelMap
// 当前帧每个像素的颜色表查找索引 只为了生成patch,非必要 // 当前帧每个像素的颜色表查找索引 只为了生成patch,非必要
pixels?: number[] pixels?: number[]

View File

@ -13,21 +13,33 @@
* limitations under the License. * limitations under the License.
*/ */
import type { IParseGif } from './IParseGif' import type { IParseGif } from './IParseGif'
import { GIFFrame } from './GIFFrame' import { Dims, GIFFrame } from './GIFFrame'
import { LoadType } from '../../../../../../../GifWorker' import { LoadType } from '../../../../../../../GifWorker'
import { parseBufferToFrame } from './parse/GIFParse' import { parseBufferToFrame } from './parse/GIFParse'
import { LogUtil } from '../../utils/LogUtil' import { LogUtil } from '../../utils/LogUtil'
import image from '@ohos.multimedia.image' import image from '@ohos.multimedia.image'
import { ImageKnifeGlobal } from '../../ImageKnifeGlobal' import { ImageKnifeGlobal } from '../../ImageKnifeGlobal'
import { BusinessError } from '@ohos.base' import { BusinessError } from '@ohos.base'
import worker from '@ohos.worker'; import worker, { ErrorEvent, MessageEvents } from '@ohos.worker';
export interface senderData{
type:string,
data:ArrayBuffer;
}
export interface gifBackData{
dims:Dims[],
delay:number[],
disposalType:number[],
patch:Uint8ClampedArray[],
transparentIndex:number[]
}
export class GIFParseImpl implements IParseGif { export class GIFParseImpl implements IParseGif {
parseGifs(imageinfo: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void, worker?:worker.ThreadWorker,runMainThread?:boolean) { parseGifs(imageinfo: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void, worker?:worker.ThreadWorker,runMainThread?:boolean) {
let resolveWorker = worker; let resolveWorker = worker;
LogUtil.log('parseGifs resolveWorker1 is null =' + (resolveWorker == null)) LogUtil.log('parseGifs resolveWorker1 is null =' + (resolveWorker == null))
if (!resolveWorker) { if (!resolveWorker && ImageKnifeGlobal.getInstance().getImageKnife() != undefined) {
resolveWorker = ImageKnifeGlobal.getInstance().getImageKnife().getGifWorker(); resolveWorker = ImageKnifeGlobal.getInstance().getImageKnife()?.getGifWorker();
} }
LogUtil.log('parseGifs resolveWorker2 is null =' + (resolveWorker == null)) LogUtil.log('parseGifs resolveWorker2 is null =' + (resolveWorker == null))
@ -38,18 +50,22 @@ export class GIFParseImpl implements IParseGif {
if (err) { if (err) {
callback(undefined, err) callback(undefined, err)
} else { } else {
this.createPixelMapAll(data).then((pixelmaps) => { if (data != undefined) {
if (pixelmaps.length == data.length) { this.createPixelMapAll(data).then((pixelmaps) => {
for (let i = 0;i < data.length; i++) { if (pixelmaps.length == data.length) {
let frame = data[i]; for (let i = 0;i < data.length; i++) {
frame['drawPixelMap'] = pixelmaps[i]; let frame = data[i];
frame['patch'] = null; frame['drawPixelMap'] = pixelmaps[i];
frame['patch'] = undefined;
}
callback(data, undefined)
} }
callback(data, undefined) }).catch((err: BusinessError) => {
} callback(undefined, err)
}).catch(err => { })
callback(undefined, err) }else{
}) callback(undefined, 'GIF Parse Error callback data is undefined')
}
} }
}) })
} else { } else {
@ -61,55 +77,58 @@ export class GIFParseImpl implements IParseGif {
for (let i = 0;i < frames.length; i++) { for (let i = 0;i < frames.length; i++) {
let frame = frames[i]; let frame = frames[i];
frame['drawPixelMap'] = pixelmaps[i]; frame['drawPixelMap'] = pixelmaps[i];
frame['patch'] = null; frame['patch'] = undefined;
} }
LogUtil.log('parseGifs in main thread! callback is done!') LogUtil.log('parseGifs in main thread! callback is done!')
callback(frames, undefined) callback(frames, undefined)
} }
}).catch(err => { }).catch((err:BusinessError) => {
LogUtil.log('parseGifs in main thread! err =' + err) LogUtil.log('parseGifs in main thread! err =' + err)
callback(undefined, err) callback(undefined, err)
}) })
} }
} }
private createPixelMapAll(frames): Promise<PixelMap[]> { private createPixelMapAll(frames:GIFFrame[]): Promise<PixelMap[]> {
let promises = [] let promises:Promise<PixelMap>[] = new Array();
let filterCriteria = (item) => { let filterCriteria = (item:GIFFrame) => {
if (!item['drawPixelMap']) { if (!item['drawPixelMap']) {
return true; return true;
} }
return false;
} }
frames.filter(filterCriteria, frames).flatMap((frame) => { frames.filter(filterCriteria, frames).flatMap<void,undefined>((frame:GIFFrame) => {
promises.push(image.createPixelMap(frame.patch.buffer, { if(frame.patch != undefined) {
'size': { promises.push(image.createPixelMap(frame.patch.buffer, {
'height': frame.dims.height as number, 'size': {
'width': frame.dims.width as number 'height': frame.dims.height as number,
} 'width': frame.dims.width as number
})) }
}))
}
}) })
return Promise.all(promises) return Promise.all<PixelMap>(promises)
} }
private useWorkerParse(worker: any, buffer: ArrayBuffer, callback: (data?, err?) => void) { private useWorkerParse(worker:worker.ThreadWorker, buffer: ArrayBuffer, callback: (data?:GIFFrame[], err?:BusinessError|string) => void) {
worker.onerror = function (data) { worker.onerror = (err:ErrorEvent)=>{
callback(undefined, data) callback(undefined, err)
} }
worker.onmessageerror = function (event) { worker.onmessageerror = (event: MessageEvents) => {
callback(undefined, event) callback(undefined, event)
} }
worker.onexit = function () { worker.onexit = ()=> {
LogUtil.log('gifWork worker.onexit!') LogUtil.log('gifWork worker.onexit!')
} }
worker.onmessage = (e) => { worker.onmessage = (e: MessageEvents) => {
var data = e.data; let data:Record<string,Object> = e.data;
switch (data.type) { switch (data.type as string) {
case LoadType.loadBufferByWorker: case LoadType.loadBufferByWorker:
let pages = data.data; let pages:gifBackData = (data.data as gifBackData);
if (this.gifDecodeCorrect(pages)) { if (this.gifDecodeCorrect(pages)) {
let images = this.recDecodedData(pages); let images = this.recDecodedData(pages);
callback(images, undefined) callback(images, undefined)
@ -122,12 +141,12 @@ export class GIFParseImpl implements IParseGif {
} }
} }
var obj = { type: LoadType.loadBufferByWorker, data: buffer } let obj:senderData = { type: LoadType.loadBufferByWorker, data: buffer }
worker.postMessage(obj, [buffer]) worker.postMessage(obj, [buffer])
} }
private gifDecodeCorrect(frames) { private gifDecodeCorrect(frames:gifBackData) {
if ( if (
(frames.patch.length == frames.dims.length) && (frames.patch.length == frames.dims.length) &&
(frames.patch.length == frames.delay.length) && (frames.patch.length == frames.delay.length) &&
@ -141,24 +160,19 @@ export class GIFParseImpl implements IParseGif {
} }
// 子线程数据回传处理 // 子线程数据回传处理
private recDecodedData(pages): GIFFrame[] { private recDecodedData(pages:gifBackData): GIFFrame[] {
let images = [] let images:GIFFrame[] = new Array()
for (let i = 0; i < pages.patch.length; i++) { for (let i = 0; i < pages.patch.length; i++) {
let frame = {} let frame = new GIFFrame();
frame['dims'] = pages.dims[i] frame['dims'] = pages.dims[i]
pages.dims[i] = null
frame['delay'] = pages.delay[i] frame['delay'] = pages.delay[i]
pages.delay[i] = null
frame['disposalType'] = pages.disposalType[i] frame['disposalType'] = pages.disposalType[i]
pages.disposalType[i] = null
let uint8ClampedArray = new Uint8ClampedArray(pages.patch[i]) let uint8ClampedArray = new Uint8ClampedArray(pages.patch[i])
frame['patch'] = uint8ClampedArray frame['patch'] = uint8ClampedArray
pages.patch[i] = null pages[i] = new Uint8ClampedArray(0)
frame['transparentIndex'] = pages.transparentIndex[i] frame['transparentIndex'] = pages.transparentIndex[i]
pages.transparentIndex[i] = null
images.push(frame) images.push(frame)
} }
pages = null
return images; return images;
} }
} }

View File

@ -12,7 +12,8 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
import {Size} from '../../RequestOption'
export interface IParseSvg { export interface IParseSvg {
// 解析svg // 解析svg
parseSvg(imageinfo: ArrayBuffer,size?:{width:number,height:number}): Promise<PixelMap> parseSvg:(imageinfo: ArrayBuffer,size?:Size)=> Promise<PixelMap>
} }