import { EncodeOptions, defaultOptions } from '../shared/meta'; import type WorkerBridge from 'client/lazy-app/worker-bridge'; import { h, Component, Fragment } from 'preact'; import { inputFieldChecked, inputFieldValueAsNumber, preventDefault, clamp, } from 'client/lazy-app/util'; import * as style from 'client/lazy-app/Compress/Options/style.css'; import linkState from 'linkstate'; import Range from 'client/lazy-app/Compress/Options/Range'; import Checkbox from 'client/lazy-app/Compress/Options/Checkbox'; import Expander from 'client/lazy-app/Compress/Options/Expander'; import Select from 'client/lazy-app/Compress/Options/Select'; import Revealer from 'client/lazy-app/Compress/Options/Revealer'; export function encode( signal: AbortSignal, workerBridge: WorkerBridge, imageData: ImageData, options: EncodeOptions, ) { return workerBridge.basisEncode(signal, imageData, options); } interface Props { options: EncodeOptions; onChange(newOptions: EncodeOptions): void; } interface State { showAdvanced: boolean; } export class Options extends Component { state: State = { showAdvanced: false, }; onChange = (event: Event) => { const form = (event.currentTarget as HTMLInputElement).closest( 'form', ) as HTMLFormElement; const { options } = this.props; const uastc = form.mode.value === '1'; let quality = inputFieldValueAsNumber(form.quality, options.quality); if (uastc) { quality = clamp(0, quality, 4); } else { quality = Math.floor(clamp(0, quality, 255)); } const newOptions: EncodeOptions = { ...this.props.options, uastc, quality, y_flip: inputFieldChecked(form.y_flip, options.y_flip), perceptual: inputFieldChecked(form.perceptual, options.perceptual), mipmap: inputFieldChecked(form.mipmap, options.mipmap), srgb_mipmap: inputFieldChecked(form.srgb_mipmap, options.srgb_mipmap), mipmap_filter: form.mipmap_filter?.value ?? defaultOptions.mipmap_filter, // FIXME: We really should support range remapping // in the range-slider component. For now I’ll // shoe-horn it into the state management. mipmap_min_dimension: 2 ** inputFieldValueAsNumber( form.mipmap_min_dimension, Math.floor(Math.log2(options.mipmap_min_dimension)), ), compression: inputFieldValueAsNumber( form.compression, options.compression, ), }; this.props.onChange(newOptions); }; render({ options }: Props, { showAdvanced }: State) { return (
Quality:
Compression:
{showAdvanced ? (
{options.mipmap ? (
Log2 of smallest mipmap:
) : null}
) : null}
); } }