From 49c47e32dc8df985744206d4a15392324b5de056 Mon Sep 17 00:00:00 2001 From: Jake Archibald Date: Fri, 19 Oct 2018 12:46:19 +0100 Subject: [PATCH] WebP options --- src/codecs/webp/options.tsx | 454 ++++++++++++++++-------------- src/codecs/webp/styles.scss | 3 - src/components/Options/index.tsx | 44 +-- src/components/Options/style.scss | 8 + 4 files changed, 275 insertions(+), 234 deletions(-) delete mode 100644 src/codecs/webp/styles.scss diff --git a/src/codecs/webp/options.tsx b/src/codecs/webp/options.tsx index 0025051d..6b85b761 100644 --- a/src/codecs/webp/options.tsx +++ b/src/codecs/webp/options.tsx @@ -2,13 +2,21 @@ import { h, Component } from 'preact'; import { bind } from '../../lib/initial-util'; import { inputFieldCheckedAsNumber, inputFieldValueAsNumber } from '../../lib/util'; import { EncodeOptions, WebPImageHint } from './encoder-meta'; -import * as styles from './styles.scss'; -import '../../custom-els/RangeInput'; +import * as style from '../../components/options/style.scss'; +import Checkbox from '../../components/checkbox'; +import Expander from '../../components/expander'; +import Select from '../../components/select'; +import Range from '../../components/range'; +import linkState from 'linkstate'; -type Props = { - options: EncodeOptions, - onChange(newOptions: EncodeOptions): void, -}; +interface Props { + options: EncodeOptions; + onChange(newOptions: EncodeOptions): void; +} + +interface State { + showAdvanced: boolean; +} // From kLosslessPresets in config_enc.c // The format is [method, quality]. @@ -26,249 +34,281 @@ function determineLosslessQuality(quality: number): number { return losslessPresetDefault; } -export default class WebPEncoderOptions extends Component { +export default class WebPEncoderOptions extends Component { + state: State = { + showAdvanced: false, + }; + @bind onChange(event: Event) { const form = (event.currentTarget as HTMLInputElement).closest('form') as HTMLFormElement; const lossless = inputFieldCheckedAsNumber(form.lossless); - const losslessPresetInput = (form.lossless_preset as HTMLInputElement); + const { options } = this.props; + const losslessPresetValue = inputFieldValueAsNumber( + form.lossless_preset, determineLosslessQuality(options.quality), + ); - const options: EncodeOptions = { + const newOptions: EncodeOptions = { // Copy over options the form doesn't care about, eg emulate_jpeg_size - ...this.props.options, + ...options, // And now stuff from the form: lossless, // Special-cased inputs: // In lossless mode, the quality is derived from the preset. quality: lossless ? - losslessPresets[Number(losslessPresetInput.value)][1] : - inputFieldValueAsNumber(form.quality), + losslessPresets[losslessPresetValue][1] : + inputFieldValueAsNumber(form.quality, options.quality), // In lossless mode, the method is derived from the preset. method: lossless ? - losslessPresets[Number(losslessPresetInput.value)][0] : - inputFieldValueAsNumber(form.method_input), - image_hint: (form.image_hint as HTMLInputElement).checked ? + losslessPresets[losslessPresetValue][0] : + inputFieldValueAsNumber(form.method_input, options.method), + image_hint: inputFieldCheckedAsNumber(form.image_hint, options.image_hint) ? WebPImageHint.WEBP_HINT_GRAPH : WebPImageHint.WEBP_HINT_DEFAULT, // .checked - exact: inputFieldCheckedAsNumber(form.exact), - alpha_compression: inputFieldCheckedAsNumber(form.alpha_compression), - autofilter: inputFieldCheckedAsNumber(form.autofilter), - filter_type: inputFieldCheckedAsNumber(form.filter_type), - use_sharp_yuv: inputFieldCheckedAsNumber(form.use_sharp_yuv), + exact: inputFieldCheckedAsNumber(form.exact, options.exact), + alpha_compression: inputFieldCheckedAsNumber( + form.alpha_compression, options.alpha_compression, + ), + autofilter: inputFieldCheckedAsNumber(form.autofilter, options.autofilter), + filter_type: inputFieldCheckedAsNumber(form.filter_type, options.filter_type), + use_sharp_yuv: inputFieldCheckedAsNumber(form.use_sharp_yuv, options.use_sharp_yuv), // .value - near_lossless: 100 - inputFieldValueAsNumber(form.near_lossless), - alpha_quality: inputFieldValueAsNumber(form.alpha_quality), - alpha_filtering: inputFieldValueAsNumber(form.alpha_filtering), - sns_strength: inputFieldValueAsNumber(form.sns_strength), - filter_strength: inputFieldValueAsNumber(form.filter_strength), - filter_sharpness: 7 - inputFieldValueAsNumber(form.filter_sharpness), - pass: inputFieldValueAsNumber(form.pass), - preprocessing: inputFieldValueAsNumber(form.preprocessing), - segments: inputFieldValueAsNumber(form.segments), - partitions: inputFieldValueAsNumber(form.partitions), + near_lossless: 100 - inputFieldValueAsNumber(form.near_lossless, 100 - options.near_lossless), + alpha_quality: inputFieldValueAsNumber(form.alpha_quality, options.alpha_quality), + alpha_filtering: inputFieldValueAsNumber(form.alpha_filtering, options.alpha_filtering), + sns_strength: inputFieldValueAsNumber(form.sns_strength, options.sns_strength), + filter_strength: inputFieldValueAsNumber(form.filter_strength, options.filter_strength), + filter_sharpness: + 7 - inputFieldValueAsNumber(form.filter_sharpness, 7 - options.filter_sharpness), + pass: inputFieldValueAsNumber(form.pass, options.pass), + preprocessing: inputFieldValueAsNumber(form.preprocessing, options.preprocessing), + segments: inputFieldValueAsNumber(form.segments, options.segments), + partitions: inputFieldValueAsNumber(form.partitions, options.partitions), }; - this.props.onChange(options); + this.props.onChange(newOptions); } private _losslessSpecificOptions(options: EncodeOptions) { return ( -
-
); } private _lossySpecificOptions(options: EncodeOptions) { + const { showAdvanced } = this.state; + return ( -
-
); } @@ -277,32 +317,26 @@ export default class WebPEncoderOptions extends Component { // I'm rendering both lossy and lossless forms, as it becomes much easier when // gathering the data. return ( -
-