diff options
Diffstat (limited to 'ipl/gprogs/gamma.icn')
-rw-r--r-- | ipl/gprogs/gamma.icn | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/ipl/gprogs/gamma.icn b/ipl/gprogs/gamma.icn new file mode 100644 index 0000000..0d9a57d --- /dev/null +++ b/ipl/gprogs/gamma.icn @@ -0,0 +1,220 @@ +############################################################################ +# +# File: gamma.icn +# +# Subject: Program to perform gamma correction on images +# +# Author: Ralph E. Griswold +# +# Date: March 5, 1998 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# This program allows changing the gamma correction for images. It can +# be used, for example, to desaturate images for use as backgrounds. +# Note: Fully saturated nd fully unsaturated colors are not affected by +# gamma correction. +# +############################################################################ +# +# Requires: Version 9 graphics +# +############################################################################ +# +# Links: interact, vfilter, vsetup +# +############################################################################ + +link interact +link vfilter +link vsetup + +global continuous_vidget # continuous update toggle +global gamma # current gamma value +global gamma_vidget # gamma vidget +global default_gamma # original gamma value +global name # name of current image file +global pane # window for current image +global vidgets # table of vidgets + + + +procedure main() + + vidgets := ui() + + continuous_vidget := vidgets["continuous"] + gamma_vidget := vidgets["gamma"] + + VSetState(continuous_vidget, "1") + + default_gamma := WAttrib("gamma") + + set_gamma(default_gamma) + + GetEvents(vidgets["root"], , shortcuts) + +end + +procedure continuous_cb(vidget, value) + + if \value then VSetFilter(gamma_vidget, &null) else + VSetFilter(gamma_vidget, "1") + + return + +end + +procedure file_cb(vidget, value) + + case value[1] of { + "load @L" : load_image() + "quit @Q" : exit() + "save @S" : save_image() + } + + return + +end + +procedure gamma_cb(vidget, value) + + set_gamma(10.0 ^ value) + + return + +end + +procedure load_image() + + WClose(\pane) + + repeat { + if OpenDialog("Load image file:") == "Cancel" then fail + pane := WOpen("label=" || dialog_value, "image=" || dialog_value, + "gamma=" || gamma) | { + Notice("Cannot open image file.") + next + } + name := dialog_value + Raise() + return + } + +end + +procedure reset_cb() + + set_gamma(default_gamma) + +end + +procedure save_image() + + WAttrib(\pane, "gamma=" || default_gamma) | { + Notice("No image loaded.") + fail + } + snapshot(pane) + WAttrib(pane, "gamma=" || gamma) + + return + +end + +procedure set_cb() + + repeat { + if OpenDialog("Set gamma value:", gamma, 10) == "Cancel" then fail + if 0.0 <= numeric(dialog_value) <= 100.0 then { + set_gamma(dialog_value) + return + } + else { + Notice("Invalid gamma value.") + next + } + } + +end + +procedure set_gamma(value) + + gamma := value + + WAttrib(\pane, "gamma=" || gamma) + VSetState(gamma_vidget, log(value, 10)) + show_gamma() + ReadImage(\pane, name) + Raise() + + return + +end + +procedure shortcuts(value) + + if &meta then case map(value) of { + "l" : load_image() + "q" : exit() + "r" : set_gamma(default_gamma) + "s" : save_image() + } + + return + +end + +procedure show_gamma() + static old_gamma, x, y + + initial { + old_gamma := "" + x := vidgets["show_gamma"].ax + y := vidgets["show_gamma"].ay + } + + WAttrib("drawop=reverse") + DrawString(x, y, old_gamma) + DrawString(x, y, gamma) + WAttrib("drawop=copy") + + old_gamma := gamma + + return + +end + +#===<<vib:begin>>=== modify using vib; do not remove this marker line +procedure ui_atts() + return ["size=337,210", "bg=pale gray"] +end + +procedure ui(win, cbk) +return vsetup(win, cbk, + [":Sizer:::0,0,337,210:",], + ["10:Label:::109,97,21,13:1.0",], + ["20:Label:::193,97,28,13:10.0",], + ["3:Label:::23,97,21,13:0.1",], + ["continuous:Button:regular:1:12,120,126,20:continuous update",continuous_cb], + ["file:Menu:pull::0,2,36,21:File",file_cb, + ["load @L","save @S","quit @Q"]], + ["gamma:Scrollbar:h::12,62,305,16:-1.0,2.0,2.0",gamma_cb], + ["glabel:Label:::102,37,112,13:gamma correction",], + ["label1:Label:::276,97,35,13:100.0",], + ["label2:Label:::117,162,56,13:gamma = ",], + ["line1:Line:::0,23,336,23:",], + ["line2:Line:::34,80,34,90:",], + ["line3:Line:::209,80,209,90:",], + ["line4:Line:::121,80,121,90:",], + ["line5:Line:::295,80,295,90:",], + ["reset:Button:regular::57,159,42,20:reset",reset_cb], + ["set:Button:regular::12,159,35,20:set",set_cb], + ["show_gamma:Button:regularno::179,174,35,20:",], + ) +end +#===<<vib:end>>=== end of section maintained by vib |