forked from floraachy/ImageKnife
!26 1.适配DevEco Studio: 3.1Release(3.1.3.400) 2.包管理工具由npm切换为ohpm 3.pako、md5和js-binary-schema-parser使用源码引入
Merge pull request !26 from zhoulisheng1/master
This commit is contained in:
commit
d319910f11
|
@ -0,0 +1,2 @@
|
||||||
|
imageknife/src/main/ets/components/3rd_party/**/*
|
||||||
|
hvigor/hvigor-wrapper.js
|
13
CHANGELOG.md
13
CHANGELOG.md
|
@ -1,4 +1,17 @@
|
||||||
|
## 2.0.0
|
||||||
|
- 包管理工具由npm切换为ohpm
|
||||||
|
- 适配DevEco Studio: 3.1Release(3.1.3.400)
|
||||||
|
- 适配SDK: API9 Release(3.2.11.5)
|
||||||
|
- 新增开发者可对图片缓存进行全局配置能力
|
||||||
|
- 新增对OpenHarmony图库的Uri数据加载的能力(需要申请图库访问权限和文件读取权限,动态申请图库访问权限)
|
||||||
|
- 修复若干问题:
|
||||||
|
|
||||||
|
1.ImageKnifeOption的loadSrc为undefined,导致的crash问题
|
||||||
|
|
||||||
|
2.ImageKnifeComponent直接绘制GIF图片格式第几帧的时候,无法绘制问题。
|
||||||
|
|
||||||
## 1.0.6
|
## 1.0.6
|
||||||
|
|
||||||
- 适配DevEco Studio 3.1Beta1及以上版本。
|
- 适配DevEco Studio 3.1Beta1及以上版本。
|
||||||
|
|
||||||
- 适配OpenHarmony SDK API version 9及以上版本。
|
- 适配OpenHarmony SDK API version 9及以上版本。
|
||||||
|
|
25
OAT.xml
25
OAT.xml
|
@ -3,23 +3,24 @@
|
||||||
<oatconfig>
|
<oatconfig>
|
||||||
<filefilterlist>
|
<filefilterlist>
|
||||||
<filefilter name="copyrightPolicyFilter" desc="Filters for compatibility,license header policies">
|
<filefilter name="copyrightPolicyFilter" desc="Filters for compatibility,license header policies">
|
||||||
<filteritem type="filename" name="hvigorfile.js" desc="hvigor构建脚本,DevEco Studio自动生成,不手动修改"/>
|
<filteritem type="filename" name="hvigorfile.*" desc="hvigor配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
<filteritem type="filename" name="*.json5" desc="hvigor配置文件,DevEco Studio自动生成,不手动修改"/>
|
<filteritem type="filename" name="*.json5" desc="hvigor配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
<filteritem type="filepath" name="imageknife/src/main/ets/components/imageknife/pngj/UPNG.js" desc="使用开源库UPNG,使用其默认版权头,无需修改"/>
|
|
||||||
<filteritem type="filepath" name="imageknife/src/main/ets/components/imageknife/utils/gif/parse/lzw.js" desc="使用开源库gifuct-js,使用其默认版权头,无需修改"/>
|
|
||||||
<filteritem type="filename" name="LICENSE" desc="版权文件,不添加版权头"/>
|
<filteritem type="filename" name="LICENSE" desc="版权文件,不添加版权头"/>
|
||||||
<filteritem type="filename" name="NOTICE" desc="NOTICE文件,不添加版权头"/>
|
<filteritem type="filename" name="NOTICE" desc="NOTICE文件,不添加版权头"/>
|
||||||
|
<filteritem type="filename" name="hvigorw" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
|
<filteritem type="filename" name="hvigorw.bat" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
|
<filteritem type="filename" name="hvigor-wrapper.js" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
|
<filteritem type="filepath" name="imageknife/src/main/ets/components/3rd_party/.*" desc="第三方开源软件源码,不修改版权头,以防有修改版权风险"/>
|
||||||
</filefilter>
|
</filefilter>
|
||||||
<filefilter name="defaultPolicyFilter" desc="Filters for compatibility,license header policies">
|
<filefilter name="defaultPolicyFilter" desc="Filters for compatibility,license header policies">
|
||||||
<filteritem type="filename" name="hvigorfile.js" desc="hvigor构建脚本,DevEco Studio自动生成,不手动修改"/>
|
<filteritem type="filename" name="hvigorfile.*" desc="hvigor配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
<filteritem type="filename" name="*.json5" desc="hvigor配置文件,DevEco Studio自动生成,不手动修改"/>
|
<filteritem type="filename" name="*.json5" desc="hvigor等配置文件,DevEco Studio自动生成,且不支持注释"/>
|
||||||
<filteritem type="filepath" name="imageknife/src/main/ets/components/imageknife/pngj/UPNG.js" desc="使用开源库UPNG,使用其默认版权头,无需修改"/>
|
|
||||||
<filteritem type="filepath" name="imageknife/src/main/ets/components/imageknife/utils/gif/parse/lzw.js" desc="使用开源库gifuct-js,使用其默认版权头,无需修改"/>
|
|
||||||
<filteritem type="filename" name="LICENSE" desc="版权文件,不添加版权头"/>
|
<filteritem type="filename" name="LICENSE" desc="版权文件,不添加版权头"/>
|
||||||
<filteritem type="filename" name="NOTICE" desc="NOTICE文件,不添加版权头"/>
|
<filteritem type="filename" name="NOTICE" desc="NOTICE文件,不添加版权头"/>
|
||||||
</filefilter>
|
<filteritem type="filename" name="hvigorw" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
<filefilter name="defaultPolicyFilter" desc="Filters for copyright header policies">
|
<filteritem type="filename" name="hvigorw.bat" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
|
<filteritem type="filename" name="hvigor-wrapper.js" desc="hvigorw配置文件,DevEco Studio自动生成,不手动修改"/>
|
||||||
|
<filteritem type="filepath" name="imageknife/src/main/ets/components/3rd_party/.*" desc="第三方开源软件源码,不修改版权头,以防有修改版权风险"/>
|
||||||
</filefilter>
|
</filefilter>
|
||||||
<filefilter name="binaryFileTypePolicyFilter" desc="Filters for binary file policies">
|
<filefilter name="binaryFileTypePolicyFilter" desc="Filters for binary file policies">
|
||||||
<filteritem type="filename" name="*.dpg" desc="dpg图片格式文件,用于展示示例"/>
|
<filteritem type="filename" name="*.dpg" desc="dpg图片格式文件,用于展示示例"/>
|
||||||
|
@ -30,6 +31,10 @@
|
||||||
<filteritem type="filename" name="*.gif" desc="gif图片格式文件,用于展示示例"/>
|
<filteritem type="filename" name="*.gif" desc="gif图片格式文件,用于展示示例"/>
|
||||||
<filteritem type="filename" name="*.jpg" desc="jpg图片格式文件,用于展示示例"/>
|
<filteritem type="filename" name="*.jpg" desc="jpg图片格式文件,用于展示示例"/>
|
||||||
<filteritem type="filename" name="*.jpeg" desc="jpeg图片格式文件,用于展示示例"/>
|
<filteritem type="filename" name="*.jpeg" desc="jpeg图片格式文件,用于展示示例"/>
|
||||||
|
<filteritem type="filename" name="*.json5" desc="hvigor配置文件"/>
|
||||||
|
</filefilter>
|
||||||
|
<filefilter name="defaultFilter" desc="Files not to check">
|
||||||
|
<filteritem type="filepath" name="imageknife/src/main/ets/components/3rd_party/.*" desc="第三方开源软件源码,不修改版权头,以防有修改版权风险"/>
|
||||||
</filefilter>
|
</filefilter>
|
||||||
</filefilterlist>
|
</filefilterlist>
|
||||||
</oatconfig>
|
</oatconfig>
|
||||||
|
|
|
@ -57,6 +57,33 @@
|
||||||
"Owner" : " Yalantis",
|
"Owner" : " Yalantis",
|
||||||
"Upstream URL": "https://github.com/Yalantis/uCrop",
|
"Upstream URL": "https://github.com/Yalantis/uCrop",
|
||||||
"Description": " Image Cropping Library "
|
"Description": " Image Cropping Library "
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "js-spark-md5",
|
||||||
|
"License": "MIT",
|
||||||
|
"License File": "https://github.com/satazor/js-spark-md5/blob/master/LICENSE",
|
||||||
|
"Version Number": "v3.0.2",
|
||||||
|
"Owner" : "satazor",
|
||||||
|
"Upstream URL": "https://github.com/satazor/js-spark-md5",
|
||||||
|
"Description": "Lightning fast normal and incremental md5 for javascript"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "gifuct-js",
|
||||||
|
"License": "MIT",
|
||||||
|
"License File": "https://github.com/matt-way/gifuct-js/blob/master/LICENSE",
|
||||||
|
"Version Number": "1.0.0",
|
||||||
|
"Owner" : "matt-way",
|
||||||
|
"Upstream URL": "https://github.com/matt-way/gifuct-js",
|
||||||
|
"Description": "Fastest javascript .GIF decoder/parser"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "jsBinarySchemaParser",
|
||||||
|
"License": "MIT",
|
||||||
|
"License File": "https://github.com/matt-way/jsBinarySchemaParser/blob/master/LICENSE",
|
||||||
|
"Version Number": "v1.0.1",
|
||||||
|
"Owner" : "matt-way",
|
||||||
|
"Upstream URL": "https://github.com/matt-way/jsBinarySchemaParser",
|
||||||
|
"Description": "Parse binary files in javascript using clean schema objects"
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
11
README.md
11
README.md
|
@ -18,11 +18,9 @@
|
||||||
## 下载安装
|
## 下载安装
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
npm install @ohos/imageknife --save
|
ohpm install @ohos/imageknife
|
||||||
```
|
```
|
||||||
|
|
||||||
OpenHarmony npm环境配置等更多内容,参考安装教程 [如何安装OpenHarmony npm包](https://gitee.com/openharmony-tpc/docs/blob/master/OpenHarmony_npm_usage.md)。
|
|
||||||
|
|
||||||
## 使用说明
|
## 使用说明
|
||||||
|
|
||||||
1.在AbilityStage.ts中,初始化全局ImageKnife实例。
|
1.在AbilityStage.ts中,初始化全局ImageKnife实例。
|
||||||
|
@ -439,10 +437,11 @@ request.skipMemoryCache(true)
|
||||||
|
|
||||||
<img src="screenshot/gif4.gif" width="50%"/>
|
<img src="screenshot/gif4.gif" width="50%"/>
|
||||||
|
|
||||||
## 兼容性
|
## 约束与限制
|
||||||
|
|
||||||
- [DevEco Studio版本](https://developer.harmonyos.com/cn/develop/deveco-studio#download):DevEco Studio 3.1Beta1及以上版本。
|
在下述版本验证通过:
|
||||||
- OpenHarmony SDK版本:API version 9及以上版本。
|
|
||||||
|
DevEco Studio: 3.1Release(3.1.3.400), SDK: API9 Release(3.2.11.5)
|
||||||
|
|
||||||
## 目录结构
|
## 目录结构
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,6 @@
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"devDependencies": {},
|
"devDependencies": {},
|
||||||
"name": "entry",
|
"name": "entry",
|
||||||
"ohos": {
|
|
||||||
"org": "huawei",
|
|
||||||
"directoryLevel": "module",
|
|
||||||
"buildTool": "hvigor"
|
|
||||||
},
|
|
||||||
"description": "example description",
|
"description": "example description",
|
||||||
"repository": {},
|
"repository": {},
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
|
@ -141,7 +141,7 @@ struct TestImageKnifeOptionChangedPage {
|
||||||
Button('svg')
|
Button('svg')
|
||||||
.onClick(()=>{
|
.onClick(()=>{
|
||||||
this.imageKnifeOption1 = {
|
this.imageKnifeOption1 = {
|
||||||
loadSrc: 'http://design-svc.fat.lunz.cn/StaticFiles/BP9999999772/BV9999999422/SA9999998420/30df266a-485e-411e-b178-b9fb1d8e0748.svg',
|
loadSrc: 'http://124.222.187.78/download/test.svg',
|
||||||
|
|
||||||
placeholderSrc: $r('app.media.icon_loading'),
|
placeholderSrc: $r('app.media.icon_loading'),
|
||||||
errorholderSrc: $r('app.media.icon_failed')
|
errorholderSrc: $r('app.media.icon_failed')
|
||||||
|
|
|
@ -142,6 +142,7 @@ struct TestImageKnifeOptionChangedPage4 {
|
||||||
if(index<30){
|
if(index<30){
|
||||||
index++
|
index++
|
||||||
let nextFunc = this.drawMainAnimate.bind(this,index, context, scaleType, imagePixelMap, widthPixel, heightPixel, compWidth, compHeight)
|
let nextFunc = this.drawMainAnimate.bind(this,index, context, scaleType, imagePixelMap, widthPixel, heightPixel, compWidth, compHeight)
|
||||||
|
// @ts-ignore
|
||||||
this.mTimerId = setTimeout(nextFunc, 1000/30.0)
|
this.mTimerId = setTimeout(nextFunc, 1000/30.0)
|
||||||
}else{
|
}else{
|
||||||
// 不做处理
|
// 不做处理
|
||||||
|
@ -225,6 +226,7 @@ struct TestImageKnifeOptionChangedPage4 {
|
||||||
console.log('imageinfo width =' + imageInfo.size.width + ' height=' + imageInfo.size.height + 'scaleType=' + scaleType)
|
console.log('imageinfo width =' + imageInfo.size.width + ' height=' + imageInfo.size.height + 'scaleType=' + scaleType)
|
||||||
|
|
||||||
let func = this.drawMainAnimate.bind(this,0, context, scaleType, data.drawPixelMap.imagePixelMap, imageInfo.size.width, imageInfo.size.height, compWidth, compHeight)
|
let func = this.drawMainAnimate.bind(this,0, context, scaleType, data.drawPixelMap.imagePixelMap, imageInfo.size.width, imageInfo.size.height, compWidth, compHeight)
|
||||||
|
// @ts-ignore
|
||||||
this.mTimerId = setTimeout(func, 1000/30.0)
|
this.mTimerId = setTimeout(func, 1000/30.0)
|
||||||
|
|
||||||
console.log('TestImageKnifeOptionChangedPage4 drawMainSource end!')
|
console.log('TestImageKnifeOptionChangedPage4 drawMainSource end!')
|
||||||
|
|
|
@ -258,7 +258,7 @@ struct TestPreloadPage {
|
||||||
Button('预加载网络资源svg')
|
Button('预加载网络资源svg')
|
||||||
.onClick(() => {
|
.onClick(() => {
|
||||||
let request = new RequestOption();
|
let request = new RequestOption();
|
||||||
request.load('http://design-svc.fat.lunz.cn/StaticFiles/BP9999999772/BV9999999422/SA9999998420/4dc8463e-8ac6-4eb4-862c-783bf486a242.svg')
|
request.load('http://124.222.187.78/download/test.svg')
|
||||||
.setImageViewSize({ width: 300, height: 300 })
|
.setImageViewSize({ width: 300, height: 300 })
|
||||||
.addListener((err, data) => {
|
.addListener((err, data) => {
|
||||||
if (err && err.length > 0) {
|
if (err && err.length > 0) {
|
||||||
|
@ -276,7 +276,7 @@ struct TestPreloadPage {
|
||||||
Button('网络资源svg')
|
Button('网络资源svg')
|
||||||
.onClick(() => {
|
.onClick(() => {
|
||||||
this.imageKnifeOption = {
|
this.imageKnifeOption = {
|
||||||
loadSrc: 'http://design-svc.fat.lunz.cn/StaticFiles/BP9999999772/BV9999999422/SA9999998420/4dc8463e-8ac6-4eb4-862c-783bf486a242.svg',
|
loadSrc: 'http://124.222.187.78/download/test.svg',
|
||||||
|
|
||||||
placeholderSrc: $r('app.media.icon_loading'),
|
placeholderSrc: $r('app.media.icon_loading'),
|
||||||
errorholderSrc: $r('app.media.icon_failed'),
|
errorholderSrc: $r('app.media.icon_failed'),
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import AbilityStage from "@ohos.application.AbilityStage"
|
|
||||||
|
|
||||||
export default class TestAbilityStage extends AbilityStage {
|
|
||||||
onCreate() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import Ability from '@ohos.application.Ability'
|
|
||||||
import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
|
|
||||||
import { Hypium } from 'hypium/index'
|
|
||||||
import testsuite from '../test/List.test'
|
|
||||||
|
|
||||||
export default class TestAbility extends Ability {
|
|
||||||
onCreate(want, launchParam) {
|
|
||||||
|
|
||||||
var abilityDelegator: any
|
|
||||||
abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
|
|
||||||
var abilityDelegatorArguments: any
|
|
||||||
abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
|
|
||||||
|
|
||||||
Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
|
|
||||||
}
|
|
||||||
|
|
||||||
onDestroy() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onWindowStageCreate(windowStage) {
|
|
||||||
|
|
||||||
windowStage.setUIContent(this.context, 'TestAbility/pages/index', null)
|
|
||||||
|
|
||||||
globalThis.abilityContext = this.context;
|
|
||||||
}
|
|
||||||
|
|
||||||
onWindowStageDestroy() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onForeground() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onBackground() {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
|
@ -12,14 +12,37 @@
|
||||||
* 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 { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from 'hypium/index'
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
|
||||||
|
|
||||||
export default function abilityTest() {
|
export default function abilityTest() {
|
||||||
describe('ActsAbilityTest', function () {
|
describe('ActsAbilityTest', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
it('assertContain',0, function () {
|
it('assertContain',0, function () {
|
||||||
console.info("it begin")
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'it begin');
|
||||||
let a = 'abc'
|
let a = 'abc'
|
||||||
let b = 'b'
|
let b = 'b'
|
||||||
|
// Defines a variety of assertion methods, which are used to declare expected boolean conditions.
|
||||||
expect(a).assertContain(b)
|
expect(a).assertContain(b)
|
||||||
expect(a).assertEqual(a)
|
expect(a).assertEqual(a)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
|
@ -13,7 +13,15 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import abilityTest from './Ability.test'
|
import abilityTest from './Ability.test'
|
||||||
|
import lruCacheTest from './lrucache'
|
||||||
|
import LogUtilTest from './logutil'
|
||||||
|
import Transform from './transfrom'
|
||||||
|
import RequestOptionTest from './requestoption'
|
||||||
|
|
||||||
export default function testsuite() {
|
export default function testsuite() {
|
||||||
abilityTest()
|
abilityTest()
|
||||||
|
lruCacheTest()
|
||||||
|
LogUtilTest()
|
||||||
|
Transform()
|
||||||
|
RequestOptionTest()
|
||||||
}
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
import {ImageKnife,ImageKnifeDrawFactory} from '@ohos/imageknife'
|
||||||
|
|
||||||
|
export default function LogUtilTest() {
|
||||||
|
describe('LogUtilTest', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
it('TestGlobalImageKnife',0, function () {
|
||||||
|
expect(globalThis.ImageKnife).assertEqual(undefined)
|
||||||
|
globalThis.ImageKnife = ImageKnife.with(getContext())
|
||||||
|
expect((globalThis.ImageKnife == undefined)).assertFalse()
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
it('TestGlobalDefaultLifeCycle',1, function () {
|
||||||
|
globalThis.ImageKnife = ImageKnife.with(getContext())
|
||||||
|
globalThis.ImageKnife.setDefaultLifeCycle(ImageKnifeDrawFactory.createProgressLifeCycle("#10a5ff", 0.5))
|
||||||
|
let globalLifeCycle = globalThis.ImageKnife.getDefaultLifeCycle();
|
||||||
|
expect(globalLifeCycle == undefined).assertFalse();
|
||||||
|
})
|
||||||
|
|
||||||
|
it('TestGlobalCacheKey',2, function () {
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
import {LogUtil} from '@ohos/imageknife'
|
||||||
|
|
||||||
|
export default function LogUtilTest() {
|
||||||
|
describe('LogUtilTest', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
it('TestLogUtilLevel',0, function () {
|
||||||
|
|
||||||
|
console.log("tag:LogUtil LogUtil.mLogLevel="+LogUtil.mLogLevel);
|
||||||
|
LogUtil.mLogLevel = LogUtil.OFF;
|
||||||
|
expect(LogUtil.mLogLevel).assertEqual(LogUtil.OFF);
|
||||||
|
|
||||||
|
LogUtil.debug("你好! 第一条消息看不到!")
|
||||||
|
LogUtil.mLogLevel = LogUtil.DEBUG;
|
||||||
|
expect(LogUtil.mLogLevel).assertEqual(LogUtil.DEBUG)
|
||||||
|
LogUtil.debug("你好! 第二条消息可以查看!")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
import {LruCache} from '@ohos/imageknife' // DiskLruCache用例由DiskLruCache三方库提供
|
||||||
|
|
||||||
|
export default function lruCacheTest() {
|
||||||
|
describe('lruCacheTest', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
it('testLruCacheSize',0, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(100);
|
||||||
|
expect(memoryCache.size).assertEqual(0);
|
||||||
|
expect(memoryCache.maxsize).assertEqual(100)
|
||||||
|
})
|
||||||
|
it('testLruCachePut',1, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(5);
|
||||||
|
memoryCache.put("1","1");
|
||||||
|
memoryCache.put("2","2");
|
||||||
|
memoryCache.put("3","3");
|
||||||
|
memoryCache.put("4","4");
|
||||||
|
memoryCache.put("5","5");
|
||||||
|
memoryCache.put("6","6");
|
||||||
|
|
||||||
|
expect(memoryCache.maxsize).assertEqual(5)
|
||||||
|
let result = memoryCache.get("1")
|
||||||
|
expect(result).assertEqual(undefined)
|
||||||
|
})
|
||||||
|
it('testLruCacheGet',2, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(5);
|
||||||
|
memoryCache.put("1","1");
|
||||||
|
memoryCache.put("2","2");
|
||||||
|
memoryCache.put("3","3");
|
||||||
|
memoryCache.put("4","4");
|
||||||
|
memoryCache.put("5","5");
|
||||||
|
memoryCache.put("6","6");
|
||||||
|
|
||||||
|
expect(memoryCache.maxsize).assertEqual(5)
|
||||||
|
let result = memoryCache.get("2")
|
||||||
|
expect(result).assertEqual("2")
|
||||||
|
})
|
||||||
|
it('testLruCacheAlgorithm',3, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(5);
|
||||||
|
memoryCache.put("1","1");
|
||||||
|
memoryCache.put("2","2");
|
||||||
|
memoryCache.put("3","3");
|
||||||
|
memoryCache.put("4","4");
|
||||||
|
memoryCache.put("5","5");
|
||||||
|
|
||||||
|
memoryCache.get("1");
|
||||||
|
memoryCache.get("2");
|
||||||
|
|
||||||
|
memoryCache.foreachLruCache(function (value, key, index) {
|
||||||
|
if(index == 0){
|
||||||
|
expect(key).assertEqual("2")
|
||||||
|
expect(value).assertEqual("2")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it('testLruCacheRemove',4, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(5);
|
||||||
|
memoryCache.put("1","1");
|
||||||
|
memoryCache.put("2","2");
|
||||||
|
memoryCache.put("3","3");
|
||||||
|
memoryCache.put("4","4");
|
||||||
|
memoryCache.put("5","5");
|
||||||
|
|
||||||
|
memoryCache.get("1");
|
||||||
|
memoryCache.get("2");
|
||||||
|
|
||||||
|
memoryCache.remove("2");
|
||||||
|
|
||||||
|
memoryCache.foreachLruCache(function (value, key, index) {
|
||||||
|
if(index == 0){
|
||||||
|
expect(key).assertEqual("1")
|
||||||
|
expect(value).assertEqual("1")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
it('testLruCacheResize',5, function () {
|
||||||
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
|
let memoryCache = new LruCache<string, any>(5);
|
||||||
|
memoryCache.put("1","1");
|
||||||
|
memoryCache.put("2","2");
|
||||||
|
memoryCache.put("3","3");
|
||||||
|
memoryCache.put("4","4");
|
||||||
|
memoryCache.put("5","5");
|
||||||
|
|
||||||
|
memoryCache.resize(4);
|
||||||
|
|
||||||
|
let result1 = memoryCache.get("1");
|
||||||
|
expect(result1).assertEqual(undefined);
|
||||||
|
let result2 = memoryCache.get("2");
|
||||||
|
expect(result2).assertEqual("2");
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
import {RequestOption} from '@ohos/imageknife'
|
||||||
|
|
||||||
|
export default function RequestOptionTest() {
|
||||||
|
describe('RequestOptionTest', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
it('TestRequestOption',0, function () {
|
||||||
|
let option = new RequestOption();
|
||||||
|
expect(option.requestListeners.length == 0).assertTrue()
|
||||||
|
})
|
||||||
|
it('TestConfigLoadSrc',1, function () {
|
||||||
|
let option = new RequestOption();
|
||||||
|
expect(option.loadSrc).assertEqual(undefined)
|
||||||
|
option.loadSrc = $r('app.media.icon')
|
||||||
|
expect(JSON.stringify(option.loadSrc)).assertEqual(JSON.stringify($r('app.media.icon')))
|
||||||
|
})
|
||||||
|
it('TestConfigViewSize',2, function () {
|
||||||
|
let option = new RequestOption();
|
||||||
|
option.loadSrc = $r('app.media.icon')
|
||||||
|
option.setImageViewSize({width:100,height:100})
|
||||||
|
expect(JSON.stringify(option.size)).assertEqual(JSON.stringify({width:100,height:100}))
|
||||||
|
})
|
||||||
|
it('TestNormalConfigInfo',3, function () {
|
||||||
|
let option = new RequestOption();
|
||||||
|
expect(option.strategy.getName()).assertEqual('AUTOMATIC')
|
||||||
|
|
||||||
|
expect(option.dontAnimateFlag).assertFail()
|
||||||
|
|
||||||
|
expect(option.onlyRetrieveFromCache).assertFail()
|
||||||
|
|
||||||
|
expect(option.isCacheable).assertTrue()
|
||||||
|
|
||||||
|
expect(option.gpuEnabled).assertFail()
|
||||||
|
expect(option.loadMainReady).assertFail()
|
||||||
|
expect(option.loadErrorReady).assertFail()
|
||||||
|
expect(option.loadRetryReady).assertFail()
|
||||||
|
expect(option.loadThumbnailReady).assertFail()
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
|
||||||
|
import {
|
||||||
|
BlurTransformation,
|
||||||
|
BrightnessFilterTransformation,
|
||||||
|
ContrastFilterTransformation,
|
||||||
|
CropCircleTransformation,
|
||||||
|
CropCircleWithBorderTransformation,
|
||||||
|
CropSquareTransformation,
|
||||||
|
CropTransformation,
|
||||||
|
CropType,
|
||||||
|
GrayscaleTransformation,
|
||||||
|
InvertFilterTransformation,
|
||||||
|
PixelationFilterTransformation,
|
||||||
|
RotateImageTransformation,
|
||||||
|
RoundedCornersTransformation,
|
||||||
|
SepiaFilterTransformation,
|
||||||
|
SketchFilterTransformation,
|
||||||
|
MaskTransformation,
|
||||||
|
SwirlFilterTransformation,
|
||||||
|
KuwaharaFilterTransform,
|
||||||
|
ToonFilterTransform,
|
||||||
|
VignetteFilterTransform,
|
||||||
|
|
||||||
|
} from '@ohos/imageknife'
|
||||||
|
|
||||||
|
export default function Transform() {
|
||||||
|
describe('Transform', function () {
|
||||||
|
// Defines a test suite. Two parameters are supported: test suite name and test suite function.
|
||||||
|
beforeAll(function () {
|
||||||
|
// Presets an action, which is performed only once before all test cases of the test suite start.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
beforeEach(function () {
|
||||||
|
// Presets an action, which is performed before each unit test case starts.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: preset action function.
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
// Presets a clear action, which is performed after each unit test case ends.
|
||||||
|
// The number of execution times is the same as the number of test cases defined by **it**.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
afterAll(function () {
|
||||||
|
// Presets a clear action, which is performed after all test cases of the test suite end.
|
||||||
|
// This API supports only one parameter: clear action function.
|
||||||
|
})
|
||||||
|
it('TestBlurTransformation', 0, function () {
|
||||||
|
let blur = new BlurTransformation(15);
|
||||||
|
expect(blur.getName()).assertEqual('BlurTransformation _mRadius:15')
|
||||||
|
})
|
||||||
|
it('TestBrightnessFilterTransformation', 1, function () {
|
||||||
|
let bright = new BrightnessFilterTransformation(20);
|
||||||
|
expect(bright.getName()).assertEqual("BrightnessFilterTransformation:20")
|
||||||
|
})
|
||||||
|
it('TestContrastFilterTransformation', 2, function () {
|
||||||
|
let constrast = new ContrastFilterTransformation(30);
|
||||||
|
expect(constrast.getName()).assertEqual("ContrastFilterTransformation:30")
|
||||||
|
})
|
||||||
|
it('TestCropCircleTransformation', 3, function () {
|
||||||
|
let cropCircle = new CropCircleTransformation();
|
||||||
|
expect(cropCircle.getName()).assertContain("CropCircleTransformation")
|
||||||
|
expect(cropCircle.getName()).assertContain(";mCenterX:")
|
||||||
|
expect(cropCircle.getName()).assertContain(";mCenterY:")
|
||||||
|
expect(cropCircle.getName()).assertContain(";mRadius:")
|
||||||
|
})
|
||||||
|
it('TestCropCircleWithBorderTransformation', 4, function () {
|
||||||
|
let CropCircleWithBorder = new CropCircleWithBorderTransformation(10,{r_color:100,g_color:100,b_color:100 });
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain("CropCircleTransformation")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mCenterX:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mCenterY:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mRadius:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mBorderSize:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mRColor:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mGColor:")
|
||||||
|
expect(CropCircleWithBorder.getName()).assertContain(";mBColor:")
|
||||||
|
})
|
||||||
|
it('TestCropSquareTransformation', 5, function () {
|
||||||
|
let CropSquare = new CropSquareTransformation();
|
||||||
|
expect(CropSquare.getName()).assertContain("CropSquareTransformation")
|
||||||
|
})
|
||||||
|
it('TestCropTransformation', 6, function () {
|
||||||
|
let crop = new CropTransformation(10,10,CropType.CENTER);
|
||||||
|
expect(crop.getName()).assertContain("CropCircleTransformation"+ ";mWidth:10" + ";mHeight:10" + ";mCropType:1" )
|
||||||
|
})
|
||||||
|
it('TestGrayscaleTransformation', 7, function () {
|
||||||
|
let grayscale = new GrayscaleTransformation();
|
||||||
|
expect(grayscale.getName()).assertContain("GrayscaleTransformation" )
|
||||||
|
})
|
||||||
|
it('TestInvertFilterTransformation', 8, function () {
|
||||||
|
let invert = new InvertFilterTransformation();
|
||||||
|
expect(invert.getName()).assertContain("InvertFilterTransformation" )
|
||||||
|
})
|
||||||
|
it('TestPixelationFilterTransformation', 9, function () {
|
||||||
|
let pixelation = new PixelationFilterTransformation();
|
||||||
|
expect(pixelation.getName()).assertContain("PixelationFilterTransformation" )
|
||||||
|
})
|
||||||
|
it('TestRotateImageTransformation', 10, function () {
|
||||||
|
let rotateImage = new RotateImageTransformation(180);
|
||||||
|
expect(rotateImage.getName()).assertContain("RotateImageTransformation" + ";degreesToRotate:180")
|
||||||
|
})
|
||||||
|
it('TestRoundedCornersTransformation', 11, function () {
|
||||||
|
let roundConer = new RoundedCornersTransformation({top_left:5,bottom_left:5,top_right:5,bottom_right:5});
|
||||||
|
expect(roundConer.getName()).assertContain("RoundedCornersTransformation" + ";mTop_left:" + 5
|
||||||
|
+ ";mTop_right:" + 5
|
||||||
|
+ ";mBottom_left:" + 5
|
||||||
|
+ ";mBottom_right:" + 5)
|
||||||
|
})
|
||||||
|
it('TestRoundedCornersTransformation', 12, function () {
|
||||||
|
let speia = new SepiaFilterTransformation();
|
||||||
|
expect(speia.getName()).assertContain("SepiaFilterTransformation")
|
||||||
|
})
|
||||||
|
it('TestSepiaFilterTransformation', 13, function () {
|
||||||
|
let speia = new SepiaFilterTransformation();
|
||||||
|
expect(speia.getName()).assertContain("SepiaFilterTransformation")
|
||||||
|
})
|
||||||
|
it('TestSketchFilterTransformation', 13, function () {
|
||||||
|
let Sketch = new SketchFilterTransformation();
|
||||||
|
expect(Sketch.getName()).assertContain("SketchFilterTransformation")
|
||||||
|
})
|
||||||
|
it('TestMaskTransformation', 14, function () {
|
||||||
|
let mask = new MaskTransformation($r('app.media.icon'));
|
||||||
|
expect(mask.getName()).assertContain("MaskTransformation")
|
||||||
|
})
|
||||||
|
it('TestSwirlFilterTransformation', 15, function () {
|
||||||
|
let swirl = new SwirlFilterTransformation(10,180,[10,10]);
|
||||||
|
expect(swirl.getName()).assertContain("SwirlFilterTransformation")
|
||||||
|
})
|
||||||
|
it('TestKuwaharaFilterTransform', 16, function () {
|
||||||
|
let kuwahara = new KuwaharaFilterTransform(10);
|
||||||
|
expect(kuwahara.getName()).assertContain("KuwaharaFilterTransform _mRadius:10")
|
||||||
|
})
|
||||||
|
it('TestToonFilterTransform', 17, function () {
|
||||||
|
let toon = new ToonFilterTransform(10);
|
||||||
|
expect(toon.getName()).assertContain("ToonFilterTransform threshold:")
|
||||||
|
expect(toon.getName()).assertContain(";quantizationLevels:")
|
||||||
|
})
|
||||||
|
it('TestKuwaharaFilterTransform', 18, function () {
|
||||||
|
let vignette = new VignetteFilterTransform([0.5, 0.5],[0.0, 0.0, 0.0],[0.3, 0.75]);
|
||||||
|
expect(vignette.getName()).assertContain("VignetteFilterTransform centerPoint:")
|
||||||
|
expect(vignette.getName()).assertContain(";vignetteColor:")
|
||||||
|
expect(vignette.getName()).assertContain(";vignetteSpace:")
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
import UIAbility from '@ohos.app.ability.UIAbility';
|
||||||
|
import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
|
||||||
|
import hilog from '@ohos.hilog';
|
||||||
|
import { Hypium } from '@ohos/hypium';
|
||||||
|
import testsuite from '../test/List.test';
|
||||||
|
import window from '@ohos.window';
|
||||||
|
|
||||||
|
export default class TestAbility extends UIAbility {
|
||||||
|
onCreate(want, launchParam) {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate');
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? '');
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:'+ JSON.stringify(launchParam) ?? '');
|
||||||
|
var abilityDelegator: any
|
||||||
|
abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
|
||||||
|
var abilityDelegatorArguments: any
|
||||||
|
abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!');
|
||||||
|
Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite)
|
||||||
|
}
|
||||||
|
|
||||||
|
onDestroy() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy');
|
||||||
|
}
|
||||||
|
|
||||||
|
onWindowStageCreate(windowStage: window.WindowStage) {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate');
|
||||||
|
windowStage.loadContent('testability/pages/Index', (err, data) => {
|
||||||
|
if (err.code) {
|
||||||
|
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s',
|
||||||
|
JSON.stringify(data) ?? '');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onWindowStageDestroy() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy');
|
||||||
|
}
|
||||||
|
|
||||||
|
onForeground() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground');
|
||||||
|
}
|
||||||
|
|
||||||
|
onBackground() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground');
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
|
@ -12,14 +12,16 @@
|
||||||
* 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 router from '@ohos.router';
|
import hilog from '@ohos.hilog';
|
||||||
|
|
||||||
@Entry
|
@Entry
|
||||||
@Component
|
@Component
|
||||||
struct Index {
|
struct Index {
|
||||||
|
|
||||||
aboutToAppear() {
|
aboutToAppear() {
|
||||||
console.info('TestAbility index aboutToAppear')
|
hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility index aboutToAppear');
|
||||||
}
|
}
|
||||||
|
|
||||||
@State message: string = 'Hello World'
|
@State message: string = 'Hello World'
|
||||||
build() {
|
build() {
|
||||||
Row() {
|
Row() {
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
|
@ -12,32 +12,19 @@
|
||||||
* 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 TestRunner from '@ohos.application.testRunner'
|
import hilog from '@ohos.hilog';
|
||||||
import AbilityDelegatorRegistry from '@ohos.application.abilityDelegatorRegistry'
|
import TestRunner from '@ohos.application.testRunner';
|
||||||
|
import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
|
||||||
|
|
||||||
var abilityDelegator = undefined
|
var abilityDelegator = undefined
|
||||||
var abilityDelegatorArguments = undefined
|
var abilityDelegatorArguments = undefined
|
||||||
|
|
||||||
function translateParamsToString(parameters) {
|
|
||||||
const keySet = new Set([
|
|
||||||
'-s class', '-s notClass', '-s suite', '-s it',
|
|
||||||
'-s level', '-s testType', '-s size', '-s timeout'
|
|
||||||
])
|
|
||||||
let targetParams = '';
|
|
||||||
for (const key in parameters) {
|
|
||||||
if (keySet.has(key)) {
|
|
||||||
targetParams = `${targetParams} ${key} ${parameters[key]}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return targetParams.trim()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onAbilityCreateCallback() {
|
async function onAbilityCreateCallback() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'onAbilityCreateCallback');
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addAbilityMonitorCallback(err: any) {
|
async function addAbilityMonitorCallback(err: any) {
|
||||||
|
hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? '');
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class OpenHarmonyTestRunner implements TestRunner {
|
export default class OpenHarmonyTestRunner implements TestRunner {
|
||||||
|
@ -45,11 +32,11 @@ export default class OpenHarmonyTestRunner implements TestRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
onPrepare() {
|
onPrepare() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare ');
|
||||||
}
|
}
|
||||||
|
|
||||||
async onRun() {
|
async onRun() {
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun run');
|
||||||
abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
|
abilityDelegatorArguments = AbilityDelegatorRegistry.getArguments()
|
||||||
abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
|
abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator()
|
||||||
var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility'
|
var testAbilityName = abilityDelegatorArguments.bundleName + '.TestAbility'
|
||||||
|
@ -59,14 +46,18 @@ export default class OpenHarmonyTestRunner implements TestRunner {
|
||||||
};
|
};
|
||||||
abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback)
|
abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback)
|
||||||
var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName
|
var cmd = 'aa start -d 0 -a TestAbility' + ' -b ' + abilityDelegatorArguments.bundleName
|
||||||
cmd += ' '+translateParamsToString(abilityDelegatorArguments.parameters)
|
var debug = abilityDelegatorArguments.parameters['-D']
|
||||||
|
if (debug == 'true')
|
||||||
|
{
|
||||||
|
cmd += ' -D'
|
||||||
|
}
|
||||||
|
hilog.info(0x0000, 'testTag', 'cmd : %{public}s', cmd);
|
||||||
abilityDelegator.executeShellCommand(cmd,
|
abilityDelegator.executeShellCommand(cmd,
|
||||||
(err: any, d: any) => {
|
(err: any, d: any) => {
|
||||||
|
hilog.info(0x0000, 'testTag', 'executeShellCommand : err : %{public}s', JSON.stringify(err) ?? '');
|
||||||
|
hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.stdResult ?? '');
|
||||||
|
hilog.info(0x0000, 'testTag', 'executeShellCommand : data : %{public}s', d.exitCode ?? '');
|
||||||
})
|
})
|
||||||
|
hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner onRun end');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
|
@ -2,25 +2,29 @@
|
||||||
"module": {
|
"module": {
|
||||||
"name": "entry_test",
|
"name": "entry_test",
|
||||||
"type": "feature",
|
"type": "feature",
|
||||||
"srcEntrance": "./ets/TestAbility/TestAbility.ts",
|
"srcEntrance": "./ets/testability/TestAbility.ets",
|
||||||
"description": "$string:entry_test_desc",
|
"description": "$string:module_test_desc",
|
||||||
"mainElement": "TestAbility",
|
"mainElement": "TestAbility",
|
||||||
"deviceTypes": [
|
"deviceTypes": ["default"],
|
||||||
"default",
|
|
||||||
"tablet"
|
|
||||||
],
|
|
||||||
"deliveryWithInstall": true,
|
"deliveryWithInstall": true,
|
||||||
"installationFree": false,
|
"installationFree": false,
|
||||||
"pages": "$profile:test_pages",
|
"pages": "$profile:test_pages",
|
||||||
"uiSyntax": "ets",
|
"metadata": [
|
||||||
|
{
|
||||||
|
"name": "ArkTSPartialUpdate",
|
||||||
|
"value": "true"
|
||||||
|
}
|
||||||
|
],
|
||||||
"abilities": [
|
"abilities": [
|
||||||
{
|
{
|
||||||
"name": "TestAbility",
|
"name": "TestAbility",
|
||||||
"srcEntrance": "./ets/TestAbility/TestAbility.ts",
|
"srcEntry": "./ets/testability/TestAbility.ets",
|
||||||
"description": "$string:TestAbility_desc",
|
"description": "$string:TestAbility_desc",
|
||||||
"icon": "$media:icon",
|
"icon": "$media:icon",
|
||||||
"label": "$string:TestAbility_label",
|
"label": "$string:TestAbility_label",
|
||||||
"visible": true,
|
"exported": true,
|
||||||
|
"startWindowIcon": "$media:icon",
|
||||||
|
"startWindowBackground": "$color:start_window_background",
|
||||||
"skills": [
|
"skills": [
|
||||||
{
|
{
|
||||||
"actions": [
|
"actions": [
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"color": [
|
"color": [
|
||||||
{
|
{
|
||||||
"name": "white",
|
"name": "start_window_background",
|
||||||
"value": "#FFFFFF"
|
"value": "#FFFFFF"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
{
|
{
|
||||||
"string": [
|
"string": [
|
||||||
{
|
{
|
||||||
"name": "entry_test_desc",
|
"name": "module_test_desc",
|
||||||
"value": "i am an entry for tv"
|
"value": "test ability description"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "TestAbility_desc",
|
"name": "TestAbility_desc",
|
||||||
"value": "the tv entry test ability"
|
"value": "the test ability"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "TestAbility_label",
|
"name": "TestAbility_label",
|
||||||
"value": "tvBase"
|
"value": "test label"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"src": [
|
"src": [
|
||||||
"TestAbility/pages/index"
|
"testability/pages/index"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
## 1.0.0
|
## 1.0.0
|
||||||
|
- 包管理工具由npm切换为ohpm
|
||||||
|
- 适配DevEco Studio: 3.1Release(3.1.3.400)
|
||||||
|
- 适配SDK: API9 Release(3.2.11.5)
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
获取图片的buffer数据,使用openGL、着色器(Shader),操作GPU,达到图片滤波器的效果
|
获取图片的buffer数据,使用openGL、着色器(Shader),操作GPU,达到图片滤波器的效果
|
||||||
- 支持模糊滤波器
|
- 支持模糊滤波器
|
||||||
- 支持亮度滤波器
|
- 支持亮度滤波器
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
## 下载安装
|
## 下载安装
|
||||||
```
|
```
|
||||||
npm install @ohos/gpu_transform --save
|
ohpm install @ohos/gpu_transform
|
||||||
```
|
```
|
||||||
|
|
||||||
## 例子说明
|
## 例子说明
|
||||||
|
@ -64,9 +64,11 @@
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## 兼容性
|
## 约束与限制
|
||||||
|
|
||||||
支持 OpenHarmony API version 9 及以上版本。
|
在下述版本验证通过:
|
||||||
|
|
||||||
|
DevEco Studio: 3.1Release(3.1.3.400), SDK: API9 Release(3.2.11.5)
|
||||||
|
|
||||||
## 贡献代码
|
## 贡献代码
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
"main": "index.ets",
|
"main": "index.ets",
|
||||||
"repository": "https://gitee.com/openharmony-tpc/ImageKnife",
|
"repository": "https://gitee.com/openharmony-tpc/ImageKnife",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "0.1.0",
|
"version": "1.0.0",
|
||||||
"tags": [
|
"tags": [
|
||||||
"Tool"
|
"Tool"
|
||||||
],
|
],
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"types": "./index.d.ts",
|
||||||
|
"name": "libentry.so",
|
||||||
|
"description": "",
|
||||||
|
"version": ""
|
||||||
|
}
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"name": "libentry.so",
|
|
||||||
"types": "./index.d.ts"
|
|
||||||
}
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
import { NativeEglRender } from '../gl/NativeEglRender'
|
import { NativeEglRender } from '../gl/NativeEglRender'
|
||||||
import { GPUFilterType } from '../gl/GPUFilterType'
|
import { GPUFilterType } from '../gl/GPUFilterType'
|
||||||
import { Runnable } from '../interface/Runnable'
|
import type { Runnable } from '../interface/Runnable'
|
||||||
import LinkedList from '@ohos.util.LinkedList';
|
import LinkedList from '@ohos.util.LinkedList';
|
||||||
import ArrayList from '@ohos.util.ArrayList';
|
import ArrayList from '@ohos.util.ArrayList';
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"hvigorVersion": "2.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@ohos/hvigor-ohos-plugin": "2.0.0"
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Hvigor startup script, version 1.0.0
|
||||||
|
#
|
||||||
|
# Required ENV vars:
|
||||||
|
# ------------------
|
||||||
|
# NODE_HOME - location of a Node home dir
|
||||||
|
# or
|
||||||
|
# Add /usr/local/nodejs/bin to the PATH environment variable
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
HVIGOR_APP_HOME=$(dirname $(readlink -f $0))
|
||||||
|
HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js
|
||||||
|
warn() {
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
fail() {
|
||||||
|
error "$@"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine node to start hvigor wrapper script
|
||||||
|
if [ -n "${NODE_HOME}" ];then
|
||||||
|
EXECUTABLE_NODE="${NODE_HOME}/bin/node"
|
||||||
|
if [ ! -x "$EXECUTABLE_NODE" ];then
|
||||||
|
fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
EXECUTABLE_NODE="node"
|
||||||
|
which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check hvigor wrapper script
|
||||||
|
if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then
|
||||||
|
fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# start hvigor-wrapper script
|
||||||
|
exec "${EXECUTABLE_NODE}" \
|
||||||
|
"${HVIGOR_WRAPPER_SCRIPT}" "$@"
|
|
@ -0,0 +1,57 @@
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Hvigor startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js
|
||||||
|
set NODE_EXE=node.exe
|
||||||
|
|
||||||
|
goto start
|
||||||
|
|
||||||
|
:start
|
||||||
|
@rem Find node.exe
|
||||||
|
if defined NODE_HOME goto findNodeFromNodeHome
|
||||||
|
|
||||||
|
%NODE_EXE% --version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the NODE_HOME variable in your environment to match the
|
||||||
|
echo location of your NodeJs installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findNodeFromNodeHome
|
||||||
|
set NODE_HOME=%NODE_HOME:"=%
|
||||||
|
set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE%
|
||||||
|
|
||||||
|
if exist "%NODE_EXE_PATH%" goto execute
|
||||||
|
echo.
|
||||||
|
echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the NODE_HOME variable in your environment to match the
|
||||||
|
echo location of your NodeJs installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Execute hvigor
|
||||||
|
"%NODE_EXE%" %WRAPPER_MODULE_PATH% %*
|
||||||
|
|
||||||
|
:fail
|
||||||
|
exit /b 1
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import arkWorker from '@ohos.worker';
|
import arkWorker from '@ohos.worker';
|
||||||
import {UPNG} from './src/main/ets/components/imageknife/pngj/UPNG'
|
import {UPNG} from './src/main/ets/components/3rd_party/upng/UPNG'
|
||||||
|
|
||||||
export function handler (e) {
|
export function handler (e) {
|
||||||
var data = e.data;
|
var data = e.data;
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export * from './src/main/ets/components/cache/FileUtils'
|
export * from './src/main/ets/components/cache/FileUtils'
|
||||||
export * from './src/main/ets/components/cache/Md5'
|
|
||||||
export * from './src/main/ets/components/cache/Base64'
|
export * from './src/main/ets/components/cache/Base64'
|
||||||
export * from './src/main/ets/components/cache/LruCache'
|
export * from './src/main/ets/components/cache/LruCache'
|
||||||
export * from './src/main/ets/components/cache/diskstrategy/enum/ALL'
|
export * from './src/main/ets/components/cache/diskstrategy/enum/ALL'
|
||||||
|
@ -27,16 +26,16 @@ export * from './src/main/ets/components/cache/diskstrategy/enum/AUTOMATIC'
|
||||||
export * from './src/main/ets/components/cache/diskstrategy/enum/DATA'
|
export * from './src/main/ets/components/cache/diskstrategy/enum/DATA'
|
||||||
export * from './src/main/ets/components/cache/diskstrategy/enum/NONE'
|
export * from './src/main/ets/components/cache/diskstrategy/enum/NONE'
|
||||||
export * from './src/main/ets/components/cache/diskstrategy/enum/RESOURCE'
|
export * from './src/main/ets/components/cache/diskstrategy/enum/RESOURCE'
|
||||||
export * from './src/main/ets/components/cache/key/EngineKeyInterface'
|
export type {EngineKeyInterface} from './src/main/ets/components/cache/key/EngineKeyInterface'
|
||||||
export * from './src/main/ets/components/cache/key/EngineKeyFactories'
|
export * from './src/main/ets/components/cache/key/EngineKeyFactories'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* compress
|
* compress
|
||||||
*/
|
*/
|
||||||
export * from './src/main/ets/components/imageknife/compress/CompressBuilder'
|
export * from './src/main/ets/components/imageknife/compress/CompressBuilder'
|
||||||
export * from './src/main/ets/components/imageknife/compress/listener/OnCompressListener'
|
export type {OnCompressListener} from './src/main/ets/components/imageknife/compress/listener/OnCompressListener'
|
||||||
export * from './src/main/ets/components/imageknife/compress/listener/OnRenameListener'
|
export type {OnRenameListener} from './src/main/ets/components/imageknife/compress/listener/OnRenameListener'
|
||||||
export * from './src/main/ets/components/imageknife/compress/listener/CompressDataListener'
|
export type {CompressDataListener} from './src/main/ets/components/imageknife/compress/listener/CompressDataListener'
|
||||||
export * from './src/main/ets/components/imageknife/compress/listener/CompressionPredicate'
|
export * from './src/main/ets/components/imageknife/compress/listener/CompressionPredicate'
|
||||||
export * from './src/main/ets/components/imageknife/compress/provider/CompressAdapter'
|
export * from './src/main/ets/components/imageknife/compress/provider/CompressAdapter'
|
||||||
export * from './src/main/ets/components/imageknife/compress/provider/CompressProvider'
|
export * from './src/main/ets/components/imageknife/compress/provider/CompressProvider'
|
||||||
|
@ -55,7 +54,7 @@ export * from './src/main/ets/components/imageknife/crop/CropCallback'
|
||||||
/**
|
/**
|
||||||
* transform
|
* transform
|
||||||
*/
|
*/
|
||||||
export * from './src/main/ets/components/imageknife/transform/BaseTransform'
|
export type {BaseTransform} from './src/main/ets/components/imageknife/transform/BaseTransform'
|
||||||
export * from './src/main/ets/components/imageknife/transform/BlurTransformation'
|
export * from './src/main/ets/components/imageknife/transform/BlurTransformation'
|
||||||
export * from './src/main/ets/components/imageknife/transform/BrightnessFilterTransformation'
|
export * from './src/main/ets/components/imageknife/transform/BrightnessFilterTransformation'
|
||||||
export * from './src/main/ets/components/imageknife/transform/ContrastFilterTransformation'
|
export * from './src/main/ets/components/imageknife/transform/ContrastFilterTransformation'
|
||||||
|
@ -86,7 +85,7 @@ export * from './src/main/ets/components/imageknife/transform/pixelmap/FitCenter
|
||||||
*/
|
*/
|
||||||
export * from './src/main/ets/components/imageknife/pngj/Pngj'
|
export * from './src/main/ets/components/imageknife/pngj/Pngj'
|
||||||
export {handler} from './PngWork'
|
export {handler} from './PngWork'
|
||||||
export * from './src/main/ets/components/imageknife/pngj/UPNG'
|
export * from './src/main/ets/components/3rd_party/upng/UPNG'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,10 +98,11 @@ export * from './src/main/ets/components/imageknife/ImageKnifeComponent'
|
||||||
export * from './src/main/ets/components/imageknife/ImageKnifeDrawFactory'
|
export * from './src/main/ets/components/imageknife/ImageKnifeDrawFactory'
|
||||||
export * from './src/main/ets/components/imageknife/ImageKnifeOption'
|
export * from './src/main/ets/components/imageknife/ImageKnifeOption'
|
||||||
export * from './src/main/ets/components/imageknife/ImageKnifeData'
|
export * from './src/main/ets/components/imageknife/ImageKnifeData'
|
||||||
export * from './src/main/ets/components/imageknife/interface/IAllCacheInfoCallback'
|
export type {IAllCacheInfoCallback} from './src/main/ets/components/imageknife/interface/IAllCacheInfoCallback'
|
||||||
export * from './src/main/ets/components/imageknife/interface/IParseImage'
|
export type {AllCacheInfo} from './src/main/ets/components/imageknife/interface/IAllCacheInfoCallback'
|
||||||
export * from './src/main/ets/components/imageknife/networkmanage/IDataFetch'
|
export type {IParseImage} from './src/main/ets/components/imageknife/interface/IParseImage'
|
||||||
export * from './src/main/ets/components/imageknife/requestmanage/ICache'
|
export type {IDataFetch} from './src/main/ets/components/imageknife/networkmanage/IDataFetch'
|
||||||
|
export type {ICache} from './src/main/ets/components/imageknife/requestmanage/ICache'
|
||||||
export * from './src/main/ets/components/imageknife/utils/FileTypeUtil'
|
export * from './src/main/ets/components/imageknife/utils/FileTypeUtil'
|
||||||
export * from './src/main/ets/components/imageknife/utils/ParseImageUtil'
|
export * from './src/main/ets/components/imageknife/utils/ParseImageUtil'
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ export {gifHandler} from './GifWorker'
|
||||||
|
|
||||||
// 自定义组件新增
|
// 自定义组件新增
|
||||||
// 自定义组件绘制生命周期
|
// 自定义组件绘制生命周期
|
||||||
export * from './src/main/ets/components/imageknife/interface/IDrawLifeCycle'
|
export type {IDrawLifeCycle} from './src/main/ets/components/imageknife/interface/IDrawLifeCycle'
|
||||||
|
|
||||||
// 日志管理
|
// 日志管理
|
||||||
export * from './src/main/ets/components/imageknife/utils/LogUtil'
|
export * from './src/main/ets/components/imageknife/utils/LogUtil'
|
|
@ -14,15 +14,11 @@
|
||||||
"main": "index.ets",
|
"main": "index.ets",
|
||||||
"repository": "https://gitee.com/openharmony-tpc/ImageKnife",
|
"repository": "https://gitee.com/openharmony-tpc/ImageKnife",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "1.0.6",
|
"version": "2.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"pako": "^1.0.5",
|
"@ohos/disklrucache": "^2.0.0",
|
||||||
"js-binary-schema-parser": "^2.0.3",
|
"@ohos/svg": "^2.0.0",
|
||||||
"@ohos/disklrucache": "^1.0.0",
|
"@ohos/gpu_transform": "^1.0.0"
|
||||||
"@ohos/svg": "1.1.0",
|
|
||||||
"crc-32": "^1.2.0",
|
|
||||||
"spark-md5": "^3.0.2",
|
|
||||||
"@ohos/gpu_transform": "^0.1.0"
|
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"ImageCache",
|
"ImageCache",
|
71
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/index.js
vendored
Normal file
71
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/index.js
vendored
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var parse = function parse(stream, schema) {
|
||||||
|
var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||||||
|
var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;
|
||||||
|
|
||||||
|
if (Array.isArray(schema)) {
|
||||||
|
schema.forEach(function (partSchema) {
|
||||||
|
return parse(stream, partSchema, result, parent);
|
||||||
|
});
|
||||||
|
} else if (typeof schema === 'function') {
|
||||||
|
schema(stream, result, parent, parse);
|
||||||
|
} else {
|
||||||
|
var key = Object.keys(schema)[0];
|
||||||
|
|
||||||
|
if (Array.isArray(schema[key])) {
|
||||||
|
parent[key] = {};
|
||||||
|
parse(stream, schema[key], result, parent[key]);
|
||||||
|
} else {
|
||||||
|
parent[key] = schema[key](stream, result, parent, parse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var conditional = function conditional(schema, conditionFunc) {
|
||||||
|
return function (stream, result, parent, parse) {
|
||||||
|
if (conditionFunc(stream, result, parent)) {
|
||||||
|
parse(stream, schema, result, parent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var loop = function loop(schema, continueFunc) {
|
||||||
|
return function (stream, result, parent, parse) {
|
||||||
|
var arr = [];
|
||||||
|
var lastStreamPos = stream.pos;
|
||||||
|
|
||||||
|
while (continueFunc(stream, result, parent)) {
|
||||||
|
var newParent = {};
|
||||||
|
parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well
|
||||||
|
// it falls into infinite recursion, null check to avoid the same
|
||||||
|
|
||||||
|
if (stream.pos === lastStreamPos) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastStreamPos = stream.pos;
|
||||||
|
arr.push(newParent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export{
|
||||||
|
loop,
|
||||||
|
conditional,
|
||||||
|
parse
|
||||||
|
}
|
||||||
|
|
114
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/parsers/uint8.js
vendored
Normal file
114
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/parsers/uint8.js
vendored
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
// Default stream and parsers for Uint8TypedArray data type
|
||||||
|
var buildStream = function buildStream(uint8Data) {
|
||||||
|
return {
|
||||||
|
data: uint8Data,
|
||||||
|
pos: 0
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var readByte = function readByte() {
|
||||||
|
return function (stream) {
|
||||||
|
return stream.data[stream.pos++];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var peekByte = function peekByte() {
|
||||||
|
var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
||||||
|
return function (stream) {
|
||||||
|
return stream.data[stream.pos + offset];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var readBytes = function readBytes(length) {
|
||||||
|
return function (stream) {
|
||||||
|
return stream.data.subarray(stream.pos, stream.pos += length);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var peekBytes = function peekBytes(length) {
|
||||||
|
return function (stream) {
|
||||||
|
return stream.data.subarray(stream.pos, stream.pos + length);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var readString = function readString(length) {
|
||||||
|
return function (stream) {
|
||||||
|
return Array.from(readBytes(length)(stream)).map(function (value) {
|
||||||
|
return String.fromCharCode(value);
|
||||||
|
}).join('');
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var readUnsigned = function readUnsigned(littleEndian) {
|
||||||
|
return function (stream) {
|
||||||
|
var bytes = readBytes(2)(stream);
|
||||||
|
return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var readArray = function readArray(byteSize, totalOrFunc) {
|
||||||
|
return function (stream, result, parent) {
|
||||||
|
var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;
|
||||||
|
var parser = readBytes(byteSize);
|
||||||
|
var arr = new Array(total);
|
||||||
|
|
||||||
|
for (var i = 0; i < total; i++) {
|
||||||
|
arr[i] = parser(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
var subBitsTotal = function subBitsTotal(bits, startIndex, length) {
|
||||||
|
var result = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < length; i++) {
|
||||||
|
result += bits[startIndex + i] && Math.pow(2, length - i - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
var readBits = function readBits(schema) {
|
||||||
|
return function (stream) {
|
||||||
|
var _byte = readByte()(stream); // convert the byte to bit array
|
||||||
|
|
||||||
|
|
||||||
|
var bits = new Array(8);
|
||||||
|
|
||||||
|
for (var i = 0; i < 8; i++) {
|
||||||
|
bits[7 - i] = !!(_byte & 1 << i);
|
||||||
|
} // convert the bit array to values based on the schema
|
||||||
|
|
||||||
|
|
||||||
|
return Object.keys(schema).reduce(function (res, key) {
|
||||||
|
var def = schema[key];
|
||||||
|
|
||||||
|
if (def.length) {
|
||||||
|
res[key] = subBitsTotal(bits, def.index, def.length);
|
||||||
|
} else {
|
||||||
|
res[key] = bits[def.index];
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}, {});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
export {buildStream,readByte,peekByte,readBytes,peekBytes,readString,readUnsigned,readArray,readBits}
|
220
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/schemas/gif.js
vendored
Normal file
220
imageknife/src/main/ets/components/3rd_party/jsbinaryschemaparser/lib/schemas/gif.js
vendored
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
|
||||||
|
import {
|
||||||
|
loop,
|
||||||
|
conditional,
|
||||||
|
parse
|
||||||
|
} from "../";
|
||||||
|
|
||||||
|
import {buildStream,readByte,peekByte,readBytes,peekBytes,readString,readUnsigned,readArray,readBits} from "../parsers/uint8";
|
||||||
|
|
||||||
|
// a set of 0x00 terminated subblocks
|
||||||
|
var subBlocksSchema = {
|
||||||
|
blocks: function blocks(stream) {
|
||||||
|
var terminator = 0x00;
|
||||||
|
var chunks = [];
|
||||||
|
var streamSize = stream.data.length;
|
||||||
|
var total = 0;
|
||||||
|
|
||||||
|
for (var size = (0, readByte)()(stream); size !== terminator; size = (0, readByte)()(stream)) {
|
||||||
|
// size becomes undefined for some case when file is corrupted and terminator is not proper
|
||||||
|
// null check to avoid recursion
|
||||||
|
if (!size) break; // catch corrupted files with no terminator
|
||||||
|
|
||||||
|
if (stream.pos + size >= streamSize) {
|
||||||
|
var availableSize = streamSize - stream.pos;
|
||||||
|
chunks.push((0, readBytes)(availableSize)(stream));
|
||||||
|
total += availableSize;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunks.push((0, readBytes)(size)(stream));
|
||||||
|
total += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = new Uint8Array(total);
|
||||||
|
var offset = 0;
|
||||||
|
|
||||||
|
for (var i = 0; i < chunks.length; i++) {
|
||||||
|
result.set(chunks[i], offset);
|
||||||
|
offset += chunks[i].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}; // global control extension
|
||||||
|
|
||||||
|
var gceSchema = (0, conditional)({
|
||||||
|
gce: [{
|
||||||
|
codes: (0, readBytes)(2)
|
||||||
|
}, {
|
||||||
|
byteSize: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
extras: (0, readBits)({
|
||||||
|
future: {
|
||||||
|
index: 0,
|
||||||
|
length: 3
|
||||||
|
},
|
||||||
|
disposal: {
|
||||||
|
index: 3,
|
||||||
|
length: 3
|
||||||
|
},
|
||||||
|
userInput: {
|
||||||
|
index: 6
|
||||||
|
},
|
||||||
|
transparentColorGiven: {
|
||||||
|
index: 7
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
delay: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
transparentColorIndex: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
terminator: (0, readByte)()
|
||||||
|
}]
|
||||||
|
}, function (stream) {
|
||||||
|
var codes = (0, peekBytes)(2)(stream);
|
||||||
|
return codes[0] === 0x21 && codes[1] === 0xf9;
|
||||||
|
}); // image pipeline block
|
||||||
|
|
||||||
|
var imageSchema = (0, conditional)({
|
||||||
|
image: [{
|
||||||
|
code: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
descriptor: [{
|
||||||
|
left: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
top: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
width: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
height: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
lct: (0, readBits)({
|
||||||
|
exists: {
|
||||||
|
index: 0
|
||||||
|
},
|
||||||
|
interlaced: {
|
||||||
|
index: 1
|
||||||
|
},
|
||||||
|
sort: {
|
||||||
|
index: 2
|
||||||
|
},
|
||||||
|
future: {
|
||||||
|
index: 3,
|
||||||
|
length: 2
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
index: 5,
|
||||||
|
length: 3
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}]
|
||||||
|
}, (0, conditional)({
|
||||||
|
lct: (0, readArray)(3, function (stream, result, parent) {
|
||||||
|
return Math.pow(2, parent.descriptor.lct.size + 1);
|
||||||
|
})
|
||||||
|
}, function (stream, result, parent) {
|
||||||
|
return parent.descriptor.lct.exists;
|
||||||
|
}), {
|
||||||
|
data: [{
|
||||||
|
minCodeSize: (0, readByte)()
|
||||||
|
}, subBlocksSchema]
|
||||||
|
}]
|
||||||
|
}, function (stream) {
|
||||||
|
return (0, peekByte)()(stream) === 0x2c;
|
||||||
|
}); // plain text block
|
||||||
|
|
||||||
|
var textSchema = (0, conditional)({
|
||||||
|
text: [{
|
||||||
|
codes: (0, readBytes)(2)
|
||||||
|
}, {
|
||||||
|
blockSize: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
preData: function preData(stream, result, parent) {
|
||||||
|
return (0, readBytes)(parent.text.blockSize)(stream);
|
||||||
|
}
|
||||||
|
}, subBlocksSchema]
|
||||||
|
}, function (stream) {
|
||||||
|
var codes = (0, peekBytes)(2)(stream);
|
||||||
|
return codes[0] === 0x21 && codes[1] === 0x01;
|
||||||
|
}); // application block
|
||||||
|
|
||||||
|
var applicationSchema = (0, conditional)({
|
||||||
|
application: [{
|
||||||
|
codes: (0, readBytes)(2)
|
||||||
|
}, {
|
||||||
|
blockSize: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
id: function id(stream, result, parent) {
|
||||||
|
return (0, readString)(parent.blockSize)(stream);
|
||||||
|
}
|
||||||
|
}, subBlocksSchema]
|
||||||
|
}, function (stream) {
|
||||||
|
var codes = (0, peekBytes)(2)(stream);
|
||||||
|
return codes[0] === 0x21 && codes[1] === 0xff;
|
||||||
|
}); // comment block
|
||||||
|
|
||||||
|
var commentSchema = (0, conditional)({
|
||||||
|
comment: [{
|
||||||
|
codes: (0, readBytes)(2)
|
||||||
|
}, subBlocksSchema]
|
||||||
|
}, function (stream) {
|
||||||
|
var codes = (0, peekBytes)(2)(stream);
|
||||||
|
return codes[0] === 0x21 && codes[1] === 0xfe;
|
||||||
|
});
|
||||||
|
var schema = [{
|
||||||
|
header: [{
|
||||||
|
signature: (0, readString)(3)
|
||||||
|
}, {
|
||||||
|
version: (0, readString)(3)
|
||||||
|
}]
|
||||||
|
}, {
|
||||||
|
lsd: [{
|
||||||
|
width: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
height: (0, readUnsigned)(true)
|
||||||
|
}, {
|
||||||
|
gct: (0, readBits)({
|
||||||
|
exists: {
|
||||||
|
index: 0
|
||||||
|
},
|
||||||
|
resolution: {
|
||||||
|
index: 1,
|
||||||
|
length: 3
|
||||||
|
},
|
||||||
|
sort: {
|
||||||
|
index: 4
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
index: 5,
|
||||||
|
length: 3
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, {
|
||||||
|
backgroundColorIndex: (0, readByte)()
|
||||||
|
}, {
|
||||||
|
pixelAspectRatio: (0, readByte)()
|
||||||
|
}]
|
||||||
|
}, (0, conditional)({
|
||||||
|
gct: (0, readArray)(3, function (stream, result) {
|
||||||
|
return Math.pow(2, result.lsd.gct.size + 1);
|
||||||
|
})
|
||||||
|
}, function (stream, result) {
|
||||||
|
return result.lsd.gct.exists;
|
||||||
|
}), // content frames
|
||||||
|
{
|
||||||
|
frames: (0, loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {
|
||||||
|
var nextCode = (0, peekByte)()(stream); // rather than check for a terminator, we should check for the existence
|
||||||
|
// of an ext or image block to avoid infinite loops
|
||||||
|
//var terminator = 0x3B;
|
||||||
|
//return nextCode !== terminator;
|
||||||
|
|
||||||
|
return nextCode === 0x21 || nextCode === 0x2c;
|
||||||
|
})
|
||||||
|
}];
|
||||||
|
var _default = schema;
|
||||||
|
|
||||||
|
export {_default}
|
|
@ -0,0 +1,383 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import {deflateInit2,deflateSetHeader,deflateEnd,deflate as deflate1,deflateSetDictionary} from './zlib/deflate';
|
||||||
|
import {assign,flattenChunks} from './utils/common';
|
||||||
|
import { string2buf } from './utils/strings';
|
||||||
|
import msg from './zlib/messages';
|
||||||
|
import {ZStream} from './zlib/zstream';
|
||||||
|
|
||||||
|
const toString = Object.prototype.toString;
|
||||||
|
|
||||||
|
/* Public constants ==========================================================*/
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
import constants1 from './zlib/constants';
|
||||||
|
var Z_NO_FLUSH = constants1.Z_NO_FLUSH;
|
||||||
|
var Z_SYNC_FLUSH = constants1.Z_SYNC_FLUSH;
|
||||||
|
var Z_FULL_FLUSH = constants1.Z_FULL_FLUSH;
|
||||||
|
var Z_FINISH = constants1.Z_FINISH;
|
||||||
|
var Z_OK = constants1.Z_OK;
|
||||||
|
var Z_STREAM_END = constants1.Z_STREAM_END;
|
||||||
|
var Z_DEFAULT_COMPRESSION = constants1.Z_DEFAULT_COMPRESSION;
|
||||||
|
var Z_DEFAULT_STRATEGY = constants1.Z_DEFAULT_STRATEGY;
|
||||||
|
var Z_DEFLATED = constants1.Z_DEFLATED;
|
||||||
|
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Deflate
|
||||||
|
*
|
||||||
|
* Generic JS-style wrapper for zlib calls. If you don't need
|
||||||
|
* streaming behaviour - use more simple functions: [[deflate]],
|
||||||
|
* [[deflateRaw]] and [[gzip]].
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* internal
|
||||||
|
* Deflate.chunks -> Array
|
||||||
|
*
|
||||||
|
* Chunks of output data, if [[Deflate#onData]] not overridden.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.result -> Uint8Array
|
||||||
|
*
|
||||||
|
* Compressed result, generated by default [[Deflate#onData]]
|
||||||
|
* and [[Deflate#onEnd]] handlers. Filled after you push last chunk
|
||||||
|
* (call [[Deflate#push]] with `Z_FINISH` / `true` param).
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.err -> Number
|
||||||
|
*
|
||||||
|
* Error code after deflate finished. 0 (Z_OK) on success.
|
||||||
|
* You will not need it in real life, because deflate errors
|
||||||
|
* are possible only on wrong options or bad `onData` / `onEnd`
|
||||||
|
* custom handlers.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate.msg -> String
|
||||||
|
*
|
||||||
|
* Error message, if [[Deflate.err]] != 0
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* new Deflate(options)
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* Creates new deflator instance with specified params. Throws exception
|
||||||
|
* on bad params. Supported options:
|
||||||
|
*
|
||||||
|
* - `level`
|
||||||
|
* - `windowBits`
|
||||||
|
* - `memLevel`
|
||||||
|
* - `strategy`
|
||||||
|
* - `dictionary`
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Additional options, for internal needs:
|
||||||
|
*
|
||||||
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
||||||
|
* - `raw` (Boolean) - do raw deflate
|
||||||
|
* - `gzip` (Boolean) - create gzip wrapper
|
||||||
|
* - `header` (Object) - custom header for gzip
|
||||||
|
* - `text` (Boolean) - true if compressed data believed to be text
|
||||||
|
* - `time` (Number) - modification time, unix timestamp
|
||||||
|
* - `os` (Number) - operation system code
|
||||||
|
* - `extra` (Array) - array of bytes with extra data (max 65536)
|
||||||
|
* - `name` (String) - file name (binary string)
|
||||||
|
* - `comment` (String) - comment (binary string)
|
||||||
|
* - `hcrc` (Boolean) - true if header crc should be added
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako = require('pako')
|
||||||
|
* , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
|
||||||
|
* , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
|
||||||
|
*
|
||||||
|
* const deflate = new pako.Deflate({ level: 3});
|
||||||
|
*
|
||||||
|
* deflate.push(chunk1, false);
|
||||||
|
* deflate.push(chunk2, true); // true -> last chunk
|
||||||
|
*
|
||||||
|
* if (deflate.err) { throw new Error(deflate.err); }
|
||||||
|
*
|
||||||
|
* console.log(deflate.result);
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function Deflate(options) {
|
||||||
|
this.options = assign({
|
||||||
|
level: Z_DEFAULT_COMPRESSION,
|
||||||
|
method: Z_DEFLATED,
|
||||||
|
chunkSize: 16384,
|
||||||
|
windowBits: 15,
|
||||||
|
memLevel: 8,
|
||||||
|
strategy: Z_DEFAULT_STRATEGY
|
||||||
|
}, options || {});
|
||||||
|
|
||||||
|
let opt = this.options;
|
||||||
|
|
||||||
|
if (opt.raw && (opt.windowBits > 0)) {
|
||||||
|
opt.windowBits = -opt.windowBits;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
|
||||||
|
opt.windowBits += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.err = 0; // error code, if happens (0 = Z_OK)
|
||||||
|
this.msg = ''; // error message
|
||||||
|
this.ended = false; // used to avoid multiple onEnd() calls
|
||||||
|
this.chunks = []; // chunks of compressed data
|
||||||
|
|
||||||
|
this.strm = new ZStream();
|
||||||
|
this.strm.avail_out = 0;
|
||||||
|
|
||||||
|
let status = deflateInit2(
|
||||||
|
this.strm,
|
||||||
|
opt.level,
|
||||||
|
opt.method,
|
||||||
|
opt.windowBits,
|
||||||
|
opt.memLevel,
|
||||||
|
opt.strategy
|
||||||
|
);
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.header) {
|
||||||
|
deflateSetHeader(this.strm, opt.header);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.dictionary) {
|
||||||
|
let dict;
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof opt.dictionary === 'string') {
|
||||||
|
// If we need to compress text, change encoding to utf8.
|
||||||
|
dict = string2buf(opt.dictionary);
|
||||||
|
} else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
|
||||||
|
dict = new Uint8Array(opt.dictionary);
|
||||||
|
} else {
|
||||||
|
dict = opt.dictionary;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = deflateSetDictionary(this.strm, dict);
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dict_set = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#push(data[, flush_mode]) -> Boolean
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data. Strings will be
|
||||||
|
* converted to utf8 byte sequence.
|
||||||
|
* - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
|
||||||
|
* See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.
|
||||||
|
*
|
||||||
|
* Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
|
||||||
|
* new compressed chunks. Returns `true` on success. The last data block must
|
||||||
|
* have `flush_mode` Z_FINISH (or `true`). That will flush internal pending
|
||||||
|
* buffers and call [[Deflate#onEnd]].
|
||||||
|
*
|
||||||
|
* On fail call [[Deflate#onEnd]] with error code and return false.
|
||||||
|
*
|
||||||
|
* ##### Example
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* push(chunk, false); // push one of data chunks
|
||||||
|
* ...
|
||||||
|
* push(chunk, true); // push last chunk
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
Deflate.prototype.push = function (data, flush_mode) {
|
||||||
|
const strm = this.strm;
|
||||||
|
const chunkSize = this.options.chunkSize;
|
||||||
|
let status, _flush_mode;
|
||||||
|
|
||||||
|
if (this.ended) { return false; }
|
||||||
|
|
||||||
|
if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;
|
||||||
|
else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;
|
||||||
|
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof data === 'string') {
|
||||||
|
// If we need to compress text, change encoding to utf8.
|
||||||
|
strm.input = string2buf(data);
|
||||||
|
} else if (toString.call(data) === '[object ArrayBuffer]') {
|
||||||
|
strm.input = new Uint8Array(data);
|
||||||
|
} else {
|
||||||
|
strm.input = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_in = 0;
|
||||||
|
strm.avail_in = strm.input.length;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
strm.output = new Uint8Array(chunkSize);
|
||||||
|
strm.next_out = 0;
|
||||||
|
strm.avail_out = chunkSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure avail_out > 6 to avoid repeating markers
|
||||||
|
if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out));
|
||||||
|
strm.avail_out = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = deflate1(strm, _flush_mode);
|
||||||
|
|
||||||
|
// Ended => flush and finish
|
||||||
|
if (status === Z_STREAM_END) {
|
||||||
|
if (strm.next_out > 0) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out));
|
||||||
|
}
|
||||||
|
status = deflateEnd(this.strm);
|
||||||
|
this.onEnd(status);
|
||||||
|
this.ended = true;
|
||||||
|
return status === Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush if out buffer full
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
this.onData(strm.output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flush if requested and has data
|
||||||
|
if (_flush_mode > 0 && strm.next_out > 0) {
|
||||||
|
this.onData(strm.output.subarray(0, strm.next_out));
|
||||||
|
strm.avail_out = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strm.avail_in === 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#onData(chunk) -> Void
|
||||||
|
* - chunk (Uint8Array): output data.
|
||||||
|
*
|
||||||
|
* By default, stores data blocks in `chunks[]` property and glue
|
||||||
|
* those in `onEnd`. Override this handler, if you need another behaviour.
|
||||||
|
**/
|
||||||
|
Deflate.prototype.onData = function (chunk) {
|
||||||
|
this.chunks.push(chunk);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deflate#onEnd(status) -> Void
|
||||||
|
* - status (Number): deflate status. 0 (Z_OK) on success,
|
||||||
|
* other if not.
|
||||||
|
*
|
||||||
|
* Called once after you tell deflate that the input stream is
|
||||||
|
* complete (Z_FINISH). By default - join collected chunks,
|
||||||
|
* free memory and fill `results` / `err` properties.
|
||||||
|
**/
|
||||||
|
Deflate.prototype.onEnd = function (status) {
|
||||||
|
// On success - join
|
||||||
|
if (status === Z_OK) {
|
||||||
|
this.result = flattenChunks(this.chunks);
|
||||||
|
}
|
||||||
|
this.chunks = [];
|
||||||
|
this.err = status;
|
||||||
|
this.msg = this.strm.msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deflate(data[, options]) -> Uint8Array
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data to compress.
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* Compress `data` with deflate algorithm and `options`.
|
||||||
|
*
|
||||||
|
* Supported options are:
|
||||||
|
*
|
||||||
|
* - level
|
||||||
|
* - windowBits
|
||||||
|
* - memLevel
|
||||||
|
* - strategy
|
||||||
|
* - dictionary
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Sugar (options):
|
||||||
|
*
|
||||||
|
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
|
||||||
|
* negative windowBits implicitly.
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako = require('pako')
|
||||||
|
* const data = new Uint8Array([1,2,3,4,5,6,7,8,9]);
|
||||||
|
*
|
||||||
|
* console.log(pako.deflate(data));
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function deflate(input, options) {
|
||||||
|
const deflator = new Deflate(options);
|
||||||
|
|
||||||
|
deflator.push(input, true);
|
||||||
|
|
||||||
|
// That will never happens, if you don't cheat with options :)
|
||||||
|
if (deflator.err) { throw deflator.msg || msg[deflator.err]; }
|
||||||
|
|
||||||
|
return deflator.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* deflateRaw(data[, options]) -> Uint8Array
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data to compress.
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* The same as [[deflate]], but creates raw data, without wrapper
|
||||||
|
* (header and adler32 crc).
|
||||||
|
**/
|
||||||
|
function deflateRaw(input, options) {
|
||||||
|
options = options || {};
|
||||||
|
options.raw = true;
|
||||||
|
return deflate(input, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gzip(data[, options]) -> Uint8Array
|
||||||
|
* - data (Uint8Array|ArrayBuffer|String): input data to compress.
|
||||||
|
* - options (Object): zlib deflate options.
|
||||||
|
*
|
||||||
|
* The same as [[deflate]], but create gzip wrapper instead of
|
||||||
|
* deflate one.
|
||||||
|
**/
|
||||||
|
function gzip(input, options) {
|
||||||
|
options = options || {};
|
||||||
|
options.gzip = true;
|
||||||
|
return deflate(input, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
import constants from './zlib/constants'
|
||||||
|
|
||||||
|
export {Deflate,deflate,deflateRaw,gzip,constants}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,421 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import {inflateReset,inflateInit2,inflate as inflate1,inflateEnd,inflateGetHeader,inflateSetDictionary,inflateInfo } from './zlib/inflate'
|
||||||
|
|
||||||
|
import {assign,flattenChunks} from './utils/common';
|
||||||
|
import {string2buf,buf2string,utf8border} from './utils/strings';
|
||||||
|
import msg from './zlib/messages';
|
||||||
|
import {ZStream} from './zlib/zstream';
|
||||||
|
import {GZheader} from './zlib/gzheader';
|
||||||
|
|
||||||
|
const toString = Object.prototype.toString;
|
||||||
|
|
||||||
|
/* Public constants ==========================================================*/
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
import constants from './zlib/constants';
|
||||||
|
var Z_NO_FLUSH = constants.Z_NO_FLUSH;
|
||||||
|
var Z_FINISH = constants.Z_FINISH;
|
||||||
|
var Z_OK = constants.Z_OK;
|
||||||
|
var Z_STREAM_END = constants.Z_STREAM_END;
|
||||||
|
var Z_NEED_DICT = constants.Z_NEED_DICT;
|
||||||
|
var Z_STREAM_ERROR = constants.Z_STREAM_ERROR;
|
||||||
|
var Z_DATA_ERROR = constants.Z_DATA_ERROR;
|
||||||
|
var Z_MEM_ERROR = constants.Z_MEM_ERROR;
|
||||||
|
|
||||||
|
/* ===========================================================================*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Inflate
|
||||||
|
*
|
||||||
|
* Generic JS-style wrapper for zlib calls. If you don't need
|
||||||
|
* streaming behaviour - use more simple functions: [[inflate]]
|
||||||
|
* and [[inflateRaw]].
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* internal
|
||||||
|
* inflate.chunks -> Array
|
||||||
|
*
|
||||||
|
* Chunks of output data, if [[Inflate#onData]] not overridden.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.result -> Uint8Array|String
|
||||||
|
*
|
||||||
|
* Uncompressed result, generated by default [[Inflate#onData]]
|
||||||
|
* and [[Inflate#onEnd]] handlers. Filled after you push last chunk
|
||||||
|
* (call [[Inflate#push]] with `Z_FINISH` / `true` param).
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.err -> Number
|
||||||
|
*
|
||||||
|
* Error code after inflate finished. 0 (Z_OK) on success.
|
||||||
|
* Should be checked if broken data possible.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate.msg -> String
|
||||||
|
*
|
||||||
|
* Error message, if [[Inflate.err]] != 0
|
||||||
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* new Inflate(options)
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Creates new inflator instance with specified params. Throws exception
|
||||||
|
* on bad params. Supported options:
|
||||||
|
*
|
||||||
|
* - `windowBits`
|
||||||
|
* - `dictionary`
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information on these.
|
||||||
|
*
|
||||||
|
* Additional options, for internal needs:
|
||||||
|
*
|
||||||
|
* - `chunkSize` - size of generated data chunks (16K by default)
|
||||||
|
* - `raw` (Boolean) - do raw inflate
|
||||||
|
* - `to` (String) - if equal to 'string', then result will be converted
|
||||||
|
* from utf8 to utf16 (javascript) string. When string output requested,
|
||||||
|
* chunk length can differ from `chunkSize`, depending on content.
|
||||||
|
*
|
||||||
|
* By default, when no options set, autodetect deflate/gzip data format via
|
||||||
|
* wrapper header.
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako = require('pako')
|
||||||
|
* const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])
|
||||||
|
* const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);
|
||||||
|
*
|
||||||
|
* const inflate = new pako.Inflate({ level: 3});
|
||||||
|
*
|
||||||
|
* inflate.push(chunk1, false);
|
||||||
|
* inflate.push(chunk2, true); // true -> last chunk
|
||||||
|
*
|
||||||
|
* if (inflate.err) { throw new Error(inflate.err); }
|
||||||
|
*
|
||||||
|
* console.log(inflate.result);
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function Inflate(options) {
|
||||||
|
this.options = utils.assign({
|
||||||
|
chunkSize: 1024 * 64,
|
||||||
|
windowBits: 15,
|
||||||
|
to: ''
|
||||||
|
}, options || {});
|
||||||
|
|
||||||
|
const opt = this.options;
|
||||||
|
|
||||||
|
// Force window size for `raw` data, if not set directly,
|
||||||
|
// because we have no header for autodetect.
|
||||||
|
if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
|
||||||
|
opt.windowBits = -opt.windowBits;
|
||||||
|
if (opt.windowBits === 0) { opt.windowBits = -15; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
|
||||||
|
if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
|
||||||
|
!(options && options.windowBits)) {
|
||||||
|
opt.windowBits += 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gzip header has no info about windows size, we can do autodetect only
|
||||||
|
// for deflate. So, if window size not set, force it to max when gzip possible
|
||||||
|
if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
|
||||||
|
// bit 3 (16) -> gzipped data
|
||||||
|
// bit 4 (32) -> autodetect gzip/deflate
|
||||||
|
if ((opt.windowBits & 15) === 0) {
|
||||||
|
opt.windowBits |= 15;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.err = 0; // error code, if happens (0 = Z_OK)
|
||||||
|
this.msg = ''; // error message
|
||||||
|
this.ended = false; // used to avoid multiple onEnd() calls
|
||||||
|
this.chunks = []; // chunks of compressed data
|
||||||
|
|
||||||
|
this.strm = new ZStream();
|
||||||
|
this.strm.avail_out = 0;
|
||||||
|
|
||||||
|
let status = inflateInit2(
|
||||||
|
this.strm,
|
||||||
|
opt.windowBits
|
||||||
|
);
|
||||||
|
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.header = new GZheader();
|
||||||
|
|
||||||
|
inflateGetHeader(this.strm, this.header);
|
||||||
|
|
||||||
|
// Setup dictionary
|
||||||
|
if (opt.dictionary) {
|
||||||
|
// Convert data if needed
|
||||||
|
if (typeof opt.dictionary === 'string') {
|
||||||
|
opt.dictionary = strings.string2buf(opt.dictionary);
|
||||||
|
} else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
|
||||||
|
opt.dictionary = new Uint8Array(opt.dictionary);
|
||||||
|
}
|
||||||
|
if (opt.raw) { //In raw mode we need to set the dictionary early
|
||||||
|
status = inflateSetDictionary(this.strm, opt.dictionary);
|
||||||
|
if (status !== Z_OK) {
|
||||||
|
throw new Error(msg[status]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#push(data[, flush_mode]) -> Boolean
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data
|
||||||
|
* - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE
|
||||||
|
* flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,
|
||||||
|
* `true` means Z_FINISH.
|
||||||
|
*
|
||||||
|
* Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
|
||||||
|
* new output chunks. Returns `true` on success. If end of stream detected,
|
||||||
|
* [[Inflate#onEnd]] will be called.
|
||||||
|
*
|
||||||
|
* `flush_mode` is not needed for normal operation, because end of stream
|
||||||
|
* detected automatically. You may try to use it for advanced things, but
|
||||||
|
* this functionality was not tested.
|
||||||
|
*
|
||||||
|
* On fail call [[Inflate#onEnd]] with error code and return false.
|
||||||
|
*
|
||||||
|
* ##### Example
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* push(chunk, false); // push one of data chunks
|
||||||
|
* ...
|
||||||
|
* push(chunk, true); // push last chunk
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
Inflate.prototype.push = function (data, flush_mode) {
|
||||||
|
const strm = this.strm;
|
||||||
|
const chunkSize = this.options.chunkSize;
|
||||||
|
const dictionary = this.options.dictionary;
|
||||||
|
let status, _flush_mode, last_avail_out;
|
||||||
|
|
||||||
|
if (this.ended) return false;
|
||||||
|
|
||||||
|
if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;
|
||||||
|
else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;
|
||||||
|
|
||||||
|
// Convert data if needed
|
||||||
|
if (toString.call(data) === '[object ArrayBuffer]') {
|
||||||
|
strm.input = new Uint8Array(data);
|
||||||
|
} else {
|
||||||
|
strm.input = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.next_in = 0;
|
||||||
|
strm.avail_in = strm.input.length;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (strm.avail_out === 0) {
|
||||||
|
strm.output = new Uint8Array(chunkSize);
|
||||||
|
strm.next_out = 0;
|
||||||
|
strm.avail_out = chunkSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = inflate1(strm, _flush_mode);
|
||||||
|
|
||||||
|
if (status === Z_NEED_DICT && dictionary) {
|
||||||
|
status = inflateSetDictionary(strm, dictionary);
|
||||||
|
|
||||||
|
if (status === Z_OK) {
|
||||||
|
status = inflate1(strm, _flush_mode);
|
||||||
|
} else if (status === Z_DATA_ERROR) {
|
||||||
|
// Replace code with more verbose
|
||||||
|
status = Z_NEED_DICT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Skip snyc markers if more data follows and not raw mode
|
||||||
|
while (strm.avail_in > 0 &&
|
||||||
|
status === Z_STREAM_END &&
|
||||||
|
strm.state.wrap > 0 &&
|
||||||
|
data[strm.next_in] !== 0)
|
||||||
|
{
|
||||||
|
inflateReset(strm);
|
||||||
|
status = inflate1(strm, _flush_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
case Z_STREAM_ERROR:
|
||||||
|
case Z_DATA_ERROR:
|
||||||
|
case Z_NEED_DICT:
|
||||||
|
case Z_MEM_ERROR:
|
||||||
|
this.onEnd(status);
|
||||||
|
this.ended = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember real `avail_out` value, because we may patch out buffer content
|
||||||
|
// to align utf8 strings boundaries.
|
||||||
|
last_avail_out = strm.avail_out;
|
||||||
|
|
||||||
|
if (strm.next_out) {
|
||||||
|
if (strm.avail_out === 0 || status === Z_STREAM_END) {
|
||||||
|
|
||||||
|
if (this.options.to === 'string') {
|
||||||
|
|
||||||
|
let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
|
||||||
|
|
||||||
|
let tail = strm.next_out - next_out_utf8;
|
||||||
|
let utf8str = strings.buf2string(strm.output, next_out_utf8);
|
||||||
|
|
||||||
|
// move tail & realign counters
|
||||||
|
strm.next_out = tail;
|
||||||
|
strm.avail_out = chunkSize - tail;
|
||||||
|
if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);
|
||||||
|
|
||||||
|
this.onData(utf8str);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must repeat iteration if out buffer is full
|
||||||
|
if (status === Z_OK && last_avail_out === 0) continue;
|
||||||
|
|
||||||
|
// Finalize if end of stream reached.
|
||||||
|
if (status === Z_STREAM_END) {
|
||||||
|
status = inflateEnd(this.strm);
|
||||||
|
this.onEnd(status);
|
||||||
|
this.ended = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strm.avail_in === 0) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#onData(chunk) -> Void
|
||||||
|
* - chunk (Uint8Array|String): output data. When string output requested,
|
||||||
|
* each chunk will be string.
|
||||||
|
*
|
||||||
|
* By default, stores data blocks in `chunks[]` property and glue
|
||||||
|
* those in `onEnd`. Override this handler, if you need another behaviour.
|
||||||
|
**/
|
||||||
|
Inflate.prototype.onData = function (chunk) {
|
||||||
|
this.chunks.push(chunk);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inflate#onEnd(status) -> Void
|
||||||
|
* - status (Number): inflate status. 0 (Z_OK) on success,
|
||||||
|
* other if not.
|
||||||
|
*
|
||||||
|
* Called either after you tell inflate that the input stream is
|
||||||
|
* complete (Z_FINISH). By default - join collected chunks,
|
||||||
|
* free memory and fill `results` / `err` properties.
|
||||||
|
**/
|
||||||
|
Inflate.prototype.onEnd = function (status) {
|
||||||
|
// On success - join
|
||||||
|
if (status === Z_OK) {
|
||||||
|
if (this.options.to === 'string') {
|
||||||
|
this.result = this.chunks.join('');
|
||||||
|
} else {
|
||||||
|
this.result = utils.flattenChunks(this.chunks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.chunks = [];
|
||||||
|
this.err = status;
|
||||||
|
this.msg = this.strm.msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inflate(data[, options]) -> Uint8Array|String
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data to decompress.
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Decompress `data` with inflate/ungzip and `options`. Autodetect
|
||||||
|
* format via wrapper header by default. That's why we don't provide
|
||||||
|
* separate `ungzip` method.
|
||||||
|
*
|
||||||
|
* Supported options are:
|
||||||
|
*
|
||||||
|
* - windowBits
|
||||||
|
*
|
||||||
|
* [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* Sugar (options):
|
||||||
|
*
|
||||||
|
* - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
|
||||||
|
* negative windowBits implicitly.
|
||||||
|
* - `to` (String) - if equal to 'string', then result will be converted
|
||||||
|
* from utf8 to utf16 (javascript) string. When string output requested,
|
||||||
|
* chunk length can differ from `chunkSize`, depending on content.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* ##### Example:
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* const pako = require('pako');
|
||||||
|
* const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));
|
||||||
|
* let output;
|
||||||
|
*
|
||||||
|
* try {
|
||||||
|
* output = pako.inflate(input);
|
||||||
|
* } catch (err) {
|
||||||
|
* console.log(err);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
**/
|
||||||
|
function inflate(input, options) {
|
||||||
|
const inflator = new Inflate(options);
|
||||||
|
|
||||||
|
inflator.push(input);
|
||||||
|
|
||||||
|
// That will never happens, if you don't cheat with options :)
|
||||||
|
if (inflator.err) throw inflator.msg || msg[inflator.err];
|
||||||
|
|
||||||
|
return inflator.result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inflateRaw(data[, options]) -> Uint8Array|String
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data to decompress.
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* The same as [[inflate]], but creates raw data, without wrapper
|
||||||
|
* (header and adler32 crc).
|
||||||
|
**/
|
||||||
|
function inflateRaw(input, options) {
|
||||||
|
options = options || {};
|
||||||
|
options.raw = true;
|
||||||
|
return inflate(input, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ungzip(data[, options]) -> Uint8Array|String
|
||||||
|
* - data (Uint8Array|ArrayBuffer): input data to decompress.
|
||||||
|
* - options (Object): zlib inflate options.
|
||||||
|
*
|
||||||
|
* Just shortcut to [[inflate]], because it autodetects format
|
||||||
|
* by header.content. Done for convenience.
|
||||||
|
**/
|
||||||
|
var ungzip = inflate;
|
||||||
|
|
||||||
|
export {Inflate,inflate,inflateRaw,ungzip,constants}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
const _has = (obj, key) => {
|
||||||
|
return Object.prototype.hasOwnProperty.call(obj, key);
|
||||||
|
};
|
||||||
|
|
||||||
|
export var assign = function (obj /*from1, from2, from3, ...*/) {
|
||||||
|
const sources = Array.prototype.slice.call(arguments, 1);
|
||||||
|
while (sources.length) {
|
||||||
|
const source = sources.shift();
|
||||||
|
if (!source) { continue; }
|
||||||
|
|
||||||
|
if (typeof source !== 'object') {
|
||||||
|
throw new TypeError(source + 'must be non-object');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const p in source) {
|
||||||
|
if (_has(source, p)) {
|
||||||
|
obj[p] = source[p];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Join array of chunks to single array.
|
||||||
|
export var flattenChunks = (chunks) => {
|
||||||
|
// calculate data length
|
||||||
|
let len = 0;
|
||||||
|
|
||||||
|
for (let i = 0, l = chunks.length; i < l; i++) {
|
||||||
|
len += chunks[i].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// join chunks
|
||||||
|
const result = new Uint8Array(len);
|
||||||
|
|
||||||
|
for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {
|
||||||
|
let chunk = chunks[i];
|
||||||
|
result.set(chunk, pos);
|
||||||
|
pos += chunk.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
|
@ -0,0 +1,174 @@
|
||||||
|
// String encode/decode helpers
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
// Quick check if we can use fast array to bin string conversion
|
||||||
|
//
|
||||||
|
// - apply(Array) can fail on Android 2.2
|
||||||
|
// - apply(Uint8Array) can fail on iOS 5.1 Safari
|
||||||
|
//
|
||||||
|
let STR_APPLY_UIA_OK = true;
|
||||||
|
|
||||||
|
try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }
|
||||||
|
|
||||||
|
|
||||||
|
// Table with utf8 lengths (calculated by first byte of sequence)
|
||||||
|
// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
|
||||||
|
// because max possible codepoint is 0x10ffff
|
||||||
|
const _utf8len = new Uint8Array(256);
|
||||||
|
for (let q = 0; q < 256; q++) {
|
||||||
|
_utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
|
||||||
|
}
|
||||||
|
_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
|
||||||
|
|
||||||
|
|
||||||
|
// convert string to array (typed, when possible)
|
||||||
|
export var string2buf = (str) => {
|
||||||
|
// if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {
|
||||||
|
// return new TextEncoder().encode(str);
|
||||||
|
// }
|
||||||
|
|
||||||
|
let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
|
||||||
|
|
||||||
|
// count binary size
|
||||||
|
for (m_pos = 0; m_pos < str_len; m_pos++) {
|
||||||
|
c = str.charCodeAt(m_pos);
|
||||||
|
if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
|
||||||
|
c2 = str.charCodeAt(m_pos + 1);
|
||||||
|
if ((c2 & 0xfc00) === 0xdc00) {
|
||||||
|
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
|
||||||
|
m_pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// allocate buffer
|
||||||
|
buf = new Uint8Array(buf_len);
|
||||||
|
|
||||||
|
// convert
|
||||||
|
for (i = 0, m_pos = 0; i < buf_len; m_pos++) {
|
||||||
|
c = str.charCodeAt(m_pos);
|
||||||
|
if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {
|
||||||
|
c2 = str.charCodeAt(m_pos + 1);
|
||||||
|
if ((c2 & 0xfc00) === 0xdc00) {
|
||||||
|
c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
|
||||||
|
m_pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c < 0x80) {
|
||||||
|
/* one byte */
|
||||||
|
buf[i++] = c;
|
||||||
|
} else if (c < 0x800) {
|
||||||
|
/* two bytes */
|
||||||
|
buf[i++] = 0xC0 | (c >>> 6);
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f);
|
||||||
|
} else if (c < 0x10000) {
|
||||||
|
/* three bytes */
|
||||||
|
buf[i++] = 0xE0 | (c >>> 12);
|
||||||
|
buf[i++] = 0x80 | (c >>> 6 & 0x3f);
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f);
|
||||||
|
} else {
|
||||||
|
/* four bytes */
|
||||||
|
buf[i++] = 0xf0 | (c >>> 18);
|
||||||
|
buf[i++] = 0x80 | (c >>> 12 & 0x3f);
|
||||||
|
buf[i++] = 0x80 | (c >>> 6 & 0x3f);
|
||||||
|
buf[i++] = 0x80 | (c & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Helper
|
||||||
|
const buf2binstring = (buf, len) => {
|
||||||
|
// On Chrome, the arguments in a function call that are allowed is `65534`.
|
||||||
|
// If the length of the buffer is smaller than that, we can use this optimization,
|
||||||
|
// otherwise we will take a slower path.
|
||||||
|
if (len < 65534) {
|
||||||
|
if (buf.subarray && STR_APPLY_UIA_OK) {
|
||||||
|
return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
result += String.fromCharCode(buf[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// convert array to string
|
||||||
|
export var buf2string = (buf, max) => {
|
||||||
|
const len = max || buf.length;
|
||||||
|
|
||||||
|
// if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {
|
||||||
|
// return new TextDecoder().decode(buf.subarray(0, max));
|
||||||
|
// }
|
||||||
|
|
||||||
|
let i, out;
|
||||||
|
|
||||||
|
// Reserve max possible length (2 words per char)
|
||||||
|
// NB: by unknown reasons, Array is significantly faster for
|
||||||
|
// String.fromCharCode.apply than Uint16Array.
|
||||||
|
const utf16buf = new Array(len * 2);
|
||||||
|
|
||||||
|
for (out = 0, i = 0; i < len;) {
|
||||||
|
let c = buf[i++];
|
||||||
|
// quick process ascii
|
||||||
|
if (c < 0x80) { utf16buf[out++] = c; continue; }
|
||||||
|
|
||||||
|
let c_len = _utf8len[c];
|
||||||
|
// skip 5 & 6 byte codes
|
||||||
|
if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }
|
||||||
|
|
||||||
|
// apply mask on first byte
|
||||||
|
c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
|
||||||
|
// join the rest
|
||||||
|
while (c_len > 1 && i < len) {
|
||||||
|
c = (c << 6) | (buf[i++] & 0x3f);
|
||||||
|
c_len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// terminated by end of string?
|
||||||
|
if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
|
||||||
|
|
||||||
|
if (c < 0x10000) {
|
||||||
|
utf16buf[out++] = c;
|
||||||
|
} else {
|
||||||
|
c -= 0x10000;
|
||||||
|
utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
|
||||||
|
utf16buf[out++] = 0xdc00 | (c & 0x3ff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf2binstring(utf16buf, out);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate max possible position in utf8 buffer,
|
||||||
|
// that will not break sequence. If that's not possible
|
||||||
|
// - (very small limits) return max size as is.
|
||||||
|
//
|
||||||
|
// buf[] - utf8 bytes array
|
||||||
|
// max - length limit (mandatory);
|
||||||
|
export var utf8border = (buf, max) => {
|
||||||
|
|
||||||
|
max = max || buf.length;
|
||||||
|
if (max > buf.length) { max = buf.length; }
|
||||||
|
|
||||||
|
// go back from last position, until start of sequence found
|
||||||
|
let pos = max - 1;
|
||||||
|
while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
|
||||||
|
|
||||||
|
// Very small and broken sequence,
|
||||||
|
// return max, because we should return something anyway.
|
||||||
|
if (pos < 0) { return max; }
|
||||||
|
|
||||||
|
// If we came to start of buffer - that means buffer is too small,
|
||||||
|
// return max too.
|
||||||
|
if (pos === 0) { return max; }
|
||||||
|
|
||||||
|
return (pos + _utf8len[buf[pos]] > max) ? pos : max;
|
||||||
|
};
|
|
@ -0,0 +1,51 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Note: adler32 takes 12% for level 0 and 2% for level 6.
|
||||||
|
// It isn't worth it to make additional optimizations as in original.
|
||||||
|
// Small size is preferable.
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
const adler32 = (adler, buf, len, pos) => {
|
||||||
|
let s1 = (adler & 0xffff) |0,
|
||||||
|
s2 = ((adler >>> 16) & 0xffff) |0,
|
||||||
|
n = 0;
|
||||||
|
|
||||||
|
while (len !== 0) {
|
||||||
|
// Set limit ~ twice less than 5552, to keep
|
||||||
|
// s2 in 31-bits, because we force signed ints.
|
||||||
|
// in other case %= will fail.
|
||||||
|
n = len > 2000 ? 2000 : len;
|
||||||
|
len -= n;
|
||||||
|
|
||||||
|
do {
|
||||||
|
s1 = (s1 + buf[pos++]) |0;
|
||||||
|
s2 = (s2 + s1) |0;
|
||||||
|
} while (--n);
|
||||||
|
|
||||||
|
s1 %= 65521;
|
||||||
|
s2 %= 65521;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (s1 | (s2 << 16)) |0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default adler32;
|
|
@ -0,0 +1,71 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
export default {
|
||||||
|
|
||||||
|
/* Allowed flush values; see deflate() and inflate() below for details */
|
||||||
|
Z_NO_FLUSH: 0,
|
||||||
|
Z_PARTIAL_FLUSH: 1,
|
||||||
|
Z_SYNC_FLUSH: 2,
|
||||||
|
Z_FULL_FLUSH: 3,
|
||||||
|
Z_FINISH: 4,
|
||||||
|
Z_BLOCK: 5,
|
||||||
|
Z_TREES: 6,
|
||||||
|
|
||||||
|
/* Return codes for the compression/decompression functions. Negative values
|
||||||
|
* are errors, positive values are used for special but normal events.
|
||||||
|
*/
|
||||||
|
Z_OK: 0,
|
||||||
|
Z_STREAM_END: 1,
|
||||||
|
Z_NEED_DICT: 2,
|
||||||
|
Z_ERRNO: -1,
|
||||||
|
Z_STREAM_ERROR: -2,
|
||||||
|
Z_DATA_ERROR: -3,
|
||||||
|
Z_MEM_ERROR: -4,
|
||||||
|
Z_BUF_ERROR: -5,
|
||||||
|
//Z_VERSION_ERROR: -6,
|
||||||
|
|
||||||
|
/* compression levels */
|
||||||
|
Z_NO_COMPRESSION: 0,
|
||||||
|
Z_BEST_SPEED: 1,
|
||||||
|
Z_BEST_COMPRESSION: 9,
|
||||||
|
Z_DEFAULT_COMPRESSION: -1,
|
||||||
|
|
||||||
|
|
||||||
|
Z_FILTERED: 1,
|
||||||
|
Z_HUFFMAN_ONLY: 2,
|
||||||
|
Z_RLE: 3,
|
||||||
|
Z_FIXED: 4,
|
||||||
|
Z_DEFAULT_STRATEGY: 0,
|
||||||
|
|
||||||
|
/* Possible values of the data_type field (though see inflate()) */
|
||||||
|
Z_BINARY: 0,
|
||||||
|
Z_TEXT: 1,
|
||||||
|
//Z_ASCII: 1, // = Z_TEXT (deprecated)
|
||||||
|
Z_UNKNOWN: 2,
|
||||||
|
|
||||||
|
/* The deflate compression method */
|
||||||
|
Z_DEFLATED: 8
|
||||||
|
//Z_NULL: null // Use -1 or null inline, depending on var type
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Note: we can't get significant speed boost here.
|
||||||
|
// So write code to minimize size - no pregenerated tables
|
||||||
|
// and array tools dependencies.
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
// Use ordinary array, since untyped makes no boost here
|
||||||
|
const makeTable = () => {
|
||||||
|
let c, table = [];
|
||||||
|
|
||||||
|
for (var n = 0; n < 256; n++) {
|
||||||
|
c = n;
|
||||||
|
for (var k = 0; k < 8; k++) {
|
||||||
|
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
}
|
||||||
|
table[n] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return table;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create table on load. Just 255 signed longs. Not a problem.
|
||||||
|
const crcTable = new Uint32Array(makeTable());
|
||||||
|
|
||||||
|
|
||||||
|
const crc32 = (crc, buf, len, pos) => {
|
||||||
|
const t = crcTable;
|
||||||
|
const end = pos + len;
|
||||||
|
|
||||||
|
crc ^= -1;
|
||||||
|
|
||||||
|
for (let i = pos; i < end; i++) {
|
||||||
|
crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
|
||||||
|
}
|
||||||
|
|
||||||
|
return (crc ^ (-1)); // >>> 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default crc32;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
function GZheader() {
|
||||||
|
/* true if compressed data believed to be text */
|
||||||
|
this.text = 0;
|
||||||
|
/* modification time */
|
||||||
|
this.time = 0;
|
||||||
|
/* extra flags (not used when writing a gzip file) */
|
||||||
|
this.xflags = 0;
|
||||||
|
/* operating system */
|
||||||
|
this.os = 0;
|
||||||
|
/* pointer to extra field or Z_NULL if none */
|
||||||
|
this.extra = null;
|
||||||
|
/* extra field length (valid if extra != Z_NULL) */
|
||||||
|
this.extra_len = 0; // Actually, we don't need it in JS,
|
||||||
|
// but leave for few code modifications
|
||||||
|
|
||||||
|
//
|
||||||
|
// Setup limits is not necessary because in js we should not preallocate memory
|
||||||
|
// for inflate use constant limit in 65536 bytes
|
||||||
|
//
|
||||||
|
|
||||||
|
/* space at extra (only when reading header) */
|
||||||
|
// this.extra_max = 0;
|
||||||
|
/* pointer to zero-terminated file name or Z_NULL */
|
||||||
|
this.name = '';
|
||||||
|
/* space at name (only when reading header) */
|
||||||
|
// this.name_max = 0;
|
||||||
|
/* pointer to zero-terminated comment or Z_NULL */
|
||||||
|
this.comment = '';
|
||||||
|
/* space at comment (only when reading header) */
|
||||||
|
// this.comm_max = 0;
|
||||||
|
/* true if there was or will be a header crc */
|
||||||
|
this.hcrc = 0;
|
||||||
|
/* true when done reading gzip header (not used when writing a gzip file) */
|
||||||
|
this.done = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {GZheader};
|
|
@ -0,0 +1,344 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
// See state defs from inflate.js
|
||||||
|
const BAD = 16209; /* got a data error -- remain here until reset */
|
||||||
|
const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Decode literal, length, and distance codes and write out the resulting
|
||||||
|
literal and match bytes until either not enough input or output is
|
||||||
|
available, an end-of-block is encountered, or a data error is encountered.
|
||||||
|
When large enough input and output buffers are supplied to inflate(), for
|
||||||
|
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
||||||
|
inflate execution time is spent in this routine.
|
||||||
|
|
||||||
|
Entry assumptions:
|
||||||
|
|
||||||
|
state.mode === LEN
|
||||||
|
strm.avail_in >= 6
|
||||||
|
strm.avail_out >= 258
|
||||||
|
start >= strm.avail_out
|
||||||
|
state.bits < 8
|
||||||
|
|
||||||
|
On return, state.mode is one of:
|
||||||
|
|
||||||
|
LEN -- ran out of enough output space or enough available input
|
||||||
|
TYPE -- reached end of block code, inflate() to interpret next block
|
||||||
|
BAD -- error in block data
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- The maximum input bits used by a length/distance pair is 15 bits for the
|
||||||
|
length code, 5 bits for the length extra, 15 bits for the distance code,
|
||||||
|
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
||||||
|
Therefore if strm.avail_in >= 6, then there is enough input to avoid
|
||||||
|
checking for available input while decoding.
|
||||||
|
|
||||||
|
- The maximum bytes that a single length/distance pair can output is 258
|
||||||
|
bytes, which is the maximum length that can be coded. inflate_fast()
|
||||||
|
requires strm.avail_out >= 258 for each loop to avoid checking for
|
||||||
|
output space.
|
||||||
|
*/
|
||||||
|
export function inflate_fast(strm, start) {
|
||||||
|
let _in; /* local strm.input */
|
||||||
|
let last; /* have enough input while in < last */
|
||||||
|
let _out; /* local strm.output */
|
||||||
|
let beg; /* inflate()'s initial strm.output */
|
||||||
|
let end; /* while out < end, enough space available */
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
let dmax; /* maximum distance from zlib header */
|
||||||
|
//#endif
|
||||||
|
let wsize; /* window size or zero if not using window */
|
||||||
|
let whave; /* valid bytes in the window */
|
||||||
|
let wnext; /* window write index */
|
||||||
|
// Use `s_window` instead `window`, avoid conflict with instrumentation tools
|
||||||
|
let s_window; /* allocated sliding window, if wsize != 0 */
|
||||||
|
let hold; /* local strm.hold */
|
||||||
|
let bits; /* local strm.bits */
|
||||||
|
let lcode; /* local strm.lencode */
|
||||||
|
let dcode; /* local strm.distcode */
|
||||||
|
let lmask; /* mask for first level of length codes */
|
||||||
|
let dmask; /* mask for first level of distance codes */
|
||||||
|
let here; /* retrieved table entry */
|
||||||
|
let op; /* code bits, operation, extra bits, or */
|
||||||
|
/* window position, window bytes to copy */
|
||||||
|
let len; /* match length, unused bytes */
|
||||||
|
let dist; /* match distance */
|
||||||
|
let from; /* where to copy match from */
|
||||||
|
let from_source;
|
||||||
|
|
||||||
|
|
||||||
|
let input, output; // JS specific, because we have no pointers
|
||||||
|
|
||||||
|
/* copy state to local variables */
|
||||||
|
const state = strm.state;
|
||||||
|
//here = state.here;
|
||||||
|
_in = strm.next_in;
|
||||||
|
input = strm.input;
|
||||||
|
last = _in + (strm.avail_in - 5);
|
||||||
|
_out = strm.next_out;
|
||||||
|
output = strm.output;
|
||||||
|
beg = _out - (start - strm.avail_out);
|
||||||
|
end = _out + (strm.avail_out - 257);
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
dmax = state.dmax;
|
||||||
|
//#endif
|
||||||
|
wsize = state.wsize;
|
||||||
|
whave = state.whave;
|
||||||
|
wnext = state.wnext;
|
||||||
|
s_window = state.window;
|
||||||
|
hold = state.hold;
|
||||||
|
bits = state.bits;
|
||||||
|
lcode = state.lencode;
|
||||||
|
dcode = state.distcode;
|
||||||
|
lmask = (1 << state.lenbits) - 1;
|
||||||
|
dmask = (1 << state.distbits) - 1;
|
||||||
|
|
||||||
|
|
||||||
|
/* decode literals and length/distances until end-of-block or not enough
|
||||||
|
input data or output space */
|
||||||
|
|
||||||
|
top:
|
||||||
|
do {
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
here = lcode[hold & lmask];
|
||||||
|
|
||||||
|
dolen:
|
||||||
|
for (;;) { // Goto emulation
|
||||||
|
op = here >>> 24/*here.bits*/;
|
||||||
|
hold >>>= op;
|
||||||
|
bits -= op;
|
||||||
|
op = (here >>> 16) & 0xff/*here.op*/;
|
||||||
|
if (op === 0) { /* literal */
|
||||||
|
//Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
|
||||||
|
// "inflate: literal '%c'\n" :
|
||||||
|
// "inflate: literal 0x%02x\n", here.val));
|
||||||
|
output[_out++] = here & 0xffff/*here.val*/;
|
||||||
|
}
|
||||||
|
else if (op & 16) { /* length base */
|
||||||
|
len = here & 0xffff/*here.val*/;
|
||||||
|
op &= 15; /* number of extra bits */
|
||||||
|
if (op) {
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
len += hold & ((1 << op) - 1);
|
||||||
|
hold >>>= op;
|
||||||
|
bits -= op;
|
||||||
|
}
|
||||||
|
//Tracevv((stderr, "inflate: length %u\n", len));
|
||||||
|
if (bits < 15) {
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
here = dcode[hold & dmask];
|
||||||
|
|
||||||
|
dodist:
|
||||||
|
for (;;) { // goto emulation
|
||||||
|
op = here >>> 24/*here.bits*/;
|
||||||
|
hold >>>= op;
|
||||||
|
bits -= op;
|
||||||
|
op = (here >>> 16) & 0xff/*here.op*/;
|
||||||
|
|
||||||
|
if (op & 16) { /* distance base */
|
||||||
|
dist = here & 0xffff/*here.val*/;
|
||||||
|
op &= 15; /* number of extra bits */
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
if (bits < op) {
|
||||||
|
hold += input[_in++] << bits;
|
||||||
|
bits += 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dist += hold & ((1 << op) - 1);
|
||||||
|
//#ifdef INFLATE_STRICT
|
||||||
|
if (dist > dmax) {
|
||||||
|
strm.msg = 'invalid distance too far back';
|
||||||
|
state.mode = BAD;
|
||||||
|
break top;
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
hold >>>= op;
|
||||||
|
bits -= op;
|
||||||
|
//Tracevv((stderr, "inflate: distance %u\n", dist));
|
||||||
|
op = _out - beg; /* max distance in output */
|
||||||
|
if (dist > op) { /* see if copy from window */
|
||||||
|
op = dist - op; /* distance back in window */
|
||||||
|
if (op > whave) {
|
||||||
|
if (state.sane) {
|
||||||
|
strm.msg = 'invalid distance too far back';
|
||||||
|
state.mode = BAD;
|
||||||
|
break top;
|
||||||
|
}
|
||||||
|
|
||||||
|
// (!) This block is disabled in zlib defaults,
|
||||||
|
// don't enable it for binary compatibility
|
||||||
|
//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
|
||||||
|
// if (len <= op - whave) {
|
||||||
|
// do {
|
||||||
|
// output[_out++] = 0;
|
||||||
|
// } while (--len);
|
||||||
|
// continue top;
|
||||||
|
// }
|
||||||
|
// len -= op - whave;
|
||||||
|
// do {
|
||||||
|
// output[_out++] = 0;
|
||||||
|
// } while (--op > whave);
|
||||||
|
// if (op === 0) {
|
||||||
|
// from = _out - dist;
|
||||||
|
// do {
|
||||||
|
// output[_out++] = output[from++];
|
||||||
|
// } while (--len);
|
||||||
|
// continue top;
|
||||||
|
// }
|
||||||
|
//#endif
|
||||||
|
}
|
||||||
|
from = 0; // window index
|
||||||
|
from_source = s_window;
|
||||||
|
if (wnext === 0) { /* very common case */
|
||||||
|
from += wsize - op;
|
||||||
|
if (op < len) { /* some from window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++];
|
||||||
|
} while (--op);
|
||||||
|
from = _out - dist; /* rest from output */
|
||||||
|
from_source = output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (wnext < op) { /* wrap around window */
|
||||||
|
from += wsize + wnext - op;
|
||||||
|
op -= wnext;
|
||||||
|
if (op < len) { /* some from end of window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++];
|
||||||
|
} while (--op);
|
||||||
|
from = 0;
|
||||||
|
if (wnext < len) { /* some from start of window */
|
||||||
|
op = wnext;
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++];
|
||||||
|
} while (--op);
|
||||||
|
from = _out - dist; /* rest from output */
|
||||||
|
from_source = output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { /* contiguous in window */
|
||||||
|
from += wnext - op;
|
||||||
|
if (op < len) { /* some from window */
|
||||||
|
len -= op;
|
||||||
|
do {
|
||||||
|
output[_out++] = s_window[from++];
|
||||||
|
} while (--op);
|
||||||
|
from = _out - dist; /* rest from output */
|
||||||
|
from_source = output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (len > 2) {
|
||||||
|
output[_out++] = from_source[from++];
|
||||||
|
output[_out++] = from_source[from++];
|
||||||
|
output[_out++] = from_source[from++];
|
||||||
|
len -= 3;
|
||||||
|
}
|
||||||
|
if (len) {
|
||||||
|
output[_out++] = from_source[from++];
|
||||||
|
if (len > 1) {
|
||||||
|
output[_out++] = from_source[from++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
from = _out - dist; /* copy direct from output */
|
||||||
|
do { /* minimum length is three */
|
||||||
|
output[_out++] = output[from++];
|
||||||
|
output[_out++] = output[from++];
|
||||||
|
output[_out++] = output[from++];
|
||||||
|
len -= 3;
|
||||||
|
} while (len > 2);
|
||||||
|
if (len) {
|
||||||
|
output[_out++] = output[from++];
|
||||||
|
if (len > 1) {
|
||||||
|
output[_out++] = output[from++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((op & 64) === 0) { /* 2nd level distance code */
|
||||||
|
here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
|
||||||
|
continue dodist;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strm.msg = 'invalid distance code';
|
||||||
|
state.mode = BAD;
|
||||||
|
break top;
|
||||||
|
}
|
||||||
|
|
||||||
|
break; // need to emulate goto via "continue"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((op & 64) === 0) { /* 2nd level length code */
|
||||||
|
here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
|
||||||
|
continue dolen;
|
||||||
|
}
|
||||||
|
else if (op & 32) { /* end-of-block */
|
||||||
|
//Tracevv((stderr, "inflate: end of block\n"));
|
||||||
|
state.mode = TYPE;
|
||||||
|
break top;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strm.msg = 'invalid literal/length code';
|
||||||
|
state.mode = BAD;
|
||||||
|
break top;
|
||||||
|
}
|
||||||
|
|
||||||
|
break; // need to emulate goto via "continue"
|
||||||
|
}
|
||||||
|
} while (_in < last && _out < end);
|
||||||
|
|
||||||
|
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
||||||
|
len = bits >> 3;
|
||||||
|
_in -= len;
|
||||||
|
bits -= len << 3;
|
||||||
|
hold &= (1 << bits) - 1;
|
||||||
|
|
||||||
|
/* update state and return */
|
||||||
|
strm.next_in = _in;
|
||||||
|
strm.next_out = _out;
|
||||||
|
strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
|
||||||
|
strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
|
||||||
|
state.hold = hold;
|
||||||
|
state.bits = bits;
|
||||||
|
return;
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,340 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
const MAXBITS = 15;
|
||||||
|
const ENOUGH_LENS = 852;
|
||||||
|
const ENOUGH_DISTS = 592;
|
||||||
|
//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
|
||||||
|
|
||||||
|
const CODES = 0;
|
||||||
|
const LENS = 1;
|
||||||
|
const DISTS = 2;
|
||||||
|
|
||||||
|
const lbase = new Uint16Array([ /* Length codes 257..285 base */
|
||||||
|
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
|
||||||
|
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
|
||||||
|
]);
|
||||||
|
|
||||||
|
const lext = new Uint8Array([ /* Length codes 257..285 extra */
|
||||||
|
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
|
||||||
|
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
|
||||||
|
]);
|
||||||
|
|
||||||
|
const dbase = new Uint16Array([ /* Distance codes 0..29 base */
|
||||||
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
|
||||||
|
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
|
||||||
|
8193, 12289, 16385, 24577, 0, 0
|
||||||
|
]);
|
||||||
|
|
||||||
|
const dext = new Uint8Array([ /* Distance codes 0..29 extra */
|
||||||
|
16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
|
||||||
|
23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
|
||||||
|
28, 28, 29, 29, 64, 64
|
||||||
|
]);
|
||||||
|
|
||||||
|
const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>
|
||||||
|
{
|
||||||
|
const bits = opts.bits;
|
||||||
|
//here = opts.here; /* table entry for duplication */
|
||||||
|
|
||||||
|
let len = 0; /* a code's length in bits */
|
||||||
|
let sym = 0; /* index of code symbols */
|
||||||
|
let min = 0, max = 0; /* minimum and maximum code lengths */
|
||||||
|
let root = 0; /* number of index bits for root table */
|
||||||
|
let curr = 0; /* number of index bits for current table */
|
||||||
|
let drop = 0; /* code bits to drop for sub-table */
|
||||||
|
let left = 0; /* number of prefix codes available */
|
||||||
|
let used = 0; /* code entries in table used */
|
||||||
|
let huff = 0; /* Huffman code */
|
||||||
|
let incr; /* for incrementing code, index */
|
||||||
|
let fill; /* index for replicating entries */
|
||||||
|
let low; /* low bits for current root entry */
|
||||||
|
let mask; /* mask for low root bits */
|
||||||
|
let next; /* next available space in table */
|
||||||
|
let base = null; /* base value table to use */
|
||||||
|
// let shoextra; /* extra bits table to use */
|
||||||
|
let match; /* use base and extra for symbol >= match */
|
||||||
|
const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */
|
||||||
|
const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */
|
||||||
|
let extra = null;
|
||||||
|
|
||||||
|
let here_bits, here_op, here_val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Process a set of code lengths to create a canonical Huffman code. The
|
||||||
|
code lengths are lens[0..codes-1]. Each length corresponds to the
|
||||||
|
symbols 0..codes-1. The Huffman code is generated by first sorting the
|
||||||
|
symbols by length from short to long, and retaining the symbol order
|
||||||
|
for codes with equal lengths. Then the code starts with all zero bits
|
||||||
|
for the first code of the shortest length, and the codes are integer
|
||||||
|
increments for the same length, and zeros are appended as the length
|
||||||
|
increases. For the deflate format, these bits are stored backwards
|
||||||
|
from their more natural integer increment ordering, and so when the
|
||||||
|
decoding tables are built in the large loop below, the integer codes
|
||||||
|
are incremented backwards.
|
||||||
|
|
||||||
|
This routine assumes, but does not check, that all of the entries in
|
||||||
|
lens[] are in the range 0..MAXBITS. The caller must assure this.
|
||||||
|
1..MAXBITS is interpreted as that code length. zero means that that
|
||||||
|
symbol does not occur in this code.
|
||||||
|
|
||||||
|
The codes are sorted by computing a count of codes for each length,
|
||||||
|
creating from that a table of starting indices for each length in the
|
||||||
|
sorted table, and then entering the symbols in order in the sorted
|
||||||
|
table. The sorted table is work[], with that space being provided by
|
||||||
|
the caller.
|
||||||
|
|
||||||
|
The length counts are used for other purposes as well, i.e. finding
|
||||||
|
the minimum and maximum length codes, determining if there are any
|
||||||
|
codes at all, checking for a valid set of lengths, and looking ahead
|
||||||
|
at length counts to determine sub-table sizes when building the
|
||||||
|
decoding tables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
|
||||||
|
for (len = 0; len <= MAXBITS; len++) {
|
||||||
|
count[len] = 0;
|
||||||
|
}
|
||||||
|
for (sym = 0; sym < codes; sym++) {
|
||||||
|
count[lens[lens_index + sym]]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bound code lengths, force root to be within code lengths */
|
||||||
|
root = bits;
|
||||||
|
for (max = MAXBITS; max >= 1; max--) {
|
||||||
|
if (count[max] !== 0) { break; }
|
||||||
|
}
|
||||||
|
if (root > max) {
|
||||||
|
root = max;
|
||||||
|
}
|
||||||
|
if (max === 0) { /* no symbols to code at all */
|
||||||
|
//table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
|
||||||
|
//table.bits[opts.table_index] = 1; //here.bits = (var char)1;
|
||||||
|
//table.val[opts.table_index++] = 0; //here.val = (var short)0;
|
||||||
|
table[table_index++] = (1 << 24) | (64 << 16) | 0;
|
||||||
|
|
||||||
|
|
||||||
|
//table.op[opts.table_index] = 64;
|
||||||
|
//table.bits[opts.table_index] = 1;
|
||||||
|
//table.val[opts.table_index++] = 0;
|
||||||
|
table[table_index++] = (1 << 24) | (64 << 16) | 0;
|
||||||
|
|
||||||
|
opts.bits = 1;
|
||||||
|
return 0; /* no symbols, but wait for decoding to report error */
|
||||||
|
}
|
||||||
|
for (min = 1; min < max; min++) {
|
||||||
|
if (count[min] !== 0) { break; }
|
||||||
|
}
|
||||||
|
if (root < min) {
|
||||||
|
root = min;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for an over-subscribed or incomplete set of lengths */
|
||||||
|
left = 1;
|
||||||
|
for (len = 1; len <= MAXBITS; len++) {
|
||||||
|
left <<= 1;
|
||||||
|
left -= count[len];
|
||||||
|
if (left < 0) {
|
||||||
|
return -1;
|
||||||
|
} /* over-subscribed */
|
||||||
|
}
|
||||||
|
if (left > 0 && (type === CODES || max !== 1)) {
|
||||||
|
return -1; /* incomplete set */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* generate offsets into symbol table for each length for sorting */
|
||||||
|
offs[1] = 0;
|
||||||
|
for (len = 1; len < MAXBITS; len++) {
|
||||||
|
offs[len + 1] = offs[len] + count[len];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sort symbols by length, by symbol order within each length */
|
||||||
|
for (sym = 0; sym < codes; sym++) {
|
||||||
|
if (lens[lens_index + sym] !== 0) {
|
||||||
|
work[offs[lens[lens_index + sym]]++] = sym;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Create and fill in decoding tables. In this loop, the table being
|
||||||
|
filled is at next and has curr index bits. The code being used is huff
|
||||||
|
with length len. That code is converted to an index by dropping drop
|
||||||
|
bits off of the bottom. For codes where len is less than drop + curr,
|
||||||
|
those top drop + curr - len bits are incremented through all values to
|
||||||
|
fill the table with replicated entries.
|
||||||
|
|
||||||
|
root is the number of index bits for the root table. When len exceeds
|
||||||
|
root, sub-tables are created pointed to by the root entry with an index
|
||||||
|
of the low root bits of huff. This is saved in low to check for when a
|
||||||
|
new sub-table should be started. drop is zero when the root table is
|
||||||
|
being filled, and drop is root when sub-tables are being filled.
|
||||||
|
|
||||||
|
When a new sub-table is needed, it is necessary to look ahead in the
|
||||||
|
code lengths to determine what size sub-table is needed. The length
|
||||||
|
counts are used for this, and so count[] is decremented as codes are
|
||||||
|
entered in the tables.
|
||||||
|
|
||||||
|
used keeps track of how many table entries have been allocated from the
|
||||||
|
provided *table space. It is checked for LENS and DIST tables against
|
||||||
|
the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
|
||||||
|
the initial root table size constants. See the comments in inftrees.h
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
sym increments through all symbols, and the loop terminates when
|
||||||
|
all codes of length max, i.e. all codes, have been processed. This
|
||||||
|
routine permits incomplete codes, so another loop after this one fills
|
||||||
|
in the rest of the decoding tables with invalid code markers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* set up for code type */
|
||||||
|
// poor man optimization - use if-else instead of switch,
|
||||||
|
// to avoid deopts in old v8
|
||||||
|
if (type === CODES) {
|
||||||
|
base = extra = work; /* dummy value--not used */
|
||||||
|
match = 20;
|
||||||
|
|
||||||
|
} else if (type === LENS) {
|
||||||
|
base = lbase;
|
||||||
|
extra = lext;
|
||||||
|
match = 257;
|
||||||
|
|
||||||
|
} else { /* DISTS */
|
||||||
|
base = dbase;
|
||||||
|
extra = dext;
|
||||||
|
match = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize opts for loop */
|
||||||
|
huff = 0; /* starting code */
|
||||||
|
sym = 0; /* starting code symbol */
|
||||||
|
len = min; /* starting code length */
|
||||||
|
next = table_index; /* current table to fill in */
|
||||||
|
curr = root; /* current table index bits */
|
||||||
|
drop = 0; /* current bits to drop from code for index */
|
||||||
|
low = -1; /* trigger new sub-table when len > root */
|
||||||
|
used = 1 << root; /* use root table entries */
|
||||||
|
mask = used - 1; /* mask for comparing low */
|
||||||
|
|
||||||
|
/* check available table space */
|
||||||
|
if ((type === LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type === DISTS && used > ENOUGH_DISTS)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* process all codes and make table entries */
|
||||||
|
for (;;) {
|
||||||
|
/* create table entry */
|
||||||
|
here_bits = len - drop;
|
||||||
|
if (work[sym] + 1 < match) {
|
||||||
|
here_op = 0;
|
||||||
|
here_val = work[sym];
|
||||||
|
}
|
||||||
|
else if (work[sym] >= match) {
|
||||||
|
here_op = extra[work[sym] - match];
|
||||||
|
here_val = base[work[sym] - match];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
here_op = 32 + 64; /* end of block */
|
||||||
|
here_val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replicate for those indices with low len bits equal to huff */
|
||||||
|
incr = 1 << (len - drop);
|
||||||
|
fill = 1 << curr;
|
||||||
|
min = fill; /* save offset to next table */
|
||||||
|
do {
|
||||||
|
fill -= incr;
|
||||||
|
table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
|
||||||
|
} while (fill !== 0);
|
||||||
|
|
||||||
|
/* backwards increment the len-bit code huff */
|
||||||
|
incr = 1 << (len - 1);
|
||||||
|
while (huff & incr) {
|
||||||
|
incr >>= 1;
|
||||||
|
}
|
||||||
|
if (incr !== 0) {
|
||||||
|
huff &= incr - 1;
|
||||||
|
huff += incr;
|
||||||
|
} else {
|
||||||
|
huff = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go to next symbol, update count, len */
|
||||||
|
sym++;
|
||||||
|
if (--count[len] === 0) {
|
||||||
|
if (len === max) { break; }
|
||||||
|
len = lens[lens_index + work[sym]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create new sub-table if needed */
|
||||||
|
if (len > root && (huff & mask) !== low) {
|
||||||
|
/* if first time, transition to sub-tables */
|
||||||
|
if (drop === 0) {
|
||||||
|
drop = root;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increment past last table */
|
||||||
|
next += min; /* here min is 1 << curr */
|
||||||
|
|
||||||
|
/* determine length of next table */
|
||||||
|
curr = len - drop;
|
||||||
|
left = 1 << curr;
|
||||||
|
while (curr + drop < max) {
|
||||||
|
left -= count[curr + drop];
|
||||||
|
if (left <= 0) { break; }
|
||||||
|
curr++;
|
||||||
|
left <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for enough space */
|
||||||
|
used += 1 << curr;
|
||||||
|
if ((type === LENS && used > ENOUGH_LENS) ||
|
||||||
|
(type === DISTS && used > ENOUGH_DISTS)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* point entry in root table to sub-table */
|
||||||
|
low = huff & mask;
|
||||||
|
/*table.op[low] = curr;
|
||||||
|
table.bits[low] = root;
|
||||||
|
table.val[low] = next - opts.table_index;*/
|
||||||
|
table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fill in remaining table entry if code is incomplete (guaranteed to have
|
||||||
|
at most one remaining entry, since if the code is incomplete, the
|
||||||
|
maximum code length that was allowed to get this far is one bit) */
|
||||||
|
if (huff !== 0) {
|
||||||
|
//table.op[next + huff] = 64; /* invalid code marker */
|
||||||
|
//table.bits[next + huff] = len - drop;
|
||||||
|
//table.val[next + huff] = 0;
|
||||||
|
table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set return parameters */
|
||||||
|
//opts.table_index += used;
|
||||||
|
opts.bits = root;
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export {inflate_table};
|
|
@ -0,0 +1,32 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
export default {
|
||||||
|
2: 'need dictionary', /* Z_NEED_DICT 2 */
|
||||||
|
1: 'stream end', /* Z_STREAM_END 1 */
|
||||||
|
0: '', /* Z_OK 0 */
|
||||||
|
'-1': 'file error', /* Z_ERRNO (-1) */
|
||||||
|
'-2': 'stream error', /* Z_STREAM_ERROR (-2) */
|
||||||
|
'-3': 'data error', /* Z_DATA_ERROR (-3) */
|
||||||
|
'-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
|
||||||
|
'-5': 'buffer error', /* Z_BUF_ERROR (-5) */
|
||||||
|
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,47 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// (C) 1995-2013 Jean-loup Gailly and Mark Adler
|
||||||
|
// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
function ZStream() {
|
||||||
|
/* next input byte */
|
||||||
|
this.input = null; // JS specific, because we have no pointers
|
||||||
|
this.next_in = 0;
|
||||||
|
/* number of bytes available at input */
|
||||||
|
this.avail_in = 0;
|
||||||
|
/* total number of input bytes read so far */
|
||||||
|
this.total_in = 0;
|
||||||
|
/* next output byte should be put there */
|
||||||
|
this.output = null; // JS specific, because we have no pointers
|
||||||
|
this.next_out = 0;
|
||||||
|
/* remaining free space at output */
|
||||||
|
this.avail_out = 0;
|
||||||
|
/* total number of bytes output so far */
|
||||||
|
this.total_out = 0;
|
||||||
|
/* last error message, NULL if no error */
|
||||||
|
this.msg = ''/*Z_NULL*/;
|
||||||
|
/* not visible by applications */
|
||||||
|
this.state = null;
|
||||||
|
/* best guess about the data type: binary or text */
|
||||||
|
this.data_type = 2/*Z_UNKNOWN*/;
|
||||||
|
/* adler32 value of the uncompressed data */
|
||||||
|
this.adler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {ZStream};
|
|
@ -0,0 +1,741 @@
|
||||||
|
import buffer from '@ohos.buffer';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fastest md5 implementation around (JKM md5).
|
||||||
|
* Credits: Joseph Myers
|
||||||
|
*
|
||||||
|
* @see http://www.myersdaily.org/joseph/javascript/md5-text.html
|
||||||
|
* @see http://jsperf.com/md5-shootout/7
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* this function is much faster,
|
||||||
|
so if possible we use it. Some IEs
|
||||||
|
are the only ones I know of that
|
||||||
|
need the idiotic second function,
|
||||||
|
generated by an if clause. */
|
||||||
|
var add32 = function (a, b) {
|
||||||
|
return (a + b) & 0xFFFFFFFF;
|
||||||
|
},
|
||||||
|
hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
||||||
|
|
||||||
|
|
||||||
|
function cmn(q, a, b, x, s, t) {
|
||||||
|
a = add32(add32(a, q), add32(x, t));
|
||||||
|
return add32((a << s) | (a >>> (32 - s)), b);
|
||||||
|
}
|
||||||
|
|
||||||
|
function md5cycle(x, k) {
|
||||||
|
var a = x[0],
|
||||||
|
b = x[1],
|
||||||
|
c = x[2],
|
||||||
|
d = x[3];
|
||||||
|
|
||||||
|
a += (b & c | ~b & d) + k[0] - 680876936 | 0;
|
||||||
|
a = (a << 7 | a >>> 25) + b | 0;
|
||||||
|
d += (a & b | ~a & c) + k[1] - 389564586 | 0;
|
||||||
|
d = (d << 12 | d >>> 20) + a | 0;
|
||||||
|
c += (d & a | ~d & b) + k[2] + 606105819 | 0;
|
||||||
|
c = (c << 17 | c >>> 15) + d | 0;
|
||||||
|
b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
|
||||||
|
b = (b << 22 | b >>> 10) + c | 0;
|
||||||
|
a += (b & c | ~b & d) + k[4] - 176418897 | 0;
|
||||||
|
a = (a << 7 | a >>> 25) + b | 0;
|
||||||
|
d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
|
||||||
|
d = (d << 12 | d >>> 20) + a | 0;
|
||||||
|
c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
|
||||||
|
c = (c << 17 | c >>> 15) + d | 0;
|
||||||
|
b += (c & d | ~c & a) + k[7] - 45705983 | 0;
|
||||||
|
b = (b << 22 | b >>> 10) + c | 0;
|
||||||
|
a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
|
||||||
|
a = (a << 7 | a >>> 25) + b | 0;
|
||||||
|
d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
|
||||||
|
d = (d << 12 | d >>> 20) + a | 0;
|
||||||
|
c += (d & a | ~d & b) + k[10] - 42063 | 0;
|
||||||
|
c = (c << 17 | c >>> 15) + d | 0;
|
||||||
|
b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
|
||||||
|
b = (b << 22 | b >>> 10) + c | 0;
|
||||||
|
a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
|
||||||
|
a = (a << 7 | a >>> 25) + b | 0;
|
||||||
|
d += (a & b | ~a & c) + k[13] - 40341101 | 0;
|
||||||
|
d = (d << 12 | d >>> 20) + a | 0;
|
||||||
|
c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
|
||||||
|
c = (c << 17 | c >>> 15) + d | 0;
|
||||||
|
b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
|
||||||
|
b = (b << 22 | b >>> 10) + c | 0;
|
||||||
|
|
||||||
|
a += (b & d | c & ~d) + k[1] - 165796510 | 0;
|
||||||
|
a = (a << 5 | a >>> 27) + b | 0;
|
||||||
|
d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
|
||||||
|
d = (d << 9 | d >>> 23) + a | 0;
|
||||||
|
c += (d & b | a & ~b) + k[11] + 643717713 | 0;
|
||||||
|
c = (c << 14 | c >>> 18) + d | 0;
|
||||||
|
b += (c & a | d & ~a) + k[0] - 373897302 | 0;
|
||||||
|
b = (b << 20 | b >>> 12) + c | 0;
|
||||||
|
a += (b & d | c & ~d) + k[5] - 701558691 | 0;
|
||||||
|
a = (a << 5 | a >>> 27) + b | 0;
|
||||||
|
d += (a & c | b & ~c) + k[10] + 38016083 | 0;
|
||||||
|
d = (d << 9 | d >>> 23) + a | 0;
|
||||||
|
c += (d & b | a & ~b) + k[15] - 660478335 | 0;
|
||||||
|
c = (c << 14 | c >>> 18) + d | 0;
|
||||||
|
b += (c & a | d & ~a) + k[4] - 405537848 | 0;
|
||||||
|
b = (b << 20 | b >>> 12) + c | 0;
|
||||||
|
a += (b & d | c & ~d) + k[9] + 568446438 | 0;
|
||||||
|
a = (a << 5 | a >>> 27) + b | 0;
|
||||||
|
d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
|
||||||
|
d = (d << 9 | d >>> 23) + a | 0;
|
||||||
|
c += (d & b | a & ~b) + k[3] - 187363961 | 0;
|
||||||
|
c = (c << 14 | c >>> 18) + d | 0;
|
||||||
|
b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
|
||||||
|
b = (b << 20 | b >>> 12) + c | 0;
|
||||||
|
a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
|
||||||
|
a = (a << 5 | a >>> 27) + b | 0;
|
||||||
|
d += (a & c | b & ~c) + k[2] - 51403784 | 0;
|
||||||
|
d = (d << 9 | d >>> 23) + a | 0;
|
||||||
|
c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
|
||||||
|
c = (c << 14 | c >>> 18) + d | 0;
|
||||||
|
b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
|
||||||
|
b = (b << 20 | b >>> 12) + c | 0;
|
||||||
|
|
||||||
|
a += (b ^ c ^ d) + k[5] - 378558 | 0;
|
||||||
|
a = (a << 4 | a >>> 28) + b | 0;
|
||||||
|
d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
|
||||||
|
d = (d << 11 | d >>> 21) + a | 0;
|
||||||
|
c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
|
||||||
|
c = (c << 16 | c >>> 16) + d | 0;
|
||||||
|
b += (c ^ d ^ a) + k[14] - 35309556 | 0;
|
||||||
|
b = (b << 23 | b >>> 9) + c | 0;
|
||||||
|
a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
|
||||||
|
a = (a << 4 | a >>> 28) + b | 0;
|
||||||
|
d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
|
||||||
|
d = (d << 11 | d >>> 21) + a | 0;
|
||||||
|
c += (d ^ a ^ b) + k[7] - 155497632 | 0;
|
||||||
|
c = (c << 16 | c >>> 16) + d | 0;
|
||||||
|
b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
|
||||||
|
b = (b << 23 | b >>> 9) + c | 0;
|
||||||
|
a += (b ^ c ^ d) + k[13] + 681279174 | 0;
|
||||||
|
a = (a << 4 | a >>> 28) + b | 0;
|
||||||
|
d += (a ^ b ^ c) + k[0] - 358537222 | 0;
|
||||||
|
d = (d << 11 | d >>> 21) + a | 0;
|
||||||
|
c += (d ^ a ^ b) + k[3] - 722521979 | 0;
|
||||||
|
c = (c << 16 | c >>> 16) + d | 0;
|
||||||
|
b += (c ^ d ^ a) + k[6] + 76029189 | 0;
|
||||||
|
b = (b << 23 | b >>> 9) + c | 0;
|
||||||
|
a += (b ^ c ^ d) + k[9] - 640364487 | 0;
|
||||||
|
a = (a << 4 | a >>> 28) + b | 0;
|
||||||
|
d += (a ^ b ^ c) + k[12] - 421815835 | 0;
|
||||||
|
d = (d << 11 | d >>> 21) + a | 0;
|
||||||
|
c += (d ^ a ^ b) + k[15] + 530742520 | 0;
|
||||||
|
c = (c << 16 | c >>> 16) + d | 0;
|
||||||
|
b += (c ^ d ^ a) + k[2] - 995338651 | 0;
|
||||||
|
b = (b << 23 | b >>> 9) + c | 0;
|
||||||
|
|
||||||
|
a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
|
||||||
|
a = (a << 6 | a >>> 26) + b | 0;
|
||||||
|
d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
|
||||||
|
d = (d << 10 | d >>> 22) + a | 0;
|
||||||
|
c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
|
||||||
|
c = (c << 15 | c >>> 17) + d | 0;
|
||||||
|
b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
|
||||||
|
b = (b << 21 | b >>> 11) + c | 0;
|
||||||
|
a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
|
||||||
|
a = (a << 6 | a >>> 26) + b | 0;
|
||||||
|
d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
|
||||||
|
d = (d << 10 | d >>> 22) + a | 0;
|
||||||
|
c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
|
||||||
|
c = (c << 15 | c >>> 17) + d | 0;
|
||||||
|
b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
|
||||||
|
b = (b << 21 | b >>> 11) + c | 0;
|
||||||
|
a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
|
||||||
|
a = (a << 6 | a >>> 26) + b | 0;
|
||||||
|
d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
|
||||||
|
d = (d << 10 | d >>> 22) + a | 0;
|
||||||
|
c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
|
||||||
|
c = (c << 15 | c >>> 17) + d | 0;
|
||||||
|
b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
|
||||||
|
b = (b << 21 | b >>> 11) + c | 0;
|
||||||
|
a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
|
||||||
|
a = (a << 6 | a >>> 26) + b | 0;
|
||||||
|
d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
|
||||||
|
d = (d << 10 | d >>> 22) + a | 0;
|
||||||
|
c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
|
||||||
|
c = (c << 15 | c >>> 17) + d | 0;
|
||||||
|
b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
|
||||||
|
b = (b << 21 | b >>> 11) + c | 0;
|
||||||
|
|
||||||
|
x[0] = a + x[0] | 0;
|
||||||
|
x[1] = b + x[1] | 0;
|
||||||
|
x[2] = c + x[2] | 0;
|
||||||
|
x[3] = d + x[3] | 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function md5blk(s) {
|
||||||
|
var md5blks = [],
|
||||||
|
i; /* Andy King said do it this way. */
|
||||||
|
|
||||||
|
for (i = 0; i < 64; i += 4) {
|
||||||
|
md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
|
||||||
|
}
|
||||||
|
return md5blks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function md5blk_array(a) {
|
||||||
|
var md5blks = [],
|
||||||
|
i; /* Andy King said do it this way. */
|
||||||
|
|
||||||
|
for (i = 0; i < 64; i += 4) {
|
||||||
|
md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
|
||||||
|
}
|
||||||
|
return md5blks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function md51(s) {
|
||||||
|
var n = s.length,
|
||||||
|
state = [1732584193, -271733879, -1732584194, 271733878],
|
||||||
|
i,
|
||||||
|
length,
|
||||||
|
tail,
|
||||||
|
tmp,
|
||||||
|
lo,
|
||||||
|
hi;
|
||||||
|
|
||||||
|
for (i = 64; i <= n; i += 64) {
|
||||||
|
md5cycle(state, md5blk(s.substring(i - 64, i)));
|
||||||
|
}
|
||||||
|
s = s.substring(i - 64);
|
||||||
|
length = s.length;
|
||||||
|
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
|
||||||
|
}
|
||||||
|
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
|
||||||
|
if (i > 55) {
|
||||||
|
md5cycle(state, tail);
|
||||||
|
for (i = 0; i < 16; i += 1) {
|
||||||
|
tail[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Beware that the final length might not fit in 32 bits so we take care of that
|
||||||
|
tmp = n * 8;
|
||||||
|
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
|
||||||
|
lo = parseInt(tmp[2], 16);
|
||||||
|
hi = parseInt(tmp[1], 16) || 0;
|
||||||
|
|
||||||
|
tail[14] = lo;
|
||||||
|
tail[15] = hi;
|
||||||
|
|
||||||
|
md5cycle(state, tail);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
function md51_array(a) {
|
||||||
|
var n = a.length,
|
||||||
|
state = [1732584193, -271733879, -1732584194, 271733878],
|
||||||
|
i,
|
||||||
|
length,
|
||||||
|
tail,
|
||||||
|
tmp,
|
||||||
|
lo,
|
||||||
|
hi;
|
||||||
|
|
||||||
|
for (i = 64; i <= n; i += 64) {
|
||||||
|
md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not sure if it is a bug, however IE10 will always produce a sub array of length 1
|
||||||
|
// containing the last element of the parent array if the sub array specified starts
|
||||||
|
// beyond the length of the parent array - weird.
|
||||||
|
// https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
|
||||||
|
a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
|
||||||
|
|
||||||
|
length = a.length;
|
||||||
|
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
tail[i >> 2] |= a[i] << ((i % 4) << 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
|
||||||
|
if (i > 55) {
|
||||||
|
md5cycle(state, tail);
|
||||||
|
for (i = 0; i < 16; i += 1) {
|
||||||
|
tail[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Beware that the final length might not fit in 32 bits so we take care of that
|
||||||
|
tmp = n * 8;
|
||||||
|
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
|
||||||
|
lo = parseInt(tmp[2], 16);
|
||||||
|
hi = parseInt(tmp[1], 16) || 0;
|
||||||
|
|
||||||
|
tail[14] = lo;
|
||||||
|
tail[15] = hi;
|
||||||
|
|
||||||
|
md5cycle(state, tail);
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
function rhex(n) {
|
||||||
|
var s = '',
|
||||||
|
j;
|
||||||
|
for (j = 0; j < 4; j += 1) {
|
||||||
|
s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hex(x) {
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < x.length; i += 1) {
|
||||||
|
x[i] = rhex(x[i]);
|
||||||
|
}
|
||||||
|
return x.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
// In some cases the fast add32 function cannot be used..
|
||||||
|
if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
|
||||||
|
add32 = function (x, y) {
|
||||||
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF),
|
||||||
|
msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||||
|
return (msw << 16) | (lsw & 0xFFFF);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ArrayBuffer slice polyfill.
|
||||||
|
*
|
||||||
|
* @see https://github.com/ttaubert/node-arraybuffer-slice
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
function clamp(val, length) {
|
||||||
|
val = (val | 0) || 0;
|
||||||
|
|
||||||
|
if (val < 0) {
|
||||||
|
return Math.max(val + length, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.min(val, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayBuffer.prototype.slice = function (from, to) {
|
||||||
|
var length = this.byteLength,
|
||||||
|
begin = clamp(from, length),
|
||||||
|
end = length,
|
||||||
|
num,
|
||||||
|
target,
|
||||||
|
targetArray,
|
||||||
|
sourceArray;
|
||||||
|
|
||||||
|
if (to !== undefined) {
|
||||||
|
end = clamp(to, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (begin > end) {
|
||||||
|
return new ArrayBuffer(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
num = end - begin;
|
||||||
|
target = new ArrayBuffer(num);
|
||||||
|
targetArray = new Uint8Array(target);
|
||||||
|
|
||||||
|
sourceArray = new Uint8Array(this, begin, num);
|
||||||
|
targetArray.set(sourceArray);
|
||||||
|
|
||||||
|
return target;
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function toUtf8(str) {
|
||||||
|
if (/[\u0080-\uFFFF]/.test(str)) {
|
||||||
|
// 源码是str = unescape(encodeURIComponent(str));这里的API并不对等
|
||||||
|
buffer.from(str).toString("utf-8")
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function utf8Str2ArrayBuffer(str, returnUInt8Array) {
|
||||||
|
var length = str.length,
|
||||||
|
buff = new ArrayBuffer(length),
|
||||||
|
arr = new Uint8Array(buff),
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
arr[i] = str.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnUInt8Array ? arr : buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
function arrayBuffer2Utf8Str(buff) {
|
||||||
|
return String.fromCharCode.apply(null, new Uint8Array(buff));
|
||||||
|
}
|
||||||
|
|
||||||
|
function concatenateArrayBuffers(first, second, returnUInt8Array) {
|
||||||
|
var result = new Uint8Array(first.byteLength + second.byteLength);
|
||||||
|
|
||||||
|
result.set(new Uint8Array(first));
|
||||||
|
result.set(new Uint8Array(second), first.byteLength);
|
||||||
|
|
||||||
|
return returnUInt8Array ? result : result.buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hexToBinaryString(hex) {
|
||||||
|
var bytes = [],
|
||||||
|
length = hex.length,
|
||||||
|
x;
|
||||||
|
|
||||||
|
for (x = 0; x < length - 1; x += 2) {
|
||||||
|
bytes.push(parseInt(hex.substr(x, 2), 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
return String.fromCharCode.apply(String, bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SparkMD5 OOP implementation.
|
||||||
|
*
|
||||||
|
* Use this class to perform an incremental md5, otherwise use the
|
||||||
|
* static methods instead.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function SparkMD5() {
|
||||||
|
// call reset to init the instance
|
||||||
|
this.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a string.
|
||||||
|
* A conversion will be applied if an utf8 string is detected.
|
||||||
|
*
|
||||||
|
* @param {String} str The string to be appended
|
||||||
|
*
|
||||||
|
* @return {SparkMD5} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.append = function (str) {
|
||||||
|
// Converts the string to utf8 bytes if necessary
|
||||||
|
// Then append as binary
|
||||||
|
this.appendBinary(toUtf8(str));
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a binary string.
|
||||||
|
*
|
||||||
|
* @param {String} contents The binary string to be appended
|
||||||
|
*
|
||||||
|
* @return {SparkMD5} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.appendBinary = function (contents) {
|
||||||
|
this._buff += contents;
|
||||||
|
this._length += contents.length;
|
||||||
|
|
||||||
|
var length = this._buff.length,
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i = 64; i <= length; i += 64) {
|
||||||
|
md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._buff = this._buff.substring(i - 64);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finishes the incremental computation, reseting the internal state and
|
||||||
|
* returning the result.
|
||||||
|
*
|
||||||
|
* @param {Boolean} raw True to get the raw string, false to get the hex string
|
||||||
|
*
|
||||||
|
* @return {String} The result
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.end = function (raw) {
|
||||||
|
var buff = this._buff,
|
||||||
|
length = buff.length,
|
||||||
|
i,
|
||||||
|
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
ret;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._finish(tail, length);
|
||||||
|
ret = hex(this._hash);
|
||||||
|
|
||||||
|
if (raw) {
|
||||||
|
ret = hexToBinaryString(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.reset();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @return {SparkMD5} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.reset = function () {
|
||||||
|
this._buff = '';
|
||||||
|
this._length = 0;
|
||||||
|
this._hash = [1732584193, -271733879, -1732584194, 271733878];
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @return {Object} The state
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.getState = function () {
|
||||||
|
return {
|
||||||
|
buff: this._buff,
|
||||||
|
length: this._length,
|
||||||
|
hash: this._hash.slice()
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @param {Object} state The state
|
||||||
|
*
|
||||||
|
* @return {SparkMD5} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.setState = function (state) {
|
||||||
|
this._buff = state.buff;
|
||||||
|
this._length = state.length;
|
||||||
|
this._hash = state.hash;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Releases memory used by the incremental buffer and other additional
|
||||||
|
* resources. If you plan to use the instance again, use reset instead.
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype.destroy = function () {
|
||||||
|
delete this._hash;
|
||||||
|
delete this._buff;
|
||||||
|
delete this._length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finish the final calculation based on the tail.
|
||||||
|
*
|
||||||
|
* @param {Array} tail The tail (will be modified)
|
||||||
|
* @param {Number} length The length of the remaining buffer
|
||||||
|
*/
|
||||||
|
SparkMD5.prototype._finish = function (tail, length) {
|
||||||
|
var i = length,
|
||||||
|
tmp,
|
||||||
|
lo,
|
||||||
|
hi;
|
||||||
|
|
||||||
|
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
|
||||||
|
if (i > 55) {
|
||||||
|
md5cycle(this._hash, tail);
|
||||||
|
for (i = 0; i < 16; i += 1) {
|
||||||
|
tail[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the final computation based on the tail and length
|
||||||
|
// Beware that the final length may not fit in 32 bits so we take care of that
|
||||||
|
tmp = this._length * 8;
|
||||||
|
tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
|
||||||
|
lo = parseInt(tmp[2], 16);
|
||||||
|
hi = parseInt(tmp[1], 16) || 0;
|
||||||
|
|
||||||
|
tail[14] = lo;
|
||||||
|
tail[15] = hi;
|
||||||
|
md5cycle(this._hash, tail);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the md5 hash on a string.
|
||||||
|
* A conversion will be applied if utf8 string is detected.
|
||||||
|
*
|
||||||
|
* @param {String} str The string
|
||||||
|
* @param {Boolean} [raw] True to get the raw string, false to get the hex string
|
||||||
|
*
|
||||||
|
* @return {String} The result
|
||||||
|
*/
|
||||||
|
SparkMD5.hash = function (str, raw) {
|
||||||
|
// Converts the string to utf8 bytes if necessary
|
||||||
|
// Then compute it using the binary function
|
||||||
|
return SparkMD5.hashBinary(toUtf8(str), raw);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the md5 hash on a binary string.
|
||||||
|
*
|
||||||
|
* @param {String} content The binary string
|
||||||
|
* @param {Boolean} [raw] True to get the raw string, false to get the hex string
|
||||||
|
*
|
||||||
|
* @return {String} The result
|
||||||
|
*/
|
||||||
|
SparkMD5.hashBinary = function (content, raw) {
|
||||||
|
var hash = md51(content),
|
||||||
|
ret = hex(hash);
|
||||||
|
|
||||||
|
return raw ? hexToBinaryString(ret) : ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ---------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SparkMD5 OOP implementation for array buffers.
|
||||||
|
*
|
||||||
|
* Use this class to perform an incremental md5 ONLY for array buffers.
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer = function () {
|
||||||
|
// call reset to init the instance
|
||||||
|
this.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends an array buffer.
|
||||||
|
*
|
||||||
|
* @param {ArrayBuffer} arr The array to be appended
|
||||||
|
*
|
||||||
|
* @return {SparkMD5.ArrayBuffer} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.prototype.append = function (arr) {
|
||||||
|
// @ts-ignore
|
||||||
|
var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
|
||||||
|
// @ts-ignore
|
||||||
|
length = buff.length,
|
||||||
|
i;
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
this._length += arr.byteLength;
|
||||||
|
|
||||||
|
for (i = 64; i <= length; i += 64) {
|
||||||
|
// @ts-ignore
|
||||||
|
md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finishes the incremental computation, reseting the internal state and
|
||||||
|
* returning the result.
|
||||||
|
*
|
||||||
|
* @param {Boolean} raw True to get the raw string, false to get the hex string
|
||||||
|
*
|
||||||
|
* @return {String} The result
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.prototype.end = function (raw) {
|
||||||
|
// @ts-ignore
|
||||||
|
var buff = this._buff,
|
||||||
|
length = buff.length,
|
||||||
|
tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
i,
|
||||||
|
ret;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i += 1) {
|
||||||
|
tail[i >> 2] |= buff[i] << ((i % 4) << 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._finish(tail, length);
|
||||||
|
// @ts-ignore
|
||||||
|
ret = hex(this._hash);
|
||||||
|
|
||||||
|
if (raw) {
|
||||||
|
ret = hexToBinaryString(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.reset();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @return {SparkMD5.ArrayBuffer} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.prototype.reset = function () {
|
||||||
|
// @ts-ignore
|
||||||
|
this._buff = new Uint8Array(0);
|
||||||
|
// @ts-ignore
|
||||||
|
this._length = 0;
|
||||||
|
// @ts-ignore
|
||||||
|
this._hash = [1732584193, -271733879, -1732584194, 271733878];
|
||||||
|
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @return {Object} The state
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.prototype.getState = function () {
|
||||||
|
var state = SparkMD5.prototype.getState.call(this);
|
||||||
|
|
||||||
|
// Convert buffer to a string
|
||||||
|
state.buff = arrayBuffer2Utf8Str(state.buff);
|
||||||
|
|
||||||
|
return state;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the internal state of the computation.
|
||||||
|
*
|
||||||
|
* @param {Object} state The state
|
||||||
|
*
|
||||||
|
* @return {SparkMD5.ArrayBuffer} The instance itself
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.prototype.setState = function (state) {
|
||||||
|
// Convert string to buffer
|
||||||
|
state.buff = utf8Str2ArrayBuffer(state.buff, true);
|
||||||
|
|
||||||
|
return SparkMD5.prototype.setState.call(this, state);
|
||||||
|
};
|
||||||
|
|
||||||
|
SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
|
||||||
|
|
||||||
|
SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the md5 hash on an array buffer.
|
||||||
|
*
|
||||||
|
* @param {ArrayBuffer} arr The array buffer
|
||||||
|
* @param {Boolean} [raw] True to get the raw string, false to get the hex one
|
||||||
|
*
|
||||||
|
* @return {String} The result
|
||||||
|
*/
|
||||||
|
SparkMD5.ArrayBuffer.hash = function (arr, raw) {
|
||||||
|
var hash = md51_array(new Uint8Array(arr)),
|
||||||
|
ret = hex(hash);
|
||||||
|
|
||||||
|
return raw ? hexToBinaryString(ret) : ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
export { SparkMD5 }
|
||||||
|
|
|
@ -20,7 +20,8 @@
|
||||||
*LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
*LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
*OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
*OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
*SOFTWARE.*/
|
*SOFTWARE.*/
|
||||||
const pako = require('pako');
|
import {deflate} from '../pako/lib/deflate'
|
||||||
|
var pako = {deflate}
|
||||||
const UZIP = null;
|
const UZIP = null;
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
@ -1500,6 +1501,7 @@ UPNG.encode._filterZero = function (img, h, bpp, bpl, data, filter, levelZero) {
|
||||||
|
|
||||||
var CMPR = (data.length > 10e6 && UZIP != null) ? UZIP : pako;
|
var CMPR = (data.length > 10e6 && UZIP != null) ? UZIP : pako;
|
||||||
|
|
||||||
|
console.log("dodo pako is null ="+(pako == null) + "CMPR['deflate']="+CMPR['deflate'])
|
||||||
|
|
||||||
var time = Date.now();
|
var time = Date.now();
|
||||||
for (var i = 0; i < ftry.length; i++) {
|
for (var i = 0; i < ftry.length; i++) {
|
|
@ -26,9 +26,9 @@ import {RequestManager} from "../imageknife/requestmanage/RequestManager"
|
||||||
import {NONE} from "../cache/diskstrategy/enum/NONE"
|
import {NONE} from "../cache/diskstrategy/enum/NONE"
|
||||||
import {FileTypeUtil} from '../imageknife/utils/FileTypeUtil'
|
import {FileTypeUtil} from '../imageknife/utils/FileTypeUtil'
|
||||||
import {DownloadClient} from '../imageknife/networkmanage/DownloadClient'
|
import {DownloadClient} from '../imageknife/networkmanage/DownloadClient'
|
||||||
import {IDataFetch} from '../imageknife/networkmanage/IDataFetch'
|
import type {IDataFetch} from '../imageknife/networkmanage/IDataFetch'
|
||||||
import {ParseResClient} from '../imageknife/resourcemanage/ParseResClient'
|
import {ParseResClient} from '../imageknife/resourcemanage/ParseResClient'
|
||||||
import {IResourceFetch} from '../imageknife/resourcemanage/IResourceFetch'
|
import type {IResourceFetch} from '../imageknife/resourcemanage/IResourceFetch'
|
||||||
import {ImageKnifeData,ImageKnifeType} from '../imageknife/ImageKnifeData'
|
import {ImageKnifeData,ImageKnifeType} from '../imageknife/ImageKnifeData'
|
||||||
import {FileUtils} from '../cache/FileUtils'
|
import {FileUtils} from '../cache/FileUtils'
|
||||||
import {FileReader} from '../cache/FileReader'
|
import {FileReader} from '../cache/FileReader'
|
||||||
|
|
|
@ -14,9 +14,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { DiskStrategy } from "../cache/diskstrategy/DiskStrategy"
|
import { DiskStrategy } from "../cache/diskstrategy/DiskStrategy"
|
||||||
import { AsyncCallback } from "../imageknife/interface/asynccallback"
|
import type { AsyncCallback } from "../imageknife/interface/asynccallback"
|
||||||
import { AsyncSuccess } from "../imageknife/interface/AsyncSuccess"
|
import type { AsyncSuccess } from "../imageknife/interface/AsyncSuccess"
|
||||||
import { IAllCacheInfoCallback } from "../imageknife/interface/IAllCacheInfoCallback"
|
import type { IAllCacheInfoCallback } from "../imageknife/interface/IAllCacheInfoCallback"
|
||||||
import { AUTOMATIC } from "../cache/diskstrategy/enum/AUTOMATIC"
|
import { AUTOMATIC } from "../cache/diskstrategy/enum/AUTOMATIC"
|
||||||
import { BaseTransform } from "../imageknife/transform/BaseTransform"
|
import { BaseTransform } from "../imageknife/transform/BaseTransform"
|
||||||
import { RotateImageTransformation } from "../imageknife/transform/RotateImageTransformation"
|
import { RotateImageTransformation } from "../imageknife/transform/RotateImageTransformation"
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2022 Huawei Device Co., Ltd.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
import {ImageKnifeData} from '../ImageKnifeData'
|
|
||||||
export interface IDrawExtension{
|
|
||||||
<T>(context: CanvasRenderingContext2D,data: ImageKnifeData, imageKnifeOption:T, compWidth:number,compHeight:number, setGifTimeId?:(timeId:number)=>void)
|
|
||||||
}
|
|
|
@ -13,10 +13,8 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { IDataFetch } from '../networkmanage/IDataFetch'
|
import type { IDataFetch } from '../networkmanage/IDataFetch'
|
||||||
import { RequestOption } from '../RequestOption'
|
import { RequestOption } from '../RequestOption'
|
||||||
import { Md5 } from '../../cache/Md5'
|
|
||||||
import { FileUtils } from '../../cache/FileUtils'
|
|
||||||
import { NetworkDownloadClient } from './NetworkDownloadClient'
|
import { NetworkDownloadClient } from './NetworkDownloadClient'
|
||||||
import { LoadLocalFileClient } from './LoadLocalFileClient'
|
import { LoadLocalFileClient } from './LoadLocalFileClient'
|
||||||
import { LoadDataShareFileClient } from './LoadDataShareFileClient'
|
import { LoadDataShareFileClient } from './LoadDataShareFileClient'
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* 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 { IDataFetch } from '../networkmanage/IDataFetch'
|
import type { IDataFetch } from '../networkmanage/IDataFetch'
|
||||||
import { RequestOption } from '../RequestOption'
|
import { RequestOption } from '../RequestOption'
|
||||||
import fs from '@ohos.file.fs';
|
import fs from '@ohos.file.fs';
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,9 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { IDataFetch } from '../networkmanage/IDataFetch'
|
import type { IDataFetch } from '../networkmanage/IDataFetch'
|
||||||
import { RequestOption } from '../RequestOption'
|
import { RequestOption } from '../RequestOption'
|
||||||
import { Md5 } from '../../cache/Md5'
|
|
||||||
import { FileUtils } from '../../cache/FileUtils'
|
import { FileUtils } from '../../cache/FileUtils'
|
||||||
import loadRequest from '@ohos.request';
|
|
||||||
|
|
||||||
export class LoadLocalFileClient implements IDataFetch {
|
export class LoadLocalFileClient implements IDataFetch {
|
||||||
loadData(request: RequestOption, onComplete: (img: ArrayBuffer) => void, onError: (err: string) => void) {
|
loadData(request: RequestOption, onComplete: (img: ArrayBuffer) => void, onError: (err: string) => void) {
|
||||||
|
|
|
@ -13,16 +13,16 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { IDataFetch } from '../networkmanage/IDataFetch'
|
import type { IDataFetch } from '../networkmanage/IDataFetch'
|
||||||
import { RequestOption } from '../RequestOption'
|
import { RequestOption } from '../RequestOption'
|
||||||
import { Md5 } from '../../cache/Md5'
|
import { SparkMD5 } from '../../3rd_party/sparkmd5/spark-md5'
|
||||||
import { FileUtils } from '../../cache/FileUtils'
|
import { FileUtils } from '../../cache/FileUtils'
|
||||||
import loadRequest from '@ohos.request';
|
import loadRequest from '@ohos.request';
|
||||||
|
|
||||||
// 数据加载器
|
// 数据加载器
|
||||||
export class NetworkDownloadClient {
|
export class NetworkDownloadClient implements IDataFetch {
|
||||||
loadData(request: RequestOption, onComplete: (img: ArrayBuffer) => void, onError: (err: string) => void) {
|
loadData(request: RequestOption, onComplete: (img: ArrayBuffer) => void, onError: (err: string) => void) {
|
||||||
let filename = Md5.hashStr(request.generateDataKey);
|
let filename = SparkMD5.hashBinary(request.generateDataKey);
|
||||||
let downloadFolder = request.getFilesPath() + "/" + request.networkCacheFolder;
|
let downloadFolder = request.getFilesPath() + "/" + request.networkCacheFolder;
|
||||||
let allpath = request.getFilesPath() + "/" + request.networkCacheFolder + "/" + filename + ".img";
|
let allpath = request.getFilesPath() + "/" + request.networkCacheFolder + "/" + filename + ".img";
|
||||||
if (!FileUtils.getInstance().existFolder(downloadFolder)) {
|
if (!FileUtils.getInstance().existFolder(downloadFolder)) {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* 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 {UPNG} from '../pngj/UPNG';
|
import {UPNG} from '../../3rd_party/upng/UPNG';
|
||||||
import {PngCallback} from '../pngj/PngCallback';
|
import {PngCallback} from '../pngj/PngCallback';
|
||||||
import image from '@ohos.multimedia.image';
|
import image from '@ohos.multimedia.image';
|
||||||
import resourceManager from '@ohos.resourceManager';
|
import resourceManager from '@ohos.resourceManager';
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { ICache } from "../requestmanage/ICache"
|
import type { ICache } from "../requestmanage/ICache"
|
||||||
import { DiskLruCache } from "@ohos/disklrucache"
|
import { DiskLruCache } from "@ohos/disklrucache"
|
||||||
|
|
||||||
export class DiskCacheProxy implements ICache<string, ArrayBuffer> {
|
export class DiskCacheProxy implements ICache<string, ArrayBuffer> {
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {ICache} from "../requestmanage/ICache"
|
import type {ICache} from "../requestmanage/ICache"
|
||||||
import {LruCache} from "../../cache/LruCache"
|
import {LruCache} from "../../cache/LruCache"
|
||||||
|
|
||||||
export class MemoryCacheProxy <K, V> implements ICache<K, V> {
|
export class MemoryCacheProxy <K, V> implements ICache<K, V> {
|
||||||
|
|
|
@ -13,21 +13,20 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { RequestOption } from "../../imageknife/RequestOption"
|
import { RequestOption } from '../../imageknife/RequestOption'
|
||||||
import { DiskLruCache } from "@ohos/disklrucache"
|
import { DiskLruCache } from '@ohos/disklrucache'
|
||||||
import { LruCache } from "../../cache/LruCache"
|
import { LruCache } from '../../cache/LruCache'
|
||||||
import {FileUtils} from "../../cache/FileUtils"
|
import { SparkMD5 } from '../../3rd_party/sparkmd5/spark-md5'
|
||||||
import {Md5} from "../../cache/Md5"
|
import { MemoryCacheProxy } from '../requestmanage/MemoryCacheProxy'
|
||||||
import{MemoryCacheProxy} from "../requestmanage/MemoryCacheProxy"
|
import { DiskCacheProxy } from '../requestmanage/DiskCacheProxy'
|
||||||
import{DiskCacheProxy} from "../requestmanage/DiskCacheProxy"
|
import { FileTypeUtil } from '../utils/FileTypeUtil'
|
||||||
import{FileTypeUtil} from "../utils/FileTypeUtil"
|
import type { IDataFetch } from '../../imageknife/networkmanage/IDataFetch'
|
||||||
import{IDataFetch} from "../../imageknife/networkmanage/IDataFetch"
|
import type { IResourceFetch } from '../../imageknife/resourcemanage/IResourceFetch'
|
||||||
import{IResourceFetch} from "../../imageknife/resourcemanage/IResourceFetch"
|
import { ImageKnifeData, ImageKnifeType } from '../ImageKnifeData'
|
||||||
import{ImageKnifeData,ImageKnifeType} from "../ImageKnifeData"
|
import { AllCacheInfo } from '../../imageknife/interface/IAllCacheInfoCallback'
|
||||||
import {AllCacheInfo, IAllCacheInfoCallback} from "../../imageknife/interface/IAllCacheInfoCallback"
|
|
||||||
import { ParseImageUtil } from '../utils/ParseImageUtil'
|
import { ParseImageUtil } from '../utils/ParseImageUtil'
|
||||||
import{IParseImage} from '../interface/IParseImage'
|
import type { IParseImage } from '../interface/IParseImage'
|
||||||
import image from "@ohos.multimedia.image"
|
import image from '@ohos.multimedia.image'
|
||||||
import { SVGParseImpl } from '../utils/svg/SVGParseImpl'
|
import { SVGParseImpl } from '../utils/svg/SVGParseImpl'
|
||||||
import { GIFParseImpl } from '../utils/gif/GIFParseImpl'
|
import { GIFParseImpl } from '../utils/gif/GIFParseImpl'
|
||||||
import { GIFFrame } from '../utils/gif/GIFFrame'
|
import { GIFFrame } from '../utils/gif/GIFFrame'
|
||||||
|
@ -113,14 +112,14 @@ export class RequestManager {
|
||||||
|
|
||||||
// 变换后缓存
|
// 变换后缓存
|
||||||
allCacheInfo.resourceCacheInfo = {
|
allCacheInfo.resourceCacheInfo = {
|
||||||
key: Md5.hashStr(this.options.generateResourceKey),
|
key: SparkMD5.hashBinary(this.options.generateResourceKey),
|
||||||
path: (this.mDiskCacheProxy.getCachePath() + Md5.hashStr(this.options.generateResourceKey))
|
path: (this.mDiskCacheProxy.getCachePath() + SparkMD5.hashBinary(this.options.generateResourceKey))
|
||||||
};
|
};
|
||||||
|
|
||||||
// 原图缓存
|
// 原图缓存
|
||||||
allCacheInfo.dataCacheInfo = {
|
allCacheInfo.dataCacheInfo = {
|
||||||
key: Md5.hashStr(this.options.generateDataKey),
|
key: SparkMD5.hashBinary(this.options.generateDataKey),
|
||||||
path: this.mDiskCacheProxy.getCachePath() + Md5.hashStr(this.options.generateDataKey)
|
path: this.mDiskCacheProxy.getCachePath() + SparkMD5.hashBinary(this.options.generateDataKey)
|
||||||
}
|
}
|
||||||
this.options.allCacheInfoCallback(allCacheInfo)
|
this.options.allCacheInfoCallback(allCacheInfo)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {IResourceFetch} from '../resourcemanage/IResourceFetch'
|
import type {IResourceFetch} from '../resourcemanage/IResourceFetch'
|
||||||
import {ResourceTypeEts} from '../../imageknife/constants/ResourceTypeEts'
|
import {ResourceTypeEts} from '../../imageknife/constants/ResourceTypeEts'
|
||||||
|
|
||||||
import resourceManager from '@ohos.resourceManager';
|
import resourceManager from '@ohos.resourceManager';
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {IResourceFetch} from '../resourcemanage/IResourceFetch'
|
import type {IResourceFetch} from '../resourcemanage/IResourceFetch'
|
||||||
import {ResourceTypeEts} from '../../imageknife/constants/ResourceTypeEts'
|
import {ResourceTypeEts} from '../../imageknife/constants/ResourceTypeEts'
|
||||||
import {Base64} from '../../cache/Base64'
|
import {Base64} from '../../cache/Base64'
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* 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 {DataCallBack} from "../interface/DataCallBack"
|
import type {DataCallBack} from "../interface/DataCallBack"
|
||||||
|
|
||||||
export namespace ColorUtils {
|
export namespace ColorUtils {
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import{IParseImage} from '../interface/IParseImage'
|
import type {IParseImage} from '../interface/IParseImage'
|
||||||
import image from '@ohos.multimedia.image';
|
import image from '@ohos.multimedia.image';
|
||||||
|
|
||||||
export class ParseImageUtil implements IParseImage {
|
export class ParseImageUtil implements IParseImage {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* 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 { IParseGif } from './IParseGif'
|
import type { IParseGif } from './IParseGif'
|
||||||
import { GIFFrame } from './GIFFrame'
|
import { GIFFrame } from './GIFFrame'
|
||||||
import { LoadType } from '../../../../../../../GifWorker'
|
import { LoadType } from '../../../../../../../GifWorker'
|
||||||
import { parseBufferToFrame } from './parse/GIFParse'
|
import { parseBufferToFrame } from './parse/GIFParse'
|
||||||
|
|
|
@ -13,24 +13,34 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var _gif = _interopRequireDefault(require("js-binary-schema-parser/lib/schemas/gif"));
|
import { _default } from '../../../../3rd_party/jsbinaryschemaparser/lib/schemas/gif'
|
||||||
|
import { conditional, loop, parse } from '../../../../3rd_party/jsbinaryschemaparser/lib/index'
|
||||||
var _jsBinarySchemaParser = require("js-binary-schema-parser");
|
import {
|
||||||
|
buildStream,
|
||||||
var _uint = require("js-binary-schema-parser/lib/parsers/uint8");
|
peekByte,
|
||||||
|
peekBytes,
|
||||||
|
readArray,
|
||||||
|
readBits,
|
||||||
|
readByte,
|
||||||
|
readBytes,
|
||||||
|
readString,
|
||||||
|
readUnsigned
|
||||||
|
} from '../../../../3rd_party/jsbinaryschemaparser/lib/parsers/uint8'
|
||||||
import { deinterlace } from './deinterlace'
|
import { deinterlace } from './deinterlace'
|
||||||
import { lzw } from './lzw'
|
import { lzw } from './lzw'
|
||||||
|
|
||||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
var _gif = _interopRequireDefault(_default);
|
||||||
|
|
||||||
|
function _interopRequireDefault(obj) {
|
||||||
|
return { "default": obj };
|
||||||
|
}
|
||||||
|
|
||||||
export function parseGIF(arrayBuffer) {
|
export function parseGIF(arrayBuffer) {
|
||||||
var byteData = new Uint8Array(arrayBuffer);
|
var byteData = new Uint8Array(arrayBuffer);
|
||||||
return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif["default"]);
|
return (parse)((buildStream)(byteData), _gif["default"]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function generatePatch(image) {
|
export function generatePatch(image) {
|
||||||
var totalPixels = image.pixels.length;
|
var totalPixels = image.pixels.length;
|
||||||
var patchData = new Uint8ClampedArray(totalPixels * 4);
|
var patchData = new Uint8ClampedArray(totalPixels * 4);
|
||||||
|
@ -103,7 +113,6 @@ export function decompressFrame(frame, gct, buildImagePatch) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function decompressFrames(parsedGif, buildImagePatches) {
|
export function decompressFrames(parsedGif, buildImagePatches) {
|
||||||
return parsedGif.frames.filter(function (f) {
|
return parsedGif.frames.filter(function (f) {
|
||||||
return f.image;
|
return f.image;
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* 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 {IParseSvg} from'./IParseSvg'
|
import type {IParseSvg} from'./IParseSvg'
|
||||||
import {SVGImageView} from '@ohos/svg'
|
import {SVGImageView} from '@ohos/svg'
|
||||||
export class SVGParseImpl implements IParseSvg{
|
export class SVGParseImpl implements IParseSvg{
|
||||||
parseSvg(imageinfo: ArrayBuffer,size?:{width:number,height:number}): Promise<PixelMap>{
|
parseSvg(imageinfo: ArrayBuffer,size?:{width:number,height:number}): Promise<PixelMap>{
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@ohos/hypium": "1.0.6"
|
||||||
|
},
|
||||||
|
"name": "imageknife",
|
||||||
|
"description": "example description",
|
||||||
|
"repository": {},
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
19
package.json
19
package.json
|
@ -1,19 +0,0 @@
|
||||||
{
|
|
||||||
"license": "ISC",
|
|
||||||
"devDependencies": {},
|
|
||||||
"name": "imageknife",
|
|
||||||
"ohos": {
|
|
||||||
"org": "huawei",
|
|
||||||
"directoryLevel": "project",
|
|
||||||
"buildTool": "hvigor"
|
|
||||||
},
|
|
||||||
"description": "example description",
|
|
||||||
"repository": {},
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"@ohos/hypium": "1.0.3",
|
|
||||||
"@ohos/hvigor-ohos-plugin": "1.4.0",
|
|
||||||
"hypium": "^1.0.0",
|
|
||||||
"@ohos/hvigor": "1.4.0"
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue