NB. Script ped8b.ijs
NB. Written by Cliff Reiter
NB. Lafayette College
NB. Last update December, 2002, for J5.01b
NB.
NB. Allows palette editing of images which are 8 bit
NB. uncompressed windows bitmaps.
cocurrent 'ped8'
('z';'jgl2') copath 'ped8'
NB. coinsert 'jgl2'
require 'gl2'
RGBED=: 0 : 0
pc rgbed;
xywh 190 12 34 12;cc ok button;cn "OK";
xywh 190 39 34 12;cc cancel button;cn "Cancel";
xywh 6 6 50 50;cc colsq isigraph;
xywh 60 4 100 12;cc rsb scrollbar;
xywh 60 25 100 12;cc gsb scrollbar;
xywh 60 46 100 12;cc bsb scrollbar;
xywh 165 4 20 12;cc rs static;
xywh 165 25 20 12;cc gs static;
xywh 165 46 20 12;cc bs static;
pas 6 6;pcenter;
rem form end;
)
rgbed_run=: 3 : 0
rgb=.3{.".y.,' 0 0 0'
rsb=.":0{rgb
gsb=.":1{rgb
bsb=.":2{rgb
wd RGBED
NB. initialize form here
wd 'set rsb 0 0 255 16'
wd 'set gsb 0 0 255 16'
wd 'set bsb 0 0 255 16'
wd 'set rsb ',rsb
wd 'set gsb ',gsb
wd 'set bsb ',bsb
wd 'set rs * ',rsb
wd 'set gs * ',gsb
wd 'set bs * ',bsb
paint ".rsb,' ',gsb,' ',bsb
)
paint=:3 : 0
glsel colsq
glrgb y.
glbrush ''
glpolygon ,1000*#:0 1 3 2
glshow ''
wd 'pshow;'
)
getrgb=:3 : 0
".rsb,' ',gsb,' ',bsb
)
rgbed_close=: 3 : 0
wd 'pclose'
)
rgbed_cancel_button=: 3 : 0
rgbed_close''
)
rgbed_rsb_button=: 3 : 0
wd 'set rs * ',rsb
paint getrgb ''
)
rgbed_gsb_button=: 3 : 0
wd 'set gs * ',gsb
paint getrgb ''
)
rgbed_bsb_button=: 3 : 0
wd 'set bs * ',bsb
paint getrgb ''
)
rgbed_ok_button=: 3 : 0
pa_hist=:pa,pa_hist
pa=:(getrgb '')PP}pa
wd 'psel paledit'
display_pal ''
wd 'psel rgbed'
wd 'pclose'
)
PALEDIT=: 0 : 0
pc paledit;
menupop "File";
menu open "&Open Bitmap" "Ctrl+O" "" "";
menu save "&Save" "Ctrl+S" "" "";
menu saveas "S&ave As" "Ctrl +A" "" "";
menu loadpal "Load &Palette from bmp" "" "" "";
menusep ;
menu exit "&Exit" "" "" "";
menupopz;
menupop "Help";
menu command "&Commands" "F1" "" "";
menu about "&About" "" "" "";
menupopz;
cc cancel button;cn "Exit";setxywhx cancel 855 425 75 25;
cc pal isigraph;setxywhx pal 440 0 400 400;
cc pic isigraph;setxywhx pic 0 0 400 400;
cc copy button;cn "Copy RGB";setxywhx copy 855 250 75 25;
cc paste button;cn "Paste RGB";setxywhx paste 855 300 75 25;
cc saveas button;cn "Save as";setxywhx saveas 855 150 75 25;
cc open button;cn "Open";setxywhx open 855 25 75 25;
cc save button;cn "Save";setxywhx save 855 100 75 25;
cc label static;cn "Action on Selection";setxywhx label 550 475 100 25;
cc seltyp combolist;setxywhx seltyp 675 475 125 125;
cc verpos scrollbarv;setxywhx verpos 400 0 25 400;
cc horpos scrollbar;setxywhx horpos 0 400 400 25;
cc label2 static;cn "Magnification";setxywhx label2 100 450 100 25;
cc mag scrollbar;setxywhx mag 200 450 175 25;
cc phf button;cn "palette history FORWard";setxywhx phf 675 425 125 25;
cc phb button;cn "palette history BACK";setxywhx phb 525 425 125 25;
pas 6 6;pcenter;
rem form end;
)
paledit_run=: 3 : 0
wd PALEDIT
NB. initialize form here
wd 'set seltyp blend reverse inverse random2 random3 random4 random5;setselect seltyp 0; '
wd 'set verpos 0 0 99 10'
wd 'set horpos 0 0 99 10'
wd 'set mag 0 0 99 10'
require 'gl2'
if. 0<#y. do.
fn=:y.
loadbmp ''
end.
wd 'pshow;'
)
paledit_close=: 3 : 0
wd'pclose'
)
paledit_cancel_button=: 3 : 0
paledit_close''
)
paledit_exit_button=: 3 : 0
paledit_close''
)
rawwritebmp8=: 3 : 0
:
('spal';'sbmp')=.$@>"0 x.
xsbmp=.sbmp+(i.2)*4|-sbmp
h=.524289 0,(*/xsbmp),0 0,2#spal=.0{spal
h=.(54+(4*spal)+*/xsbmp),0,(54+4*spal),40,(|.sbmp),h
head=. 'BM',,a.{~,|."1 (4#256)#:h
pal=. ,(0,"1~|."1 >{.x.){a.
bmp=. ,xsbmp{.>{:x.
(head,pal,bmp) 1!:2 <y.
)
NB. read 8-bit uncompressed *.bmp files with raw data
rawreadbmp8=: 3 : 0
head=.256#.|."1 a.i. 13 4$2}.54{.x=. 1!:1 <y.
pal=. |."(1) 3{."1 (m,4)$ a.i. 54}.(54+4*m=.11{head){.x
sbmp=.5 4{head
xsbmp=.sbmp+(i.2)*4|-sbmp
bmp=. sbmp{.xsbmp$(2{head)}.x
pal;bmp
)
gpolygon=: 3 : 0
glpolygon y.
:
glbrush glrgb x.
glpolygon y.
)
display_pal=:3 : 0
NB. (pa;bit) rawwritebmp8 'temp_pal_edit.bmp'
NB. wd 'set pic "temp_pal_edit.bmp"'
wd 'psel paledit;'
glsel 'pic'
glmap MM_RAW
glwindowext 400 400
glpixels 0 0,($ bit),,256 256 256#.(a.i.bit){pa
glshow ''
glsel 'pal'
glclear ''
(16 16$256{.pa) gpolygon"1 (1000%16)*,/"2 (#:0 1 3 2)+"1 _"_ 1 (|.,"0~/])i.16
glpaint ''
glshow ''
wd 'pshow;'
)
paledit_open_button=: 3 : 0
try. 1+$fndir=.((i:&'\') {. ])fn catch. fndir=.'' end.
fn=:wd 'mbopen "Bitmap files" "',fndir,'" "*.bmp" "Bitmap(*.bmp)|*.bmp|All files(*.*)|*.*"'
wd 'pn ',fn,';'
loadbmp ''
)
paledit_loadpal_button=: 3 : 0
try. 1+$tempdir=.((i:&'\') {. ])tempfn catch. tempdir=.'' end.
tempfn=:wd 'mbopen "Bitmap files" "',tempdir,'" "*.bmp" "Bitmap(*.bmp)|*.bmp|All files(*.*)|*.*"'
if. 0<#tempfn do.
pa_hist=:pa,pa_hist
'pa temp'=:rawreadbmp8 tempfn
pa=:256{.pa
display_pal ''
end.
)
paledit_phb_button=: 3 : 0
if. 0<#pa_hist do.
'pa pa_hist'=:({.pa_hist);}.pa_hist,pa
display_pal ''
end.
)
paledit_phf_button=: 3 : 0
if. 0<#pa_hist do.
'pa pa_hist'=:({:pa_hist);pa,}:pa_hist
display_pal ''
end.
)
loadbmp=:3 : 0
if. 0<#fn do.
'pa bitmap'=:rawreadbmp8 fn
'M N'=:$bitmap
bitmap2=:|.(_1 1*>./M,N){.bitmap
pa=:256{.pa
pa_hist=:i.0 256 3
updatebit ''
display_pal ''
end.
)
updatebit=: 3 : 0
MAG=.".mag
in=.<.((i.%<:)400)*((400%99)*(99-MAG))+(MAG%99)*<:M<.N
HP=.<.((".horpos)%99)*N->:{:in
VP=.<.((".verpos)%99)*M->:{:in
bit=: (HP+in){"1 ((M-1)-|.VP+in){bitmap2
)
paledit_mag_button=: 3 : 0
updatebit ''
display_pal ''
)
paledit_horpos_button=:paledit_mag_button
paledit_verpos_button=:paledit_mag_button
paledit_octrl_fkey=: paledit_open_button
paledit_actrl_fkey=: paledit_saveas_button
paledit_sctrl_fkey=: paledit_save_button
paledit_f1_fkey=: paledit_command_button
pal_pos=:3 : 0
16 16 #. |.({.,15&-@{:)<.16*(0 1&{ % 2 3&{)". y.
)
paledit_pal_mbldbl=:3 : 0
PP=:pal_pos sysdata
rgbed_run ":PP{pa
)
paledit_pal_mbldown=:3 : 0
if. 0={:".sysdata do.
PP=:pal_pos sysdata
display_pal ''
glrgb 255-PP{pa
glpen 3 0
gllines ,(1000%16)*(#:2 1)+"1 <.16*(0 1&{ % 2 3&{)". sysdata
gllines ,(1000%16)*(#:0 3)+"1 <.16*(0 1&{ % 2 3&{)". sysdata
glrgb 0 0 0
glpen 1 0
glshow ''
else.
qq=.pal_pos sysdata
if. qq<PP do. 'PP qq'=.qq,PP end.
si=. PP+i.1+qq-PP NB. selected indices
pa_hist=:pa,pa_hist
select. seltyp
case. 'blend' do.
rr=.<.0.5+(PP{pa)+"1((qq{pa)-PP{pa)*"1 0(i.%])qq-PP
pa=:rr (}:si)}pa
case. 'reverse' do.
pa=:(|.si{pa)si}pa
case. 'inverse' do.
pa=:(255-si{pa)si}pa
case. 'random2' do.
pa=:(<.0.5+(((i.%<:)2);?2 3$256)pwlin (i.%<:)#si)si}pa
case. 'random3' do.
pa=:(<.0.5+(((i.%<:)3);?3 3$256)pwlin (i.%<:)#si)si}pa
case. 'random4' do.
pa=:(<.0.5+(((i.%<:)4);?4 3$256)pwlin (i.%<:)#si)si}pa
case. 'random5' do.
pa=:(<.0.5+(((i.%<:)5);?5 3$256)pwlin (i.%<:)#si)si}pa
end.
display_pal ''
end.
)
pwlin=: 3 : 0"_ 0
:
p=.>{.x.
c=.>{:x.
i=.i.&0 p<y.
((1-r),r=.(y.-~i{p)%-/(i-0 1){p)+/ .* (i- 0 1){c
)
paledit_copy_button=: 3 : 0
Clip=:PP{pa
)
paledit_paste_button=: 3 : 0
pa_hist=:pa,pa_hist
pa=:Clip PP}pa
display_pal ''
)
paledit_saveas_button=: 3 : 0
try. 1+$fndir=.((i:&'\') {. ])fn catch. fndir=.'' end.
out=.wd 'mbsave "Bitmap files" "',fndir,'" "*.bmp" "Bitmap(*.bmp)|*.bmp|All files(*.*)|*.*"'
if. 0<#out do.
fn=:out
(pa;bitmap) rawwritebmp8 fn
wd 'pn ',fn,';pshow;'
end.
)
paledit_save_button=: 3 : 0
ok=.wd 'mb "" "Ok to overwrite image?" mb_okcancel'
if. ok-:'OK' do. (pa;bitmap) rawwritebmp8 fn end.
)
help_commands=:0 : 0
Images opened need to be 8 bit
uncompressed windows bitmaps
Open ctrl-o Loads a new image
Save ctrl-s Save the image with modified palette
Save As ctrl-a Save the image with a new name
Copy Copies selected RGB triple to a clipboard
Paste Pastes the RGB triple to selected position
Double-left Edit palette entry
Left-click Select palette entry
Shift-left click SELECTS palette from selected entry to
current entry and performs an action on selection
Blend ..... applies Linear merge
Reverse ... reverses the order of the palette entries
Inverse ... applies 255&- to each color
Random n .. creates n uniformly spaced random color with
linear merge in between
Help F1 This help
)
paledit_command_button=: 3 : 0
wdinfo help_commands
)
help_about=:0 : 0
Utility for editing the palette of
8 bit uncompressed windows bitmaps
Written by Cliff Reiter
Lafayette College
Last update July 13, 1999
Use is free; send $10 with each complaint.
)
paledit_about_button=: 3 : 0
wdinfo help_about
)
cocurrent 'base'
paledit_run_ped8_ ''