mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-12 08:47:31 +00:00
Compare commits
1 Commits
v1.10.0
...
abstractin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f877dcaff9 |
13
.babelrc
Normal file
13
.babelrc
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
"transform-class-properties",
|
||||||
|
"transform-react-constant-elements",
|
||||||
|
"transform-react-remove-prop-types",
|
||||||
|
[
|
||||||
|
"transform-react-jsx",
|
||||||
|
{
|
||||||
|
"pragma": "h"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
36
.github/ISSUE_TEMPLATE/bug_report.md
vendored
36
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Something is not working as expected
|
|
||||||
labels:
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Before you start**
|
|
||||||
Please take a look at the [FAQ](https://github.com/GoogleChromeLabs/squoosh/wiki/FAQ) as well as the already opened issues! If nothing fits your problem, go ahead and fill out the following template:
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Version:**
|
|
||||||
- OS w/ version: [e.g. iOS 12]
|
|
||||||
- Browser w/ version [e.g. Chrome 70]
|
|
||||||
- Node version: [e.g. 10.11.0]
|
|
||||||
- npm version: [e.g. 6.4.1]
|
|
||||||
|
|
||||||
**Is your issue related to the quality of image compression?**
|
|
||||||
Please attach original and output images (you can drag & drop to attach).
|
|
||||||
- Original image
|
|
||||||
- Output image from Squoosh
|
|
||||||
|
|
||||||
**Additional context, screenshots, screencasts**
|
|
||||||
Add any other context about the problem here.
|
|
||||||
18
.github/ISSUE_TEMPLATE/feature_request.md
vendored
18
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
labels:
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Does other service/app have this feature?**
|
|
||||||
Add any service you know/use that has this feature (We want to know for research)
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- node
|
||||||
cache: npm
|
cache: npm
|
||||||
script: npm run build
|
script: npm run build || npm run build # scss ts definitions need to be generated before an actual build
|
||||||
after_success: npm run sizereport
|
|
||||||
|
|||||||
32
README.md
32
README.md
@@ -1,31 +1,5 @@
|
|||||||
# [Squoosh]!
|
# Squoosh!
|
||||||
|
|
||||||
[Squoosh] is an image compression web app that allows you to dive into the advanced options provided
|
Squoosh will be an image compression web app that allows you to dive into the
|
||||||
by various image compressors.
|
advanced options provided by various image compressors.
|
||||||
|
|
||||||
# Privacy
|
|
||||||
|
|
||||||
Google Analytics is used to record the following:
|
|
||||||
|
|
||||||
* [Basic visit data](https://support.google.com/analytics/answer/6004245?ref_topic=2919631).
|
|
||||||
* Before and after image size once an image is downloaded. These values are rounded to the nearest
|
|
||||||
kilobyte.
|
|
||||||
|
|
||||||
Image compression is handled locally; no additional data is sent to the server.
|
|
||||||
|
|
||||||
# Building locally
|
|
||||||
|
|
||||||
Clone the repo, and:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
You can run the development server with:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
[Squoosh]: https://squoosh.app
|
|
||||||
|
|||||||
18
_headers.ejs
18
_headers.ejs
@@ -1,18 +0,0 @@
|
|||||||
# Long-term cache by default.
|
|
||||||
/*
|
|
||||||
Cache-Control: max-age=31536000
|
|
||||||
|
|
||||||
# And here are the exceptions:
|
|
||||||
/
|
|
||||||
Cache-Control: no-cache
|
|
||||||
|
|
||||||
/serviceworker.js
|
|
||||||
Cache-Control: no-cache
|
|
||||||
|
|
||||||
/manifest.json
|
|
||||||
Cache-Control: must-revalidate, max-age=3600
|
|
||||||
|
|
||||||
# URLs in /assets do not include a hash and are mutable.
|
|
||||||
# But it isn't a big deal if the user gets an old version.
|
|
||||||
/assets/*
|
|
||||||
Cache-Control: must-revalidate, max-age=3600
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/index.html / 301
|
|
||||||
/* /index.html 301
|
|
||||||
@@ -11,6 +11,6 @@ $ npm install
|
|||||||
$ npm run build
|
$ npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
This will build two files: `<codec name>_<enc or dec>.js` and `<codec name>_<enc or dec>.wasm`. It will most likely be necessary to set [`Module["locateFile"]`](https://kripken.github.io/emscripten-site/docs/api_reference/module.html#affecting-execution) to successfully load the `.wasm` file. When the `.js` file is loaded, a global `<codec name>_<enc or dec>` is created with the same API as an [Emscripten `Module`](https://kripken.github.io/emscripten-site/docs/api_reference/module.html).
|
This will build two files: `<codec name>_<enc or dec>.js` and `<codec name>_<enc or dec>.wasm`. It will most likely be necessary to set [`Module["locateFile"]`](https://kripken.github.io/emscripten-site/docs/api_reference/module.html#affecting-execution) to sucessfully load the `.wasm` file. When the `.js` file is loaded, a global `<codec name>_<enc or dec>` is created with the same API as an [Emscripten `Module`](https://kripken.github.io/emscripten-site/docs/api_reference/module.html).
|
||||||
|
|
||||||
Each codec will document its API in its README.
|
Each codec will document its API in its README.
|
||||||
|
|||||||
5
codecs/hqx/.gitignore
vendored
5
codecs/hqx/.gitignore
vendored
@@ -1,5 +0,0 @@
|
|||||||
**/*.rs.bk
|
|
||||||
target
|
|
||||||
Cargo.lock
|
|
||||||
bin/
|
|
||||||
pkg/README.md
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "squooshhqx"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Surma <surma@surma.link>"]
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook", "wee_alloc"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
cfg-if = "0.1.2"
|
|
||||||
wasm-bindgen = "0.2.38"
|
|
||||||
# lazy_static = "1.0.0"
|
|
||||||
hqx = {git = "https://github.com/CryZe/wasmboy-rs", tag="v0.1.2"}
|
|
||||||
|
|
||||||
# The `console_error_panic_hook` crate provides better debugging of panics by
|
|
||||||
# logging them with `console.error`. This is great for development, but requires
|
|
||||||
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for
|
|
||||||
# code size when deploying.
|
|
||||||
console_error_panic_hook = { version = "0.1.1", optional = true }
|
|
||||||
|
|
||||||
# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size
|
|
||||||
# compared to the default allocator's ~10K. It is slower than the default
|
|
||||||
# allocator, however.
|
|
||||||
#
|
|
||||||
# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now.
|
|
||||||
wee_alloc = { version = "0.4.2", optional = true }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
wasm-bindgen-test = "0.2"
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
# Tell `rustc` to optimize for small code size.
|
|
||||||
opt-level = "s"
|
|
||||||
lto = true
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
FROM rust
|
|
||||||
RUN rustup target add wasm32-unknown-unknown
|
|
||||||
RUN curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
|
||||||
|
|
||||||
RUN mkdir /opt/binaryen && \
|
|
||||||
curl -L https://github.com/WebAssembly/binaryen/releases/download/1.38.32/binaryen-1.38.32-x86-linux.tar.gz | tar -xzf - -C /opt/binaryen --strip 1
|
|
||||||
|
|
||||||
RUN mkdir /opt/wabt && \
|
|
||||||
curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.11/wabt-1.0.11-linux.tar.gz | tar -xzf - -C /opt/wabt --strip 1
|
|
||||||
|
|
||||||
ENV PATH="/opt/binaryen:/opt/wabt:${PATH}"
|
|
||||||
WORKDIR /src
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm"
|
|
||||||
echo "============================================="
|
|
||||||
(
|
|
||||||
wasm-pack build
|
|
||||||
wasm-strip pkg/squooshhqx_bg.wasm
|
|
||||||
echo "Optimising Wasm so it doesn't break Chrome (this takes like 10-15mins. get a cup of tea)"
|
|
||||||
echo "Once https://crbug.com/974804 is fixed, we can remove this step"
|
|
||||||
wasm-opt -Os --no-validation -o pkg/squooshhqx_bg.wasm pkg/squooshhqx_bg.wasm
|
|
||||||
rm pkg/.gitignore
|
|
||||||
)
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm done"
|
|
||||||
echo "============================================="
|
|
||||||
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
echo "Did you update your docker image?"
|
|
||||||
echo "Run \`docker pull ubuntu\`"
|
|
||||||
echo "Run \`docker pull rust\`"
|
|
||||||
echo "Run \`docker build -t squoosh-hqx .\`"
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
4
codecs/hqx/package-lock.json
generated
4
codecs/hqx/package-lock.json
generated
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hqx",
|
|
||||||
"lockfileVersion": 1
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "hqx",
|
|
||||||
"scripts": {
|
|
||||||
"build:image": "docker build -t squoosh-hqx .",
|
|
||||||
"build": "docker run --rm -v $(pwd):/src squoosh-hqx ./build.sh"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "squooshhqx",
|
|
||||||
"collaborators": [
|
|
||||||
"Surma <surma@surma.link>"
|
|
||||||
],
|
|
||||||
"version": "0.1.0",
|
|
||||||
"files": [
|
|
||||||
"squooshhqx_bg.wasm",
|
|
||||||
"squooshhqx.js",
|
|
||||||
"squooshhqx.d.ts"
|
|
||||||
],
|
|
||||||
"module": "squooshhqx.js",
|
|
||||||
"types": "squooshhqx.d.ts",
|
|
||||||
"sideEffects": "false"
|
|
||||||
}
|
|
||||||
9
codecs/hqx/pkg/squooshhqx.d.ts
vendored
9
codecs/hqx/pkg/squooshhqx.d.ts
vendored
@@ -1,9 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/**
|
|
||||||
* @param {Uint32Array} input_image
|
|
||||||
* @param {number} input_width
|
|
||||||
* @param {number} input_height
|
|
||||||
* @param {number} factor
|
|
||||||
* @returns {Uint32Array}
|
|
||||||
*/
|
|
||||||
export function resize(input_image: Uint32Array, input_width: number, input_height: number, factor: number): Uint32Array;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import * as wasm from './squooshhqx_bg.wasm';
|
|
||||||
|
|
||||||
let cachegetUint32Memory = null;
|
|
||||||
function getUint32Memory() {
|
|
||||||
if (cachegetUint32Memory === null || cachegetUint32Memory.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetUint32Memory = new Uint32Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetUint32Memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
let WASM_VECTOR_LEN = 0;
|
|
||||||
|
|
||||||
function passArray32ToWasm(arg) {
|
|
||||||
const ptr = wasm.__wbindgen_malloc(arg.length * 4);
|
|
||||||
getUint32Memory().set(arg, ptr / 4);
|
|
||||||
WASM_VECTOR_LEN = arg.length;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachegetInt32Memory = null;
|
|
||||||
function getInt32Memory() {
|
|
||||||
if (cachegetInt32Memory === null || cachegetInt32Memory.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetInt32Memory = new Int32Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetInt32Memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getArrayU32FromWasm(ptr, len) {
|
|
||||||
return getUint32Memory().subarray(ptr / 4, ptr / 4 + len);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {Uint32Array} input_image
|
|
||||||
* @param {number} input_width
|
|
||||||
* @param {number} input_height
|
|
||||||
* @param {number} factor
|
|
||||||
* @returns {Uint32Array}
|
|
||||||
*/
|
|
||||||
export function resize(input_image, input_width, input_height, factor) {
|
|
||||||
const retptr = 8;
|
|
||||||
const ret = wasm.resize(retptr, passArray32ToWasm(input_image), WASM_VECTOR_LEN, input_width, input_height, factor);
|
|
||||||
const memi32 = getInt32Memory();
|
|
||||||
const v0 = getArrayU32FromWasm(memi32[retptr / 4 + 0], memi32[retptr / 4 + 1]).slice();
|
|
||||||
wasm.__wbindgen_free(memi32[retptr / 4 + 0], memi32[retptr / 4 + 1] * 4);
|
|
||||||
return v0;
|
|
||||||
}
|
|
||||||
|
|
||||||
5
codecs/hqx/pkg/squooshhqx_bg.d.ts
vendored
5
codecs/hqx/pkg/squooshhqx_bg.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
export const memory: WebAssembly.Memory;
|
|
||||||
export function __wbindgen_malloc(a: number): number;
|
|
||||||
export function __wbindgen_free(a: number, b: number): void;
|
|
||||||
export function resize(a: number, b: number, c: number, d: number, e: number, f: number): void;
|
|
||||||
Binary file not shown.
@@ -1,55 +0,0 @@
|
|||||||
extern crate cfg_if;
|
|
||||||
extern crate hqx;
|
|
||||||
extern crate wasm_bindgen;
|
|
||||||
|
|
||||||
mod utils;
|
|
||||||
|
|
||||||
use cfg_if::cfg_if;
|
|
||||||
use wasm_bindgen::prelude::*;
|
|
||||||
|
|
||||||
cfg_if! {
|
|
||||||
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
|
|
||||||
// allocator.
|
|
||||||
if #[cfg(feature = "wee_alloc")] {
|
|
||||||
extern crate wee_alloc;
|
|
||||||
#[global_allocator]
|
|
||||||
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[wasm_bindgen]
|
|
||||||
#[no_mangle]
|
|
||||||
pub fn resize(
|
|
||||||
input_image: Vec<u32>,
|
|
||||||
input_width: usize,
|
|
||||||
input_height: usize,
|
|
||||||
factor: usize,
|
|
||||||
) -> Vec<u32> {
|
|
||||||
let num_output_pixels = input_width * input_height * factor * factor;
|
|
||||||
let mut output_image = Vec::<u32>::with_capacity(num_output_pixels * 4);
|
|
||||||
output_image.resize(num_output_pixels, 0);
|
|
||||||
|
|
||||||
match factor {
|
|
||||||
2 => hqx::hq2x(
|
|
||||||
input_image.as_slice(),
|
|
||||||
output_image.as_mut_slice(),
|
|
||||||
input_width,
|
|
||||||
input_height,
|
|
||||||
),
|
|
||||||
3 => hqx::hq3x(
|
|
||||||
input_image.as_slice(),
|
|
||||||
output_image.as_mut_slice(),
|
|
||||||
input_width,
|
|
||||||
input_height,
|
|
||||||
),
|
|
||||||
4 => hqx::hq4x(
|
|
||||||
input_image.as_slice(),
|
|
||||||
output_image.as_mut_slice(),
|
|
||||||
input_width,
|
|
||||||
input_height,
|
|
||||||
),
|
|
||||||
_ => unreachable!(),
|
|
||||||
};
|
|
||||||
|
|
||||||
return output_image;
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
use cfg_if::cfg_if;
|
|
||||||
|
|
||||||
cfg_if! {
|
|
||||||
// When the `console_error_panic_hook` feature is enabled, we can call the
|
|
||||||
// `set_panic_hook` function at least once during initialization, and then
|
|
||||||
// we will get better error messages if our code ever panics.
|
|
||||||
//
|
|
||||||
// For more details see
|
|
||||||
// https://github.com/rustwasm/console_error_panic_hook#readme
|
|
||||||
if #[cfg(feature = "console_error_panic_hook")] {
|
|
||||||
extern crate console_error_panic_hook;
|
|
||||||
pub use self::console_error_panic_hook::set_once as set_panic_hook;
|
|
||||||
} else {
|
|
||||||
#[inline]
|
|
||||||
pub fn set_panic_hook() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,6 @@
|
|||||||
"libimagequant": "ImageOptim/libimagequant#2.12.1"
|
"libimagequant": "ImageOptim/libimagequant#2.12.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"napa": "3.0.0"
|
"napa": "^3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,9 +39,5 @@ struct MozJpegOptions {
|
|||||||
bool trellis_opt_zero;
|
bool trellis_opt_zero;
|
||||||
bool trellis_opt_table;
|
bool trellis_opt_table;
|
||||||
int trellis_loops;
|
int trellis_loops;
|
||||||
bool auto_subsample;
|
|
||||||
int chroma_subsample;
|
|
||||||
bool separate_chroma_quality;
|
|
||||||
int chroma_quality;
|
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
console.log('Version:', module.version().toString(16));
|
console.log('Version:', module.version().toString(16));
|
||||||
const image = await loadImage('../example.png');
|
const image = await loadImage('../example.png');
|
||||||
const result = module.encode(image.data, image.width, image.height, {
|
const result = module.encode(image.data, image.width, image.height, {
|
||||||
quality: 75,
|
quality: 40,
|
||||||
baseline: false,
|
baseline: false,
|
||||||
arithmetic: false,
|
arithmetic: false,
|
||||||
progressive: true,
|
progressive: true,
|
||||||
@@ -29,14 +29,10 @@
|
|||||||
smoothing: 0,
|
smoothing: 0,
|
||||||
color_space: 3,
|
color_space: 3,
|
||||||
quant_table: 3,
|
quant_table: 3,
|
||||||
trellis_multipass: false,
|
trellis_multipass: true,
|
||||||
trellis_opt_zero: false,
|
trellis_opt_zero: true,
|
||||||
trellis_opt_table: false,
|
trellis_opt_table: true,
|
||||||
trellis_loops: 1,
|
trellis_loops: 1,
|
||||||
auto_subsample: true,
|
|
||||||
chroma_subsample: 2,
|
|
||||||
separate_chroma_quality: false,
|
|
||||||
chroma_quality: 75,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const blob = new Blob([result], {type: 'image/jpeg'});
|
const blob = new Blob([result], {type: 'image/jpeg'});
|
||||||
|
|||||||
@@ -29,10 +29,6 @@ struct MozJpegOptions {
|
|||||||
bool trellis_opt_zero;
|
bool trellis_opt_zero;
|
||||||
bool trellis_opt_table;
|
bool trellis_opt_table;
|
||||||
int trellis_loops;
|
int trellis_loops;
|
||||||
bool auto_subsample;
|
|
||||||
int chroma_subsample;
|
|
||||||
bool separate_chroma_quality;
|
|
||||||
int chroma_quality;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int version() {
|
int version() {
|
||||||
@@ -123,6 +119,9 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio
|
|||||||
*/
|
*/
|
||||||
jpeg_set_defaults(&cinfo);
|
jpeg_set_defaults(&cinfo);
|
||||||
|
|
||||||
|
/* Now you can set any non-default parameters you wish to.
|
||||||
|
* Here we just illustrate the use of quality (quantization table) scaling:
|
||||||
|
*/
|
||||||
jpeg_set_colorspace(&cinfo, (J_COLOR_SPACE) opts.color_space);
|
jpeg_set_colorspace(&cinfo, (J_COLOR_SPACE) opts.color_space);
|
||||||
|
|
||||||
if (opts.quant_table != -1) {
|
if (opts.quant_table != -1) {
|
||||||
@@ -143,23 +142,11 @@ val encode(std::string image_in, int image_width, int image_height, MozJpegOptio
|
|||||||
jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_Q_OPT, opts.trellis_opt_table);
|
jpeg_c_set_bool_param(&cinfo, JBOOLEAN_TRELLIS_Q_OPT, opts.trellis_opt_table);
|
||||||
jpeg_c_set_int_param(&cinfo, JINT_TRELLIS_NUM_LOOPS, opts.trellis_loops);
|
jpeg_c_set_int_param(&cinfo, JINT_TRELLIS_NUM_LOOPS, opts.trellis_loops);
|
||||||
|
|
||||||
// A little hacky to build a string for this, but it means we can use set_quality_ratings which
|
|
||||||
// does some useful heuristic stuff.
|
|
||||||
std::string quality_str = std::to_string(opts.quality);
|
std::string quality_str = std::to_string(opts.quality);
|
||||||
|
|
||||||
if (opts.separate_chroma_quality && opts.color_space == JCS_YCbCr) {
|
|
||||||
quality_str += "," + std::to_string(opts.chroma_quality);
|
|
||||||
}
|
|
||||||
|
|
||||||
char const *pqual = quality_str.c_str();
|
char const *pqual = quality_str.c_str();
|
||||||
|
|
||||||
set_quality_ratings(&cinfo, (char*) pqual, opts.baseline);
|
set_quality_ratings(&cinfo, (char*) pqual, opts.baseline);
|
||||||
|
|
||||||
if (!opts.auto_subsample && opts.color_space == JCS_YCbCr) {
|
|
||||||
cinfo.comp_info[0].h_samp_factor = opts.chroma_subsample;
|
|
||||||
cinfo.comp_info[0].v_samp_factor = opts.chroma_subsample;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!opts.baseline && opts.progressive) {
|
if (!opts.baseline && opts.progressive) {
|
||||||
jpeg_simple_progression(&cinfo);
|
jpeg_simple_progression(&cinfo);
|
||||||
} else {
|
} else {
|
||||||
@@ -222,10 +209,6 @@ EMSCRIPTEN_BINDINGS(my_module) {
|
|||||||
.field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero)
|
.field("trellis_opt_zero", &MozJpegOptions::trellis_opt_zero)
|
||||||
.field("trellis_opt_table", &MozJpegOptions::trellis_opt_table)
|
.field("trellis_opt_table", &MozJpegOptions::trellis_opt_table)
|
||||||
.field("trellis_loops", &MozJpegOptions::trellis_loops)
|
.field("trellis_loops", &MozJpegOptions::trellis_loops)
|
||||||
.field("chroma_subsample", &MozJpegOptions::chroma_subsample)
|
|
||||||
.field("auto_subsample", &MozJpegOptions::auto_subsample)
|
|
||||||
.field("separate_chroma_quality", &MozJpegOptions::separate_chroma_quality)
|
|
||||||
.field("chroma_quality", &MozJpegOptions::chroma_quality)
|
|
||||||
;
|
;
|
||||||
|
|
||||||
function("version", &version);
|
function("version", &version);
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -8,6 +8,6 @@
|
|||||||
"mozjpeg": "mozilla/mozjpeg#v3.3.1"
|
"mozjpeg": "mozilla/mozjpeg#v3.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"napa": "3.0.0"
|
"napa": "^3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
codecs/optipng/.gitignore
vendored
Normal file
2
codecs/optipng/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
build/
|
||||||
|
*.o
|
||||||
26
codecs/optipng/README.md
Normal file
26
codecs/optipng/README.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# OptiPNG
|
||||||
|
|
||||||
|
- Source: <https://sourceforge.net/project/optipng>
|
||||||
|
- Version: v0.7.7
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
- Docker
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
See `example.html`
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
### `int version()`
|
||||||
|
|
||||||
|
Returns the version of optipng as a number. va.b.c is encoded as 0x0a0b0c
|
||||||
|
|
||||||
|
### `ArrayBuffer compress(std::string buffer, {level})`;
|
||||||
|
|
||||||
|
`compress` will re-compress the given PNG image via `buffer`. `level` is a number between 0 and 7.
|
||||||
|
|
||||||
|
### `void free_result()`
|
||||||
|
|
||||||
|
Frees the result created by `compress()`.
|
||||||
87
codecs/optipng/build.sh
Executable file
87
codecs/optipng/build.sh
Executable file
@@ -0,0 +1,87 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
export OPTIMIZE="-Os"
|
||||||
|
export PREFIX="/src/build"
|
||||||
|
export CFLAGS="${OPTIMIZE} -I${PREFIX}/include/"
|
||||||
|
export CPPFLAGS="${OPTIMIZE} -I${PREFIX}/include/"
|
||||||
|
export LDFLAGS="${OPTIMIZE} -L${PREFIX}/lib/"
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get install -qqy autoconf libtool
|
||||||
|
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling zlib"
|
||||||
|
echo "============================================="
|
||||||
|
test -n "$SKIP_ZLIB" || (
|
||||||
|
cd node_modules/zlib
|
||||||
|
emconfigure ./configure --prefix=${PREFIX}/
|
||||||
|
emmake make
|
||||||
|
emmake make install
|
||||||
|
)
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling zlib done"
|
||||||
|
echo "============================================="
|
||||||
|
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling libpng"
|
||||||
|
echo "============================================="
|
||||||
|
test -n "$SKIP_LIBPNG" || (
|
||||||
|
cd node_modules/libpng
|
||||||
|
autoreconf -i
|
||||||
|
emconfigure ./configure --with-zlib-prefix=${PREFIX}/ --prefix=${PREFIX}/
|
||||||
|
emmake make
|
||||||
|
emmake make install
|
||||||
|
)
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling libpng done"
|
||||||
|
echo "============================================="
|
||||||
|
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling optipng"
|
||||||
|
echo "============================================="
|
||||||
|
(
|
||||||
|
emcc \
|
||||||
|
${OPTIMIZE} \
|
||||||
|
-Wno-implicit-function-declaration \
|
||||||
|
-I ${PREFIX}/include \
|
||||||
|
-I node_modules/optipng/src/opngreduc \
|
||||||
|
-I node_modules/optipng/src/pngxtern \
|
||||||
|
-I node_modules/optipng/src/cexcept \
|
||||||
|
-I node_modules/optipng/src/gifread \
|
||||||
|
-I node_modules/optipng/src/pnmio \
|
||||||
|
-I node_modules/optipng/src/minitiff \
|
||||||
|
--std=c99 -c \
|
||||||
|
node_modules/optipng/src/opngreduc/*.c \
|
||||||
|
node_modules/optipng/src/pngxtern/*.c \
|
||||||
|
node_modules/optipng/src/gifread/*.c \
|
||||||
|
node_modules/optipng/src/minitiff/*.c \
|
||||||
|
node_modules/optipng/src/pnmio/*.c \
|
||||||
|
node_modules/optipng/src/optipng/*.c
|
||||||
|
|
||||||
|
emcc \
|
||||||
|
--bind \
|
||||||
|
${OPTIMIZE} \
|
||||||
|
-s ALLOW_MEMORY_GROWTH=1 -s MODULARIZE=1 -s 'EXPORT_NAME="optipng"' \
|
||||||
|
-I ${PREFIX}/include \
|
||||||
|
-I node_modules/optipng/src/opngreduc \
|
||||||
|
-I node_modules/optipng/src/pngxtern \
|
||||||
|
-I node_modules/optipng/src/cexcept \
|
||||||
|
-I node_modules/optipng/src/gifread \
|
||||||
|
-I node_modules/optipng/src/pnmio \
|
||||||
|
-I node_modules/optipng/src/minitiff \
|
||||||
|
-o "optipng.js" \
|
||||||
|
--std=c++11 \
|
||||||
|
optipng.cpp \
|
||||||
|
*.o \
|
||||||
|
${PREFIX}/lib/libz.so ${PREFIX}/lib/libpng.a
|
||||||
|
)
|
||||||
|
echo "============================================="
|
||||||
|
echo "Compiling optipng done"
|
||||||
|
echo "============================================="
|
||||||
|
|
||||||
|
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||||
|
echo "Did you update your docker image?"
|
||||||
|
echo "Run \`docker pull trzeci/emscripten\`"
|
||||||
|
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||||
19
codecs/optipng/example.html
Normal file
19
codecs/optipng/example.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<script src='optipng.js'></script>
|
||||||
|
<script>
|
||||||
|
const Module = optipng();
|
||||||
|
|
||||||
|
Module.onRuntimeInitialized = async _ => {
|
||||||
|
console.log('Version:', Module.version().toString(16));
|
||||||
|
const image = await fetch('../example_palette.png').then(r => r.arrayBuffer());
|
||||||
|
const newImage = Module.compress(image, {level: 3});
|
||||||
|
console.log('done');
|
||||||
|
Module.free_result();
|
||||||
|
|
||||||
|
console.log(`Old size: ${image.byteLength}, new size: ${newImage.byteLength} (${newImage.byteLength/image.byteLength*100}%)`);
|
||||||
|
const blobURL = URL.createObjectURL(new Blob([newImage], {type: 'image/png'}));
|
||||||
|
const img = document.createElement('img');
|
||||||
|
img.src = blobURL;
|
||||||
|
document.body.appendChild(img);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
53
codecs/optipng/optipng.cpp
Normal file
53
codecs/optipng/optipng.cpp
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#include "emscripten/bind.h"
|
||||||
|
#include "emscripten/val.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace emscripten;
|
||||||
|
|
||||||
|
extern "C" int main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
int version() {
|
||||||
|
// FIXME (@surma): Haven’t found a version in optipng :(
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OptiPngOpts {
|
||||||
|
int level;
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t* result;
|
||||||
|
val compress(std::string png, OptiPngOpts opts) {
|
||||||
|
remove("input.png");
|
||||||
|
remove("output.png");
|
||||||
|
FILE* infile = fopen("input.png", "wb");
|
||||||
|
fwrite(png.c_str(), png.length(), 1, infile);
|
||||||
|
fflush(infile);
|
||||||
|
fclose(infile);
|
||||||
|
|
||||||
|
char optlevel[8];
|
||||||
|
sprintf(&optlevel[0], "-o%d", opts.level);
|
||||||
|
char* args[] = {"optipng", optlevel, "-out", "output.png", "input.png"};
|
||||||
|
main(5, args);
|
||||||
|
|
||||||
|
FILE *outfile = fopen("output.png", "rb");
|
||||||
|
fseek(outfile, 0, SEEK_END);
|
||||||
|
int fsize = ftell(outfile);
|
||||||
|
result = (uint8_t*) malloc(fsize);
|
||||||
|
fseek(outfile, 0, SEEK_SET);
|
||||||
|
fread(result, fsize, 1, outfile);
|
||||||
|
return val(typed_memory_view(fsize, result));
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_result() {
|
||||||
|
free(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_BINDINGS(my_module) {
|
||||||
|
value_object<OptiPngOpts>("OptiPngOpts")
|
||||||
|
.field("level", &OptiPngOpts::level);
|
||||||
|
|
||||||
|
function("version", &version);
|
||||||
|
function("compress", &compress);
|
||||||
|
function("free_result", &free_result);
|
||||||
|
}
|
||||||
10
codecs/optipng/optipng.d.ts
vendored
Normal file
10
codecs/optipng/optipng.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import {EncodeOptions} from "src/codecs/optipng/encoder";
|
||||||
|
|
||||||
|
export interface OptiPngModule extends EmscriptenWasm.Module {
|
||||||
|
compress(data: BufferSource, opts: EncodeOptions): Uint8Array;
|
||||||
|
free_result(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function(opts: EmscriptenWasm.ModuleOpts): OptiPngModule;
|
||||||
|
|
||||||
|
|
||||||
24
codecs/optipng/optipng.js
Normal file
24
codecs/optipng/optipng.js
Normal file
File diff suppressed because one or more lines are too long
BIN
codecs/optipng/optipng.wasm
Normal file
BIN
codecs/optipng/optipng.wasm
Normal file
Binary file not shown.
1457
codecs/optipng/package-lock.json
generated
Normal file
1457
codecs/optipng/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
22
codecs/optipng/package.json
Normal file
22
codecs/optipng/package.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "optipng",
|
||||||
|
"scripts": {
|
||||||
|
"install": "tar-dependency install && napa",
|
||||||
|
"build": "npm run build:wasm",
|
||||||
|
"build:wasm": "docker run --rm -v $(pwd):/src -e SKIP_ZLIB=\"${SKIP_ZLIB}\" -e SKIP_LIBPNG=\"${SKIP_LIBPNG}\" trzeci/emscripten ./build.sh"
|
||||||
|
},
|
||||||
|
"tarDependencies": {
|
||||||
|
"node_modules/optipng": {
|
||||||
|
"url": "https://netcologne.dl.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.7/optipng-0.7.7.tar.gz",
|
||||||
|
"strip": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"napa": {
|
||||||
|
"libpng": "emscripten-ports/libpng",
|
||||||
|
"zlib": "emscripten-ports/zlib"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"napa": "^3.0.0",
|
||||||
|
"tar-dependency": "0.0.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
codecs/oxipng/.gitignore
vendored
1
codecs/oxipng/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
/target
|
|
||||||
501
codecs/oxipng/Cargo.lock
generated
501
codecs/oxipng/Cargo.lock
generated
@@ -1,501 +0,0 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
[[package]]
|
|
||||||
name = "adler32"
|
|
||||||
version = "1.0.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "autocfg"
|
|
||||||
version = "1.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bit-vec"
|
|
||||||
version = "0.6.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "1.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "build_const"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bumpalo"
|
|
||||||
version = "3.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bytemuck"
|
|
||||||
version = "1.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "byteorder"
|
|
||||||
version = "1.3.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cc"
|
|
||||||
version = "1.0.50"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cfg-if"
|
|
||||||
version = "0.1.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cloudflare-zlib"
|
|
||||||
version = "0.2.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cloudflare-zlib-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cloudflare-zlib-sys"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crc"
|
|
||||||
version = "1.8.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crc32fast"
|
|
||||||
version = "1.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crossbeam-deque"
|
|
||||||
version = "0.7.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crossbeam-epoch"
|
|
||||||
version = "0.8.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crossbeam-queue"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crossbeam-utils"
|
|
||||||
version = "0.7.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "deflate"
|
|
||||||
version = "0.8.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "either"
|
|
||||||
version = "1.5.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hermit-abi"
|
|
||||||
version = "0.1.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "image"
|
|
||||||
version = "0.23.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"bytemuck 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"png 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "indexmap"
|
|
||||||
version = "1.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "inflate"
|
|
||||||
version = "0.4.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "itertools"
|
|
||||||
version = "0.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lazy_static"
|
|
||||||
version = "1.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.68"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libdeflater"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "log"
|
|
||||||
version = "0.4.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "maybe-uninit"
|
|
||||||
version = "2.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memoffset"
|
|
||||||
version = "0.5.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "miniz_oxide"
|
|
||||||
version = "0.3.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-integer"
|
|
||||||
version = "0.1.42"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-iter"
|
|
||||||
version = "0.1.40"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-rational"
|
|
||||||
version = "0.2.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-traits"
|
|
||||||
version = "0.2.11"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num_cpus"
|
|
||||||
version = "1.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "oxipng"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"oxipng 2.3.0 (git+https://github.com/shssoichiro/oxipng.git)",
|
|
||||||
"wasm-bindgen 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "oxipng"
|
|
||||||
version = "2.3.0"
|
|
||||||
source = "git+https://github.com/shssoichiro/oxipng.git#f74726915131ec7ff1df0514436aac34bc603cff"
|
|
||||||
dependencies = [
|
|
||||||
"bit-vec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"cloudflare-zlib 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"image 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libdeflater 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rgb 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"zopfli 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "png"
|
|
||||||
version = "0.16.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"deflate 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "proc-macro2"
|
|
||||||
version = "1.0.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "quote"
|
|
||||||
version = "1.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rayon"
|
|
||||||
version = "1.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rayon-core"
|
|
||||||
version = "1.7.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rgb"
|
|
||||||
version = "0.8.16"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "scopeguard"
|
|
||||||
version = "1.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "syn"
|
|
||||||
version = "1.0.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "typed-arena"
|
|
||||||
version = "1.7.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-xid"
|
|
||||||
version = "0.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen"
|
|
||||||
version = "0.2.60"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"wasm-bindgen-macro 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-backend"
|
|
||||||
version = "0.2.60"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"bumpalo 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"wasm-bindgen-shared 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-macro"
|
|
||||||
version = "0.2.60"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"wasm-bindgen-macro-support 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-macro-support"
|
|
||||||
version = "0.2.60"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"wasm-bindgen-backend 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"wasm-bindgen-shared 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "wasm-bindgen-shared"
|
|
||||||
version = "0.2.60"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "zopfli"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[metadata]
|
|
||||||
"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
|
|
||||||
"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
|
|
||||||
"checksum bit-vec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a4523a10839ffae575fb08aa3423026c8cb4687eef43952afb956229d4f246f7"
|
|
||||||
"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
|
||||||
"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
|
|
||||||
"checksum bumpalo 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187"
|
|
||||||
"checksum bytemuck 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37fa13df2292ecb479ec23aa06f4507928bef07839be9ef15281411076629431"
|
|
||||||
"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
|
|
||||||
"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
|
|
||||||
"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
|
||||||
"checksum cloudflare-zlib 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f5ed63a019d55bacd15cadcbcb96bf41b16281417fff393bdb55fa84255fe4b9"
|
|
||||||
"checksum cloudflare-zlib-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7e195cb274a0d6ee87e718838a09baecd7cbc9f6075dac256a84cb5842739c06"
|
|
||||||
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
|
|
||||||
"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
|
|
||||||
"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285"
|
|
||||||
"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace"
|
|
||||||
"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db"
|
|
||||||
"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
|
|
||||||
"checksum deflate 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "050ef6de42a33903b30a7497b76b40d3d58691d4d3eec355348c122444a388f0"
|
|
||||||
"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
|
|
||||||
"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
|
|
||||||
"checksum image 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9062b90712d25bc6bb165d110aa59c6b47c849246e341e7b86a98daff9d49f60"
|
|
||||||
"checksum indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "076f042c5b7b98f31d205f1249267e12a6518c1481e9dae9764af19b707d2292"
|
|
||||||
"checksum inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
|
|
||||||
"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
|
||||||
"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|
||||||
"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
|
|
||||||
"checksum libdeflater 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "66dca08b13369865b2f6dca1dd05f833985cbe6c12a676b04d55f78b85e80246"
|
|
||||||
"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
|
|
||||||
"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
|
|
||||||
"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8"
|
|
||||||
"checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5"
|
|
||||||
"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
|
|
||||||
"checksum num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00"
|
|
||||||
"checksum num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef"
|
|
||||||
"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
|
|
||||||
"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
|
|
||||||
"checksum oxipng 2.3.0 (git+https://github.com/shssoichiro/oxipng.git)" = "<none>"
|
|
||||||
"checksum png 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "46060468187c21c00ffa2a920690b29997d7fd543f5a4d400461e4a7d4fccde8"
|
|
||||||
"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
|
|
||||||
"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
|
|
||||||
"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
|
|
||||||
"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
|
|
||||||
"checksum rgb 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5ec4ab2cf0b27e111e266e161cf7f9efd20125a161190da1c0945c4a4408fef3"
|
|
||||||
"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
|
||||||
"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
|
|
||||||
"checksum typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d"
|
|
||||||
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
|
|
||||||
"checksum wasm-bindgen 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "2cc57ce05287f8376e998cbddfb4c8cb43b84a7ec55cf4551d7c00eef317a47f"
|
|
||||||
"checksum wasm-bindgen-backend 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d967d37bf6c16cca2973ca3af071d0a2523392e4a594548155d89a678f4237cd"
|
|
||||||
"checksum wasm-bindgen-macro 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "8bd151b63e1ea881bb742cd20e1d6127cef28399558f3b5d415289bc41eee3a4"
|
|
||||||
"checksum wasm-bindgen-macro-support 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d68a5b36eef1be7868f668632863292e37739656a80fc4b9acec7b0bd35a4931"
|
|
||||||
"checksum wasm-bindgen-shared 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "daf76fe7d25ac79748a37538b7daeed1c7a6867c92d3245c12c6222e4a20d639"
|
|
||||||
"checksum zopfli 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4079b79464426ade2a1b0177fb0ce8396ba6b4084267407e333573c666073964"
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "oxipng"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Ingvar Stepanyan <me@rreverser.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
publish = false
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
oxipng = { version = "2.3.0", default-features = false }
|
|
||||||
wasm-bindgen = "0.2.48"
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
lto = true
|
|
||||||
opt-level = "s"
|
|
||||||
|
|
||||||
[patch.crates-io]
|
|
||||||
oxipng = { git = "https://github.com/shssoichiro/oxipng.git", branch = "master" }
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
FROM rust
|
|
||||||
RUN rustup target add wasm32-unknown-unknown
|
|
||||||
RUN curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
|
||||||
|
|
||||||
RUN mkdir /opt/wabt && \
|
|
||||||
curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.11/wabt-1.0.11-linux.tar.gz | tar -xzf - -C /opt/wabt --strip 1
|
|
||||||
|
|
||||||
RUN mkdir /opt/wasi-sdk && \
|
|
||||||
curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-8/wasi-sdk-8.0-linux.tar.gz | tar -xzf - -C /opt/wasi-sdk --strip 1
|
|
||||||
|
|
||||||
ENV PATH="/opt/wabt:/opt/wasi-sdk/bin:${PATH}"
|
|
||||||
WORKDIR /src
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm"
|
|
||||||
echo "============================================="
|
|
||||||
(
|
|
||||||
wasm-pack build
|
|
||||||
wasm-strip pkg/oxipng_bg.wasm
|
|
||||||
rm pkg/.gitignore
|
|
||||||
)
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm done"
|
|
||||||
echo "============================================="
|
|
||||||
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
echo "Did you update your docker image?"
|
|
||||||
echo "Run \`docker pull ubuntu\`"
|
|
||||||
echo "Run \`docker pull rust\`"
|
|
||||||
echo "Run \`docker build -t squoosh-oxipng .\`"
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
4
codecs/oxipng/package-lock.json
generated
4
codecs/oxipng/package-lock.json
generated
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "oxipng",
|
|
||||||
"lockfileVersion": 1
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "oxipng",
|
|
||||||
"scripts": {
|
|
||||||
"build:image": "docker build -t squoosh-oxipng .",
|
|
||||||
"build": "docker run --rm -v $(pwd):/src squoosh-oxipng ./build.sh"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
8
codecs/oxipng/pkg/oxipng.d.ts
vendored
8
codecs/oxipng/pkg/oxipng.d.ts
vendored
@@ -1,8 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/* eslint-disable */
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} data
|
|
||||||
* @param {number} level
|
|
||||||
* @returns {Uint8Array}
|
|
||||||
*/
|
|
||||||
export function optimise(data: Uint8Array, level: number): Uint8Array;
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
import * as wasm from './oxipng_bg.wasm';
|
|
||||||
|
|
||||||
const lTextDecoder = typeof TextDecoder === 'undefined' ? require('util').TextDecoder : TextDecoder;
|
|
||||||
|
|
||||||
let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
|
||||||
|
|
||||||
cachedTextDecoder.decode();
|
|
||||||
|
|
||||||
let cachegetUint8Memory0 = null;
|
|
||||||
function getUint8Memory0() {
|
|
||||||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetUint8Memory0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getStringFromWasm0(ptr, len) {
|
|
||||||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
|
|
||||||
}
|
|
||||||
|
|
||||||
let WASM_VECTOR_LEN = 0;
|
|
||||||
|
|
||||||
function passArray8ToWasm0(arg, malloc) {
|
|
||||||
const ptr = malloc(arg.length * 1);
|
|
||||||
getUint8Memory0().set(arg, ptr / 1);
|
|
||||||
WASM_VECTOR_LEN = arg.length;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachegetInt32Memory0 = null;
|
|
||||||
function getInt32Memory0() {
|
|
||||||
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetInt32Memory0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getArrayU8FromWasm0(ptr, len) {
|
|
||||||
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} data
|
|
||||||
* @param {number} level
|
|
||||||
* @returns {Uint8Array}
|
|
||||||
*/
|
|
||||||
export function optimise(data, level) {
|
|
||||||
var ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
|
|
||||||
var len0 = WASM_VECTOR_LEN;
|
|
||||||
wasm.optimise(8, ptr0, len0, level);
|
|
||||||
var r0 = getInt32Memory0()[8 / 4 + 0];
|
|
||||||
var r1 = getInt32Memory0()[8 / 4 + 1];
|
|
||||||
var v1 = getArrayU8FromWasm0(r0, r1).slice();
|
|
||||||
wasm.__wbindgen_free(r0, r1 * 1);
|
|
||||||
return v1;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const __wbindgen_throw = function(arg0, arg1) {
|
|
||||||
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
||||||
};
|
|
||||||
|
|
||||||
8
codecs/oxipng/pkg/oxipng_bg.d.ts
vendored
8
codecs/oxipng/pkg/oxipng_bg.d.ts
vendored
@@ -1,8 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/* eslint-disable */
|
|
||||||
export const memory: WebAssembly.Memory;
|
|
||||||
export function optimise(a: number, b: number, c: number, d: number): void;
|
|
||||||
export function malloc(a: number): number;
|
|
||||||
export function free(a: number): void;
|
|
||||||
export function __wbindgen_malloc(a: number): number;
|
|
||||||
export function __wbindgen_free(a: number, b: number): void;
|
|
||||||
Binary file not shown.
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "oxipng",
|
|
||||||
"collaborators": [
|
|
||||||
"Ingvar Stepanyan <me@rreverser.com>"
|
|
||||||
],
|
|
||||||
"version": "0.1.0",
|
|
||||||
"files": [
|
|
||||||
"oxipng_bg.wasm",
|
|
||||||
"oxipng.js",
|
|
||||||
"oxipng.d.ts"
|
|
||||||
],
|
|
||||||
"module": "oxipng.js",
|
|
||||||
"types": "oxipng.d.ts",
|
|
||||||
"sideEffects": false
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
mod malloc_shim;
|
|
||||||
|
|
||||||
use wasm_bindgen::prelude::*;
|
|
||||||
|
|
||||||
#[wasm_bindgen(catch)]
|
|
||||||
pub fn optimise(data: &[u8], level: u8) -> Vec<u8> {
|
|
||||||
let mut options = oxipng::Options::from_preset(level);
|
|
||||||
options.deflate = oxipng::Deflaters::Libdeflater;
|
|
||||||
oxipng::optimize_from_memory(data, &options).unwrap_throw()
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
//! This is a module that provides `malloc` and `free` for `libdeflate`.
|
|
||||||
//! These implementations are compatible with the standard signatures
|
|
||||||
//! but use Rust allocator instead of including libc one as well.
|
|
||||||
//!
|
|
||||||
//! I've raised an upstream issue to hopefully make this easier in
|
|
||||||
//! future: https://github.com/ebiggers/libdeflate/issues/62
|
|
||||||
|
|
||||||
use std::alloc::*;
|
|
||||||
use std::mem::{align_of, size_of};
|
|
||||||
|
|
||||||
unsafe fn layout_for(size: usize) -> Layout {
|
|
||||||
Layout::from_size_align_unchecked(size_of::<usize>() + size, align_of::<usize>())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn malloc(size: usize) -> *mut u8 {
|
|
||||||
let size_and_data_ptr = alloc(layout_for(size));
|
|
||||||
*(size_and_data_ptr as *mut usize) = size;
|
|
||||||
size_and_data_ptr.add(size_of::<usize>())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn free(ptr: *mut u8) {
|
|
||||||
let size_and_data_ptr = ptr.sub(size_of::<usize>());
|
|
||||||
let size = *(size_and_data_ptr as *const usize);
|
|
||||||
dealloc(ptr, layout_for(size))
|
|
||||||
}
|
|
||||||
6
codecs/resize/.gitignore
vendored
6
codecs/resize/.gitignore
vendored
@@ -1,6 +0,0 @@
|
|||||||
**/*.rs.bk
|
|
||||||
target
|
|
||||||
Cargo.lock
|
|
||||||
bin/
|
|
||||||
pkg/README.md
|
|
||||||
lut.inc
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "resize"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Surma <surma@surma.link>"]
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
#crate-type = ["cdylib", "rlib"]
|
|
||||||
crate-type = ["cdylib"]
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["console_error_panic_hook", "wee_alloc"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
cfg-if = "0.1.2"
|
|
||||||
wasm-bindgen = "0.2.38"
|
|
||||||
resize = "0.3.0"
|
|
||||||
|
|
||||||
# The `console_error_panic_hook` crate provides better debugging of panics by
|
|
||||||
# logging them with `console.error`. This is great for development, but requires
|
|
||||||
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for
|
|
||||||
# code size when deploying.
|
|
||||||
console_error_panic_hook = { version = "0.1.1", optional = true }
|
|
||||||
|
|
||||||
# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size
|
|
||||||
# compared to the default allocator's ~10K. It is slower than the default
|
|
||||||
# allocator, however.
|
|
||||||
#
|
|
||||||
# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now.
|
|
||||||
wee_alloc = { version = "0.4.2", optional = true }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
wasm-bindgen-test = "0.2"
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
# Tell `rustc` to optimize for small code size.
|
|
||||||
opt-level = "s"
|
|
||||||
lto = true
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
FROM rust
|
|
||||||
RUN rustup target add wasm32-unknown-unknown
|
|
||||||
RUN curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
|
||||||
|
|
||||||
RUN mkdir /opt/wabt && \
|
|
||||||
curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.11/wabt-1.0.11-linux.tar.gz | tar -xzf - -C /opt/wabt --strip 1
|
|
||||||
|
|
||||||
ENV PATH="/opt/wabt:${PATH}"
|
|
||||||
WORKDIR /src
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
include!("./src/srgb.rs");
|
|
||||||
|
|
||||||
use std::io::Write;
|
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
|
||||||
let mut srgb_to_linear_lut = String::from("static SRGB_TO_LINEAR_LUT: [f32; 256] = [");
|
|
||||||
let mut linear_to_srgb_lut = String::from("static LINEAR_TO_SRGB_LUT: [f32; 256] = [");
|
|
||||||
for i in 0..256 {
|
|
||||||
srgb_to_linear_lut.push_str(&format!("{0:.7}", srgb_to_linear((i as f32) / 255.0)));
|
|
||||||
srgb_to_linear_lut.push_str(",");
|
|
||||||
linear_to_srgb_lut.push_str(&format!("{0:.7}", linear_to_srgb((i as f32) / 255.0)));
|
|
||||||
linear_to_srgb_lut.push_str(",");
|
|
||||||
}
|
|
||||||
srgb_to_linear_lut.pop().unwrap();
|
|
||||||
linear_to_srgb_lut.pop().unwrap();
|
|
||||||
srgb_to_linear_lut.push_str("];");
|
|
||||||
linear_to_srgb_lut.push_str("];");
|
|
||||||
|
|
||||||
let mut file = std::fs::File::create("src/lut.inc")?;
|
|
||||||
file.write_all(srgb_to_linear_lut.as_bytes())?;
|
|
||||||
file.write_all(linear_to_srgb_lut.as_bytes())?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm"
|
|
||||||
echo "============================================="
|
|
||||||
(
|
|
||||||
wasm-pack build
|
|
||||||
wasm-strip pkg/resize_bg.wasm
|
|
||||||
rm pkg/.gitignore
|
|
||||||
)
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm done"
|
|
||||||
echo "============================================="
|
|
||||||
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
echo "Did you update your docker image?"
|
|
||||||
echo "Run \`docker pull ubuntu\`"
|
|
||||||
echo "Run \`docker pull rust\`"
|
|
||||||
echo "Run \`docker build -t squoosh-resize .\`"
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
4
codecs/resize/package-lock.json
generated
4
codecs/resize/package-lock.json
generated
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "resize",
|
|
||||||
"lockfileVersion": 1
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "resize",
|
|
||||||
"scripts": {
|
|
||||||
"build:image": "docker build -t squoosh-resize .",
|
|
||||||
"build": "docker run --rm -v $(pwd):/src squoosh-resize ./build.sh"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "resize",
|
|
||||||
"collaborators": [
|
|
||||||
"Surma <surma@surma.link>"
|
|
||||||
],
|
|
||||||
"version": "0.1.0",
|
|
||||||
"files": [
|
|
||||||
"resize_bg.wasm",
|
|
||||||
"resize.js",
|
|
||||||
"resize.d.ts"
|
|
||||||
],
|
|
||||||
"module": "resize.js",
|
|
||||||
"types": "resize.d.ts",
|
|
||||||
"sideEffects": "false"
|
|
||||||
}
|
|
||||||
13
codecs/resize/pkg/resize.d.ts
vendored
13
codecs/resize/pkg/resize.d.ts
vendored
@@ -1,13 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} input_image
|
|
||||||
* @param {number} input_width
|
|
||||||
* @param {number} input_height
|
|
||||||
* @param {number} output_width
|
|
||||||
* @param {number} output_height
|
|
||||||
* @param {number} typ_idx
|
|
||||||
* @param {boolean} premultiply
|
|
||||||
* @param {boolean} color_space_conversion
|
|
||||||
* @returns {Uint8Array}
|
|
||||||
*/
|
|
||||||
export function resize(input_image: Uint8Array, input_width: number, input_height: number, output_width: number, output_height: number, typ_idx: number, premultiply: boolean, color_space_conversion: boolean): Uint8Array;
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import * as wasm from './resize_bg.wasm';
|
|
||||||
|
|
||||||
let cachegetUint8Memory = null;
|
|
||||||
function getUint8Memory() {
|
|
||||||
if (cachegetUint8Memory === null || cachegetUint8Memory.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetUint8Memory = new Uint8Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetUint8Memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
let WASM_VECTOR_LEN = 0;
|
|
||||||
|
|
||||||
function passArray8ToWasm(arg) {
|
|
||||||
const ptr = wasm.__wbindgen_malloc(arg.length * 1);
|
|
||||||
getUint8Memory().set(arg, ptr / 1);
|
|
||||||
WASM_VECTOR_LEN = arg.length;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachegetInt32Memory = null;
|
|
||||||
function getInt32Memory() {
|
|
||||||
if (cachegetInt32Memory === null || cachegetInt32Memory.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetInt32Memory = new Int32Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetInt32Memory;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getArrayU8FromWasm(ptr, len) {
|
|
||||||
return getUint8Memory().subarray(ptr / 1, ptr / 1 + len);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} input_image
|
|
||||||
* @param {number} input_width
|
|
||||||
* @param {number} input_height
|
|
||||||
* @param {number} output_width
|
|
||||||
* @param {number} output_height
|
|
||||||
* @param {number} typ_idx
|
|
||||||
* @param {boolean} premultiply
|
|
||||||
* @param {boolean} color_space_conversion
|
|
||||||
* @returns {Uint8Array}
|
|
||||||
*/
|
|
||||||
export function resize(input_image, input_width, input_height, output_width, output_height, typ_idx, premultiply, color_space_conversion) {
|
|
||||||
const retptr = 8;
|
|
||||||
const ret = wasm.resize(retptr, passArray8ToWasm(input_image), WASM_VECTOR_LEN, input_width, input_height, output_width, output_height, typ_idx, premultiply, color_space_conversion);
|
|
||||||
const memi32 = getInt32Memory();
|
|
||||||
const v0 = getArrayU8FromWasm(memi32[retptr / 4 + 0], memi32[retptr / 4 + 1]).slice();
|
|
||||||
wasm.__wbindgen_free(memi32[retptr / 4 + 0], memi32[retptr / 4 + 1] * 1);
|
|
||||||
return v0;
|
|
||||||
}
|
|
||||||
|
|
||||||
5
codecs/resize/pkg/resize_bg.d.ts
vendored
5
codecs/resize/pkg/resize_bg.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
export const memory: WebAssembly.Memory;
|
|
||||||
export function __wbindgen_malloc(a: number): number;
|
|
||||||
export function __wbindgen_free(a: number, b: number): void;
|
|
||||||
export function resize(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number): void;
|
|
||||||
Binary file not shown.
@@ -1,121 +0,0 @@
|
|||||||
extern crate cfg_if;
|
|
||||||
extern crate resize;
|
|
||||||
extern crate wasm_bindgen;
|
|
||||||
|
|
||||||
mod utils;
|
|
||||||
|
|
||||||
use cfg_if::cfg_if;
|
|
||||||
use resize::Pixel::RGBA;
|
|
||||||
use resize::Type;
|
|
||||||
use wasm_bindgen::prelude::*;
|
|
||||||
|
|
||||||
mod srgb;
|
|
||||||
use srgb::Clamp;
|
|
||||||
|
|
||||||
cfg_if! {
|
|
||||||
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
|
|
||||||
// allocator.
|
|
||||||
if #[cfg(feature = "wee_alloc")] {
|
|
||||||
extern crate wee_alloc;
|
|
||||||
#[global_allocator]
|
|
||||||
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
include!("./lut.inc");
|
|
||||||
|
|
||||||
// If `with_space_conversion` is true, this function returns 2 functions that
|
|
||||||
// convert from sRGB to linear RGB and vice versa. If `with_space_conversion` is
|
|
||||||
// false, the 2 functions returned do nothing.
|
|
||||||
fn converter_funcs(with_space_conversion: bool) -> ((fn(u8) -> f32), (fn(f32) -> u8)) {
|
|
||||||
if with_space_conversion {
|
|
||||||
(
|
|
||||||
|v| SRGB_TO_LINEAR_LUT[v as usize] * 255.0,
|
|
||||||
|v| (LINEAR_TO_SRGB_LUT[v as usize] * 255.0) as u8,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
(|v| v as f32, |v| v as u8)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If `with_alpha_premultiplication` is true, this function returns a function
|
|
||||||
// that premultiply the alpha channel with the given channel value and another
|
|
||||||
// function that reverses that process. If `with_alpha_premultiplication` is
|
|
||||||
// false, the functions just return the channel value.
|
|
||||||
fn alpha_multiplier_funcs(
|
|
||||||
with_alpha_premultiplication: bool,
|
|
||||||
) -> ((fn(f32, u8) -> u8), (fn(u8, u8) -> f32)) {
|
|
||||||
if with_alpha_premultiplication {
|
|
||||||
(
|
|
||||||
|v, a| (v * (a as f32) / 255.0) as u8,
|
|
||||||
|v, a| (v as f32) * 255.0 / (a as f32).clamp(0.0, 255.0),
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
(|v, _a| v as u8, |v, _a| v as f32)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[wasm_bindgen]
|
|
||||||
#[no_mangle]
|
|
||||||
pub fn resize(
|
|
||||||
mut input_image: Vec<u8>,
|
|
||||||
input_width: usize,
|
|
||||||
input_height: usize,
|
|
||||||
output_width: usize,
|
|
||||||
output_height: usize,
|
|
||||||
typ_idx: usize,
|
|
||||||
premultiply: bool,
|
|
||||||
color_space_conversion: bool,
|
|
||||||
) -> Vec<u8> {
|
|
||||||
let typ = match typ_idx {
|
|
||||||
0 => Type::Triangle,
|
|
||||||
1 => Type::Catrom,
|
|
||||||
2 => Type::Mitchell,
|
|
||||||
3 => Type::Lanczos3,
|
|
||||||
_ => panic!("Nope"),
|
|
||||||
};
|
|
||||||
let num_input_pixels = input_width * input_height;
|
|
||||||
let num_output_pixels = output_width * output_height;
|
|
||||||
|
|
||||||
let (to_linear, to_color_space) = converter_funcs(color_space_conversion);
|
|
||||||
let (premultiplier, demultiplier) = alpha_multiplier_funcs(premultiply);
|
|
||||||
|
|
||||||
// If both options are false, there is no preprocessing on the pixel valus
|
|
||||||
// and we can skip the loop.
|
|
||||||
if premultiply || color_space_conversion {
|
|
||||||
for i in 0..num_input_pixels {
|
|
||||||
for j in 0..3 {
|
|
||||||
input_image[4 * i + j] =
|
|
||||||
premultiplier(to_linear(input_image[4 * i + j]), input_image[4 * i + 3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut resizer = resize::new(
|
|
||||||
input_width,
|
|
||||||
input_height,
|
|
||||||
output_width,
|
|
||||||
output_height,
|
|
||||||
RGBA,
|
|
||||||
typ,
|
|
||||||
);
|
|
||||||
let mut output_image = Vec::<u8>::with_capacity(num_output_pixels * 4);
|
|
||||||
output_image.resize(num_output_pixels * 4, 0);
|
|
||||||
resizer.resize(input_image.as_slice(), output_image.as_mut_slice());
|
|
||||||
|
|
||||||
if premultiply || color_space_conversion {
|
|
||||||
for i in 0..num_output_pixels {
|
|
||||||
for j in 0..3 {
|
|
||||||
// We don’t need to worry about division by zero, as division by zero
|
|
||||||
// is well-defined on floats to return ±Inf. ±Inf is converted to 0
|
|
||||||
// when casting to integers.
|
|
||||||
output_image[4 * i + j] = to_color_space(demultiplier(
|
|
||||||
output_image[4 * i + j],
|
|
||||||
output_image[4 * i + 3],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return output_image;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
pub trait Clamp: std::cmp::PartialOrd + Sized {
|
|
||||||
fn clamp(self, min: Self, max: Self) -> Self {
|
|
||||||
if self.lt(&min) {
|
|
||||||
min
|
|
||||||
} else if self.gt(&max) {
|
|
||||||
max
|
|
||||||
} else {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clamp for f32 {}
|
|
||||||
|
|
||||||
pub fn srgb_to_linear(v: f32) -> f32 {
|
|
||||||
if v < 0.04045 {
|
|
||||||
v / 12.92
|
|
||||||
} else {
|
|
||||||
((v + 0.055) / 1.055).powf(2.4).clamp(0.0, 1.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn linear_to_srgb(v: f32) -> f32 {
|
|
||||||
if v < 0.0031308 {
|
|
||||||
v * 12.92
|
|
||||||
} else {
|
|
||||||
(1.055 * v.powf(1.0 / 2.4) - 0.055).clamp(0.0, 1.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
use cfg_if::cfg_if;
|
|
||||||
|
|
||||||
cfg_if! {
|
|
||||||
// When the `console_error_panic_hook` feature is enabled, we can call the
|
|
||||||
// `set_panic_hook` function at least once during initialization, and then
|
|
||||||
// we will get better error messages if our code ever panics.
|
|
||||||
//
|
|
||||||
// For more details see
|
|
||||||
// https://github.com/rustwasm/console_error_panic_hook#readme
|
|
||||||
if #[cfg(feature = "console_error_panic_hook")] {
|
|
||||||
extern crate console_error_panic_hook;
|
|
||||||
pub use self::console_error_panic_hook::set_once as set_panic_hook;
|
|
||||||
} else {
|
|
||||||
#[inline]
|
|
||||||
pub fn set_panic_hook() {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
2
codecs/rotate/.gitignore
vendored
2
codecs/rotate/.gitignore
vendored
@@ -1,2 +0,0 @@
|
|||||||
target
|
|
||||||
Cargo.lock
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "rotate"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Surma <surma@google.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
name = "rotate"
|
|
||||||
path = "rotate.rs"
|
|
||||||
crate-type = ["cdylib", "rlib"]
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
lto = true
|
|
||||||
opt-level = "s"
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
FROM rust
|
|
||||||
RUN rustup target add wasm32-unknown-unknown
|
|
||||||
|
|
||||||
RUN mkdir /opt/wabt && \
|
|
||||||
curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.11/wabt-1.0.11-linux.tar.gz | tar -xzf - -C /opt/wabt --strip 1
|
|
||||||
|
|
||||||
ENV PATH="/opt/wabt:${PATH}"
|
|
||||||
WORKDIR /src
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
// THIS IS NOT A NODE SCRIPT
|
|
||||||
// This is a d8 script. Please install jsvu[1] and install v8.
|
|
||||||
// Then run `npm run --silent benchmark`.
|
|
||||||
// [1]: https://github.com/GoogleChromeLabs/jsvu
|
|
||||||
async function init() {
|
|
||||||
// Adjustable constants.
|
|
||||||
const imageDimensions = 4096;
|
|
||||||
const iterations = new Array(100);
|
|
||||||
|
|
||||||
// Constants. Don’t change.
|
|
||||||
const imageByteSize = imageDimensions * imageDimensions * 4;
|
|
||||||
const wasmPageSize = 64 * 1024;
|
|
||||||
|
|
||||||
const buffer = readbuffer("rotate.wasm");
|
|
||||||
const { instance } = await WebAssembly.instantiate(buffer);
|
|
||||||
|
|
||||||
const pagesAvailable = Math.floor(
|
|
||||||
instance.exports.memory.buffer.byteLength / wasmPageSize
|
|
||||||
);
|
|
||||||
const pagesNeeded = Math.floor((imageByteSize * 2 + 4) / wasmPageSize) + 1;
|
|
||||||
const additionalPagesNeeded = pagesNeeded - pagesAvailable;
|
|
||||||
if (additionalPagesNeeded > 0) {
|
|
||||||
instance.exports.memory.grow(additionalPagesNeeded);
|
|
||||||
}
|
|
||||||
|
|
||||||
[0, 90, 180, 270].forEach(rotation => {
|
|
||||||
print(`\n${rotation} degrees`);
|
|
||||||
print(`==============================`);
|
|
||||||
for (let i = 0; i < 100; i++) {
|
|
||||||
const start = Date.now();
|
|
||||||
instance.exports.rotate(imageDimensions, imageDimensions, rotation);
|
|
||||||
iterations[i] = Date.now() - start;
|
|
||||||
}
|
|
||||||
const average = iterations.reduce((sum, c) => sum + c) / iterations.length;
|
|
||||||
const stddev = Math.sqrt(
|
|
||||||
iterations
|
|
||||||
.map(i => Math.pow(i - average, 2))
|
|
||||||
.reduce((sum, c) => sum + c) / iterations.length
|
|
||||||
);
|
|
||||||
print(`n = ${iterations.length}`);
|
|
||||||
print(`Average: ${average}`);
|
|
||||||
print(`StdDev: ${stddev}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
init().catch(e => console.error(e.stack));
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm"
|
|
||||||
echo "============================================="
|
|
||||||
(
|
|
||||||
cargo build \
|
|
||||||
--target wasm32-unknown-unknown \
|
|
||||||
--release
|
|
||||||
cp target/wasm32-unknown-unknown/release/rotate.wasm .
|
|
||||||
wasm-strip rotate.wasm
|
|
||||||
)
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling wasm done"
|
|
||||||
echo "============================================="
|
|
||||||
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
echo "Did you update your docker image?"
|
|
||||||
echo "Run \`docker pull ubuntu\`"
|
|
||||||
echo "Run \`docker pull rust\`"
|
|
||||||
echo "Run \`docker build -t squoosh-rotate .\`"
|
|
||||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "rotate",
|
|
||||||
"scripts": {
|
|
||||||
"build:image": "docker build -t squoosh-rotate .",
|
|
||||||
"build": "docker run --rm -v $(pwd):/src squoosh-rotate ./build.sh",
|
|
||||||
"benchmark": "echo File size after gzip && npm run benchmark:filesize && echo Optimizing && npm run -s benchmark:optimizing",
|
|
||||||
"benchmark:baseline": "v8 --liftoff --no-wasm-tier-up --no-opt ./benchmark.js",
|
|
||||||
"benchmark:optimizing": "v8 --no-liftoff --no-wasm-tier-up ./benchmark.js",
|
|
||||||
"benchmark:filesize": "cat rotate.wasm | gzip -c9n | wc -c"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
use std::slice::{from_raw_parts, from_raw_parts_mut};
|
|
||||||
|
|
||||||
// This function is taken from Zachary Dremann
|
|
||||||
// https://github.com/GoogleChromeLabs/squoosh/pull/462
|
|
||||||
trait HardUnwrap<T> {
|
|
||||||
fn unwrap_hard(self) -> T;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> HardUnwrap<T> for Option<T> {
|
|
||||||
#[cfg(not(debug_assertions))]
|
|
||||||
#[inline]
|
|
||||||
fn unwrap_hard(self) -> T {
|
|
||||||
match self {
|
|
||||||
Some(t) => t,
|
|
||||||
None => std::process::abort(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
|
||||||
fn unwrap_hard(self) -> T {
|
|
||||||
self.unwrap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const TILE_SIZE: usize = 16;
|
|
||||||
|
|
||||||
fn get_buffers<'a>(width: usize, height: usize) -> (&'a [u32], &'a mut [u32]) {
|
|
||||||
let num_pixels = width * height;
|
|
||||||
let in_b: &[u32];
|
|
||||||
let out_b: &mut [u32];
|
|
||||||
unsafe {
|
|
||||||
in_b = from_raw_parts::<u32>(8 as *const u32, num_pixels);
|
|
||||||
out_b = from_raw_parts_mut::<u32>((num_pixels * 4 + 8) as *mut u32, num_pixels);
|
|
||||||
}
|
|
||||||
return (in_b, out_b);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(never)]
|
|
||||||
fn rotate_0(width: usize, height: usize) {
|
|
||||||
let (in_b, out_b) = get_buffers(width, height);
|
|
||||||
for (in_p, out_p) in in_b.iter().zip(out_b.iter_mut()) {
|
|
||||||
*out_p = *in_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(never)]
|
|
||||||
fn rotate_90(width: usize, height: usize) {
|
|
||||||
let (in_b, out_b) = get_buffers(width, height);
|
|
||||||
let new_width = height;
|
|
||||||
let _new_height = width;
|
|
||||||
for y_start in (0..height).step_by(TILE_SIZE) {
|
|
||||||
for x_start in (0..width).step_by(TILE_SIZE) {
|
|
||||||
for y in y_start..(y_start + TILE_SIZE).min(height) {
|
|
||||||
let in_offset = y * width;
|
|
||||||
let in_bounds = if x_start + TILE_SIZE < width {
|
|
||||||
(in_offset + x_start)..(in_offset + x_start + TILE_SIZE)
|
|
||||||
} else {
|
|
||||||
(in_offset + x_start)..(in_offset + width)
|
|
||||||
};
|
|
||||||
let in_chunk = in_b.get(in_bounds).unwrap_hard();
|
|
||||||
for (x, in_p) in in_chunk.iter().enumerate() {
|
|
||||||
let new_x = (new_width - 1) - y;
|
|
||||||
let new_y = x + x_start;
|
|
||||||
*out_b.get_mut(new_y * new_width + new_x).unwrap_hard() = *in_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(never)]
|
|
||||||
fn rotate_180(width: usize, height: usize) {
|
|
||||||
let (in_b, out_b) = get_buffers(width, height);
|
|
||||||
for (in_p, out_p) in in_b.iter().zip(out_b.iter_mut().rev()) {
|
|
||||||
*out_p = *in_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(never)]
|
|
||||||
fn rotate_270(width: usize, height: usize) {
|
|
||||||
let (in_b, out_b) = get_buffers(width, height);
|
|
||||||
let new_width = height;
|
|
||||||
let new_height = width;
|
|
||||||
for y_start in (0..height).step_by(TILE_SIZE) {
|
|
||||||
for x_start in (0..width).step_by(TILE_SIZE) {
|
|
||||||
for y in y_start..(y_start + TILE_SIZE).min(height) {
|
|
||||||
let in_offset = y * width;
|
|
||||||
let in_bounds = if x_start + TILE_SIZE < width {
|
|
||||||
(in_offset + x_start)..(in_offset + x_start + TILE_SIZE)
|
|
||||||
} else {
|
|
||||||
(in_offset + x_start)..(in_offset + width)
|
|
||||||
};
|
|
||||||
let in_chunk = in_b.get(in_bounds).unwrap_hard();
|
|
||||||
for (x, in_p) in in_chunk.iter().enumerate() {
|
|
||||||
let new_x = y;
|
|
||||||
let new_y = new_height - 1 - (x_start + x);
|
|
||||||
*out_b.get_mut(new_y * new_width + new_x).unwrap_hard() = *in_p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
fn rotate(width: usize, height: usize, rotate: usize) {
|
|
||||||
match rotate {
|
|
||||||
0 => rotate_0(width, height),
|
|
||||||
90 => rotate_90(width, height),
|
|
||||||
180 => rotate_180(width, height),
|
|
||||||
270 => rotate_270(width, height),
|
|
||||||
_ => std::process::abort(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
# WebP decoder
|
# WebP decoder
|
||||||
|
|
||||||
- Source: <https://github.com/webmproject/libwebp>
|
- Source: <https://github.com/webmproject/libwebp>
|
||||||
- Version: v1.0.2
|
- Version: v0.6.1
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
|
|||||||
@@ -6,33 +6,7 @@ export OPTIMIZE="-Os"
|
|||||||
export LDFLAGS="${OPTIMIZE}"
|
export LDFLAGS="${OPTIMIZE}"
|
||||||
export CFLAGS="${OPTIMIZE}"
|
export CFLAGS="${OPTIMIZE}"
|
||||||
export CPPFLAGS="${OPTIMIZE}"
|
export CPPFLAGS="${OPTIMIZE}"
|
||||||
apt-get update
|
|
||||||
apt-get install -qqy autoconf libtool libpng-dev pkg-config
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling libwebp"
|
|
||||||
echo "============================================="
|
|
||||||
test -n "$SKIP_LIBWEBP" || (
|
|
||||||
cd node_modules/libwebp
|
|
||||||
autoreconf -fiv
|
|
||||||
rm -rf build || true
|
|
||||||
mkdir -p build && cd build
|
|
||||||
emconfigure ../configure \
|
|
||||||
--disable-libwebpdemux \
|
|
||||||
--disable-wic \
|
|
||||||
--disable-gif \
|
|
||||||
--disable-tiff \
|
|
||||||
--disable-jpeg \
|
|
||||||
--disable-png \
|
|
||||||
--disable-sdl \
|
|
||||||
--disable-gl \
|
|
||||||
--disable-threading \
|
|
||||||
--disable-neon-rtcd \
|
|
||||||
--disable-neon \
|
|
||||||
--disable-sse2 \
|
|
||||||
--disable-sse4.1
|
|
||||||
emmake make
|
|
||||||
)
|
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
echo "Compiling wasm bindings"
|
echo "Compiling wasm bindings"
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
@@ -46,9 +20,9 @@ echo "============================================="
|
|||||||
--std=c++11 \
|
--std=c++11 \
|
||||||
-I node_modules/libwebp \
|
-I node_modules/libwebp \
|
||||||
-o ./webp_dec.js \
|
-o ./webp_dec.js \
|
||||||
|
node_modules/libwebp/src/{dec,dsp,demux,enc,mux,utils}/*.c \
|
||||||
-x c++ \
|
-x c++ \
|
||||||
webp_dec.cpp \
|
webp_dec.cpp
|
||||||
node_modules/libwebp/build/src/.libs/libwebp.a
|
|
||||||
)
|
)
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
echo "Compiling wasm bindings done"
|
echo "Compiling wasm bindings done"
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
"build": "docker run --rm -v $(pwd):/src trzeci/emscripten ./build.sh"
|
"build": "docker run --rm -v $(pwd):/src trzeci/emscripten ./build.sh"
|
||||||
},
|
},
|
||||||
"napa": {
|
"napa": {
|
||||||
"libwebp": "webmproject/libwebp#v1.0.2"
|
"libwebp": "webmproject/libwebp#v1.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"napa": "3.0.0"
|
"napa": "^3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
# WebP encoder
|
# WebP encoder
|
||||||
|
|
||||||
- Source: <https://github.com/webmproject/libwebp>
|
- Source: <https://github.com/webmproject/libwebp>
|
||||||
- Version: v1.0.2
|
- Version: v0.6.1
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
|
|||||||
@@ -7,33 +7,6 @@ export LDFLAGS="${OPTIMIZE}"
|
|||||||
export CFLAGS="${OPTIMIZE}"
|
export CFLAGS="${OPTIMIZE}"
|
||||||
export CPPFLAGS="${OPTIMIZE}"
|
export CPPFLAGS="${OPTIMIZE}"
|
||||||
|
|
||||||
apt-get update
|
|
||||||
apt-get install -qqy autoconf libtool libpng-dev pkg-config
|
|
||||||
|
|
||||||
echo "============================================="
|
|
||||||
echo "Compiling libwebp"
|
|
||||||
echo "============================================="
|
|
||||||
test -n "$SKIP_LIBWEBP" || (
|
|
||||||
cd node_modules/libwebp
|
|
||||||
autoreconf -fiv
|
|
||||||
rm -rf build || true
|
|
||||||
mkdir -p build && cd build
|
|
||||||
emconfigure ../configure \
|
|
||||||
--disable-libwebpdemux \
|
|
||||||
--disable-wic \
|
|
||||||
--disable-gif \
|
|
||||||
--disable-tiff \
|
|
||||||
--disable-jpeg \
|
|
||||||
--disable-png \
|
|
||||||
--disable-sdl \
|
|
||||||
--disable-gl \
|
|
||||||
--disable-threading \
|
|
||||||
--disable-neon-rtcd \
|
|
||||||
--disable-neon \
|
|
||||||
--disable-sse2 \
|
|
||||||
--disable-sse4.1
|
|
||||||
emmake make
|
|
||||||
)
|
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
echo "Compiling wasm bindings"
|
echo "Compiling wasm bindings"
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
@@ -47,9 +20,9 @@ echo "============================================="
|
|||||||
--std=c++11 \
|
--std=c++11 \
|
||||||
-I node_modules/libwebp \
|
-I node_modules/libwebp \
|
||||||
-o ./webp_enc.js \
|
-o ./webp_enc.js \
|
||||||
|
node_modules/libwebp/src/{dec,dsp,demux,enc,mux,utils}/*.c \
|
||||||
-x c++ \
|
-x c++ \
|
||||||
webp_enc.cpp \
|
webp_enc.cpp
|
||||||
node_modules/libwebp/build/src/.libs/libwebp.a
|
|
||||||
)
|
)
|
||||||
echo "============================================="
|
echo "============================================="
|
||||||
echo "Compiling wasm bindings done"
|
echo "Compiling wasm bindings done"
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
"build": "docker run --rm -v $(pwd):/src trzeci/emscripten ./build.sh"
|
"build": "docker run --rm -v $(pwd):/src trzeci/emscripten ./build.sh"
|
||||||
},
|
},
|
||||||
"napa": {
|
"napa": {
|
||||||
"libwebp": "webmproject/libwebp#v1.0.2"
|
"libwebp": "webmproject/libwebp#v1.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"napa": "3.0.0"
|
"napa": "^3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ val encode(std::string img, int width, int height, WebPConfig config) {
|
|||||||
throw std::runtime_error("Unexpected error");
|
throw std::runtime_error("Unexpected error");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only use use_argb if we really need it, as it's slower.
|
pic.use_argb = !!config.lossless;
|
||||||
pic.use_argb = config.lossless || config.use_sharp_yuv || config.preprocessing > 0;
|
|
||||||
pic.width = width;
|
pic.width = width;
|
||||||
pic.height = height;
|
pic.height = height;
|
||||||
pic.writer = WebPMemoryWrite;
|
pic.writer = WebPMemoryWrite;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,74 +0,0 @@
|
|||||||
const DtsCreator = require('typed-css-modules');
|
|
||||||
const chokidar = require('chokidar');
|
|
||||||
const util = require('util');
|
|
||||||
const sass = require('node-sass');
|
|
||||||
|
|
||||||
const sassRender = util.promisify(sass.render);
|
|
||||||
|
|
||||||
async function sassToCss(path) {
|
|
||||||
const result = await sassRender({ file: path });
|
|
||||||
return result.css;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} Opts
|
|
||||||
* @property {boolean} watch Watch for changes
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* Create typing files for CSS & SCSS.
|
|
||||||
*
|
|
||||||
* @param {string[]} rootPaths Paths to search within
|
|
||||||
* @param {Opts} [opts={}] Options.
|
|
||||||
*/
|
|
||||||
function addCssTypes(rootPaths, opts = {}) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
const { watch = false } = opts;
|
|
||||||
|
|
||||||
const paths = [];
|
|
||||||
const preReadyPromises = [];
|
|
||||||
let ready = false;
|
|
||||||
|
|
||||||
for (const rootPath of rootPaths) {
|
|
||||||
// Look for scss & css in each path.
|
|
||||||
paths.push(rootPath + '/**/*.scss');
|
|
||||||
paths.push(rootPath + '/**/*.css');
|
|
||||||
}
|
|
||||||
|
|
||||||
// For simplicity, the watcher is used even if we're not watching.
|
|
||||||
// If we're not watching, we stop the watcher after the initial files are found.
|
|
||||||
const watcher = chokidar.watch(paths, {
|
|
||||||
// Avoid processing already-processed files.
|
|
||||||
ignored: '*.d.*',
|
|
||||||
// Without this, travis and netlify builds never complete. I'm not sure why, but it might be
|
|
||||||
// related to https://github.com/paulmillr/chokidar/pull/758
|
|
||||||
persistent: watch,
|
|
||||||
});
|
|
||||||
|
|
||||||
function change(path) {
|
|
||||||
const promise = (async function() {
|
|
||||||
const creator = new DtsCreator({ camelCase: true });
|
|
||||||
const result = path.endsWith('.scss') ?
|
|
||||||
await creator.create(path, await sassToCss(path)) :
|
|
||||||
await creator.create(path);
|
|
||||||
|
|
||||||
await result.writeFile();
|
|
||||||
})();
|
|
||||||
|
|
||||||
if (!ready) preReadyPromises.push(promise);
|
|
||||||
}
|
|
||||||
|
|
||||||
watcher.on('change', change);
|
|
||||||
watcher.on('add', change);
|
|
||||||
|
|
||||||
// 'ready' is when events have been fired for file discovery.
|
|
||||||
watcher.on('ready', () => {
|
|
||||||
ready = true;
|
|
||||||
// Wait for the current set of processing to finish.
|
|
||||||
Promise.all(preReadyPromises).then(resolve);
|
|
||||||
// And if we're not watching, close the watcher.
|
|
||||||
if (!watch) watcher.close();
|
|
||||||
});
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = addCssTypes;
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const fs = require('fs');
|
|
||||||
const ejs = require('ejs');
|
|
||||||
const AssetsPlugin = require('assets-webpack-plugin');
|
|
||||||
|
|
||||||
module.exports = class AssetTemplatePlugin extends AssetsPlugin {
|
|
||||||
constructor(options) {
|
|
||||||
options = options || {};
|
|
||||||
if (!options.template) throw Error('AssetTemplatePlugin: template option is required.');
|
|
||||||
super({
|
|
||||||
useCompilerPath: true,
|
|
||||||
filename: options.filename,
|
|
||||||
processOutput: files => this._processOutput(files)
|
|
||||||
});
|
|
||||||
this._template = path.resolve(process.cwd(), options.template);
|
|
||||||
const ignore = options.ignore || /(manifest\.json|\.DS_Store)$/;
|
|
||||||
this._ignore = typeof ignore === 'function' ? ({ test: ignore }) : ignore;
|
|
||||||
}
|
|
||||||
|
|
||||||
_processOutput(files) {
|
|
||||||
const mapping = {
|
|
||||||
all: [],
|
|
||||||
byType: {},
|
|
||||||
entries: {}
|
|
||||||
};
|
|
||||||
for (const entryName in files) {
|
|
||||||
// non-entry-point-derived assets are collected under an empty string key
|
|
||||||
// since that's a bit awkward, we'll call them "assets"
|
|
||||||
const name = entryName === '' ? 'assets' : entryName;
|
|
||||||
const listing = files[entryName];
|
|
||||||
const entry = mapping.entries[name] = {
|
|
||||||
all: [],
|
|
||||||
byType: {}
|
|
||||||
};
|
|
||||||
for (let type in listing) {
|
|
||||||
const list = [].concat(listing[type]).filter(file => !this._ignore.test(file));
|
|
||||||
if (!list.length) continue;
|
|
||||||
mapping.all = mapping.all.concat(list);
|
|
||||||
mapping.byType[type] = (mapping.byType[type] || []).concat(list);
|
|
||||||
entry.all = entry.all.concat(list);
|
|
||||||
entry.byType[type] = (entry.byType[type] || []).concat(list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mapping.files = mapping.all;
|
|
||||||
return ejs.render(fs.readFileSync(this._template, 'utf8'), mapping);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
const util = require('util');
|
|
||||||
const minimatch = require('minimatch');
|
|
||||||
const SingleEntryPlugin = require('webpack/lib/SingleEntryPlugin');
|
|
||||||
const WebWorkerTemplatePlugin = require('webpack/lib/webworker/WebWorkerTemplatePlugin');
|
|
||||||
const ParserHelpers = require('webpack/lib/ParserHelpers');
|
|
||||||
|
|
||||||
const NAME = 'auto-sw-plugin';
|
|
||||||
const JS_TYPES = ['auto', 'esm', 'dynamic'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatically finds and bundles Service Workers by looking for navigator.serviceWorker.register(..).
|
|
||||||
* An Array of webpack assets is injected into the Service Worker bundle as a `BUILD_ASSETS` global.
|
|
||||||
* Hidden and `.map` files are excluded by default, and this can be customized using the include & exclude options.
|
|
||||||
* @example
|
|
||||||
* // webpack config
|
|
||||||
* plugins: [
|
|
||||||
* new AutoSWPlugin({
|
|
||||||
* exclude: [
|
|
||||||
* '**\/.*', // don't expose hidden files (default)
|
|
||||||
* '**\/*.map', // don't precache sourcemaps (default)
|
|
||||||
* 'index.html' // don't cache the page itself
|
|
||||||
* ]
|
|
||||||
* })
|
|
||||||
* ]
|
|
||||||
* @param {Object} [options={}]
|
|
||||||
* @param {string[]} [options.exclude] Minimatch pattern(s) of which assets to omit from BUILD_ASSETS.
|
|
||||||
* @param {string[]} [options.include] Minimatch pattern(s) of assets to allow in BUILD_ASSETS.
|
|
||||||
*/
|
|
||||||
module.exports = class AutoSWPlugin {
|
|
||||||
constructor(options) {
|
|
||||||
this.options = Object.assign({
|
|
||||||
exclude: [
|
|
||||||
'**/*.map',
|
|
||||||
'**/.*'
|
|
||||||
]
|
|
||||||
}, options || {});
|
|
||||||
}
|
|
||||||
|
|
||||||
apply(compiler) {
|
|
||||||
const serviceWorkers = [];
|
|
||||||
|
|
||||||
compiler.hooks.emit.tapPromise(NAME, compilation => this.emit(compiler, compilation, serviceWorkers));
|
|
||||||
|
|
||||||
compiler.hooks.normalModuleFactory.tap(NAME, (factory) => {
|
|
||||||
for (const type of JS_TYPES) {
|
|
||||||
factory.hooks.parser.for(`javascript/${type}`).tap(NAME, parser => {
|
|
||||||
let counter = 0;
|
|
||||||
|
|
||||||
const processRegisterCall = expr => {
|
|
||||||
const dep = parser.evaluateExpression(expr.arguments[0]);
|
|
||||||
|
|
||||||
if (!dep.isString()) {
|
|
||||||
parser.state.module.warnings.push({
|
|
||||||
message: 'navigator.serviceWorker.register() will only be bundled if passed a String literal.'
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const filename = dep.string;
|
|
||||||
const outputFilename = this.options.filename || 'serviceworker.js'
|
|
||||||
const context = parser.state.current.context;
|
|
||||||
serviceWorkers.push({
|
|
||||||
outputFilename,
|
|
||||||
filename,
|
|
||||||
context
|
|
||||||
});
|
|
||||||
|
|
||||||
const id = `__webpack__serviceworker__${++counter}`;
|
|
||||||
ParserHelpers.toConstantDependency(parser, id)(expr.arguments[0]);
|
|
||||||
return ParserHelpers.addParsedVariableToModule(parser, id, '__webpack_public_path__ + ' + JSON.stringify(outputFilename));
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.hooks.call.for('navigator.serviceWorker.register').tap(NAME, processRegisterCall);
|
|
||||||
parser.hooks.call.for('self.navigator.serviceWorker.register').tap(NAME, processRegisterCall);
|
|
||||||
parser.hooks.call.for('window.navigator.serviceWorker.register').tap(NAME, processRegisterCall);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
createFilter(list) {
|
|
||||||
const filters = [].concat(list);
|
|
||||||
for (let i=0; i<filters.length; i++) {
|
|
||||||
if (typeof filters[i] === 'string') {
|
|
||||||
filters[i] = minimatch.filter(filters[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return filters;
|
|
||||||
}
|
|
||||||
|
|
||||||
async emit(compiler, compilation, serviceWorkers) {
|
|
||||||
let assetMapping = Object.keys(compilation.assets);
|
|
||||||
if (this.options.include) {
|
|
||||||
const filters = this.createFilter(this.options.include);
|
|
||||||
assetMapping = assetMapping.filter(filename => {
|
|
||||||
for (const filter of filters) {
|
|
||||||
if (filter(filename)) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (this.options.exclude) {
|
|
||||||
const filters = this.createFilter(this.options.exclude);
|
|
||||||
assetMapping = assetMapping.filter(filename => {
|
|
||||||
for (const filter of filters) {
|
|
||||||
if (filter(filename)) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
await Promise.all(serviceWorkers.map(
|
|
||||||
(serviceWorker, index) => this.compileServiceWorker(compiler, compilation, serviceWorker, index, assetMapping)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
async compileServiceWorker(compiler, compilation, options, index, assetMapping) {
|
|
||||||
const entryFilename = options.filename;
|
|
||||||
|
|
||||||
const chunkFilename = compiler.options.output.chunkFilename.replace(/\.([a-z]+)$/i, '.serviceworker.$1');
|
|
||||||
const workerOptions = {
|
|
||||||
filename: options.outputFilename, // chunkFilename.replace(/\.?\[(?:chunkhash|contenthash|hash)(:\d+(?::\d+)?)?\]/g, ''),
|
|
||||||
chunkFilename: this.options.chunkFilename || chunkFilename,
|
|
||||||
globalObject: 'self'
|
|
||||||
};
|
|
||||||
|
|
||||||
const childCompiler = compilation.createChildCompiler(NAME, { filename: workerOptions.filename });
|
|
||||||
(new WebWorkerTemplatePlugin(workerOptions)).apply(childCompiler);
|
|
||||||
|
|
||||||
/* The duplication DefinePlugin ends up causing is problematic (it doesn't hoist injections), so we'll do it manually. */
|
|
||||||
// (new DefinePlugin({
|
|
||||||
// BUILD_ASSETS: JSON.stringify(assetMapping)
|
|
||||||
// })).apply(childCompiler);
|
|
||||||
(new SingleEntryPlugin(options.context, entryFilename, workerOptions.filename)).apply(childCompiler);
|
|
||||||
|
|
||||||
const subCache = `subcache ${__dirname} ${entryFilename} ${index}`;
|
|
||||||
let childCompilation;
|
|
||||||
childCompiler.hooks.compilation.tap(NAME, c => {
|
|
||||||
childCompilation = c;
|
|
||||||
if (childCompilation.cache) {
|
|
||||||
if (!childCompilation.cache[subCache]) childCompilation.cache[subCache] = {};
|
|
||||||
childCompilation.cache = childCompilation.cache[subCache];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await (util.promisify(childCompiler.runAsChild.bind(childCompiler)))();
|
|
||||||
|
|
||||||
const versionVar = this.options.version ?
|
|
||||||
`var VERSION = ${JSON.stringify(this.options.version)};` : '';
|
|
||||||
const original = childCompilation.assets[workerOptions.filename].source();
|
|
||||||
const source = `${versionVar}var BUILD_ASSETS=${JSON.stringify(assetMapping)};${original}`;
|
|
||||||
childCompilation.assets[workerOptions.filename] = {
|
|
||||||
source: () => source,
|
|
||||||
size: () => Buffer.byteLength(source, 'utf8')
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.assign(compilation.assets, childCompilation.assets);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
7
global.d.ts
vendored
7
global.d.ts
vendored
@@ -1,21 +1,16 @@
|
|||||||
declare const __webpack_public_path__: string;
|
declare const __webpack_public_path__: string;
|
||||||
declare const PRERENDER: boolean;
|
|
||||||
|
|
||||||
declare interface NodeModule {
|
declare interface NodeModule {
|
||||||
hot: any;
|
hot: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare interface Window {
|
declare interface Window {
|
||||||
STATE: any;
|
STATE: any
|
||||||
ga: typeof ga;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
declare namespace JSX {
|
declare namespace JSX {
|
||||||
interface Element { }
|
interface Element { }
|
||||||
interface IntrinsicElements { }
|
interface IntrinsicElements { }
|
||||||
interface HTMLAttributes {
|
|
||||||
decoding?: string;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'classnames' {
|
declare module 'classnames' {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB |
13080
package-lock.json
generated
13080
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
116
package.json
116
package.json
@@ -1,14 +1,13 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "squoosh",
|
"name": "squoosh",
|
||||||
"version": "1.10.0",
|
"version": "0.0.0",
|
||||||
"license": "apache-2.0",
|
"license": "apache-2.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "webpack-dev-server --host 0.0.0.0 --hot",
|
"start": "webpack serve --host 0.0.0.0 --hot",
|
||||||
"build": "webpack -p",
|
"build": "webpack -p",
|
||||||
"lint": "tslint -c tslint.json -p tsconfig.json -t verbose",
|
"lint": "tslint -c tslint.json -t verbose 'src/**/*.{ts,tsx,js,jsx}'",
|
||||||
"lintfix": "tslint -c tslint.json -p tsconfig.json -t verbose --fix 'src/**/*.{ts,tsx,js,jsx}'",
|
"lintfix": "tslint -c tslint.json -t verbose --fix 'src/**/*.{ts,tsx,js,jsx}'"
|
||||||
"sizereport": "sizereport --config"
|
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
"hooks": {
|
"hooks": {
|
||||||
@@ -16,61 +15,56 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "10.14.15",
|
"@types/node": "^9.6.23",
|
||||||
"@types/pretty-bytes": "5.1.0",
|
"@types/pretty-bytes": "^5.1.0",
|
||||||
"@types/webassembly-js-api": "0.0.3",
|
"@types/webassembly-js-api": "0.0.1",
|
||||||
"@webcomponents/custom-elements": "1.2.4",
|
"@webcomponents/custom-elements": "^1.2.0",
|
||||||
"@webpack-cli/serve": "0.1.8",
|
"babel-loader": "^7.1.5",
|
||||||
"assets-webpack-plugin": "3.9.10",
|
"babel-plugin-jsx-pragmatic": "^1.0.2",
|
||||||
"chalk": "2.4.2",
|
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
||||||
"chokidar": "3.0.2",
|
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||||
"classnames": "2.2.6",
|
"babel-plugin-transform-decorators-legacy": "^1.3.5",
|
||||||
"clean-webpack-plugin": "1.0.1",
|
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||||
"comlink": "3.1.1",
|
"babel-plugin-transform-react-constant-elements": "^6.23.0",
|
||||||
"copy-webpack-plugin": "5.0.4",
|
"babel-plugin-transform-react-jsx": "^6.24.1",
|
||||||
"critters-webpack-plugin": "2.4.0",
|
"babel-plugin-transform-react-remove-prop-types": "^0.4.14",
|
||||||
"css-loader": "1.0.1",
|
"babel-preset-env": "^1.7.0",
|
||||||
"ejs": "2.6.2",
|
"babel-register": "^6.26.0",
|
||||||
"escape-string-regexp": "2.0.0",
|
"clean-webpack-plugin": "^0.1.19",
|
||||||
"exports-loader": "0.7.0",
|
"copy-webpack-plugin": "^4.5.2",
|
||||||
"file-drop-element": "0.2.0",
|
"css-loader": "^0.28.11",
|
||||||
"file-loader": "4.2.0",
|
"exports-loader": "^0.7.0",
|
||||||
"gzip-size": "5.1.1",
|
"file-loader": "^1.1.11",
|
||||||
"html-webpack-plugin": "3.2.0",
|
"html-webpack-plugin": "^3.2.0",
|
||||||
"husky": "3.0.4",
|
"husky": "^1.0.0-rc.13",
|
||||||
"idb-keyval": "3.2.0",
|
"if-env": "^1.0.4",
|
||||||
"linkstate": "1.1.1",
|
"loader-utils": "^1.1.0",
|
||||||
"loader-utils": "1.2.3",
|
"mini-css-extract-plugin": "^0.3.0",
|
||||||
"mini-css-extract-plugin": "0.8.0",
|
"node-sass": "^4.9.3",
|
||||||
"minimatch": "3.0.4",
|
"optimize-css-assets-webpack-plugin": "^4.0.3",
|
||||||
"node-fetch": "2.6.0",
|
"progress-bar-webpack-plugin": "^1.11.0",
|
||||||
"node-sass": "4.13.0",
|
"raw-loader": "^0.5.1",
|
||||||
"optimize-css-assets-webpack-plugin": "5.0.1",
|
"sass-loader": "^7.1.0",
|
||||||
"pointer-tracker": "2.0.3",
|
"script-ext-html-webpack-plugin": "^2.0.1",
|
||||||
"preact": "8.4.2",
|
"source-map-loader": "^0.2.3",
|
||||||
"prerender-loader": "1.3.0",
|
"style-loader": "^0.22.1",
|
||||||
"pretty-bytes": "5.3.0",
|
"ts-loader": "^4.4.2",
|
||||||
"progress-bar-webpack-plugin": "1.12.1",
|
"tslint": "^5.11.0",
|
||||||
"raw-loader": "3.1.0",
|
"tslint-config-airbnb": "^5.9.2",
|
||||||
"readdirp": "3.1.2",
|
"tslint-config-semistandard": "^7.0.0",
|
||||||
"sass-loader": "7.3.1",
|
"tslint-react": "^3.6.0",
|
||||||
"script-ext-html-webpack-plugin": "2.1.4",
|
"typescript": "^2.9.2",
|
||||||
"source-map-loader": "0.2.4",
|
"typings-for-css-modules-loader": "^1.7.0",
|
||||||
"style-loader": "1.0.0",
|
"webpack": "^4.19.1",
|
||||||
"terser-webpack-plugin": "1.4.1",
|
"webpack-bundle-analyzer": "^2.13.1",
|
||||||
"travis-size-report": "1.1.0",
|
"webpack-cli": "^2.1.5",
|
||||||
"ts-loader": "6.0.3",
|
"webpack-dev-server": "^3.1.5",
|
||||||
"tslint": "5.19.0",
|
"webpack-plugin-replace": "^1.1.1",
|
||||||
"tslint-config-airbnb": "5.11.1",
|
"classnames": "^2.2.6",
|
||||||
"tslint-config-semistandard": "8.0.1",
|
"comlink": "^3.0.3",
|
||||||
"tslint-react": "4.0.0",
|
"linkstate": "^1.1.1",
|
||||||
"typed-css-modules": "0.4.2",
|
"preact": "^8.3.1",
|
||||||
"typescript": "3.5.3",
|
"pretty-bytes": "^5.1.0",
|
||||||
"url-loader": "2.1.0",
|
"worker-plugin": "^1.1.1"
|
||||||
"webpack": "4.39.3",
|
|
||||||
"webpack-bundle-analyzer": "3.4.1",
|
|
||||||
"webpack-cli": "3.3.4",
|
|
||||||
"webpack-dev-server": "3.8.0",
|
|
||||||
"worker-plugin": "3.1.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": [
|
|
||||||
"config:base"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
const escapeRE = require("escape-string-regexp");
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
repo: "GoogleChromeLabs/squoosh",
|
|
||||||
path: "build/**/!(*.map)",
|
|
||||||
branch: "master",
|
|
||||||
findRenamed(path, newPaths) {
|
|
||||||
const nameParts = /^(.+\.)[a-f0-9]+(\..+)$/.exec(path);
|
|
||||||
if (!nameParts) return;
|
|
||||||
|
|
||||||
const matchRe = new RegExp(`^${escapeRE(nameParts[1])}[a-f0-9]+${escapeRE(nameParts[2])}$`);
|
|
||||||
return newPaths.find(newPath => matchRe.test(newPath));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -5,4 +5,4 @@ export const type = 'browser-jpeg';
|
|||||||
export const label = 'Browser JPEG';
|
export const label = 'Browser JPEG';
|
||||||
export const mimeType = 'image/jpeg';
|
export const mimeType = 'image/jpeg';
|
||||||
export const extension = 'jpg';
|
export const extension = 'jpg';
|
||||||
export const defaultOptions: EncodeOptions = { quality: 0.75 };
|
export const defaultOptions: EncodeOptions = { quality: 0.5 };
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import qualityOption from '../generic/quality-option';
|
import qualityOption from '../generic/quality-option';
|
||||||
|
|
||||||
export default qualityOption({ min: 0, max: 1, step: 0.01 });
|
export default qualityOption({ min: 0, max: 1, step: 0 });
|
||||||
|
|||||||
@@ -7,5 +7,5 @@ export const type = 'browser-webp';
|
|||||||
export const label = 'Browser WebP';
|
export const label = 'Browser WebP';
|
||||||
export const mimeType = 'image/webp';
|
export const mimeType = 'image/webp';
|
||||||
export const extension = 'webp';
|
export const extension = 'webp';
|
||||||
export const defaultOptions: EncodeOptions = { quality: 0.75 };
|
export const defaultOptions: EncodeOptions = { quality: 0.5 };
|
||||||
export const featureTest = () => canvasEncodeTest(mimeType);
|
export const featureTest = () => canvasEncodeTest(mimeType);
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
import qualityOption from '../generic/quality-option';
|
import qualityOption from '../generic/quality-option';
|
||||||
|
|
||||||
export default qualityOption({ min: 0, max: 1, step: 0.01 });
|
export default qualityOption({ min: 0, max: 1, step: 0 });
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user