import { h, Component } from 'preact'; import { bind } from '../../lib/initial-util'; import { inputFieldChecked, inputFieldValueAsNumber, preventDefault } from '../../lib/util'; import { EncodeOptions, MozJpegColorSpace } from './encoder-meta'; 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'; interface Props { options: EncodeOptions; onChange(newOptions: EncodeOptions): void; } interface State { showAdvanced: boolean; } export default class MozJPEGEncoderOptions extends Component { state: State = { showAdvanced: false, }; @bind onChange(event: Event) { const form = (event.currentTarget as HTMLInputElement).closest('form') as HTMLFormElement; const { options } = this.props; const newOptions: EncodeOptions = { // Copy over options the form doesn't currently care about, eg arithmetic ...this.props.options, // And now stuff from the form: // .checked baseline: inputFieldChecked(form.baseline, options.baseline), progressive: inputFieldChecked(form.progressive, options.progressive), optimize_coding: inputFieldChecked(form.optimize_coding, options.optimize_coding), trellis_multipass: inputFieldChecked(form.trellis_multipass, options.trellis_multipass), trellis_opt_zero: inputFieldChecked(form.trellis_opt_zero, options.trellis_opt_zero), trellis_opt_table: inputFieldChecked(form.trellis_opt_table, options.trellis_opt_table), auto_subsample: inputFieldChecked(form.auto_subsample, options.auto_subsample), separate_chroma_quality: inputFieldChecked(form.separate_chroma_quality, options.separate_chroma_quality), // .value quality: inputFieldValueAsNumber(form.quality, options.quality), chroma_quality: inputFieldValueAsNumber(form.chroma_quality, options.chroma_quality), chroma_subsample: inputFieldValueAsNumber(form.chroma_subsample, options.chroma_subsample), smoothing: inputFieldValueAsNumber(form.smoothing, options.smoothing), color_space: inputFieldValueAsNumber(form.color_space, options.color_space), quant_table: inputFieldValueAsNumber(form.quant_table, options.quant_table), trellis_loops: inputFieldValueAsNumber(form.trellis_loops, options.trellis_loops), }; this.props.onChange(newOptions); } render({ options }: Props, { showAdvanced }: State) { // I'm rendering both lossy and lossless forms, as it becomes much easier when // gathering the data. return (
Quality:
{showAdvanced ?
{options.color_space === MozJpegColorSpace.YCbCr ?
{options.auto_subsample ? null :
Subsample chroma by:
}
{options.separate_chroma_quality ?
Chroma quality:
: null }
: null }
{options.baseline ? null : } {options.baseline ? : null }
Smoothing:
{options.trellis_multipass ? : null }
Trellis quantization passes:
: null }
); } }