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_ ''