Filter

Servlet FilterじゃなくてImage Filterの方。
javafxrt.jarのjavafx.ui.filterにはガウスぼかしだのノイズだのリッチなフィルタがいろいろ用意されているのに、HSBを弄るような貧乏臭いフィルタは用意されてない。コードを見たらBufferedImageOpのwrapperになっていて*1よそのライブラリを呼び出してる。

と言う訳で、見よう見まねでフィルタを作ってみたが、このフィルタ内の属性を他にbindしても描画はアップデートされない。当然と言えば当然なんだけど、フィルタのインスタンスごと取っ替えてやる必要がある。
以下コード。

import javafx.ui.filter.Filter;
import com.jhlabs.image.HSBAdjustFilter as JHHSBFilter;

public class HSBFilter extends Filter {
    protected attribute hsbFilter: JHHSBFilter;
    public attribute hue: Number;
    public attribute saturation: Number;
    public attribute brightness: Number;
}

attribute HSBFilter.hue = 0;
attribute HSBFilter.saturation = 0;
attribute HSBFilter.brightness= 0;

operation HSBFilter.createFilter() {
    if ( hsbFilter == null ) {
        hsbFilter = new JHHSBFilter();
        hsbFilter.setHFactor(hue);
        hsbFilter.setSFactor(saturation);
        hsbFilter.setBFactor(brightness);
    }
    return hsbFilter;
}

trigger on HSBFilter.hue[oldValue] = newValue {
    if ( hsbFilter <> null ) {
        hsbFilter.setHFactor(hue);
    }
}

trigger on HSBFilter.saturation[oldValue] = newValue {
    if ( hsbFilter <> null ) {
        hsbFilter.setSFactor(saturation);
    }
}

trigger on HSBFilter.brightness[oldValue] = newValue {
    if ( hsbFilter <> null ) {
        hsbFilter.setBFactor(brightness);
    }
}

*1:JavaFXではプレーンなJavaのクラスをFXの文法に適合させるためにこう言うwrapperを大量に用意している、と言うかjavafx.ui直下はほぼSwingのwrapper。