From 41f4f7778ff53e4cb59ef07e113fee9665eb6d14 Mon Sep 17 00:00:00 2001 From: Surma Date: Thu, 27 May 2021 13:21:50 +0100 Subject: [PATCH] Add all kinds of mipmap options --- codecs/basis/enc/basis_enc.cpp | 9 +- codecs/basis/enc/basis_enc.d.ts | 2 + codecs/basis/enc/basis_enc.js | 4 +- codecs/basis/enc/basis_enc.wasm | Bin 1465525 -> 1466104 bytes .../Range/custom-els/RangeInput/index.ts | 15 ++- .../custom-els/RangeInput/missing-types.d.ts | 2 +- src/features/encoders/basis/client/index.tsx | 96 +++++++++++++----- src/features/encoders/basis/shared/meta.ts | 2 + 8 files changed, 96 insertions(+), 34 deletions(-) diff --git a/codecs/basis/enc/basis_enc.cpp b/codecs/basis/enc/basis_enc.cpp index d32e9808..fb2dfdcf 100644 --- a/codecs/basis/enc/basis_enc.cpp +++ b/codecs/basis/enc/basis_enc.cpp @@ -13,8 +13,10 @@ struct BasisOptions { bool uastc; bool mipmap; bool srgb_mipmap; + std::string mipmap_filter; bool perceptual; bool y_flip; + uint32_t mipmap_min_dimension; }; thread_local const val Uint8Array = val::global("Uint8Array"); @@ -53,7 +55,8 @@ val encode(std::string image_in, int image_width, int image_height, BasisOptions params.m_y_flip = opts.y_flip; params.m_mip_gen = opts.mipmap; params.m_mip_srgb = opts.srgb_mipmap; - params.m_mip_filter = "box"; + params.m_mip_filter = opts.mipmap_filter; + params.m_mip_smallest_dimension = opts.mipmap_min_dimension; params.m_quality_level = opts.quality; params.m_compression_level = opts.compression; params.m_source_images.push_back(img); @@ -80,7 +83,9 @@ EMSCRIPTEN_BINDINGS(my_module) { .field("perceptual", &BasisOptions::perceptual) .field("y_flip", &BasisOptions::y_flip) .field("mipmap", &BasisOptions::mipmap) - .field("srgb_mipmap", &BasisOptions::srgb_mipmap); + .field("srgb_mipmap", &BasisOptions::srgb_mipmap) + .field("mipmap_filter", &BasisOptions::mipmap_filter) + .field("mipmap_min_dimension", &BasisOptions::mipmap_min_dimension); function("encode", &encode); } diff --git a/codecs/basis/enc/basis_enc.d.ts b/codecs/basis/enc/basis_enc.d.ts index 629bd961..ca34aaa6 100644 --- a/codecs/basis/enc/basis_enc.d.ts +++ b/codecs/basis/enc/basis_enc.d.ts @@ -6,6 +6,8 @@ export interface EncodeOptions { mipmap: boolean; srgb_mipmap: boolean; perceptual: boolean; + mipmap_filter: string; + mipmap_min_dimension: number; } export interface BasisModule extends EmscriptenWasm.Module { diff --git a/codecs/basis/enc/basis_enc.js b/codecs/basis/enc/basis_enc.js index b3cf3e7b..68919dda 100644 --- a/codecs/basis/enc/basis_enc.js +++ b/codecs/basis/enc/basis_enc.js @@ -40,10 +40,10 @@ h.length;++p)q=1===p?"thisWired":"arg"+(p-2)+"Wired",null!==h[p].ea&&(m+=q+"_dto c){function d(g){g>>=2;var k=I;return new e(F,k[g+1],k[g])}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=Q(c);P(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{qa:!0})},x:function(a,b){b=Q(b);var c="std::string"===b;P(a,{name:b,fromWireType:function(d){var e=I[d>>2];if(c)for(var g=d+4,k=0;k<=e;++k){var h=d+4+k;if(k==e||0==C[h]){g=ia(g,h-g);if(void 0===l)var l=g;else l+=String.fromCharCode(0),l+=g;g=h+1}}else{l=Array(e); for(k=0;k=q&&(q=65536+((q&1023)<<10)|e.charCodeAt(++n)&1023);127>=q?++m:m=2047>=q?m+2:65535>=q?m+3:m+4}return m}: function(){return e.length})(),h=sb(4+k+1);I[h>>2]=k;if(c&&g)ja(e,h+4,k+1);else if(g)for(g=0;g>2],n=k(),q,y=l+4,z=0;z<=m;++z){var p=l+4+z*b;if(z==m||0==n[p>>h])y=d(y,p-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=p+b}V(l);return q},toWireType:function(l,m){"string"!==typeof m&&R("Cannot pass non-string to C++ string type "+c);var n=g(m),q=sb(4+n+b);I[q>>2]=n>>h;e(m,q+4,n+b);null!==l&&l.push(V,q);return q},argPackAdvance:8,readValueFromPointer:Oa,ea:function(l){V(l)}})},R:function(a,b,c,d,e,g){Ma[a]={name:Q(b),sa:U(c,d),ta:U(e,g),ia:[]}},m:function(a, +fromWireType:function(l){for(var m=I[l>>2],n=k(),q,y=l+4,z=0;z<=m;++z){var p=l+4+z*b;if(z==m||0==n[p>>h])y=d(y,p-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=p+b}V(l);return q},toWireType:function(l,m){"string"!==typeof m&&R("Cannot pass non-string to C++ string type "+c);var n=g(m),q=sb(4+n+b);I[q>>2]=n>>h;e(m,q+4,n+b);null!==l&&l.push(V,q);return q},argPackAdvance:8,readValueFromPointer:Oa,ea:function(l){V(l)}})},R:function(a,b,c,d,e,g){Ma[a]={name:Q(b),sa:U(c,d),ta:U(e,g),ia:[]}},l:function(a, b,c,d,e,g,k,h,l,m){Ma[a].ia.push({la:Q(b),pa:c,na:U(d,e),oa:g,Aa:k,za:U(h,l),Ba:m})},N:function(a,b){b=Q(b);P(a,{Ea:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},o:Za,A:function(a){if(0===a)return T(mb());var b=lb[a];a=void 0===b?Q(a):b;return T(mb()[a])},O:function(a){4>> 2) + "+g+'], "parameter '+g+'");\nvar arg'+g+" = argType"+g+".readValueFromPointer(args);\nargs += argType"+g+"['argPackAdvance'];\n";e=(new Function("requireRegisteredType","Module","__emval_register",k+("var obj = new constructor("+e+");\nreturn __emval_register(obj);\n}\n")))(nb,f,T);ob[b]=e}return e(a,c,d)},z:function(a,b){a=nb(a,"_emval_take_value");a=a.readValueFromPointer(b); -return T(a)},f:function(){x()},h:function(a,b){W(a,b||1);throw"longjmp";},F:function(a,b,c){C.copyWithin(a,b,b+c)},l:function(a){a>>>=0;var b=C.length;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,a,d);0>>16);va(B.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},v:function(){return 0},I:function(a,b,c,d){a=La.Da(a);b=La.Ca(a,b,c);E[d>> +return T(a)},f:function(){x()},h:function(a,b){W(a,b||1);throw"longjmp";},F:function(a,b,c){C.copyWithin(a,b,b+c)},m:function(a){a>>>=0;var b=C.length;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,a,d);0>>16);va(B.buffer);var e=1;break a}catch(g){}e=void 0}if(e)return!0}return!1},v:function(){return 0},I:function(a,b,c,d){a=La.Da(a);b=La.Ca(a,b,c);E[d>> 2]=b;return 0},C:function(){},u:function(a,b,c,d){for(var e=0,g=0;g>2],h=E[b+(8*g+4)>>2],l=0;l>2]=e;return 0},d:function(){return ea|0},i:function(a){var b=Date.now();E[a>>2]=b/1E3|0;E[a+4>>2]=b%1E3*1E3|0;return 0},n:tb,g:ub,s:vb,r:wb,p:xb,e:yb,D:zb,a:B,G:function(){},c:function(a){ea= a|0},H:function(a){switch(a){case 30:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:case 79:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1; case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256; diff --git a/codecs/basis/enc/basis_enc.wasm b/codecs/basis/enc/basis_enc.wasm index 158e42be3d302d717853a2e78cfc52169e14c45b..32267f2c3188b1d7f1b07ad3e1340742b2443f21 100755 GIT binary patch delta 25564 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 RFVGzhz63ZEIz4vp{{bwa1kL~e diff --git a/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/index.ts b/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/index.ts index 2a41f13b..4683bc74 100644 --- a/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/index.ts +++ b/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/index.ts @@ -112,18 +112,23 @@ class RangeInputElement extends HTMLElement { this.dispatchEvent(retargetted); }; + private _formatDisplayValue(value: number): string { + const labelPrecision = + Number(this.labelPrecision) || getPrescision(this.step) || 0; + if (labelPrecision) { + return value.toFixed(labelPrecision); + } + return Math.round(value).toString(); + } + private _update = () => { // Not connected? if (!this._valueDisplay) return; const value = Number(this.value) || 0; const min = Number(this.min) || 0; const max = Number(this.max) || 100; - const labelPrecision = - Number(this.labelPrecision) || getPrescision(this.step) || 0; const percent = (100 * (value - min)) / (max - min); - const displayValue = labelPrecision - ? value.toFixed(labelPrecision) - : Math.round(value).toString(); + const displayValue = this._formatDisplayValue(value); this._valueDisplay!.textContent = displayValue; this.style.setProperty('--value-percent', percent + '%'); diff --git a/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/missing-types.d.ts b/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/missing-types.d.ts index 7800e014..fab3b113 100644 --- a/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/missing-types.d.ts +++ b/src/client/lazy-app/Compress/Options/Range/custom-els/RangeInput/missing-types.d.ts @@ -1,7 +1,7 @@ declare module 'preact' { namespace createElement.JSX { interface IntrinsicElements { - 'range-input': HTMLAttributes; + 'range-input': HTMLAttributes & { formatter?: (v: number) => string }; } } } diff --git a/src/features/encoders/basis/client/index.tsx b/src/features/encoders/basis/client/index.tsx index 2317c08b..6fc5ac75 100644 --- a/src/features/encoders/basis/client/index.tsx +++ b/src/features/encoders/basis/client/index.tsx @@ -1,6 +1,6 @@ -import { EncodeOptions } from '../shared/meta'; +import { EncodeOptions, defaultOptions } from '../shared/meta'; import type WorkerBridge from 'client/lazy-app/worker-bridge'; -import { h, Component } from 'preact'; +import { h, Component, Fragment } from 'preact'; import { inputFieldChecked, inputFieldValueAsNumber, @@ -50,7 +50,13 @@ export class Options extends Component { perceptual: inputFieldChecked(form.perceptual, options.perceptual), mipmap: inputFieldChecked(form.mipmap, options.mipmap), srgb_mipmap: inputFieldChecked(form.srgb_mipmap, options.srgb_mipmap), - // .value + mipmap_filter: form.mipmap_filter?.value ?? defaultOptions.mipmap_filter, + mipmap_min_dimension: + 2 ** + inputFieldValueAsNumber( + form.mipmap_min_dimension, + options.mipmap_min_dimension, + ), quality: inputFieldValueAsNumber(form.quality, options.quality), compression: inputFieldValueAsNumber( form.compression, @@ -61,22 +67,20 @@ export class Options extends Component { }; render({ options }: Props, { showAdvanced }: State) { - // I'm rendering both lossy and lossless forms, as it becomes much easier when - // gathering the data. return (
+
- { {options.mipmap ? ( - + +
+ + Smallest mipmap (2^x): + +
+ + +
) : null}
diff --git a/src/features/encoders/basis/shared/meta.ts b/src/features/encoders/basis/shared/meta.ts index ac1e5a81..27bed023 100644 --- a/src/features/encoders/basis/shared/meta.ts +++ b/src/features/encoders/basis/shared/meta.ts @@ -25,4 +25,6 @@ export const defaultOptions: EncodeOptions = { srgb_mipmap: false, perceptual: true, y_flip: false, + mipmap_filter: 'kaiser', + mipmap_min_dimension: 1, };