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}
); } }