Home » Archimedes archive » Micro User » MU 1991-10.adf » PD-Stuff » Graphics/!Translatr/!RunImage
Graphics/!Translatr/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Archimedes archive » Micro User » MU 1991-10.adf » PD-Stuff |
| Filename: | Graphics/!Translatr/!RunImage |
| Read OK: | ✔ |
| File size: | 15606 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >!RunImage
20REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG
30REM Converts foreign graphics files to Archimedes
40REM Version date : Thu,25 Apr 1991.23:16:49
50REM LEN 1991 Zeridajh software
60REM by John Kortink
70REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG
80ON ERROR MODE0:PRINT'"Error"''"'";REPORT$;"' (code ";ERL;")"'':END
90tversion%=644:REM Translator version number
100DIM window &A00,iconsprites 2048,icondata 4096,icondend 0
110DIM menuico% 256,poll 256,block 256,err 256,wimppal 256,pointer 512
120DIM InPal%(256),ImgPal%(256),ShowPal%(256),UserModeSet%(4)
130DIM arg% 1024,dum% 5*1024,transtab% 256,Buffer%(32,1)
140DIM buffer% 32*8,freq% 1024,palrgb% 1024,hambas% 64
150DIM intmap% 1024,pbmint% 256
160Progneed%=150*1024:REM Estimated space needed for program+vars
170LowHeap%=1024:REM Lowest size for heap (sprite, buffers, etc.)
180Totalfree%=HIMEM-PAGE:REM Total free for program+vars+sprbuf
190MidHimem%=PAGE+Progneed%:REM Pseudo HIMEM (top of prog, start of heap)
200Heap%=MidHimem%:HeapSize%=Totalfree%-Progneed%:REM Set heap + size
210IFHeapSize%<LowHeap% THEN ERROR 1,"No room to start up Translator"
220HIMEM=MidHimem%:REM Lower himem to below sprite buffer
230PROCinitialise:REM Initialise application
240PROCmode_change(-1):REM Reselect current mode to tidy up
250Lname$=FNOSvar("Translator$File"):IFLname$<>"" THEN SYS "OS_CLI","Unset Translator$File":Ltype%=FNimage_type(Lname$,TRUE):IFLtype%>0 THEN Action=ActLoad:REM Auto-boot, pending load
260ON ERROR PROCerror(ERR,REPORT$+" (code "+STR$ERL+")"):PROCiclose
270REM Poll and action
280IFDataLoadRef% THEN pollmask%=48 ELSE pollmask%=49:REM No nulls if wasted
290CASE FNpoll(pollmask%) OF
300 WHEN 0 : PROCnull
310 WHEN 1 : PROCredraw
320 WHEN 2 : PROCopen
330 WHEN 3 : PROCclose
340 IFKill THEN Kill=FALSE:SlotDown=TRUE
350 WHEN 6 : PROCmouseclick
360 WHEN 7 : PROCdragdrop
370 WHEN 8 : PROCkey
380 WHEN 9 : PROCmenuselect
390 WHEN 17,18 : PROCmessage
400ENDCASE
410IFAction THEN
420 SlotDown=TRUE:END=&1000000:PROCnew_slot:HIMEM=MidHimem%:REM Claim max
430 CASE Action OF
440 WHEN ActLoad : REM Load new image
450 Action=0:REM Reset action flag
460 Ok=FNload(Ltype%,Lname$):REM Attempt to load image
470 IFOk THEN Action=ActPostLoad
480 WHEN ActRotate : REM Rotate image
490 Action=0:REM Reset action flag
500 free%=Heap%+HeapSize%-SprEnd%:REM Free above sprite
510 IFfree%>8*1024 THEN
520 PROChour_on:PROCvar("rotb",SprEnd%):PROCvar("rots",free%):SYS "Translator_Rotate",SprPtr%:PROChour_off:REM Rotate sprite
530 Sprite%!12=Sprite%!8+!(Sprite%+Sprite%!8):SWAP SprH%,SprW%
540 PROCnew_image_window:REM New image window
550 ELSE PROCerror(-1,"No room for rotate buffer !")
560 ENDIF
570 ENDCASE
580ENDIF
590IFSlotDown THEN
600 IFImg THEN END=(SprEnd%+1023)ANDNOT1023 ELSE END=MidHimem%
610 PROCnew_slot:HIMEM=MidHimem%
620 SlotDown=FALSE
630ENDIF
640IF(Action=ActPostLoad) THEN
650 Action=0:REM Reset action flag
660 PROCset_mode(ImgMode%):REM Select image mode
670 ZoomX=1:ZoomY=1:REM Reset zoom factors
680 IFAutoPal THEN PROCset_palette(1):REM Select image palette if enabled
690 PROCnew_image_window:REM Open window on image
700ENDIF
710GOTO 270:REM Sorry, I have to. Current BASIC restrictions with END=.
720
730DEFPROCnew_slot
740REM Slot changed, reset info
750HeapSize%=HIMEM-MidHimem%:REM New size of heap
760ENDPROC
770
780DEFPROCmenuselect
790SYS WDecodeM%,,menu1,poll,STRING$(100," ") TO ,,,select$:REM Selection
800REM Decode main/sub/subsub selection string
810menupath$=select$:REM Remember menu path
820select2=FALSE:select3=FALSE:select4=FALSE:select5=FALSE:select2$="":select3$="":select4$="":select5$="":REM Defaults
830p%=INSTR(select$,"."):IFp%>0 THEN select2=TRUE:select2$=MID$(select$,p%+1):select$=LEFT$(select$,p%-1):p%=INSTR(select2$,"."):IFp%>0 THEN select3=TRUE:select3$=MID$(select2$,p%+1):select2$=LEFT$(select2$,p%-1):p%=INSTR(select3$,".")
840IFp%>0 THEN select4=TRUE:select4$=MID$(select3$,p%+1):select3$=LEFT$(select3$,p%-1):p%=INSTR(select4$,"."):IFp%>0 THEN select5=TRUE:select5$=MID$(select4$,p%+1):select4$=LEFT$(select4$,p%-1)
850REM Filter clicks on roots of entries with submenu
860CASE menupath$ OF
870 WHEN "Image info","Pop up","Process","Manipulate","Examine","Misc" : IFselect2 ELSE select$=""
880 WHEN "Pop up.Mode set","Process.Colour","Process.Sprite output","Process.Scaling","Process.Misc","Examine.Zoom","Manipulate.Mirror","Misc.Save","Misc.Status" : IFselect3 ELSE select$=""
890 WHEN "Process.Sprite output.Output mode","Process.Sprite output.Output palette","Process.Sprite output.Error spreading","Process.Scaling.x","Process.Scaling.y","Examine.Zoom.In","Examine.Zoom.Out" : IFselect4 ELSE select$=""
900ENDCASE
910CASE select$ OF
920 WHEN "" : REM Do nothing
930 WHEN "Quit" : REM Quit program
940 PROCdie:REM Tidy up and exit
950 WHEN "Pop up" : REM Pop up options
960 CASE select2$ OF
970 WHEN "Auto mode" : AutoMode=NOTAutoMode
980 WHEN "Auto palette" : AutoPal=NOTAutoPal
990 WHEN "Mode set" : REM Select new mode set
1000 CASE LEFT$(select3$,4) OF
1010 WHEN "Root" : REM No selection (root)
1020 WHEN "None" : ModeSet=0:REM No mode set
1030 WHEN "Norm" : ModeSet=1:REM Normal monitor mode set
1040 WHEN "Mult" : ModeSet=2:REM Multisync monitor mode set
1050 OTHERWISE : REM User mode set, check and if ok, change
1060 s$=select3$:p%=INSTR(s$,","):IFp%>0 THEN m1%=VALs$:s$=MID$(s$,p%+1):p%=INSTR(s$,","):IFp%>0 THEN m2%=VALs$:s$=MID$(s$,p%+1):p%=INSTR(s$,","):IFp%>0 THEN m3%=VALs$:s$=MID$(s$,p%+1):m4%=VALs$
1070 IFp%>0 THEN UserModeSet%(1)=m1%:UserModeSet%(2)=m2%:UserModeSet%(3)=m3%:UserModeSet%(4)=m4%:ModeSet=3 ELSE PROCerror(-1,"Bad user mode set. Please use '<2colmode>,<4colmode>,<16colmode>,<256colmode>', e.g. '1,2,3,4'.")
1080 ENDCASE
1090 WHEN "Auto zoom" : AutoZoom=NOTAutoZoom
1100 WHEN "View mode" : ViewMode=NOTViewMode
1110 ENDCASE
1120 WHEN "Process" : REM Processing options
1130 CASE select2$ OF
1140 WHEN "Colour" : REM Colour processing options
1150 CASE select3$ OF
1160 WHEN "Black and white" : BlackWhite=NOTBlackWhite
1170 WHEN "Correct gamma" : REM Gamma correction factor
1180 IF(select4$+select5$)="" THEN GammaF=1 ELSE GammaF=VAL(select4$+"."+select5$):REM New factor
1190 Gamma=(GammaF<>1)AND(GammaF>0):REM Gamma in effect ?
1200 WHEN "Correct black" : REM Black correction factor
1210 IFselect4$="" THEN BlackF=0 ELSE BlackF=VAL(select4$):REM New factor
1220 Black=(BlackF<>0):REM Black correction in effect ?
1230 WHEN "Expand range" : Range=NOTRange
1240 WHEN "Invert RGB" : InvertRGB=NOTInvertRGB
1250 ENDCASE
1260 WHEN "Sprite output" : REM Sprite output options
1270 CASE select3$ OF
1280 WHEN "Output mode" : REM Change output mode selection
1290 IFselect4$="Auto" THEN OutMode=1 ELSE OutMode=2
1300 WHEN "Output palette" : REM Change output palette selection
1310 IFselect4$="Current" THEN OutPal=1 ELSE IFselect4$="Default" THEN OutPal=2 ELSE OutPal=3
1320 WHEN "Error spreading" : REM Set error spreading
1330 CASE select4$ OF
1340 WHEN "Simple" : ErrSpread=1
1350 WHEN "Floyd Steinberg" : ErrSpread=2
1360 WHEN "Off" : ErrSpread=0
1370 ENDCASE
1380 WHEN "Zig zag" : ZigZag=NOTZigZag
1390 ENDCASE
1400 WHEN "Clear output" : REM Clear output file off
1410 IFClearFile THEN SYS "OS_File",6,ClearSave$:ClearFile=FALSE
1420 WHEN "Scaling" : REM Change scale factors
1430 xm%=-1:ym%=-1:xd%=-1:yd%=-1
1440 CASE select3$ OF
1450 WHEN "1:1" : xm%=1:ym%=1:xd%=1:yd%=1
1460 WHEN "1:2" : xm%=1:ym%=1:xd%=2:yd%=2
1470 WHEN "2:1" : xm%=2:ym%=2:xd%=1:yd%=1
1480 WHEN "x","y" : s$=select4$:p%=INSTR(s$,":"):mul%=VALs$:IFp%>0 THEN s$=MID$(s$,p%+1):div%=VALs$ ELSE div%=0:REM Determine scaling ratio (0=inpix)
1490 IFselect3$="x" THEN xm%=mul%:xd%=div% ELSE ym%=mul%:yd%=div%
1500 ENDCASE
1510 IFxm%=-1 ELSE XMul%=xm%:XDiv%=xd%:DivIsInX=(XDiv%<=0)
1520 IFym%=-1 ELSE YMul%=ym%:YDiv%=yd%:DivIsInY=(YDiv%<=0)
1530 WHEN "Misc" : REM Miscelaneous options
1540 CASE select3$ OF
1550 WHEN "Screen blanking" : Blanking=NOTBlanking
1560 WHEN "GIF scan" : GIFScan=NOTGIFScan
1570 WHEN "Image number" : REM Image number
1580 IFselect4$="" THEN ImageNr%=1 ELSE ImageNr%=VAL(select4$)
1590 WHEN "Next image","Previous image" : REM Image number up/down
1600 CASE LEFT$(select3$,1) OF
1610 WHEN "N" : ImageNr%+=1
1620 WHEN "P" : IFImageNr%>1 THEN ImageNr%-=1
1630 ENDCASE
1640 IFInFile$<>"" THEN Lname$=InFile$:Ltype%=InType%:Action=ActLoad ELSE PROCerror(-1,"Load an image file first !"):REM Pending load
1650 WHEN "Percentage" : Percent=NOTPercent
1660 ENDCASE
1670 ENDCASE
1680 WHEN "Manipulate" : REM Manipulation options
1690 CASE select2$ OF
1700 WHEN "Rotate" : REM Rotate sprite
1710 Action=ActRotate:REM Pending load
1720 WHEN "Mirror" : REM Mirror image
1730 PROCvar("imgx",SprW%):PROCvar("imgy",SprH%):REM Module info
1740 PROChour_on
1750 IFselect3$="x" THEN SYS "Translator_MirrorX",SprPtr% ELSE SYS "Translator_MirrorY",SprPtr%:REM Mirror sprite
1760 PROChour_off
1770 PROCnew_window(win_img%):REM Freshen image window
1780 ENDCASE
1790 WHEN "Examine" : REM Examination options
1800 CASE select2$ OF
1810 WHEN "Zoom" : REM Zoom in, out, normal size
1820 OldZoomX=ZoomX:OldZoomY=ZoomY:REM Remember old zoom factors
1830 CASE select3$ OF
1840 WHEN "In": IFselect4$="Both" THEN ZoomX=ZoomX*2:ZoomY=ZoomY*2 ELSE IFselect4$="x" THEN ZoomX=ZoomX*2 ELSE IFselect4$="y" THEN ZoomY=ZoomY*2
1850 WHEN "Out": IFselect4$="Both" THEN ZoomX=ZoomX/2:ZoomY=ZoomY/2 ELSE IFselect4$="x" THEN ZoomX=ZoomX/2 ELSE IFselect4$="y" THEN ZoomY=ZoomY/2
1860 WHEN "1:1": ZoomX=1:ZoomY=1
1870 ENDCASE
1880 REM Set image window extent and title according to current zoom factor
1890 !block=0:block!4=0:block!8=FNsprW*ZoomX:block!12=FNsprH*ZoomY
1900 SYS WSetE%,win_img%,block:REM Set window extent to zoomed size
1910 $IMWtt%=FNimage_title:REM New title
1920 !block=win_img%:SYS WGetWS%,,block:REM Read window's position
1930 dx%=(block!12-block!4)/2:dy%=(block!16-block!8)/2:REM Half window size
1940 vx%=block!20+dx%:vy%=block!24-dy%:REM Vector from centre to origin
1950 REM Calculate new scroll offsets by scaling vector and re-transpose
1960 block!20=vx%*ZoomX/OldZoomX-dx%:block!24=vy%*ZoomY/OldZoomY+dy%
1970 PROCclose_window(win_img%):PROCopen_window(win_img%,block)
1980 WHEN "Magnifier" : REM Pop up zoom window
1990 ZoomWin=TRUE:ZoomWX%=0:ZoomWY%=0:ZoomW=ZoomD:REM Init zoom window
2000 PROCopen_window(win_zoom%,-1):REM Open zoom window
2010 ENDCASE
2020 WHEN "Misc" : REM Miscellaneous options
2030 CASE select2$ OF
2040 WHEN "Reload last" : REM Reload last image file
2050 IFInFile$<>"" THEN Lname$=InFile$:Ltype%=InType%:Action=ActLoad ELSE PROCerror(-1,"Load an image file first !"):REM Pending load
2060 WHEN "Save" : REM Save whole or part of image
2070 CASE select3$ OF
2080 WHEN "Include palette" : SavePal=NOTSavePal
2090 WHEN "Same leafname" : SameLeaf=NOTSameLeaf
2100 OTHERWISE : SaveKind$=select3$:REM Remember type of save
2110 $SAVfn%=SaveSpr$:$SAVsn%="file_ff9":REM Set file window for sprite
2120 PROCopen_window(win_file%,-1):REM Open file window
2130 SYS WSetCa%,win_file%,1,,,-1,LEN(SaveSpr$)
2140 ENDCASE
2150 WHEN "Image palette" : REM Select image palette
2160 PROCset_palette(1)
2170 WHEN "Status" : REM Manipulate defaults
2180 CASE select3$ OF
2190 WHEN "Save" : Status=OPENOUT("<Translator$Dir>.Status"):PRINT#Status,AutoMode,AutoPal,ModeSet,ErrSpread,SavePal,UserModeSet%(1),UserModeSet%(2),UserModeSet%(3),UserModeSet%(4),AutoZoom,BlackWhite,GIFScan,Blanking,InvertRGB
2200 PRINT#Status,ZigZag,ViewMode,OutMode,OutPal,Percent,GammaF,Gamma,BlackF,Black,Range,SameLeaf:CLOSE#Status
2210 WHEN "Load" : IFFNload_status ELSE PROCerror(-1,"I cannot find my status file ! Have you saved one ?")
2220 WHEN "Kill" : SYS "OS_File",6,"<Translator$Dir>.Status"
2230 ENDCASE
2240 ENDCASE
2250ENDCASE
2260SYS WGetPI%,,block:REM Get pointer info
2270IF((block!8)AND1)>0 THEN PROCmain_menu:REM Adjust -> re-open
2280ENDPROC
2290
2300DEFPROCclose
2310Kill=FALSE:REM Flag returned : image killed
2320win%=poll!0:REM Window handle
2330PROCclose_window(win%):REM Close window
2340CASE win% OF
2350 WHEN win_img% : PROCinvalidate_image:PROCset_palette(0)
2360 PROCclose_window(win_file%)
2370 PROCclose_window(win_zoom%):ZoomWin=FALSE
2380 IFViewMode THEN PROCmode_change(PreMode)
2390 Kill=TRUE
2400 WHEN win_zoom% : ZoomWin=FALSE
2410ENDCASE
2420ENDPROC
2430
2440DEFPROCopen
2450PROCopen_window(0,poll)
2460ENDPROC
2470
2480DEFPROCredraw
2490PROCredraw_window(poll!0,FALSE)
2500ENDPROC
2510
2520DEFPROCnull
2530IFDataLoadRef% THEN
2540 DataLoadRef%=FALSE:SYS "OS_File",6,Save$:REM Delete file saved/created
2550 PROCerror(-1,"Bad data transfer, receiver dead"):REM No DataLoadAck
2560ENDIF
2570ENDPROC
2580
2590DEFPROCkey
2600win%=poll!0:ico%=poll!4:char%=poll!24:REM Window, icon, key pressed
2610IF(win%=win_file%) AND (ico%=1) THEN
2620 CASE char% OF
2630 WHEN 13 : REM Return pressed
2640 PROCerror(-1,"Please drag the sprite file icon to a directory viewer")
2650 WHEN 27 : REM Escape pressed
2660 PROCclose_window(win_file%)
2670 ENDCASE
2680ENDIF
2690ENDPROC
2700
2710DEFPROCmessage
2720REM Ignore messages originating from myself
2730IF(poll!4)=TaskHandle% THEN msgnr%=-1 ELSE msgnr%=poll!16
2740CASE msgnr% OF
2750 WHEN -1 : REM Don't react
2760 WHEN 0 : PROCdie:REM Request to terminate task
2770 WHEN 1 : REM DataSave, transfer via scrap file
2780 scrap$=FNOSvar("Wimp$Scrap"):REM Read scrap filename
2790 IFscrap$<>"" THEN poll!12=poll!8:poll!16=2:poll!36=-1:$(poll+44)=scrap$+CHR$0:poll!0=44+(LENscrap$+1+3)ANDNOT3:SYS WSendMsg%,18,poll,poll!4 ELSE PROCerror(-1,"Wimp$Scrap not defined"):REM Send DataSaveAck if scrap file defined
2800 WHEN 2 : REM DataSaveAck, save file
2810 IFpoll!12=DataSaveRef% THEN
2820 Save$=FNstring(poll+44):REM Full pathname of file to be saved/created
2830 REM Save sprite file or 'open' Clear file
2840 IF$SAVsn%="file_ff9" THEN SprSave$=Save$:PROCsave_sprite(SprSave$) ELSE ClearSave$=Save$:SYS "OS_File",11,ClearSave$,&690,0,0:ClearFile=TRUE
2850 poll!12=poll!8:poll!16=3:REM Amend data block for DataLoad
2860 SYS WSendMsg%,18,poll,poll!4:REM Send DataLoad
2870 DataLoadRef%=poll!8:REM Await a DataLoadAck, remember myref
2880 ENDIF
2890 WHEN 3,5 : REM DataLoad/Open : attempt to load
2900 type%=poll!40:name$=FNstring(poll+44):REM Filetype and filename
2910 CASE type% OF
2920 WHEN &FF9,&DE2,&DFA,&D58,&004 : IFmsgnr%=3 THEN type%=FNimage_type(name$,TRUE) ELSE type%=0
2930 OTHERWISE type%=FNimage_type(name$,(msgnr%=3))
2940 ENDCASE
2950 IFtype%>0 THEN
2960 poll!12=poll!8:poll!16=4:SYS WSendMsg%,17,poll,poll!4:REM DataLoadAck
2970 Lname$=name$:Ltype%=type%:Action=ActLoad:REM Pending load
2980 ELSE IFmsgnr%=3 THEN PROCerror(-1,"I don't recognize this file. Please filetype it appropiately."):REM Drag unrecognized
2990 ENDIF
3000 WHEN 4 : REM DataLoadAck, check or ignore
3010 IFDataLoadRef% THEN IFpoll!12=DataLoadRef% THEN DataLoadRef%=FALSE
3020 WHEN &400C0 : REM Submenu warning
3030 pointer%=poll!20:x%=poll!24:y%=poll!28:REM Get pointer/proposed x/y
3040 SYS WDecodeM%,,menu1,poll+32,STRING$(100," ") TO ,,,path$:REM Get path
3050 CASE path$ OF
3060 WHEN "Process.Clear output" : $SAVfn%=SaveClear$:$SAVsn%="file_690":SYS WCreateSM%,,pointer%,x%,y%:SYS WSetCa%,win_file%,1,,,-1,LEN(SaveClear$):REM Open file window for Clear file
3070 ENDCASE
3080 WHEN &400C1 : REM Mode has changed (and it may not have been me)
3090 PROCmode_change(-1):REM Tidy up
3100ENDCASE
3110ENDPROC
3120
3130DEFPROCmouseclick
3140but%=poll!8:win%=poll!12:ico%=poll!16:REM Buttons/window/icon
3150CASE win% OF
3160 WHEN -2 : REM Click on iconbar
3170 IFico%=Iiconbar% THEN
3180 REM Iconbar icon clicked
3190 CASE but% AND 7 OF
3200 WHEN 2 : PROCmouse(x%,_%,_%):m%=menuico%
3210 $m%="Translator":m%?12=tf%:m%?13=tb%:m%?14=wf%:m%?15=wb%:m%!16=10*16:m%!20=40:m%!24=0:m%!28=0:m%!32=win_info%:m%!36=(wb%<<28)+(wf%<<24)+1:$(m%+40)="Info":m%!52=0:m%!56=win_filet%:m%!60=m%!36
3220 $(m%+64)="Filetypes":m%!76=&80:m%!80=-1:m%!84=m%!36:$(m%+88)="Quit":menu1=m%:SYS WCreateM%,,menu1,x%-64,96+3*40
3230 WHEN 1,4 : From%=1:PROCmain_menu
3240 ENDCASE
3250 ENDIF
3260 WHEN win_img% : REM Click on image window
3270 CASE but% AND 7 OF
3280 WHEN 2 : From%=2:PROCmain_menu
3290 OTHERWISE : REM Wandering over image, recalculate zoom window if open
3300 IFZoomWin THEN
3310 xs%=Xstep%:ys%=Ystep%:x%=poll!0:y%=poll!4:!block=win_img%:SYS WGetWS%,,block:ox%=block!4-block!20:oy%=block!16-block!24:rx%=x%-ox%:ry%=y%-oy%:ex%=rx%/ZoomX/xs%:ey%=ry%/ZoomY/ys%:REM Pixel coordinates in image
3320 IFZoomX<1 THEN ex%=ex%+1/ZoomX-1:REM Display correction
3330 IFZoomY<1 THEN ey%=ey%+1/ZoomY-1:REM Display correction
3340 IF(ZoomWX%<>ex%)OR(ZoomWY%<>ey%) THEN ZoomWX%=ex%:ZoomWY%=ey%:PROCredraw_window(win_zoom%,TRUE):REM If changed, redraw zoom window
3350 ENDIF
3360 ENDCASE
3370 WHEN win_zoom% : REM Click on zoom window
3380 CASE but% AND 7 OF
3390 WHEN 1 : IFZoomW>ZoomD THEN ZoomW=ZoomW-1
3400 WHEN 2 : ZoomW=ZoomD
3410 WHEN 4 : IF(ZoomW/ZoomD)<100 THEN ZoomW=ZoomW+1
3420 ENDCASE
3430 PROCredraw_window(win_zoom%,TRUE):REM Redraw zoom window
3440 WHEN win_file% : REM Click on file window
3450 IFico%=0 THEN
3460 CASE but% AND &7F OF
3470 WHEN 16,64 : REM Drag,calculate drag box and create it
3480 !block=win%:SYS WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:SYS WGetIS%,,block:!block=win%:block!4=5:block!8+=x%:block!12+=y%:block!16=block!8+68:block!20=block!12+68:block!24=0:block!28=0:block!32=ScrW%:block!36=ScrH%
3490 SYS WDragB%,,block:REM Create drag box
3500 ENDCASE
3510 ENDIF
3520 WHEN win_rgbbits% : REM RGB slider manipulation
3530 !block=win%:SYS WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:SYS WGetIS%,,block:x%+=block!8+2:y%+=block!12+8:REM Position in slider icon
3540 mx%=!poll:dx%=mx%-x%-8:val%=dx% DIV 16:IFval%>8 THEN val%=8:REM Position
3550 IFico%=3 THEN col%=11:sn$="R":bit%=16 ELSE IFico%=4 THEN col%=10:sn$="G":bit%=8 ELSE col%=8:sn$="B":bit%=0:REM Slider colours, names, bitoffsets
3560 REM Plot slider in slider sprite
3570 SYS OSSpop%,60+256,iconsprites,"slider"+sn$,0 TO r0,r1,r2,r3:GCOL0,0:RECTANGLE FILL 2,8,8*16,16:GCOL0,col%:IFval%>0 THEN RECTANGLE FILL 2,8,val%*16,16
3580 SYS OSSpop%,r0,r1,r2,r3:REM Restore VDU context
3590 RGBbits%=(RGBbits% AND NOT (255<<bit%)) OR (val%<<bit%):!block=win%:block!4=ico%:block!8=0:block!12=0:SYS WSetIS%,,block:REM Update code and icon
3600ENDCASE
3610ENDPROC
3620
3630DEFPROCdragdrop
3640SYS WCreateM%,,-1:REM Close menu
3650SYS WGetPI%,,block:REM Get pointer position
3660dropwin%=block!12:dropico%=block!16:REM Window/icon where box dropped
3670save$=FNstring(SAVfn%):REM Get leafname
3680IF$SAVsn%="file_ff9" THEN SaveSpr$=save$:ft%=&FF9 ELSE SaveClear$=save$:ft%=&690:REM Remember leafname, set filetype
3690block!20=block!12:block!24=block!16:block!28=block!0:block!32=block!4:block!12=0:block!16=1:block!36=0:block!40=ft%:$(block+44)=save$+CHR$0:!block=(44+LENsave$+4)ANDNOT3
3700SYS WSendMsg%,17,block,dropwin%,dropico%:REM Send DataSave
3710DataSaveRef%=block!8:REM Remember myref for DataSave
3720PROCclose_window(win_file%):REM Close file window
3730ENDPROC
3740
3750DEFFNimage_type(name$,check)
3760REM Examines file and returns filetype <>0 if image file
3770REM If check=TRUE, contents are checked as well as filetype
3780LOCAL obj%,load%,type%,Head,id$,i%
3790SYS "OS_File",5,name$ TO obj%,,load%:REM Read file info
3800IFobj%<>1 THEN =0:REM Not a file
3810IF(load%>>>20)=&FFF THEN type%=(load%>>>8)AND&FFF ELSE type%=0
3820CASE type% OF
3830 WHEN &690,&691,&692,&693,&694,&695,&697,&698,&699,&69A,&69B,&69C,&69D,&69E,&69F,&FC9,&FF0,&FF9,&DE2,&DFA,&D58,&004 : REM Recognized by filetype
3840 OTHERWISE IFcheck ELSE =0
3850 Head=OPENIN(name$):REM Open file to examine contents
3860 type%=0:REM Not recognized anything (yet)
3870 id$="":FOR i%=1 TO 12:id$+=CHR$(BGET#Head):NEXT
3880 IFLEFT$(id$,6)="GIF87a" THEN type%=&695 ELSE IF(LEFT$(id$,4)="FORM") AND (RIGHT$(id$,4)="ILBM") THEN type%=&693 ELSE IFLEFT$(id$,4)=CHR$&59+CHR$&A6+CHR$&6A+CHR$&95 THEN type%=&FC9
3890 IFtype%<>0 ELSE IF(LEFT$(id$,2)="II") OR (LEFT$(id$,2)="MM") THEN type%=&FF0 ELSE IFLEFT$(id$,5)="Irlam" THEN type%=&69B ELSE IFLEFT$(id$,2)="BM" THEN type%=&69C ELSE IF(INSTR("P1P2P3P4P5P6",LEFT$(id$,2))MOD2)>0 THEN type%=&69E
3900 IFtype%<>0 ELSE IFLEFT$(id$,4)="ZVDA" THEN type%=&69F
3910 IFtype%<>0 ELSE PTR#Head=&41:id$="":FOR i%=1 TO 4:id$+=CHR$(BGET#Head):NEXT:IFid$="PNTG" THEN type%=&694
3920 IFtype%<>0 ELSE PTR#Head=&10:id$="":FOR i%=1 TO 9:id$+=CHR$(BGET#Head):NEXT:IFid$="MILLIPEDE" THEN type%=&69A
3930 CLOSE#Head:REM Close image file
3940ENDCASE
3950=type%
3960
3970DEFFNload(type%,name$)
3980REM Loads image file
3990REM Returns TRUE if succesful load, else FALSE
4000InFile$=name$:InType%=type%:REM Set file info
4010pos%=LENname$:REPEAT pos%-=1:period=(MID$(name$,pos%,1)="."):UNTIL (pos%=1) OR period:IFperiod THEN Leaf$=RIGHT$(name$,LENname$-pos%) ELSE Leaf$=name$
4020SYS "OS_File",5,name$ TO ,,,,Flen%:REM File's length
4030F1%=OPENIN(name$):d%=FNib:PROCiptr(F1%,0):REM Open file, ensure disc
4040PROCvar("fha1",F1%):PROCvar("ifp1",0):REM REM Module info
4050PROChour_on
4060IFPercent THEN SYS "Hourglass_Percentage",0:REM Init percentage if on
4070IFwin_img%>0 THEN PROCclose_window(win_img%):REM Old image discarded
4080IFImg THEN PROCinvalidate_image ELSE PreMode=MODE
4090PROCdeallocate:REM Free all memory
4100CASE type% OF
4110 WHEN &FF9 : p%=INSTR("."+FNupstring(name$),".HIP."):IFp%>0 THEN loppath$=name$:MID$(loppath$,p%,3)="LOP":F2%=OPENIN(loppath$):IFF2%=0 THEN PROCerror(-1,"I cannot find the ArVis LOP file !"):ENDPROC
4120 IFp%=0 THEN Ok=FNpic_ARC ELSE PROCvar("fha2",F2%):PROCvar("ifp2",0):Ok=FNpic_ARVIS:REM What's this then ?
4130 WHEN &DE2 : Ok=FNpic_PROART
4140 WHEN &DFA : Ok=FNpic_WATFORD
4150 WHEN &D58 : Ok=FNpic_RENDER
4160 WHEN &004 : Ok=FNpic_AIM
4170 WHEN &690 : Ok=FNpic_CLEAR
4180 WHEN &691 : Ok=FNpic_DEGAS
4190 WHEN &692 : Ok=FNpic_IMG
4200 WHEN &693 : Ok=FNpic_IFF
4210 WHEN &694 : Ok=FNpic_MAC
4220 WHEN &695 : Ok=FNpic_GIF
4230 WHEN &697 : Ok=FNpic_PCX
4240 WHEN &698 : Ok=FNpic_QRT
4250 WHEN &699 : Ok=FNpic_MTV
4260 WHEN &69A : Ok=FNpic_CADSOFT
4270 WHEN &69B : Ok=FNpic_IRLAM
4280 WHEN &69C : Ok=FNpic_BMP
4290 WHEN &69D : Ok=FNpic_TARGA
4300 WHEN &69E : Ok=FNpic_PBMPLUS
4310 WHEN &69F : Ok=FNpic_ZVDA
4320 WHEN &FC9 : Ok=FNpic_SUN
4330 WHEN &FF0 : Ok=FNpic_TIFF
4340ENDCASE
4350Img=Ok:REM Image ok if all is well
4360IFImg THEN
4370 ImgMode%=Mode%
4380 IFSameLeaf THEN SaveSpr$=Leaf$
4390ENDIF
4400PROChour_off
4410PROCiclose:REM Close input file(s)
4420=Img
4430
4440DEFPROCsave_sprite(out$)
4450REM Saves image as spritefile
4460CASE SaveKind$ OF
4470 WHEN "Full" : REM Full resolution sprite, no edit
4480 WHEN "Whole" : PROCedit_part(FALSE,FALSE)
4490 WHEN "Whole (scaled)" : PROCedit_part(TRUE,FALSE)
4500 WHEN "Part" : PROCedit_part(FALSE,TRUE)
4510 WHEN "Part (scaled)" : PROCedit_part(TRUE,TRUE)
4520ENDCASE
4530PROChour_on
4540IFSaveKind$="Full" THEN
4550 REM Full sprite, save image with palette (optionally)
4560 Out=OPENOUT(out$):REM Open sprite file
4570 spr%=Sprite%+Sprite%!8:REM Start of sprite
4580 cols%=2^SprColbits%:REM Colours in sprite
4590 IFSavePal THEN
4600 REM Save with palette included
4610 IFcols%=256 THEN ents%=64 ELSE ents%=cols%:REM Palette entries
4620 extra%=ents%*8:REM Extra room for palette
4630 SYS "OS_GBPB",1,Out,Sprite%+4,8,0:REM Output part of control block
4640 !arg%=extra%+Sprite%!12:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4650 !arg%=extra%+!spr%:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4660 SYS "OS_GBPB",2,Out,spr%+4,28:REM Output part of sprite header
4670 !arg%=extra%+spr%!32:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4680 !arg%=extra%+spr%!36:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4690 SYS "OS_GBPB",2,Out,spr%+40,4:REM Output sprite's mode
4700 FOR c%=1 TO ents%:arg%!(c%*8-8)=FNreadpalval(ImgPal%(c%)):arg%!(c%*8-4)=arg%!(c%*8-8):NEXT:SYS "OS_GBPB",2,Out,arg%,ents%*8:REM Output palette
4710 SYS "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:REM Data
4720 ELSE REM No palette, output the whole lot
4730 SYS "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:REM Output all
4740 ENDIF
4750 CLOSE#Out:SYS "OS_CLI","SetType "+out$+" Sprite":REM Close & type
4760ELSE REM Edited part in window on screen, save it
4770 PROCinvalidate_screen:REM Screen invalid
4780 IFSavePal THEN pal%=1 ELSE pal%=0
4790 SYS OSSpop%,2,,out$,pal%:REM Save screen in window
4800 VDU24,0;0;ScrW%;ScrH%;:REM Reset screen window
4810ENDIF
4820PROChour_off
4830ENDPROC
4840
4850DEFFNpic_DEGAS
4860REM Makes Atari Degas image (PI1/2/3,PC1/2/3)
4870compr%=FNib:res%=FNib:REM Flags, resolution (1/2/3)
4880compressed=((compr%AND%10000000)>0):REM Compressed flag
4890total%=32000:REM Total data bytes
4900CASE res% OF
4910 WHEN 0 : width%=320:height%=200:colbits%=4
4920 WHEN 1 : width%=640:height%=200:colbits%=2
4930 WHEN 2 : width%=640:height%=400:colbits%=1
4940ENDCASE
4950colours%=2^colbits%:REM Number of colours
4960PROCset(width%,height%,colours%,Mode%)
4970IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
4980IFFNnew_image(0) ELSE =FALSE
4990PROCiget(F1%,dum%,32):REM Read palette from file
5000InPal%(0)=colbits%:FOR c%=0 TO colours%-1:v%=dum%!(c%*2):r%=(v%AND7)*32:g%=((v%>>12)AND7)*32:b%=((v%>>8)AND7)*32:InPal%(colours%-c%)=(r%<<16)+(g%<<8)+b%:NEXT
5010IFcompressed THEN compr$="Run length":type$="PC"+STR$(res%+1) ELSE compr$="":type$="PI"+STR$(res%+1)
5020PROCimage_info("Atari Degas "+type$,width%,height%,0,colbits%,Mode%,compr$,"",Flen%-34,total%)
5030PROCvar("comp",compressed):PROCvar("rest",res%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",&22):IFFNunpack("DEGAS") ELSE =FALSE
5040=TRUE
5050
5060DEFFNpic_IMG
5070REM Makes Atari IMG image
5080version%=FNidb:headlen%=FNidb:nplanes%=FNidb:REM Version, headlength, planes
5090patlen%=FNidb:pw%=FNidb:ph%=FNidb:REM Pattern length, pixel width and height
5100width%=FNidb:height%=FNidb:REM Width and height in pixels
5110colours%=2^nplanes%:REM Number of colours
5120PROCset(width%,height%,colours%,Mode%)
5130IFcolours%<>2 OR patlen%<>2 THEN PROCerror(-1,"I cannot display Atari IMG images with more than 2 colours or patternlength<>2 !"):ENDPROC
5140IFFNallocate_std(width%,(width%*nplanes%+7)DIV8,width%,0) ELSE =FALSE
5150IFFNnew_image(0) ELSE =FALSE
5160PROCgreypal(InPal%(),nplanes%,1):REM Set palette
5170PROCimage_info("Atari IMG",width%,height%,0,nplanes%,Mode%,"Several ways","",Flen%-headlen%*2,(width%*height%*nplanes%)DIV8)
5180PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",headlen%*2):IFFNunpack("IMG") ELSE =FALSE
5190=TRUE
5200
5210DEFFNpic_MAC
5220REM Makes MacIntosh MacPaint image
5230width%=576:height%=720:colbits%=1:REM Resolution
5240PROCset(width%,height%,2^colbits%,Mode%)
5250IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
5260IFFNnew_image(0) ELSE =FALSE
5270PROCgreypal(InPal%(),colbits%,1):REM Set palette
5280PROCimage_info("MacIntosh MacPaint",width%,height%,0,colbits%,Mode%,"Run length","",Flen%-640,(576*720)DIV8)
5290PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",640):IFFNunpack("MAC") ELSE =FALSE
5300=TRUE
5310
5320DEFFNpic_IFF
5330REM Makes Amiga IFF image
5340bmhd=FALSE:cmap=FALSE:body=FALSE:REM Init flags
5350ham=FALSE:lace=FALSE:hires=FALSE:halfbright=FALSE:REM Init flags
5360REM Check if this is a standard IFF picture file
5370form$=FNistring(F1%,4):PROCiskip(F1%,4):form$+=FNistring(F1%,4):IFform$<>"FORMILBM" THEN PROCerror(-1,"This screen file is not an IFF screen file !"):=FALSE
5380REPEAT REM Follow BMHD,CMAP and BODY headers
5390head$=FNistring(F1%,4):hlen%=FNiwb:startptr%=FNiptr(F1%)
5400CASE head$ OF
5410 WHEN "BMHD" : bmhd=TRUE:REM Bitmap header
5420 REM Read picture/screen width, height, colours, etc.
5430 width%=FNidb:height%=FNidb:PROCiskip(F1%,4):planes%=FNib:PROCiskip(F1%,1)
5440 compressed=(FNib=1):PROCiskip(F1%,5):s_width%=FNidb:s_height%=FNidb
5450 WHEN "CAMG" : flags%=FNiwb:REM Get flag bits, set flags from it
5460 ham=((flags%AND&800)>0):lace=((flags%AND&4)>0)
5470 hires=((flags%AND&8000)>0):halfbright=((flags%AND&80)>0)
5480 WHEN "CMAP" : cmap=TRUE:REM Colour map (palette)
5490 paldefs%=hlen%DIV3:REM Number of palette entries
5500 PROCread24pal(F1%,InPal%(),paldefs%,0,1,2,3)
5510 WHEN "BODY" : body=TRUE:REM Screen data
5520 REM Check if all parts are there
5530 IFNOTbmhd THEN PROCerror(-1,"IFF error : I did not find a 'BMHD' block. Cannot proceed !"):UNTIL TRUE:=FALSE ELSE IFNOTcmap THEN PROCerror(-1,"IFF error : I did not find a 'CMAP' block. Cannot proceed !"):UNTIL TRUE:=FALSE
5540 REM Determine suitable Archimedes screen mode
5550 IFham THEN
5560 PROCset(width%,height%,256,Mode%):colbits%=12:info$="HAM (Hold And Modify)":InPal%(0)=colbits%:FOR c%=0 TO 15:hambas%!(c%<<2)=InPal%(c%+1):NEXT:PROCvar("map1",hambas%)
5570 Mode%=FNmode(320,s_height%,256)
5580 IFFNallocate_std(width%,width%*4,0,width%) ELSE =FALSE
5590 ELSE colours%=2^planes%:PROCset(width%,height%,colours%,Mode%):colbits%=planes%:InPal%(0)=planes%:info$=""
5600 IFhalfbright THEN info$="Half-bright":half%=colours%DIV2:FOR c%=1 TO half%:InPal%(c%+half%)=(InPal%(c%)AND&E0E0E0)>>1:NEXT
5610 IFFNallocate_std(width%,width%,0,0) ELSE =FALSE
5620 ENDIF
5630 IFFNnew_image(0) ELSE =FALSE
5640 IFcompressed THEN compr$="Run length" ELSE compr$=""
5650 IFcolbits%>8 THEN ci%=2 ELSE ci%=0
5660 PROCimage_info("Amiga IFF",width%,height%,ci%,colbits%,Mode%,compr$,info$,Flen%-FNiptr(F1%),(width%*height%*planes%)DIV8)
5670 IFham THEN PROCvar("scty",1) ELSE PROCvar("scty",0)
5680 PROCvar("ifp1",FNiptr(F1%)):PROCvar("plan",planes%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",compressed):IFFNunpack("IFF") ELSE =FALSE
5690ENDCASE
5700IFhead$<>"BODY" THEN PROCiskip(F1%,hlen%-(FNiptr(F1%)-startptr%)):REM To next
5710UNTIL body
5720=TRUE
5730
5740DEFFNpic_GIF
5750REM Makes GIF (Graphics Interchange Format) image
5760LOCAL g_InPal%(),Pic_ptr%(),Pic_len%()
5770DIM g_InPal%(256),Pic_ptr%(256),Pic_len%(256)
5780signature$=FNistring(F1%,6):REM Read GIF signature
5790IFLEFT$(signature$,3)<>"GIF" THEN PROCerror(-1,"This screen file is not a GIF screen file !"):=FALSE
5800REM Read data in Screen Descriptor
5810r_width%=FNidl:r_height%=FNidl:REM Raster size
5820flags%=FNib:backgr%=FNib:PROCiskip(F1%,1):REM Flags and back colour
5830global=((flags%AND&80)>0):REM Global colour map following ?
5840g_pixbits%=(flags%AND7)+1:REM Global bits per pixel
5850colbits%=((flags%>>4)AND7)+1:REM Bits of colour resolution
5860IFglobal THEN
5870 REM Read Global Colour Map
5880 PROCread24pal(F1%,g_InPal%(),2^g_pixbits%,0,1,2,3)
5890 g_InPal%(0)=g_pixbits%:REM Palette entries
5900ELSE InPal%(0)=-1:REM No palette found
5910ENDIF
5920REM Scan data for pictures, make a list
5930picture%=0:REPEAT
5940PROCskip_GIF_extension:REM Skip extension blocks preceding Image
5950REM Search for next Image Descriptor
5960REPEAT _%=FNib:image=(_%=ASC","):end=(_%=ASC";"):UNTIL image OR end OR FNieof(F1%)
5970IFNOTimage THEN IFNOTend THEN PROCerror(-1,"Warning ! GIF file is not properly terminated !"):end=TRUE:PROChour_off:PROChour_on:REM Read beyond file
5980IFimage THEN
5990 REM Register picture's position
6000 picture%+=1:Pic_ptr%(picture%)=FNiptr(F1%)-1
6010 PROCiskip(F1%,8):_%=FNib:IF(_%AND&80)>0 THEN PROCiskip(F1%,3*2^((_%AND7)+1)):REM If there's a local colour map, skip it
6020 IFGIFScan THEN
6030 REM Determine picture data length, skip data
6040 PROCiskip(F1%,1):REPEAT c%=FNib:PROCiskip(F1%,c%):UNTIL c%=0
6050 Pic_len%(picture%)=FNiptr(F1%)-Pic_ptr%(picture%)
6060 ELSE Pic_len%(picture%)=FNilen(F1%)-Pic_ptr%(picture%):end=TRUE
6070 ENDIF
6080ENDIF
6090UNTIL end
6100pictures%=picture%:REM Number of pictures found
6110IFpictures%>0 ELSE PROCerror(-1,"I cannot find any images in this GIF file !"):=FALSE
6120IFGIFScan THEN
6130 IF(ImageNr%>0) AND (ImageNr%<=pictures%) THEN picture%=ImageNr% ELSE PROCerror(-1,"This GIF file contains "+STR$(pictures%)+" images. Select '1'-'"+STR$(pictures%)+"' in the 'Image number' submenu !"):=FALSE
6140ELSE picture%=1
6150ENDIF
6160PROCiptr(F1%,Pic_ptr%(picture%)+1):len%=Pic_len%(picture%):REM Pic pos & len
6170REM Read Image Descriptor data
6180i_left%=FNidl:i_top%=FNidl:REM Position in frame
6190i_width%=FNidl:i_height%=FNidl:flags%=FNib:REM Size and flags
6200local=(flags%AND&80)>0:REM Local colour map following ?
6210ibit=(flags%AND&40)>0:REM Image stored in interlaced order ?
6220l_pixbits%=(flags%AND7)+1:REM Local bits per pixel
6230IFlocal THEN
6240 pixbits%=l_pixbits%:REM Read and use Local Colour Map palette
6250 PROCread24pal(F1%,InPal%(),2^l_pixbits%,0,1,2,3)
6260 InPal%(0)=l_pixbits%:REM Palette entries
6270ELSE pixbits%=g_pixbits%:InPal%()=g_InPal%():REM Use Global data
6280ENDIF
6290IFInPal%(0)=-1 THEN PROCerror(-1,"I cannot find a palette in this GIF file !"):=FALSE
6300colours%=2^pixbits%:REM Number of colours
6310width%=i_width%:height%=i_height%:REM True width and height
6320PROCset(width%,height%,colours%,Mode%)
6330IFFNallocate(B_lzwtable%,32*1024) ELSE PROCerror(-1,"I have no room for the LZW decompression table !"):=FALSE
6340IFFNallocate_std(width%,0,width%,0) ELSE =FALSE
6350REM Room needed for decompression data and de-interlacing
6360IFpixbits%<=2 THEN rbits%=pixbits% ELSE IFpixbits%<=4 THEN rbits%=4 ELSE rbits%=8:REM Round up bpp to sprite bpp
6370room%=(((width%*rbits%+31)>>5)<<2)*(height%+1):REM Room needed
6380IFFNnew_image(room%) ELSE =FALSE
6390IFGIFScan THEN np$=STR$pictures% ELSE np$="?"
6400PROCimage_info(signature$,width%,height%,0,pixbits%,Mode%,"LZW",np$+" pics (this is "+FNtimes(picture%)+")",len%,(height%*width%*pixbits%)DIV8)
6410IFibit THEN PROCvar("lace",1) ELSE PROCvar("lace",0)
6420PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("GIF") ELSE =FALSE
6430=TRUE
6440
6450DEFPROCskip_GIF_extension
6460REM Skips a GIF Extension Block if present at current pointer
6470LOCAL _%
6480IF(FNib)=ASC"!" THEN
6490 PROCiskip(F1%,1):REM Skip function code
6500 REPEAT _%=FNib:PROCiskip(F1%,_%):UNTIL _%=0:REM Skip data byte blocks
6510ELSE PROCiskip(F1%,-1)
6520ENDIF
6530ENDPROC
6540
6550DEFFNpic_ARC
6560REM Loads Archimedes sprite image
6570pictures%=FNiwl:ofirst%=FNiwl:REM Number of sprites, offset to first
6580IF(ImageNr%>0) AND (ImageNr%<=pictures%) THEN picture%=ImageNr% ELSE PROCerror(-1,"This sprite file contains "+STR$(pictures%)+" images. Select '1'-'"+STR$(pictures%)+"' in the 'Image number' submenu !"):=FALSE
6590PROCiskip(F1%,ofirst%-8-4):REM Start of first sprite
6600skip%=picture%-1:WHILE skip%>0:PROCiskip(F1%,FNiwl-4):skip%-=1:ENDWHILE
6610start%=FNiptr(F1%):PROCiskip(F1%,16):REM Remember start, skip offset and name
6620words%=FNiwl+1:height%=FNiwl+1:REM Width in words, height in lines
6630bfirst%=FNiwl:blast%=FNiwl:REM First/last bits used
6640oimage%=FNiwl:PROCiskip(F1%,4):sprMode%=FNiwl:REM Offset to image, mode
6650colbits%=2^FNmode_var(sprMode%,9):colours%=2^colbits%:REM Colours
6660IFcolbits%=8 THEN ents%=64 ELSE ents%=colours%
6670IFoimage%<=44 THEN
6680 PROCstdpal(InPal%(),colbits%):REM No palette, set default
6690ELSE PROCread24pal(F1%,InPal%(),ents%,1,2,3,8):InPal%(0)=colbits%:REM Read palette
6700 IFcolbits%=8 THEN FOR c%=1 TO ents%:p%=InPal%(c%):InPal%(c%+64)=p% OR 1<<15:InPal%(c%+128)=p% OR 1<<7:InPal%(c%+192)=p% OR 1<<15 OR 1<<7:NEXT
6710ENDIF
6720width%=(words%*32-bfirst%-(31-blast%)) DIV colbits%
6730IFFNavailable_mode(sprMode%) THEN Mode%=sprMode% ELSE Mode%=FNmode(width%,height%,colours%):REM Determine other mode if sprite's mode won't do
6740PROCset(width%,height%,colours%,_%)
6750IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
6760IFFNnew_image(0) ELSE =FALSE
6770PROCimage_info("Archimedes sprite",width%,height%,0,colbits%,Mode%,"",STR$pictures%+" sprites (this is "+FNtimes(picture%)+")",1,1)
6780PROCvar("ifp1",start%+oimage%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("wrds",words%):PROCvar("bfir",bfirst%):IFFNunpack("ARC") ELSE =FALSE
6790=TRUE
6800
6810DEFFNpic_PROART
6820REM Makes ProArtisan image
6830width%=640:height%=256:REM Set resolution
6840PROCset(width%,height%,256,Mode%)
6850IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
6860room%=(width%*height%+3)ANDNOT3:REM Room needed for unpack (coltable)
6870IFFNnew_image(room%) ELSE =FALSE
6880collen%=FNiwl:comflag%=FNiwl:REM Length of colour table/compression
6890coltable%=SprTop%-collen%:REM Space for colour table
6900PROCiget(F1%,coltable%,collen%):REM Read colour table
6910PROCstdpal(InPal%(),8):REM Standard 256 colour palette
6920PROCimage_info("ProArtisan",width%,height%,0,8,Mode%,"Run length","",Flen%-8,width%*height%)
6930PROCvar("ifp1",FNiptr(F1%)):PROCvar("prot",coltable%):PROCvar("comp",comflag%):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("PROART") ELSE =FALSE
6940=TRUE
6950
6960DEFFNpic_WATFORD
6970REM Makes Watford digitiser image
6980width%=512:height%=256:REM Set resolution
6990PROCset(width%,height%,256,Mode%)
7000IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7010IFFNnew_image(0) ELSE =FALSE
7020PROCgreypal(InPal%(),6,1):REM Palette is 64 greys
7030PROCimage_info("Watford digitiser",width%,height%,1,6,Mode%,"Run length","",Flen%,(width%*height%*6)DIV8)
7040PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",0):IFFNunpack("WATFORD") ELSE =FALSE
7050=TRUE
7060
7070DEFFNpic_RENDER
7080REM Makes Render Bender image
7090Mode%=FNib:REM Read image's mode
7100IFFNmode_var(Mode%,9)<>3 THEN PROCerror(-1,"This Render Bender image was not defined in a 256 colour mode !") ELSE width%=FNmode_var(Mode%,11)+1:height%=FNmode_var(Mode%,12)+1
7110PROCset(width%,height%,256,Mode%)
7120IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7130IFFNnew_image(0) ELSE =FALSE
7140PROCstdpal(InPal%(),8):REM Standard 256 colour palette
7150PROCimage_info("Render Bender",width%,height%,0,8,Mode%,"Run length","",Flen%-1,width%*height%)
7160PROCvar("ifp1",1):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("RENDER") ELSE =FALSE
7170=TRUE
7180
7190DEFFNpic_AIM
7200REM Makes AIM image
7210width%=256:height%=256:REM Set resolution
7220PROCset(width%,height%,256,Mode%)
7230IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7240IFFNnew_image(0) ELSE =FALSE
7250PROCgreypal(InPal%(),8,1):REM Palette is 256 greys
7260PROCimage_info("AIM",width%,height%,1,8,Mode%,"","",Flen%,256*256)
7270PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",0):IFFNunpack("AIM") ELSE =FALSE
7280=TRUE
7290
7300DEFFNpic_SUN
7310REM Makes SUN image
7320magic%=FNiwb:IFmagic%<>&59A66A95 THEN PROCerror(-1,"This is no standard SUN raster file !"):=FALSE
7330width%=FNiwb:height%=FNiwb:colbits%=FNiwb:REM Read resolution
7340length%=FNiwb:type%=FNiwb:maptype%=FNiwb:maplength%=FNiwb:REM Extra info
7350IFtype%>2 THEN PROCerror(-1,"I can only read uncompressed or RLE Sun images !"):=FALSE
7360colours%=2^colbits%:REM Number of colours
7370CASE colbits% OF
7380 WHEN 1,8 : IF(maptype%<>1)OR(maplength%=0) THEN
7390 IFcolbits%>1 THEN PROCerror(-1,"This SUN image file contains no palette ! I will use a greyscale.")
7400 PROCgreypal(InPal%(),colbits%,1)
7410 ELSE InPal%()=0:FOR i%=1 TO 3:FOR c%=1 TO maplength%DIV3:InPal%(c%)=(InPal%(c%)<<8)+FNib:NEXT:NEXT:InPal%(0)=colbits%
7420 ENDIF
7430 OTHERWISE : PROCerror(-1,"I can only read 1- and 8-bit per pixel Sun images !"):=FALSE
7440ENDCASE
7450PROCset(width%,height%,colours%,Mode%)
7460IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
7470IFFNnew_image(0) ELSE =FALSE
7480IFtype%=2 THEN compr$="Run length" ELSE compr$=""
7490PROCimage_info("SUN",width%,height%,0,colbits%,Mode%,compr$,"",Flen%-32-maplength%,(width%*height%*colbits%)DIV8)
7500PROCvar("ifp1",32+maplength%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",type%):IFFNunpack("SUN") ELSE =FALSE
7510=TRUE
7520
7530DEFFNpic_PCX
7540REM Makes PCX image
7550man%=FNib:REM Manufacture code (should be 10)
7560IFman%<>10 THEN PROCerror(-1,"This is no standard PCX file !"):=FALSE
7570version%=FNib:REM Version code (0/2/3/5)
7580encoding%=FNib:REM Encoding code (0-none, 1-PCX runlength encoding)
7590bits%=FNib:REM Bits per 'pixel' (1-EGA, 8-MCGA)
7600wxmin%=FNidl:wymin%=FNidl:wxmax%=FNidl:wymax%=FNidl:REM Window coordinates
7610width%=wxmax%-wxmin%+1:height%=wymax%-wymin%+1:REM Resolution in pixels
7620PROCiskip(F1%,4):REM Skip Hres/Vres
7630InPal%()=0:REM Clear palette
7640PROCread24pal(F1%,InPal%(),16,0,1,2,3):REM Read colourmap in header
7650PROCiskip(F1%,1):REM Skip reserved byte
7660planes%=FNib:REM Colourplanes
7670linelen%=FNidl:REM Bytes per line
7680REM roundlen%=((width%*bits%+7)DIV8):IFroundlen%<>linelen% THEN width%=linelen%*8/bits%:REM Correct width if window and linelength data conflict
7690pixbits%=bits%*planes%:REM Bits per pixel
7700IF(pixbits%=1) OR (pixbits%=2) OR (pixbits%=4) OR (pixbits%=8) ELSE PROCerror(-1,"I cannot handle "+STR$(2^pixbits%)+" colour EGA PCX files !"):=FALSE
7710colours%=2^pixbits%:REM Number of colours
7720PROCiptr(F1%,FNilen(F1%)-769):code%=FNib:REM Try end-769 for palette
7730IFcode%<>12 THEN
7740 IFFNallocate(B_infile%,1024) ELSE PROCerror(-1,"I have no room for the input file buffer !"):=FALSE
7750 PROCvar("ifp1",128):PROCvar("totl",linelen%*planes%*height%):PROCvar("comp",encoding%):PROCunpack_phase("PCX",2):REM Get (packed) length
7760 len%=FNvar("pakl"):PROCiptr(F1%,128+len%):REM Go to end of image data
7770 code%=FNib:REM Get code (12 indicates palette info follows)
7780ENDIF
7790IFcode%=12 THEN PROCread24pal(F1%,InPal%(),colours%,0,1,2,3)
7800grey=FALSE:REM Flag to indicate forced greyscale
7810IFbits%=8 THEN IFcode%<>12 THEN PROCerror(-1,"I cannot find the palette in this 256-colour PCX image ! I will use a greyscale."):grey=TRUE
7820IFNOTgrey THEN IFSUM(InPal%())=0 THEN PROCerror(-1,"I cannot find a decent palette in this PCX image ! I will use a greyscale."):grey=TRUE
7830IFgrey THEN PROCgreypal(InPal%(),pixbits%,1) ELSE InPal%(0)=pixbits%
7840IF(pixbits%=1)OR(pixbits%=8) THEN size%=0 ELSE size%=(width%*pixbits%+7)DIV8:REM Intermediate pixel data buffer for 'planed' data
7850PROCset(width%,height%,colours%,Mode%)
7860IFFNallocate_std(width%,(width%*pixbits%+7)DIV8,width%,size%) ELSE =FALSE
7870IFFNnew_image(0) ELSE =FALSE
7880IFencoding%=1 THEN compr$="Run length" ELSE compr$=""
7890PROCimage_info("PCX",width%,height%,0,pixbits%,Mode%,compr$,"",Flen%-128,(width%*height%*pixbits%)DIV8)
7900PROCvar("ifp1",128):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",encoding%):PROCvar("line",linelen%):IFFNunpack("PCX") ELSE =FALSE
7910=TRUE
7920
7930DEFFNpic_TIFF
7940REM Makes TIFF image
7950headbytes%=2:REM Count bytes in header
7960id$=FNistring(F1%,2):REM TIFF identification
7970CASE id$ OF
7980 WHEN "II" : Ttype%=0:REM Set low-to-high type of data
7990 WHEN "MM" : Ttype%=1:REM Set high-to-low type of data
8000 OTHERWISE : PROCerror(-1,"This is not a TIFF file !"):=FALSE
8010ENDCASE
8020version%=FNtiff(3):REM TIFF version number
8030IFversion%<>42 THEN PROCerror(-1,"I cannot handle this TIFF version's images !"):=FALSE
8040offFIFD%=FNtiff(4):REM Offset to first IFD
8050PROCiptr(F1%,offFIFD%):REM Go to first IFD
8060entries%=FNtiff(3):REM Number of IFD entries
8070InPal%()=0:pal=FALSE:REM No palette yet
8080rowsperstrip%=-1:bits%=1:compression%=1:planar%=1:fillorder%=1:greyunit%=3:pixsamples%=1:softw$="":REM Defaults
8090FOR e%=1 TO entries%
8100tag%=FNtiff(3):type%=FNtiff(3):length%=FNtiff(4):REM Tag and info
8110IFlength%>1 THEN value%=FNtiff(4) ELSE IFtype%=1 THEN value%=FNtiff(1):PROCiskip(F1%,3) ELSE IFtype%=3 THEN value%=FNtiff(3):PROCiskip(F1%,2) ELSE value%=FNtiff(4):REM Read value
8120cptr%=FNiptr(F1%):REM Remember current position in file
8130CASE tag% OF
8140 WHEN 256 : width%=value%
8150 WHEN 257 : height%=value%
8160 WHEN 258 : IFlength%=1 THEN
8170 bits%=value%
8180 ELSE PROCiptr(F1%,value%):p%=FNtiff(type%):s%=2:ok=TRUE:WHILE s%<=length%:ok=ok AND (FNtiff(type%)=p%):s%+=1:ENDWHILE
8190 IFNOTok THEN PROCerror(-1,"I cannot handle unequal bits per sample plane TIFF !"):=FALSE
8200 PROCiptr(F1%,cptr%):bits%=p%*length%
8210 ENDIF
8220 WHEN 259 : compression%=value%
8230 WHEN 262 : photometric%=value%
8240 WHEN 266 : fillorder%=value%
8250 WHEN 273 : IFFNallocate(B_stroff%,4+length%*4) ELSE PROCerror(-1,"I have no room for the TIFF strip offsets !"):=FALSE
8260 stroff%=Buffer%(B_stroff%,0):!stroff%=length%:IFlength%=1 THEN stroff%!4=value% ELSE PROCiptr(F1%,value%):p%=stroff%+4:FOR s%=1 TO length%:!p%=FNtiff(type%):p%+=4:NEXT:PROCiptr(F1%,cptr%)
8270 WHEN 277 : pixsamples%=value%
8280 WHEN 278 : rowsperstrip%=value%
8290 WHEN 284 : planar%=value%
8300 WHEN 290 : greyunit%=value%
8310 WHEN 291 : PROCiptr(F1%,value%):div%=2*10^greyunit%:FOR g%=1 TO length%:c%=FNtiff(type%)*255:i%=c%/div%:InPal%(g%)=i%+(i%<<8)+(i%<<16):NEXT:pal=TRUE:PROCiptr(F1%,cptr%)
8320 WHEN 305 : PROCiptr(F1%,value%):softw$=FNtiff(type%):PROCiptr(F1%,cptr%)
8330 WHEN 320 : PROCiptr(F1%,value%):InPal%()=0:FOR p%=1 TO 3:FOR c%=1 TO length%DIV3:v%=FNtiff(type%):InPal%(c%)=(InPal%(c%)<<8)+(v%>>8):NEXT:NEXT:pal=TRUE:PROCiptr(F1%,cptr%)
8340ENDCASE
8350NEXT
8360IFrowsperstrip%=-1 THEN rowsperstrip%=height%
8370CASE compression% OF
8380 WHEN 1 : compr$=""
8390 WHEN 32773 : compr$="Packbits"
8400 WHEN 5 : compr$="LZW"
8410 OTHERWISE : PROCerror(-1,"I cannot handle TIFF compression #"+STR$(compression%)+" !"):=FALSE
8420ENDCASE
8430IF((pixsamples%=1)AND((bits%=1)OR(bits%=2)OR(bits%=4)OR(bits%=8))) OR ((bits%=24)AND(pixsamples%=3)) ELSE PROCerror(-1,"I can only handle TIFF images with 1,2,4,8 or 24 bits per pixel !"):=FALSE
8440IFplanar%<>1 THEN PROCerror(-1,"I cannot handle TIFF images with multiple planes !"):=FALSE
8450InPal%(0)=bits%:IFpal ELSE IFbits%>8 ELSE IFphotometric%=0 THEN PROCgreypal(InPal%(),bits%,-1) ELSE PROCgreypal(InPal%(),bits%,1)
8460IFbits%=24 THEN colours%=256:size1%=width%*4:size2%=0 ELSE colours%=2^bits%:size1%=(width%*bits%+7)DIV8:size2%=width%
8470PROCset(width%,height%,colours%,Mode%)
8480CASE compression% OF
8490 WHEN 1 : size3%=0:REM No temp buffer
8500 WHEN 32773 : size3%=1024:REM Small temp buffer
8510 WHEN 5 : size3%=((width%*bits%+7)DIV8)*rowsperstrip%:REM Temp for 1 strip
8520 IFFNallocate(B_lzwtable%,32*1024) ELSE PROCerror(-1,"I have no room for the LZW decompression table !"):=FALSE
8530ENDCASE
8540IFFNallocate_std(width%,size1%,size2%,size3%) ELSE =FALSE
8550IFFNnew_image(0) ELSE =FALSE
8560IFbits%=24 THEN code%=2 ELSE IFphotometric%<=1 THEN code%=1 ELSE code%=0
8570IFsoftw$<>"" THEN softw$=LEFT$("Made by "+softw$,25)
8580PROCimage_info("TIFF",width%,height%,code%,bits%,Mode%,compr$,softw$,Flen%-headbytes%,(width%*height%*bits%)DIV8)
8590PROCvar("ifp1",stroff%!4):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("rops",rowsperstrip%):PROCvar("bito",fillorder%):PROCvar("comp",compression%):IFFNunpack("TIFF") ELSE =FALSE
8600=TRUE
8610
8620DEFFNtiff(type%)
8630REM Returns tiff data type
8640LOCAL i$,b%
8650CASE type% OF
8660 WHEN 1 : headbytes%+=1:=FNib
8670 WHEN 2 : i$="":b%=FNib:WHILE b%<>0:i$+=CHR$b%:b%=FNib:ENDWHILE:headbytes%+=LENi$+1:=i$
8680 WHEN 3 : headbytes%+=2:IFTtype%=0 THEN =FNidl ELSE =FNidb
8690 WHEN 4 : headbytes%+=4:IFTtype%=0 THEN =FNiwl ELSE =FNiwb
8700 WHEN 5 : =0
8710ENDCASE
8720=0
8730
8740DEFFNpic_QRT
8750REM Makes QRT image
8760width%=FNidl:height%=FNidl:REM Read resolution
8770PROCset(width%,height%,256,Mode%)
8780IFFNallocate_std(width%,width%*4,0,width%*3) ELSE =FALSE
8790IFFNnew_image(0) ELSE =FALSE
8800InPal%(0)=24:REM No palette, pure 24-bit RGB
8810PROCimage_info("QRT RAW",width%,height%,2,24,Mode%,"","",1,1)
8820PROCvar("ifp1",4):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("QRT") ELSE =FALSE
8830=TRUE
8840
8850DEFFNpic_ARVIS
8860REM Makes ArVis image
8870PROCiptr(F1%,4):PROCiptr(F1%,FNiwl-4):PROCiskip(F1%,16):width%=FNiwl*4+4:height%=FNiwl+1:REM Get width and height
8880PROCiskip(F1%,8):PROCiskip(F1%,FNiwl-36):PROCiptr(F2%,4):PROCiptr(F2%,FNiwlf(F2%)-4):PROCiskip(F2%,32):PROCiskip(F2%,FNiwlf(F2%)-36):REM Go to sprite data
8890colbits%=15:colours%=2^colbits%:REM Colours
8900PROCset(width%,height%,256,Mode%)
8910IFFNallocate_std(width%,width%*4,0,width%*2) ELSE =FALSE
8920IFFNnew_image(0) ELSE =FALSE
8930InPal%(0)=15:REM No palette, pure 15-bit RGB
8940PROCimage_info("ArVis",width%,height%,2,15,Mode%,"","",1,1)
8950PROCvar("ifp1",FNiptr(F1%)):PROCvar("ifp2",FNiptr(F2%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("ARVIS") ELSE =FALSE
8960=TRUE
8970
8980DEFFNpic_CLEAR
8990REM Makes Clear image
9000maker$=FNistring(F1%,-1):version%=FNiwl:REM Creator information
9010width%=FNiwl:height%=FNiwl:bits%=FNiwl:REM Width, height, bpp
9020IFbits%<=8 THEN colbits%=bits%:PROCread24pal(F1%,InPal%(),2^bits%,0,1,2,3) ELSE colbits%=8
9030InPal%(0)=bits%:REM Bits per pixel
9040IFbits%<=8 THEN size%=width% ELSE size%=width%*4
9050PROCset(width%,height%,2^colbits%,Mode%)
9060IFFNallocate_std(width%,size%,0,0) ELSE =FALSE
9070IFFNnew_image(0) ELSE =FALSE
9080PROCimage_info("Clear",width%,height%,code%,bits%,Mode%,"","by "+maker$+" "+STR$(version%DIV100)+"."+RIGHT$("0"+STR$(version%MOD100),2),1,1)
9090PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("CLEAR") ELSE =FALSE
9100=TRUE
9110
9120DEFFNpic_MTV
9130REM Makes MTV image
9140size$=FNistring(F1%,-1):REM String containing resolution
9150width%=VALsize$:height%=VAL(MID$(size$,INSTR(size$," "))):REM Resolution
9160PROCset(width%,height%,256,Mode%)
9170IFFNallocate_std(width%,width%*4,0,0) ELSE =FALSE
9180IFFNnew_image(0) ELSE =FALSE
9190InPal%(0)=24:REM No palette, pure 24-bit RGB
9200PROCimage_info("MTV",width%,height%,2,24,Mode%,"","",1,1)
9210PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("MTV") ELSE =FALSE
9220=TRUE
9230
9240DEFFNpic_CADSOFT
9250REM Makes Cadsoft image
9260PROCiptr(F1%,9):width%=(FNidl+2)/2:height%=(FNidl+2)/2:REM Resolution
9270PROCiptr(F1%,26):compression%=FNib:REM Compression code
9280PROCiptr(F1%,512):InPal%()=0:InPal%(0)=8:FOR rgb%=16 TO 0 STEP -8:FOR c%=1 TO 256:InPal%(c%)=InPal%(c%) OR (FNib<<rgb%):NEXT:NEXT:REM Palette
9290PROCset(width%,height%,256,Mode%)
9300IFFNallocate_std(width%,width%,0,0) ELSE =FALSE
9310IFFNnew_image(0) ELSE =FALSE
9320IFcompression%=2 THEN compr$="Run length" ELSE compr$=""
9330PROCimage_info("CadSoft",width%,height%,0,8,Mode%,compr$,"",Flen%-&600,width%*height%)
9340PROCvar("ifp1",&600):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",compression%):IFFNunpack("CADSOFT") ELSE =FALSE
9350=TRUE
9360
9370DEFFNpic_IRLAM
9380REM Makes Irlam image
9390id$=FNistring(F1%,-1):p%=INSTR(id$,":"):REM String containing image info
9400width%=VALMID$(id$,p%+1):height%=VALMID$(id$,p%+2+LENSTR$width%)
9410PROCset(width%,height%,256,Mode%)
9420IFFNallocate_std(width%,width%*4,0,width%*3) ELSE =FALSE
9430IFFNnew_image(0) ELSE =FALSE
9440InPal%(0)=24:REM No palette, pure 24-bit RGB
9450PROCimage_info("Irlam",width%,height%,2,24,Mode%,"","",1,1)
9460PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("IRLAM") ELSE =FALSE
9470=TRUE
9480
9490DEFFNpic_BMP
9500REM Makes BMP (Windows 3) image
9510PROCiptr(F1%,18):width%=FNiwl:height%=FNiwl:REM Size
9520PROCiptr(F1%,28):colbits%=FNib:REM Bits per pixel
9530IF(colbits%=1)OR(colbits%=2)OR(colbits%=4)OR(colbits%=8) ELSE PROCerror(-1,"I can only handle 1,2,4 or 8 bit per pixel BMP images ! This is "+STR$colbits%+" bpp."):=FALSE
9540rowbytes%=(colbits%*width%+7)DIV8:REM Bytes per pixel row
9550PROCiptr(F1%,54):PROCread24pal(F1%,InPal%(),2^colbits%,2,1,0,4)
9560InPal%(0)=colbits%
9570PROCset(width%,height%,2^colbits%,Mode%)
9580IFFNallocate_std(width%,rowbytes%,width%,0) ELSE =FALSE
9590IFFNnew_image(0) ELSE =FALSE
9600PROCimage_info("Windows 3 BMP",width%,height%,0,colbits%,Mode%,"","",1,1)
9610PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("BMP") ELSE =FALSE
9620=TRUE
9630
9640DEFFNpic_TARGA
9650REM Makes Truevision TARGA image
9660idlen%=FNib:colmaptype%=FNib:REM Length of ID string, colourmap type
9670imagetype%=FNib:REM Image type
9680index%=FNidl:length%=FNidl:REM Colourmap first index & #indices
9690cmapsize%=FNib:REM Bits per colour
9700xorg%=FNidl:xorg%=FNidl:REM X/Y origin
9710width%=FNidl:height%=FNidl:REM Size of image
9720pixbits%=FNib:flags%=FNib:REM Bits per pixel & flags
9730PROCiskip(F1%,idlen%):REM Skip ID string
9740fattr%=flags%AND&0F:flips%=(flags%AND&30)>>4:REM Attributes, flip-flags
9750fleave%=(flags%AND&C0)>>6:REM Interleave code
9760IFpixbits%>8 THEN IFcolmaptype%<>0 THEN PROCerror(-1,"I cannot handle >8 bit TARGA with colourmaps !"):=FALSE
9770IFfleave%<>0 THEN PROCerror(-1,"I cannot handle interlaced TARGA !"):=FALSE
9780InPal%()=0:REM Clear colourmap
9790IFcolmaptype%<>0 THEN
9800 FOR c%=index%+1 TO index%+length%
9810 CASE cmapsize% OF
9820 WHEN 8 : i%=FNib:InPal%(c%)=i% OR i%<<8 OR i%<<16
9830 WHEN 15,16 : i%=FNidl:InPal%(c%)=((i%AND&7C00)<<9)+((i%AND&3E0)<<6)+((i%AND&1F)<<3)
9840 WHEN 24 : InPal%(c%)=FNitl
9850 WHEN 32 : InPal%(c%)=FNiwl AND &FFFFFF
9860 ENDCASE
9870 NEXT
9880ELSE PROCgreypal(InPal%(),8,1)
9890ENDIF
9900InPal%(0)=pixbits%:REM Bits per pixel
9910rle=(imagetype%>=9)AND(imagetype%<=11):REM Run length encoded ?
9920IFpixbits%>8 THEN code%=2:size2%=width%*4 ELSE size2%=width%:IF(cmapsize%=8)OR(colmaptype%=0) THEN code%=1 ELSE code%=0
9930PROCset(width%,height%,256,Mode%)
9940IFFNallocate_std(width%,size2%,0,size2%) ELSE =FALSE
9950IFFNnew_image(room%) ELSE =FALSE
9960IFrle THEN compr$="Run length" ELSE compr$=""
9970PROCimage_info("Truevision TARGA",width%,height%,code%,pixbits%,Mode%,compr$,"",Flen%-FNiptr(F1%),(width%*height%*pixbits%)DIV8)
9980PROCvar("ordr",flips%):PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",rle):IFFNunpack("TARGA") ELSE =FALSE
9990=TRUE
10000
10010DEFFNpic_PBMPLUS
10020REM Makes PBMPLUS image
10030type$=FNistring(F1%,2):PROCpbm_white:REM PBMPLUS type
10040type%=VAL(MID$(type$,2)):REM Type number
10050width%=FNpbm_decval:height%=FNpbm_decval:REM Width and height
10060CASE type% OF
10070 WHEN 1,4 : code%=1:maxval%=-1:bpp%=1:REM Bilevel
10080 PROCgreypal(InPal%(),1,-1):REM Bilevel palette (0=white,1=black)
10090 WHEN 2,5 : maxval%=FNpbm_decval:REM Max grey
10100 IFmaxval%>255 THEN PROCerror(-1,"I cannot read >256-level grey PBMPLUS"):=FALSE
10110 code%=1:bpp%=FNcolstobpp(1+maxval%):REM Grey, calculate bpp
10120 InPal%(0)=bpp%:step=255/maxval%:v=0:FOR c%=0 TO maxval%:v%=INTv:InPal%(c%+1)=v%ORv%<<8ORv%<<16:v+=step:NEXT:REM Palette
10130 WHEN 3,6 : maxval%=FNpbm_decval:REM Max r/g/b
10140 IFmaxval%>255 THEN PROCerror(-1,"I cannot read >256-level RGB PBMPLUS"):=FALSE
10150 code%=2:bpc%=FNcolstobpp(1+maxval%):REM RGB
10160 IFbpc%<3 THEN bpp%=9 ELSE bpp%=3*bpc%
10170 InPal%(0)=bpp%:step=255/maxval%:v=0:FOR c%=0 TO maxval%:pbmint%?c%=INTv:v+=step:NEXT:REM Intmap
10180ENDCASE
10190IFtype%<=3 THEN PROCpbm_white ELSE c%=FNib:IF(c%=32)OR(c%=9)OR(c%=10)OR(c%=13) ELSE PROCiskip(F1%,-1)
10200IFbpp%>8 THEN rowbytes%=4*width%:colbits%=8 ELSE rowbytes%=width%:colbits%=bpp%
10210PROCset(width%,height%,2^colbits%,Mode%)
10220IFtype%=4 THEN size1%=width% ELSE size1%=0
10230IFFNallocate_std(width%,rowbytes%,size1%,0) ELSE =FALSE
10240IFFNnew_image(0) ELSE =FALSE
10250PROCimage_info("PBMPLUS "+type$,width%,height%,code%,bpp%,Mode%,"","",1,1)
10260PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("scty",type%):PROCvar("map1",pbmint%):IFFNunpack("PBMPLUS") ELSE =FALSE
10270=TRUE
10280
10290DEFPROCpbm_white
10300REM Skips PBMPLUS whitespace and comments
10310LOCAL c%,ok
10320ok=FALSE:REM Exit flag
10330REPEAT
10340REPEAT c%=FNib:UNTIL NOT((c%=32)OR(c%=9)OR(c%=13)OR(c%=10))
10350IFc%=ASC"#" THEN REPEAT c%=FNib:UNTIL (c%=13)OR(c%=10) ELSE ok=TRUE
10360UNTIL ok
10370PROCiskip(F1%,-1):REM Step back to last non-white
10380ENDPROC
10390
10400DEFFNpbm_decval
10410REM Skips whitespace, returns decimal value for PBMPLUS
10420LOCAL c%,v$
10430PROCpbm_white
10440c%=FNib:v$="":REM Init
10450WHILE (c%>=ASC"0")AND(c%<=ASC"9"):v$+=CHR$c%:c%=FNib:ENDWHILE
10460=VALv$
10470
10480DEFFNpic_ZVDA
10490REM Makes Zeridajh Video Digitiser Animation image
10500id$=FNistring(F1%,4):IFid$<>"ZVDA" THEN PROCerror(-1,"This is not a Zeridajh Video Digitiser Animation file !"):ENDPROC
10510version%=FNiwl:mode%=FNiwl:REM Version of maker & mode of pics
10520width%=FNiwl:height%=FNiwl:REM Size of pics
10530pictures%=FNiwl:off1%=FNiwl:REM Number of pics, offset to first
10540IF(ImageNr%>0) AND (ImageNr%<=pictures%) THEN picture%=ImageNr% ELSE PROCerror(-1,"This ZVDA file contains "+STR$(pictures%)+" images. Select '1'-'"+STR$(pictures%)+"' in the 'Image number' submenu !"):=FALSE
10550compr%=FNiwl:REM Compression method
10560IFcompr%<>1 THEN PROCerror(-1,"I only know Bitmap compression, no #"+STR$(compr%)+" !")
10570PROCiptr(F1%,off1%):REM Skip to first picture
10580s%=1:WHILE s%<picture%:PROCiskip(F1%,FNiwl-4):s%+=1:ENDWHILE:REM Go to pic
10590complen%=FNiwl:REM Length of picture data
10600colbits%=2^FNmode_var(mode%,9):REM Bits per pixel
10610PROCgreypal(InPal%(),colbits%,1):REM Pics are grey
10620rowbytes%=((colbits%*width%+63)DIV64)*8:REM Bytes per pixel row
10630PROCset(width%,height%,2^colbits%,Mode%)
10640bitmaplen%=height%*rowbytes%DIV8:REM Length of bitmap
10650IFFNallocate_std(width%,rowbytes%,width%,bitmaplen%) ELSE =FALSE
10660IFFNnew_image(0) ELSE =FALSE
10670PROCimage_info("Zeridajh VDA",width%,height%,1,colbits%,Mode%,"Bitmap",STR$pictures%+" images (this is "+FNtimes(picture%)+")",complen%,rowbytes%*height%)
10680PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("maxc",complen%):IFFNunpack("ZVDA") ELSE =FALSE
10690=TRUE
10700
10710DEFPROCimage_info(type$,width%,height%,code%,colbits%,mode%,compr$,info$,datalen%,piclen%)
10720REM Sets information about the image
10730LOCAL factor%,w%,h%,c%,i%,id$
10740ImgW%=width%:ImgH%=height%:ImgBits%=colbits%:REM Register resolution
10750$IMIfn%=Leaf$:$IMIit%=type$
10760IFinfo$="" THEN $IMIin%="-" ELSE $IMIin%=info$
10770$IMIif%=STR$Flen%+" bytes"
10780IFcompr$="" THEN $IMIco%="None (0%)" ELSE factor%=100-INT(100*(datalen%/piclen%)):$IMIco%=compr$+" ("+STR$factor%+"%)"
10790$IMIwh%=STR$width%+" x "+STR$height%+" pixels"
10800IF(width%<>SprW%)OR(height%<>SprH%) THEN $IMIsc%="to "+STR$SprW%+" x "+STR$SprH% ELSE $IMIsc%="Full size"
10810$IMIbp%=STR$(colbits%)+"-bit "+MID$("colourgrey RGB",1+code%*6,6)
10820PROCmode_info(mode%,w%,h%,c%):$IMIsm%=STR$mode%+" ("+STR$w%+"x"+STR$h%+"x"+STR$c%+")"
10830ENDPROC
10840
10850DEFPROCnew_image_window
10860REM Creates new image window of appropiate size in current mode
10870LOCAL w%
10880PROCautozoom:REM Auto zoom if enabled
10890!block=win_img%:SYS WGetWI%,,block:REM Read window's definition
10900!dum%=win_img%:SYS WDeleteW%,,dum%:REM Delete old definition
10910w%=block+4:w%!40=0:w%!44=0:w%!48=FNsprW*ZoomX:w%!52=FNsprH*ZoomY:$IMWtt%=FNimage_title:REM Rewrite work area and title
10920SYS WCreateW%,,w% TO win_img%:REM Create new window
10930IFImg THEN PROCopen_window(win_img%,0)
10940ENDPROC
10950
10960DEFFNimage_title
10970REM Returns image window title depending on zoom factors
10980LOCAL title$
10990title$="Image":REM Base
11000IFZoomX<1 THEN title$+=" x/"+STR$(1/ZoomX) ELSE IFZoomX>1 THEN title$+=" x*"+STR$(ZoomX)
11010IFZoomY<1 THEN title$+=" y/"+STR$(1/ZoomY) ELSE IFZoomY>1 THEN title$+=" y*"+STR$(ZoomY)
11020=title$+" "+InFile$
11030
11040DEFPROCset(w%,h%,c%,RETURN m%)
11050REM Some presetting : determines mode, sets deferred scaling, sets outpix
11060REM Given are width, height, colours of image, returned is mode
11070m%=FNmode(w%,h%,c%):REM Return most suitable mode
11080OutMode%=m%:REM Set output mode
11090IFDivIsInX THEN XDiv%=w%:REM Select Xin as XDiv (deferred scaling)
11100IFDivIsInY THEN YDiv%=h%:REM Idem YDiv
11110IFXMul%<=XDiv% THEN OutX%=w%*XMul%/XDiv% ELSE OutX%=FNceil(w%*XMul%/XDiv%)
11120IFYMul%<=YDiv% THEN OutY%=h%*YMul%/YDiv% ELSE OutY%=FNceil(h%*YMul%/YDiv%)
11130ENDPROC
11140
11150DEFFNnew_image(room%)
11160REM Allocates image sprite
11170REM There are at least room% bytes from sprite start to 'lomem'
11180REM Returns TRUE if all is well, else FALSE
11190LOCAL colbits%,bits%,bitsrot%,words%,wordsrot%,sizeup%,sizerot%
11200LOCAL datasize%,sptr%,sprdoff%,size%
11210xres%=OutX%:yres%=OutY%:mode%=OutMode%:REM Output image size and mode
11220IF(yres%<=0)OR(xres%<=0) THEN PROCerror(-1,"There are no pixels left with the current scaling !"):=FALSE
11230colbits%=2^FNmode_var(mode%,9):REM Bits per pixel
11240bits%=xres%*colbits%:bitsrot%=yres%*colbits%:REM Bits per row
11250words%=(bits%+31)>>5:wordsrot%=(bitsrot%+31)>>5:REM Words per row
11260sizeup%=words%*yres%<<2:sizerot%=wordsrot%*xres%<<2:REM Sprite sizes
11270datasize%=FNmax(sizeup%,sizerot%):REM Maximum sprite size (normal/rotated)
11280datasize%=FNmax(datasize%,room%):REM More room needed ?
11290IFFNallocate(B_area%,16) ELSE PROCerror(-1,"I have no room for the sprite area header !"):=FALSE
11300sprdoff%=44:REM Offset to sprite data/sprite header size
11310IFFNallocate(B_sprite%,sprdoff%) ELSE PROCerror(-1,"I have no room for the image sprite header !"):=FALSE
11320IFFNallocate(B_sprimg%,datasize%) ELSE PROCerror(-1,"I have no room to store this image ! I need at least "+STR$((Short%+1023)DIV1024)+"K more !"):=FALSE
11330IFdatasize%<room% THEN size%=room%-datasize% ELSE size%=0
11340IFFNallocate(B_imgtop%,size%) ELSE PROCerror(-1,"I have no room to process this image ! I need at least "+STR$((Short%+1023)DIV1024)+"K more !"):=FALSE
11350SprTop%=Buffer%(B_imgtop%,0)+Buffer%(B_imgtop%,1):REM End of sprite room
11360Sprite%=Buffer%(B_area%,0):!Sprite%=Buffer%(B_area%,1)+Buffer%(B_sprite%,1)+Buffer%(B_sprimg%,1):Sprite%!4=1:Sprite%!8=16:Sprite%!12=Sprite%!8+sprdoff%+sizeup%:REM Init sprite area
11370sptr%=Buffer%(B_sprite%,0):REM Start of sprite
11380SprEnd%=sptr%+sprdoff%+datasize%:REM End of sprite
11390!sptr%=sprdoff%+sizeup%:REM Offset to next sprite
11400$(sptr%+4)=ImageSpr$+STRING$(12,CHR$0):REM Sprite's name
11410sptr%!16=words%-1:REM Width in words-1
11420sptr%!20=yres%-1:REM Height in scanlines-1
11430sptr%!24=0:sptr%!28=31-(words%*32-bits%):REM Start/end bits
11440sptr%!32=sprdoff%:sptr%!36=sptr%!32:REM Offset to sprite data/mask
11450sptr%!40=mode%:REM Mode of sprite
11460SYS "Translator_WriteWords",sptr%+sprdoff%,0,sizeup%>>2:REM Wipe sprite
11470PROCvar("rowl",words%<<2):REM Module info
11480PROCvar("outb",colbits%):REM Module info
11490PROCvar("spri",sptr%+sptr%!32):REM Module info
11500SprColbits%=colbits%:SprPtr%=sptr%:SprMode%=mode%:REM Global sprite info
11510SprW%=xres%:SprH%=yres%:REM Remember sprite's resolution in pixels
11520=TRUE
11530
11540DEFPROCdeallocate
11550REM Deallocates all buffers
11560Buffer%()=0:REM Wipe all buffer info
11570Store%=FNalign(Heap%):Free%=HeapSize%:REM Deallocate all storage space
11580ENDPROC
11590
11600DEFFNallocate(nr%,bytes%)
11610REM Allocates bytes% bytes to buffer number nr% (word-aligned)
11620REM Returns TRUE if succesful, else FALSE
11630IF(bytes%<0)OR(bytes%>16*1024*1024) THEN PROCerror(-1,"Are you NUTS ?"):Short%=999999*1024:=FALSE:REM Enormous amount asked
11640bytes%=FNalign(bytes%):REM Word-align
11650IFFree%<bytes% THEN Short%=bytes%-Free%:=FALSE
11660Buffer%(nr%,0)=Store%:Buffer%(nr%,1)=bytes%:REM Allocate buffer
11670Store%+=bytes%:Free%-=bytes%:REM Deallocate storage used
11680=TRUE
11690
11700DEFFNallocate_std(width%,pixbuf1%,pixval%,pixbuf2%)
11710REM Allocates standard buffers (pixel buffers, etc.)
11720LOCAL times%
11730IFFNallocate(B_pixbuf1%,pixbuf1%) ELSE PROCerror(-1,"I have no room for pixel buffer #1 !"):=FALSE
11740IFFNallocate(B_pixval%,pixval%) ELSE PROCerror(-1,"I have no room for a pixel value buffer !"):=FALSE
11750IFFNallocate(B_pixbuf2%,pixbuf2%) ELSE PROCerror(-1,"I have no room for pixel buffer #2 !"):=FALSE
11760IFXMul%<>XDiv% THEN
11770 IFFNallocate(B_pixscaled%,FNmax(pixbuf1%,pixval%)*FNceil(XMul%/XDiv%)) ELSE PROCerror(-1,"I have no room for the scaled pixel buffer !"):=FALSE
11780ENDIF
11790IFErrSpread=2 THEN
11800 IFBlackWhite THEN times%=1 ELSE times%=4
11810 IFFNallocate(B_fserr%,(width%+2)*times%*4*FNceil(XMul%/XDiv%)) ELSE PROCerror(-1,"I have no room for Floyd Steinberg error spreading !"):=FALSE
11820ENDIF
11830=TRUE
11840
11850DEFPROChour_on
11860REM Turns hourglass on
11870SYS "Hourglass_On"
11880ENDPROC
11890
11900DEFPROChour_off
11910REM Turns hourglass off
11920SYS "Hourglass_Off"
11930ENDPROC
11940
11950DEFPROCedit_part(size,part)
11960REM Edits image size and part (if enabled with flags)
11970REM Returns with (scaled) image in graphics window ready for save
11980LOCAL _%,ox%,oy%,x%,y%,but%,x1%,x2%,y1%,y2%,xs%,ys%,sizex%,sizey%
11990LOCAL sprW%,sprH%,ptr$,r0,r1,r2,r3
12000!pointer=512:pointer!4=0:pointer!8=16:pointer!12=16:ptr$="ptr":SYS "OS_SpriteOp",15+256,pointer,ptr$,0,32,32,8:REM Initialise pointer sprite area
12010SYS OSSpop%,60+256,pointer,ptr$,0 TO r0,r1,r2,r3:MOVE 0,124:GCOL0,3:PLOT1,0,-32:PLOT0,0,32:PLOT1,40,0:PLOT0,-40,0:PLOT1,60,-30:PLOT0,-60,26:PLOT1,60,-30:SYS OSSpop%,r0,r1,r2,r3:REM Plot arrow in pointer sprite
12020VDU24,0;0;ScrW%;ScrH%;:REM Whole screen window for image sprite
12030sprW%=FNsprW:sprH%=FNsprH:REM True OS size of image sprite
12040xs%=2^FNmode_var(MODE,4):REM X coordinate step
12050ys%=2^FNmode_var(MODE,5):REM Y coordinate step
12060IFScrW%>sprW% THEN sizex%=sprW% ELSE sizex%=ScrW%:REM Initial width
12070IFScrH%>sprH% THEN sizey%=sprH% ELSE sizey%=ScrH%:REM Initial height
12080!arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH%:REM Initial scaling
12090CLG:PROCplot_image(0,0,0,arg%):REM Initial display
12100IFsize THEN
12110 MOUSE RECTANGLE 0,0,ScrW%-xs%,ScrH%-ys%:REM Restrict pointer to screen
12120 ox%=sizex%-xs%:oy%=sizey%-ys%:REM 'Old' coordinates
12130 MOUSE TO ox%,oy%:REM Pointer to upper left corner
12140 REPEAT PROCrmouse(_%,_%,but%):UNTIL but%=0:REM Wait for buttons released
12150 REPEAT PROCvalue_ptr(sizex%DIVxs%,sizey%DIVys%)
12160 REPEAT PROCrmouse(x%,y%,but%):UNTIL (x%<>ox%)OR(y%<>oy%)OR(but%<>0)
12170 IFbut%=0 THEN
12180 IFoy%>y% THEN MOVE 0,y%:PLOT 103,FNmax(x%,ox%),oy%:REM Wipe Y-portion
12190 IFox%>x% THEN MOVE x%,0:PLOT 103,ox%,FNmax(y%,oy%):REM Wipe X-portion
12200 sizex%=x%+xs%:sizey%=y%+ys%:REM True scaled image size
12210 !arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH%
12220 PROCplot_image(0,0,0,arg%)
12230 ox%=x%:oy%=y%:REM Remember old coordinates
12240 ENDIF
12250 UNTIL but%<>0
12260 SYS "OS_CLI","Pointer 1":REM Restore default pointer
12270ENDIF
12280IFpart THEN
12290 REPEAT PROCmouse(_%,_%,but%):UNTIL but%=0:REM Wait for buttons released
12300 MOUSE RECTANGLE 0,0,sizex%-xs%,sizey%-ys%:REM Restrict pointer to image
12310 MOUSE TO 0,sizey%-ys%:REM Mouse to top right of scaled sprite
12320 REPEAT PROCrmouse(x1%,y2%,but%):PROCvalue_ptr(x1%DIVxs%,y2%DIVys%)
12330 UNTIL but%<>0:REM Get top left point
12340 REPEAT PROCmouse(_%,_%,but%):UNTIL but%=0:REM Wait for buttons released
12350 x2%=x1%:y1%=y2%:REM Initial window corner
12360 MOUSE RECTANGLE x1%,0,sizex%-xs%-x1%,y2%:REM Trap mouse to down/right
12370 SYS WSetCol%,(4<<4)+0:REM Invert colour on screen
12380 ox%=x2%:oy%=y1%:RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM First rectangle
12390 REPEAT PROCrmouse(x2%,y1%,but%)
12400 PROCvalue_ptr((x2%-x1%)DIVxs%+1,(y2%-y1%)DIVys%+1)
12410 IF(x2%<>ox%)OR(y1%<>oy%) THEN
12420 RECTANGLE x1%,oy%,ox%-x1%,y2%-oy%:REM Wipe old rectangle
12430 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM New rectangle
12440 ox%=x2%:oy%=y1%:REM Old mouse position
12450 ENDIF
12460 UNTIL but%<>0:REM Until second button press
12470 MOUSE RECTANGLE 0,0,ScrW%,ScrH%:REM Reset mouse rectangle to whole screen
12480 RECTANGLE x1%,y1%,x2%-x1%,y2%-y1%:REM Wipe rectangle
12490 MOVE 0,0:REM Wipe surrounding area
12500 _%=x1%-xs%:IF_%>=0 THEN PLOT 103,_%,1024-ys% ELSE MOVE _%,1024-ys%
12510 _%=y2%+ys%:IF_%<ScrH% THEN PLOT 103,1280-xs%,_% ELSE MOVE 1280-xs%,_%
12520 _%=x2%+xs%:IF_%<ScrW% THEN PLOT 103,_%,0 ELSE MOVE _%,0
12530 _%=y1%-ys%:IF_%>=0 THEN PLOT 103,x1%-xs%,_% ELSE MOVE x1%-xs%,_%
12540 SYS "OS_CLI","Pointer 1":REM Restore default pointer
12550ELSE x1%=0:y1%=0:x2%=sizex%-xs%:y2%=sizey%-ys%:REM Whole sprite window
12560ENDIF
12570VDU24,x1%;y1%;x2%;y2%;:REM Clip window
12580ENDPROC
12590
12600DEFPROCrmouse(RETURN x%,RETURN y%,RETURN but%)
12610REM Returns mouse coordinates and buttons, rounded to exact pixel coords
12620PROCmouse(x%,y%,but%):REM Mouse state
12630x%-=x% MOD xs%:y%-=y% MOD ys%:REM Round down
12640ENDPROC
12650
12660DEFPROCvalue_ptr(val1%,val2%)
12670REM Puts values in pointer
12680SYS OSSpop%,60+256,pointer,ptr$,0 TO r0,r1,r2,r3:REM Output to sprite
12690COLOUR129:COLOUR2:PRINTTAB(0,2);RIGHT$(" "+STR$val1%,4)'RIGHT$(" "+STR$val2%,4);:SYS OSSpop%,36+256,pointer,ptr$,%0000010:REM Print values and define
12700SYS OSSpop%,r0,r1,r2,r3:REM Restore output to screen
12710ENDPROC
12720
12730DEFPROCmain_menu
12740REM Creates main menu
12750LOCAL x%,y%
12760PROCsetmenu:REM Set flags and data
12770PROCmouse(x%,y%,_%):IFFrom%=2 THEN y%+=24 ELSE y%=96+6*40
12780menu1=menumain%:SYS WCreateM%,,menu1,x%-64,y%
12790ENDPROC
12800
12810DEFPROCsetmenu
12820REM Writes current flags and icon data to main menu
12830REM Main
12840PROCifl(ipTrImageinfo,0,NOTImg)
12850PROCifl(ipTrManipulate,0,NOTImg)
12860PROCifl(ipTrExamine,0,NOTImg)
12870REM Main.Pop up
12880PROCifl(ipPoAutomode,AutoMode,0)
12890PROCifl(ipPoAutopalette,AutoPal,0)
12900PROCifl(ipPoAutozoom,AutoZoom,0)
12910PROCifl(ipPoViewmode,ViewMode,0)
12920PROCifl(ipPoModeset,(ModeSet>0),NOTAutoMode)
12930REM Main.Pop up.Mode set
12940PROCifl(ipMoNone,(ModeSet=0),0)
12950PROCifl(ipMoNormal,(ModeSet=1),0)
12960PROCifl(ipMoMultisync,(ModeSet=2),0)
12970PROCifl(ipMoums,(ModeSet=3),0)
12980PROCida(idMoums,FNums)
12990REM Main.Process
13000PROCifl(ipPrClearoutput,ClearFile,0)
13010PROCifl(ipPrScaling,((XMul%<>XDiv%)OR(YMul%<>YDiv%)),0)
13020REM Main.Process.Colour
13030PROCifl(ipCoBlackandwhite,BlackWhite,0)
13040PROCifl(ipCoCorrectgamma,Gamma,0)
13050PROCifl(ipCoCorrectblack,Black,0)
13060PROCifl(ipCoExpandrange,Range,0)
13070PROCifl(ipCoInvertRGB,InvertRGB,0)
13080REM Main.Process.Sprite output
13090PROCifl(ipSpOutputpalette,0,(OutMode=1))
13100PROCifl(ipSpErrorspreading,(ErrSpread<>0),0)
13110PROCifl(ipSpZigzag,ZigZag,0)
13120REM Main.Process.Scaling
13130PROCifl(ipScx,(XMul%<>XDiv%),0)
13140PROCifl(ipScy,(YMul%<>YDiv%),0)
13150REM Main.Process.Misc
13160PROCifl(ipMiScreenblanking,Blanking,0)
13170PROCifl(ipMiGIFscan,GIFScan,0)
13180PROCifl(ipMiPercentage,Percent,0)
13190REM Main.Process.Colour.Correct gamma
13200PROCida(idGagam,STR$(GammaF))
13210REM Main.Process.Colour.Correct black
13220PROCida(idBlbla,STR$(BlackF))
13230REM Main.Process.Sprite output.Error spreading
13240PROCifl(ipSpSimple,(ErrSpread=1),0)
13250PROCifl(ipSpFloydSteinberg,(ErrSpread=2),0)
13260PROCifl(ipSpOff,(ErrSpread=0),0)
13270REM Main.Process.Sprite output.Output mode
13280PROCifl(ipMoAuto,(OutMode=1),0)
13290PROCifl(ipMoCurrent,(OutMode=2),0)
13300REM Main.Process.Sprite output.Output palette
13310PROCifl(ipPaCurrent,(OutPal=1),0)
13320PROCifl(ipPaDefault,(OutPal=2),0)
13330PROCifl(ipPaGreyscale,(OutPal=3),0)
13340REM Main.Process.Scaling.x
13350d$=STR$(XMul%)+":":IFDivIsInX THEN d$+="x" ELSE d$+=STR$(XDiv%)
13360PROCida(idXxsc,d$)
13370REM Main.Process.Scaling.y
13380d$=STR$(YMul%)+":":IFDivIsInY THEN d$+="y" ELSE d$+=STR$(YDiv%)
13390PROCida(idYysc,d$)
13400REM Main.Process.Misc.Image number
13410PROCida(idNunum,STR$(ImageNr%))
13420REM Main.Examine.Zoom
13430PROCifl(ipZo11,((ZoomX=1)AND(ZoomY=1)),0)
13440REM Main.Misc
13450PROCifl(ipMiImagepalette,0,NOTImg)
13460REM Main.Misc.Save
13470PROCifl(ipSaFull,0,NOTImg)
13480PROCifl(ipSaWhole,0,NOTImg)
13490PROCifl(ipSaPart,0,NOTImg)
13500PROCifl(ipSaWholescaled,0,NOTImg)
13510PROCifl(ipSaPartscaled,0,NOTImg)
13520PROCifl(ipSaIncludepalette,SavePal,0)
13530PROCifl(ipSaSameleafname,SameLeaf,0)
13540ENDPROC
13550
13560DEFPROCifl(fl%,t%,d%)
13570REM Sets menu icon flags
13580t%=-(t%<>0):d%=-(d%<>0)
13590!fl%=((!fl%)ANDNOT1)+t%:REM Tick
13600fl%!8=((fl%!8)ANDNOT(1<<22))+(d%<<22):REM Shaded
13610ENDPROC
13620
13630DEFPROCida(dp%,d$)
13640REM Sets menu icon data
13650$dp%=d$
13660ENDPROC
13670
13680DEFPROCset_mode(mode%)
13690REM Sets new mode (if enabled) for image display
13700LOCAL log2bpp%
13710IFAutoMode ELSE PROCset_trans:ENDPROC:REM Auto mode selection not enabled
13720log2bpp%=FNmode_var(mode%,9):REM Log2BPP
13730CASE ModeSet OF
13740 WHEN 0 : REM No mode set : no change of display mode
13750 WHEN 1 : mode%=VALMID$(" 0 81215",log2bpp%*2+1,2):REM Normal set
13760 WHEN 2 : mode%=VALMID$("18192021",log2bpp%*2+1,2):REM Multisync set
13770 WHEN 3 : mode%=UserModeSet%(log2bpp%+1):REM User set
13780ENDCASE
13790IFNOTMultiSync THEN IF(mode%>=18)AND(mode%<=28) THEN mode%=VAL(MID$("0008121515002400081215",(mode%-18)*2+1,2)):REM Map to non-multisync mode
13800PROCmode_change(mode%):REM Select mode
13810ENDPROC
13820
13830DEFPROCmode_change(mode%)
13840REM Mode has changed or select new mode
13850REM If mode%>=0, mode mode% is selected
13860LOCAL _%,xwind%,ywind%,othermode,colours%,pos%,altmode$,modecols%,sprcols%
13870SYS WReadP%,,wimppal:REM Read current WIMP palette
13880IF(mode%>=0) AND (mode%<>MODE) THEN
13890 SYS WSetM%,mode%:REM Change mode
13900 IFmode%<>MODE THEN
13910 SOUND 1,-10,180,1:REM Alert user that 'ideal' mode couldn't be selected
13920 colours%=2^(2^FNmode_var(mode%,9)):REM Colours required
13930 IFcolours%=2 THEN altmode$="|1800" ELSE IFcolours%=4 THEN altmode$="|1908|0801" ELSE IFcolours%=16 THEN altmode$="|2012|1612|1209" ELSE IFcolours%=256 THEN altmode$="|2115|2415|1513|1310"
13940 REPEAT
13950 IFMODE=mode% ELSE pos%=INSTR(altmode$,"|"+RIGHT$("0"+STR$mode%,2)):IFpos%>0 THEN mode%=VAL(MID$(altmode$,pos%+3)) ELSE PROCerror(-1,"I failed to select the ideal mode, nor any alternative mode ! Now you try it !"):mode%=-1
13960 SYS WSetM%,mode%:REM Change mode
13970 UNTIL (MODE=mode%) OR (mode%<0)
13980 ENDIF
13990ENDIF
14000othermode=(MODE<>CurrMode%):CurrMode%=MODE:REM Mode other than old ?
14010Xeig%=FNmode_var(MODE,4):Yeig%=FNmode_var(MODE,5):REM Read X/YEigFactor
14020Xstep%=2^Xeig%:Ystep%=2^Yeig%:REM Coordinate steps
14030xwind%=FNmode_var(MODE,11)+1:ywind%=FNmode_var(MODE,12)+1:REM Resolution
14040ScrW%=(1<<Xeig%)*xwind%:ScrH%=(1<<Yeig%)*ywind%:REM Screen size
14050IFImg THEN
14060 PROCset_trans:REM Re-set sprite translation
14070 IFAutoPal THEN PROCset_palette(1):REM Select image palette if enabled
14080 IFothermode THEN PROCnew_image_window
14090ENDIF
14100ENDPROC
14110
14120DEFPROCset_trans
14130REM Sets translation factors (transtab & palette) for sprite plot
14140LOCAL mc%,sc%,v%,c%,gv%,gi%,i%,p%
14150mc%=2^(2^FNlog2BPP):sc%=2^SprColbits%:REM Colours available
14160ShowPal%()=ImgPal%():ShowPal%(0)=2^ShowPal%(0):REM Copy image palette
14170IFmc%=sc% THEN TransTabId=TRUE:ENDPROC:REM Ideal
14180TransTabId=FALSE:REM Always translation
14190IFmc%>sc% THEN
14200 IFmc%<=16 THEN FOR c%=0 TO sc%-1:transtab%?c%=c%AND(mc%-1):NEXT:ENDPROC
14210 SYS "Translator_Palette",8,dum%,2:REM Get default palette
14220 PROCstdpal(ShowPal%(),8):REM Show in default palette
14230 FOR c%=0 TO sc%-1:SYS "Translator_ClosestToRGB",ImgPal%(c%+1),256,dum% TO v%:transtab%?c%=v%:NEXT
14240ELSE REM Less colours than required, so compromise
14250 PROChour_on
14260 IFNOTFreqCalc THEN SYS "Translator_PixelFreq",SprPtr%,freq%:FreqCalc=TRUE:REM Calculate pixel frequencies in image sprite
14270 p1%=freq%:p2%=dum%:pc%=0:FOR c%=0 TO sc%-1:f%=!p1%:p1%+=4:IFf%>0 THEN !p2%=ImgPal%(c%+1)AND&F0F0F0:p2%!4=f%:p2%+=8:pc%+=1:transtab%?c%=1:NEXT ELSE transtab%?c%=0:NEXT
14280 SYS "Translator_Heckbert",dum%,pc%,mc% TO p1%,p2%,used%
14290 FOR c%=1 TO used%:ShowPal%(c%)=(!p1%)AND&F0F0F0:p1%+=4:NEXT:ShowPal%(0)=used%:FOR c%=0 TO sc%-1:IFtranstab%?c%=1 THEN transtab%?c%=!p2%:p2%+=4:NEXT ELSE NEXT
14300 PROChour_off
14310ENDIF
14320ENDPROC
14330
14340DEFPROCautozoom
14350REM Adjust zoom factor for auto zoom (if enabled)
14360LOCAL _%
14370IFAutoZoom THEN
14380 _%=FNsprW*ZoomX:WHILE _%>ScrW%:ZoomX=ZoomX/2:_%=_%/2:ENDWHILE
14390 IFZoomX<1 THEN WHILE _%*2<=ScrW%:ZoomX=ZoomX*2:_%=_%*2:ENDWHILE
14400 _%=FNsprH*ZoomY:WHILE _%>ScrH%:ZoomY=ZoomY/2:_%=_%/2:ENDWHILE
14410 IFZoomY<1 THEN WHILE _%*2<=ScrH%:ZoomY=ZoomY*2:_%=_%*2:ENDWHILE
14420ENDIF
14430ENDPROC
14440
14450DEFPROCplot_image(x%,y%,act%,scale%)
14460REM Plots image sprite with translation table
14470IFTransTabId THEN SYS OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale% ELSE SYS OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale%,transtab%
14480ENDPROC
14490
14500DEFFNunpack(type$)
14510REM Unpacks image (final unpacking phase)
14520REM Returns TRUE if all is well, else FALSE
14530LOCAL c%,bpp%,pc%,b%,gf,bf,min%,max%,rgb%,s%,v%,sub%,mul,r%,g%
14540LOCAL rm%,gm%,bm%,i,ri,gi,bi,Out
14550IFFree%>2*1024 THEN IFFNallocate(B_infile%,Free%-16) ELSE PROCerror(-1,"I have no room for the input file buffer !"):=FALSE
14560bpp%=InPal%(0):REM Bits per pixel input
14570PROCvar("inbi",bpp%):REM Input (image) bits per pixel
14580PROCvar("bwhi",BlackWhite):REM B/w flag
14590PROCvar("espr",ErrSpread):REM Error spreading flag
14600PROCvar("zigz",ZigZag):REM Zig zag flag
14610PROCvar("clfh",0):REM No Clear (yet)
14620PROCvar("outx",OutX%):PROCvar("outy",OutY%):REM Output resolution
14630PROCvar("ymul",YMul%):PROCvar("ydiv",YDiv%):REM Scaling factors Y
14640PROCvar("xmul",XMul%):PROCvar("xdiv",XDiv%):REM Scaling factors X
14650IFPercent THEN IFNOTBlanking THEN PROCvar("perc",1):PROCvar("pinc",(100<<16)/ImgH%) ELSE PROCvar("perc",0):REM Hourglass percentage
14660REM Set palette (if relevant, i.e. not pure RGB input)
14670IFbpp%<=8 THEN FOR c%=0 TO 2^bpp%-1:palrgb%!(c%<<2)=InPal%(c%+1):NEXT
14680FOR b%=0 TO 31:buffer%!(b%*8)=Buffer%(b%,0):buffer%!(b%*8+4)=Buffer%(b%,1):NEXT:REM Buffer locations/sizes
14690IFOutMode=1 THEN pc%=0 ELSE pc%=OutPal:REM Select palette code
14700REM Build R/G/B intensity map for gamma/invert/rgbbits/b&w
14710IFGamma THEN IFGammaF>0 THEN gf=1/GammaF ELSE gf=0:REM Gamma factor
14720IFBlack THEN IFBlackF<>0 THEN bf=BlackF ELSE bf=0:REM Black correction
14730IFRange OR (bpp%<=8) THEN
14740 IFbpp%<=8 THEN
14750 min%=256:max%=0:FOR c%=0 TO 2^bpp%-1:rgb%=InPal%(c%+1):FOR s%=1 TO 3:v%=rgb%AND&FF:rgb%=rgb%>>8:min%=FNmin(min%,v%):max%=FNmax(max%,v%):NEXT:NEXT
14760 ELSE SYS "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap%
14770 PROCunpack_phase(type$,3):REM Gather info on RGB range
14780 min%=FNvar("inmi"):max%=FNvar("inma"):REM Get min/max intensity
14790 ENDIF
14800 sub%=min%:mul=255/(max%-min%):REM Range correction factors
14810 RangeMin%=min%:RangeMax%=max%:REM Remember min/max
14820 $IMIrn%=STR$(RangeMin%)+"-"+STR$(RangeMax%)+" ("+STR$(INT((max%-min%)/2.55))+"%)":REM Set range info
14830 RangeI=TRUE:REM Info present
14840ELSE RangeI=FALSE:$IMIrn%="Unknown"
14850ENDIF
14860r%=(RGBbits%>>16)AND&FF:g%=(RGBbits%>>8)AND&FF:b%=RGBbits%AND&FF:v%=&FF00:rm%=v%>>r%:gm%=v%>>g%:bm%=v%>>b%:REM R/G/B masks
14870rg=0.300:gg=0.586:bg=0.114:REM Greyvalues of R/G/B
14880FOR c%=0 TO 255
14890IFRange THEN i=(c%-sub%)*mul ELSE i=c%
14900IFbf=0 ELSE i=i+bf:IFi<0 THEN i=0 ELSE IFi>255 THEN i=255
14910IFgf>0 THEN IFi>0 THEN i=((i/255)^gf)*255
14920IFInvertRGB THEN i=255-i
14930ri=i AND rm%:gi=i AND gm%:bi=i AND bm%
14940IFBlackWhite THEN ri=ri*rg:gi=gi*gg:bi=bi*bg
14950intmap%!(c%<<2)=(ri<<16)+(gi<<8)+bi
14960NEXT
14970GreyRgb=(bpp%>8) AND BlackWhite:REM Flag to indicate grey RGB output
14980SYS "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap% TO ,truepal%
14990ImgPal%()=0:ImgPal%(0)=SprColbits%:FOR c%=0 TO 2^SprColbits%-1:ImgPal%(c%+1)=palrgb%!(c%<<2):NEXT:REM Read image palette
15000IFClearFile THEN
15010 Out=OPENOUT(ClearSave$):REM Open Clear file
15020 PROCostring(Out,"Translator"):PROCobf(Out,0):PROCowlf(Out,tversion%):PROCowlf(Out,OutX%):PROCowlf(Out,OutY%):REM Header
15030 IFGreyRgb THEN PROCowlf(Out,8):FOR c%=0 TO 255:PROCotlf(Out,c%ORc%<<8ORc%<<16):NEXT ELSE PROCowlf(Out,ImgBits%):REM Bpp and greypal if grey RGB
15040 IFImgBits%<=8 THEN FOR c%=0 TO 2^ImgBits%-1:rgb%=truepal%!(c%<<2):PROCotbf(Out,rgb%):NEXT:REM Set palette to 'true' palette
15050 PROCvar("clfh",Out):PROCvar("clfp",PTR#Out):PROCvar("clgr",GreyRgb):REM Inform clear writer on outfile
15060 bytes%=OutX%*OutY%:IFImgBits%>8 THEN bytes%=3*bytes%
15070 SYS "XOS_Args",6,Out,bytes%+PTR#Out TO ;f%:IFf%AND1 THEN CLOSE#Out:ClearFile=FALSE:SYS "OS_File",6,ClearSave$:PROCerror(-1,"No room for Clear file on disc !"):=FALSE
15080ELSE PROCvar("clfh",0):REM Clear off
15090ENDIF
15100PROCunpack_phase(type$,1):REM Execute final unpack phase
15110IFClearFile THEN
15120 ClearFile=FALSE:CLOSE#Out:IFFNvar("clfh")=0 THEN SYS "OS_File",6,ClearSave$:PROCerror(-1,"Error during output to Clear file : "+FNstring(FNvar("erro")+4)):REM Remove Clear file if error
15130ENDIF
15140=TRUE
15150
15160DEFPROCunpack_phase(type$,phase%)
15170REM Executes unpack phase, blanks screen if enabled
15180PROCvar("phas",phase%):REM Set unpacking phase
15190$dum%=LEFT$(type$+" ",4):REM Type to unpack
15200IFBlanking THEN SYS "Translator_VideoDMA",0:REM Blank if enabled
15210SYS "Translator_Unpack",!dum%:REM Execute unpack phase
15220IFBlanking THEN SYS "Translator_VideoDMA",1:REM Re-enable if blanked
15230IFphase%<>1 THEN result%=0 ELSE result%=FNvar("resu"):REM Result code
15240CASE result% OF
15250 WHEN 0 : REM All OK
15260 WHEN 1,2,3 : PROCerror(-1,"File is too short ! Image may be corrupted !"):REM Out of data
15270 WHEN 16 : PROCerror(-1,"Error in TIFF file : strip(s) missing ! Image may be corrupted !"):REM Out of TIFF strips
15280 OTHERWISE : PROCerror(-1,"Some mysterious error #"+STR$result%+"occured ! Image may be corrupted !"):REM Huh ?
15290ENDCASE
15300ENDPROC
15310
15320DEFPROCset_palette(palette%)
15330REM Sets a palette according to palette%
15340REM 0 - Desktop palette
15350REM 1 - Image's own palette (when possible)
15360LOCAL c%
15370CASE palette% OF
15380 WHEN 0 : IFFNlog2BPP=3 THEN SYS "Translator_Palette",8,dum%,2:SYS "Translator_SetPalette",256,dum% ELSE SYS WSetP%,,wimppal
15390 WHEN 1 : FOR c%=0 TO ShowPal%(0)-1:dum%!(c%<<2)=ShowPal%(c%+1):NEXT:SYS "Translator_SetPalette",ShowPal%(0),dum%
15400ENDCASE
15410ENDPROC
15420
15430DEFPROCstdpal(RETURN Pal%(),bpp%)
15440REM Sets a palette to standard Archimedes 2,4,16 or 256 colour palette
15450LOCAL c%,p%
15460SYS "Translator_Palette",bpp%,dum%,2:REM Calculate standard palette
15470p%=dum%:REM Pointer
15480FOR c%=1 TO 2^bpp%:Pal%(c%)=!p%:p%+=4:NEXT
15490Pal%(0)=bpp%
15500ENDPROC
15510
15520DEFPROCgreypal(RETURN Pal%(),bpp%,dir%)
15530REM Sets a palette to greyscale for bpp% bits per pixel
15540REM dir%=1 gives black to white, dir%=-1 gives white to black
15550LOCAL cols%,step,i,c%
15560cols%=2^bpp%:step=255/(cols%-1):i=0
15570IFdir%=-1 THEN step=-step:i=255 ELSE i=0
15580FOR c%=1 TO 2^bpp%:Pal%(c%)=i OR i<<8 OR i<<16:i+=step:NEXT
15590Pal%(0)=bpp%
15600ENDPROC
15610
15620DEFPROCmode_info(mode%,RETURN width%,RETURN height%,RETURN colours%)
15630REM Returns information about a particular mode
15640colours%=2^(2^FNmode_var(mode%,9)):width%=1+FNmode_var(mode%,11):height%=1+FNmode_var(mode%,12):REM Return info
15650ENDPROC
15660
15670DEFPROCinvalidate_screen
15680REM Invalidates entire screen
15690SYS WForce%,-1,0,0,ScrW%,ScrH%:REM Force redraw whole screen
15700ENDPROC
15710
15720DEFPROCinvalidate_image
15730REM Invalidates image
15740Img=FALSE:FreqCalc=FALSE:REM Reset image flags
15750ENDPROC
15760
15770DEFPROCnew_window(handle%)
15780REM Redraws entire window area
15790PROCredraw_window(handle%,TRUE)
15800ENDPROC
15810
15820DEFPROCredraw_window(handle%,force)
15830REM Redraws window with handle handle%
15840REM If force=TRUE the window's entire work area is updated
15850LOCAL more%,nx%,ny%,vw%,vh%,x%,y%,ox%,oy%,z
15860LOCAL x1%,x2%,x3%,x4%,y1%,y2%,y3%,y4%,w1%,w2%,w3%,w4%,h1%,h2%,h3%,h4%
15870!block=handle%:REM Set window's handle
15880IFforce THEN block!4=0:block!8=0:block!12=&7FFF:block!16=&7FFF:SYS WUpdateW%,,block TO more% ELSE SYS WRedrawW%,,block TO more%
15890vw%=block!12+Xstep%-block!4:vh%=block!16+Ystep%-block!8:REM Visible size
15900CASE handle% OF
15910 WHEN win_img% : REM Redraw image window
15920 nx%=(block!4-block!20):ny%=(block!16-block!24):REM Work area origin
15930 IFZoomX>=1 THEN !arg%=ZoomX:arg%!8=1 ELSE !arg%=1:arg%!8=1/ZoomX
15940 IFZoomY>=1 THEN arg%!4=ZoomY:arg%!12=1 ELSE arg%!4=1:arg%!12=1/ZoomY
15950 IF(vw%<=160)OR(vh%<=160) THEN x%=block!4:y%=block!8 ELSE vw%=0
15960 WHILE more%:IFvw%>0 THEN SYS WSetCol%,0:RECTANGLE FILL x%,y%,vw%,vh%
15970 PROCplot_image(nx%,ny%,0,arg%):REM Display image sprite
15980 SYS WGetR%,,block TO more%:ENDWHILE:REM Get next rectangle
15990 WHEN win_zoom% : REM Redraw zoom window
16000 x%=block!4:y%=block!8:REM Visible area coordinates
16010 z=ZoomW/ZoomD:REM Zoom factor
16020 ox%=vw%/2-ZoomWX%*z*Xstep%:oy%=vh%/2-ZoomWY%*z*Ystep%:REM Offset
16030 nx%=SprW%*z*Xstep%:ny%=SprH%*z*Ystep%:REM Total externals
16040 w1%=0:w2%=0:w3%=0:w4%=0:REM No uncovered borders yet
16050 IFox%>0 THEN x1%=x%:y1%=y%:w1%=ox%-Xstep%:h1%=vh%
16060 IF(ox%+nx%)<vw% THEN x2%=x%+ox%+nx%:y2%=y%:w2%=vw%-(ox%+nx%):h2%=vh%
16070 IFoy%>0 THEN x3%=x%:y3%=y%:w3%=vw%:h3%=oy%-Ystep%
16080 IF(oy%+ny%)<vh% THEN x4%=x%:y4%=y%+oy%+ny%:w4%=vw%:h4%=vh%-(oy%+ny%)
16090 !arg%=ZoomW:arg%!8=ZoomD:arg%!4=ZoomW:arg%!12=ZoomD:REM Zoom factors
16100 nx%=x%+ox%:ny%=y%+oy%:REM Plot coordinates
16110 WHILE more%:IFw1%>0 THEN RECTANGLE FILL x1%,y1%,w1%,h1%
16120 IFw2%>0 THEN RECTANGLE FILL x2%,y2%,w2%,h2%
16130 IFw3%>0 THEN RECTANGLE FILL x3%,y3%,w3%,h3%
16140 IFw4%>0 THEN RECTANGLE FILL x4%,y4%,w4%,h4%
16150 PROCplot_image(nx%,ny%,0,arg%):REM Display image sprite
16160 SYS WGetR%,,block TO more%:ENDWHILE:REM Get next rectangle
16170ENDCASE
16180ENDPROC
16190
16200DEFPROCopen_window(handle%,info)
16210REM Opens window with handle handle%
16220REM If info>0 then info is ready at info, else get info, if -1 pop at top
16230LOCAL b%,px%,py%,_%,xs%,ys%
16240IFinfo>0 THEN
16250 FOR b%=0 TO 31 STEP 4:block!b%=info!b%:NEXT
16260ELSE !block=handle%:SYS WGetWS%,,block
16270 IFinfo=-1 THEN block!28=-1:REM Pop up at top if requested
16280 IFhandle%<>win_img% THEN PROCmouse(px%,py%,_%):xs%=block!12-block!4:ys%=block!16-block!8:block!4=px%-64:block!8=py%-ys%+16:block!12=block!4+xs%:block!16=block!8+ys%:REM Pop up at mouse if not image window
16290ENDIF
16300SYS WOpenW%,,block
16310ENDPROC
16320
16330DEFPROCclose_window(handle%)
16340REM Closes window with handle handle%
16350!block=handle%:SYS WCloseW%,,block
16360ENDPROC
16370
16380DEFFNpoll(mask%)
16390REM Returns poll reason code, masking with mask%, data at poll
16400LOCAL reasoncode
16410SYS WPoll%,mask%,poll TO reasoncode
16420=reasoncode
16430
16440DEFPROCinitialise
16450REM Initialises program
16460SYS "Wimp_ReadPalette",,wimppal:REM Read current WIMP palette
16470PROChour_on:PROCinit_module:PROChour_off:REM Initialise module
16480SYS "OS_CheckModeValid",18 TO _%:MultiSync=(_%<>-1):REM Monitor type
16490applname$="Translator":REM Name of application
16500SYS "Wimp_Initialise",200,&4B534154,applname$ TO version,TaskHandle%
16510IFversion<200 THEN ERROR 1,"I cannot work with WIMP pre-2.00"
16520W%=FNswi_to_nr("Wimp_Initialise"):REM Base SWI number
16530WCreateW%=W%+1:WCreateI%=W%+2:WDeleteW%=W%+3:WOpenW%=W%+5:WCloseW%=W%+6:WPoll%=W%+7:WRedrawW%=W%+8:WUpdateW%=W%+9:WGetR%=W%+10:WGetWS%=W%+11:WGetWI%=W%+12:WSetIS%=W%+13:WGetIS%=W%+14:WGetPI%=W%+15:WDragB%=W%+16:WForce%=W%+17
16540WSetCa%=W%+18:WCreateM%=W%+20:WDecodeM%=W%+21:WSetE%=W%+23:WLoadT%=W%+27:WReport%=W%+31:WSetM%=W%+35:WSetP%=W%+36:WReadP%=W%+37:WSetCol%=W%+38:WSendMsg%=W%+39:WCreateSM%=W%+40
16550OSSpop%=FNswi_to_nr("OS_SpriteOp"):OSReadVV%=FNswi_to_nr("OS_ReadVduVariables"):OSReadMV%=FNswi_to_nr("OS_ReadModeVariable")
16560SYS WReadP%,,wimppal:REM Read current WIMP palette
16570tf%=7:tb%=2:wf%=7:wb%=0:si%=1:so%=3:REM Window/menu colours
16580!block=-1:block!4=0:block!8=0:block!12=68:block!16=68:block!20=&27003002:$(block+24)="!translatr":SYS WCreateI%,,block TO Iiconbar%:REM Iconbar icon
16590REM Load sprites for icons
16600!iconsprites=2048:iconsprites!4=0:iconsprites!8=16:iconsprites!12=16
16610SYS OSSpop%,10+256,iconsprites,"<Translator$Dir>.Sprites"
16620REM Load templates
16630SYS "Wimp_OpenTemplate",,"<Translator$Dir>.Templates"
16640ic=icondata:ie=icondend:REM Indirected icon data workspace
16650$dum%="save":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16660window!(88+24)=1:REM WIMP areaptr
16670SYS WCreateW%,,window TO win_file%
16680SAVsn%=FNiconaddr(win_file%,0):SAVfn%=FNiconaddr(win_file%,1)
16690$dum%="info":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16700SYS WCreateW%,,window TO win_info%
16710$dum%="filetypes":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16720SYS WCreateW%,,window TO win_filet%
16730$dum%="imageinfo":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16740SYS WCreateW%,,window TO win_iminfo%
16750w%=win_iminfo%:IMIfn%=FNiconaddr(w%,1):IMIit%=FNiconaddr(w%,3):IMIin%=FNiconaddr(w%,5):IMIif%=FNiconaddr(w%,7):IMIco%=FNiconaddr(w%,9)
16760IMIwh%=FNiconaddr(w%,11):IMIsc%=FNiconaddr(w%,13):IMIbp%=FNiconaddr(w%,15):IMIsm%=FNiconaddr(w%,17):IMIrn%=FNiconaddr(w%,19)
16770$dum%="rgbbits":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16780FOR i%=3 TO 5:ap%=window+88+i%*32+24:!ap%=iconsprites:NEXT:REM Areaptrs
16790SYS WCreateW%,,window TO win_rgbbits%
16800$dum%="image":IMWtt%=ic:SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16810window?35=&FF:REM Transparent background
16820SYS WCreateW%,,window TO win_img%
16830$dum%="zoom":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16840SYS WCreateW%,,window TO win_zoom%
16850SYS "Wimp_CloseTemplate"
16860REM Load menu structure
16870SYS "OS_File",5,"<Translator$Dir>.MenuStruct" TO ,,,,slen%
16880DIM menustruct% slen%
16890SYS "OS_File",255,"<Translator$Dir>.MenuStruct",menustruct%
16900SYS "OS_File",5,"<Translator$Dir>.MenuData" TO ,,,,dlen%
16910DIM menudata% dlen%
16920SYS "OS_File",255,"<Translator$Dir>.MenuData",menudata%
16930FOR a%=menustruct%+4 TO a%+slen%-8 STEP 4
16940d%=!a%:IF(d%AND&FFF00000)<>&DEA00000 ELSE k%=(d%>>16)AND&F:d%=d%AND&FFFF:IFk%=1 THEN !a%=d%+menustruct% ELSE IFk%=2 THEN !a%=d%+menudata% ELSE IFd%=1 THEN !a%=win_file% ELSE IFd%=2 THEN !a%=win_rgbbits% ELSE !a%=win_iminfo%
16950NEXT
16960Vars=OPENIN"<Translator$Dir>.MenuVars":WHILE NOTEOF#Vars:vn$=GET$#Vars:d%=BGET#Vars:vv$=GET$#Vars:d%=BGET#Vars:IFLEFT$(vn$,2)="id" THEN vv%=menudata%+VALvv$ ELSE vv%=menustruct%+VALvv$
16970d%=EVAL("FNcvar("+vn$+","+STR$vv%+")"):ENDWHILE:CLOSE#Vars
16980menumain%=menustruct%+!menustruct%
16990REM Init variables
17000SaveKind$="":Img=FALSE:SavePal=TRUE:ZoomX=1:ZoomY=1:ImageSpr$="image":Flen%=0:Load$="":SameLeaf=FALSE:SlotDown=FALSE
17010DataSaveRef%=-1:DataLoadRef%=FALSE:YMul%=1:YDiv%=1:XMul%=1:XDiv%=1:ClearFile=FALSE:SaveSpr$="Image":SaveClear$="Clear":SprSave$="":ClearSave$=""
17020F1%=0:F2%=0:SprW%=0:SprH%=0:ImageNr%=1:AutoMode=TRUE:AutoPal=TRUE:CurrMode%=-1:ErrSpread=1:ModeSet=0:UserModeSet%()=0,0,8,12,15:AutoZoom=FALSE
17030BlackWhite=FALSE:TransTabId=FALSE:ImgMode%=0:GIFScan=FALSE:RGBbits%=&080808:Blanking=FALSE:ZigZag=TRUE:InvertRGB=FALSE:FreqCalc=FALSE:OutMode=1:OutPal=1:InFile$="":InType%=0:Percent=TRUE
17040Action=0:ActLoad=1:ActRotate=2:ActPostLoad=3:ViewMode=FALSE:PreMode=MODE:ZoomWin=FALSE:ZoomD=4:ZoomW=ZoomD:DivIsInX=FALSE:DivIsInY=FALSE
17050OutX%=1:OutY%=1:OutMode%=15:GammaF=1:Gamma=FALSE:BlackF=0:Black=FALSE:Range=FALSE:RangeMin%=0:RangeMax%=0:RangeI=FALSE:From%=1:GreyRgb=FALSE
17060B_null%=0:B_area%=1:B_sprite%=2:B_sprimg%=3:B_imgtop%=4:B_infile%=5:B_pixbuf1%=6:B_pixbuf2%=7:B_pixval%=8:B_pixscaled%=9:B_lzwtable%=10:B_stroff%=11:B_fserr%=12
17070IFFNload_status:REM Load default status (if any)
17080ENDPROC
17090
17100DEFFNcvar(RETURN var%,val%)
17110REM Creates new variable var%, value val%
17120var%=val%:=0
17130
17140DEFFNiconaddr(win%,ico%)
17150REM Returns indirected icon's data address
17160!block=win%:block!4=ico%:SYS WGetIS%,,block:REM Get icon info
17170=block!28
17180
17190DEFFNload_status
17200REM Loads default status (if any)
17210REM Returns TRUE if succesful, else FALSE (i.e. status file not found)
17220Status=OPENIN("<Translator$Dir>.Status"):IFStatus=0 THEN =FALSE
17230INPUT#Status,AutoMode,AutoPal,ModeSet,ErrSpread,SavePal,UserModeSet%(1),UserModeSet%(2),UserModeSet%(3),UserModeSet%(4),AutoZoom,BlackWhite,GIFScan,Blanking,InvertRGB,ZigZag,ViewMode,OutMode,OutPal,Percent,GammaF,Gamma,BlackF,Black
17240INPUT#Status,Range,SameLeaf:CLOSE#Status
17250IFErrSpread=-1 THEN ErrSpread=1
17260=TRUE
17270
17280DEFFNums
17290REM Returns string representing current user mode set
17300=STR$(UserModeSet%(1))+","+STR$(UserModeSet%(2))+","+STR$(UserModeSet%(3))+","+STR$(UserModeSet%(4))
17310
17320DEFFNavailable_mode(mode%)
17330REM Checks if mode% is a valid WIMP mode and available on monitor
17340IFmode%=3 OR mode%=6 OR mode%=7 OR mode%=23 THEN =FALSE
17350IFmode%<0 OR mode%>28 THEN =FALSE
17360IFmode%=24 OR mode%<18 THEN =TRUE ELSE =MultiSync
17370
17380DEFFNalign(val%)
17390REM Returns next-up word aligned value of val%
17400=(val%+3)ANDNOT3
17410
17420DEFFNreadpalval(rgb%)
17430REM Returns 'OS_ReadPalette' word from &RGB value
17440=((rgb%AND&FF)<<24)+((rgb%AND&FF00)<<8)+((rgb%AND&FF0000)>>8)+&10
17450
17460DEFFNstring(addr%)
17470REM Returns CTRL-char terminated string at addr%
17480LOCAL _%,_c%,_$
17490_%=-1:REPEAT _%+=1:UNTIL addr%?_%<32
17500_c%=addr%?_%:addr%?_%=13:_$=$addr%:addr%?_%=_c%
17510=_$
17520
17530DEFFNupstring(m$)
17540REM Returns upper case m$
17550LOCAL c%,v%,u$
17560u$=m$:FOR c%=1 TO LEN m$:v%=ASCMID$(m$,c%,1):IF(v%<=ASC"z")AND(v%>=ASC"a") THEN MID$(u$,c%,1)=CHR$(v%AND&5F)
17570NEXT:=u$
17580
17590DEFPROCmouse(RETURN x%,RETURN y%,RETURN but%)
17600REM Returns x,y and button state of mouse
17610MOUSE x%,y%,but%
17620ENDPROC
17630
17640DEFFNlog2BPP
17650REM Returns Log2BPP for current mode
17660=FNmode_var(MODE,9)
17670
17680DEFFNcolstobpp(cols%)
17690REM Returns bits per pixel needed for cols% colours
17700IFcols%<=1 THEN =1 ELSE =FNceil(LOG(cols%)/LOG2)
17710
17720DEFFNvdu_var(varnr%)
17730REM Returns VDU variable varnr%
17740!arg%=varnr%:arg%!4=-1:SYS OSReadVV%,arg%,arg%+8:=arg%!8
17750
17760DEFFNmode_var(mode%,varnr%)
17770REM Returns mode mode% variable varnr%
17780LOCAL result%
17790SYS OSReadMV%,mode%,varnr% TO ,,result%:=result%
17800
17810DEFFNOS_var(_$)
17820REM Attempts to return OS-var's string value
17830LOCAL _r$,_l%
17840SYS "XOS_ReadVarVal",_$,STRING$(100," "),100,0,3 TO ,_r$,_l%
17850_r$=LEFT$(_r$,_l%):=_r$
17860
17870DEFFNswi_to_nr(swi$)
17880REM Returns SWI number of SWI call swi$
17890LOCAL swinr%
17900SYS "XOS_SWINumberFromString",,swi$ TO swinr%
17910=swinr%
17920
17930DEFPROCerror(errnr,errmsg$)
17940REM Handles errors
17950LOCAL but%,opt%
17960SYS "Translator_VideoDMA",1:REM Ensure video DMA enabled
17970IFerrnr=-1 THEN errnr=1:opt%=1 ELSE opt%=3
17980!err=errnr:$(err+4)=errmsg$
17990SYS "Translator_Palette",2^FNlog2BPP,dum%,1:REM Read current palette
18000PROCset_palette(0):REM Select WIMP palette
18010SYS WReport%,err,opt%,applname$ TO ,but%
18020IFbut%<>1 THEN PROCdie
18030SYS "Translator_SetPalette",2^(2^FNlog2BPP),dum%:REM Reset palette
18040ENDPROC
18050
18060DEFFNsprW
18070REM Returns image sprite's width in OS pixels in current mode
18080=SprW%*Xstep%
18090
18100DEFFNsprH
18110REM Returns image sprite's height in OS pixels in current mode
18120=SprH%*Ystep%
18130
18140DEFFNmax(v1%,v2%)
18150REM Returns maximum of v1% and v2%
18160IFv1%>v2% THEN =v1% ELSE =v2%
18170
18180DEFFNmin(v1%,v2%)
18190REM Returns minimum of v1% and v2%
18200IFv1%<v2% THEN =v1% ELSE =v2%
18210
18220DEFFNceil(v)
18230REM Returns 'ceiling' of value (i.e. round up)
18240IFv=INTv THEN =v ELSE =INTv+1
18250
18260DEFPROCdie
18270REM Tidies up and exits
18280PROCfinish:REM Tidy up
18290SYS "OS_Exit"
18300ENDPROC
18310
18320DEFPROCfinish
18330REM Tidies up
18340SYS "Translator_TaskQuit" TO tasks%:IFtasks%<=0 THEN SYS "OS_Module",4,"Translator":REM Kill module if no other tasks are using it
18350SYS WSetP%,,wimppal:REM Reset palette
18360SYS "Wimp_CloseDown",TaskHandle%,&4B534154
18370ENDPROC
18380
18390DEFFNmode(width%,height%,colours%)
18400REM Returns, if possible, a standard screen mode that is most suitable for
18410REM displaying a picture of (width%)x(height%) pixels in colours% colours
18420REM Returns -1 if number of colours greater than 256
18430LOCAL arccols%,arcwidth%,archeight%,mode%
18440IFOutMode=2 THEN =MODE
18450REM Range check for colours, width and height
18460IFcolours%>256 THEN =-1:REM Impossible !
18470REM Determine closest colours/width/height
18480IFcolours%>16 THEN arccols%=256 ELSE IFcolours%>4 THEN arccols%=16 ELSE IFcolours%>2 THEN arccols%=4 ELSE arccols%=2
18490IFwidth%>640 THEN arcwidth%=1056 ELSE IFwidth%>320 THEN arcwidth%=640 ELSE arcwidth%=320
18500IFheight%<=256 THEN archeight%=256 ELSE archeight%=512
18510CASE arccols% OF
18520 WHEN 2 : IFarcheight%=512 THEN mode%=18 ELSE mode%=0
18530 WHEN 4 : IFarcheight%=512 THEN mode%=19 ELSE IFarcwidth%<=320 THEN mode%=1 ELSE mode%=8
18540 WHEN 16 : IFarcheight%=512 THEN mode%=20 ELSE IFarcwidth%<=320 THEN mode%=9 ELSE IFarcwidth%=640 THEN mode%=12 ELSE mode%=16
18550 WHEN 256 : IFarcheight%=512 THEN mode%=21 ELSE IFarcwidth%=160 THEN mode%=10 ELSE IFarcwidth%=320 THEN mode%=13 ELSE IFarcwidth%=640 THEN mode%=15 ELSE mode%=24
18560ENDCASE
18570=mode%
18580
18590DEFFNtimes(value%)
18600REM Returns STR$value% with 'plural extension'
18610LOCAL _d%
18620_d%=value%MOD10:REM Last digit determines extension
18630IF(((value%MOD100)DIV10)=1)OR(_d%>3)OR(_d%=0) THEN =STR$value%+"th"
18640CASE _d% OF
18650 WHEN 1 : =STR$value%+"st"
18660 WHEN 2 : =STR$value%+"nd"
18670 WHEN 3 : =STR$value%+"rd"
18680ENDCASE
18690
18700DEFPROCread24pal(fh%,RETURN Pal%(),cols%,ro%,go%,bo%,elen%)
18710REM Reads 24-bit palette from input file
18720REM Entries are cols%*elen%-byte, R,G,B at r0%/go%/bo% offsets
18730LOCAL p%,c%,m%
18740SYS "OS_GBPB",4,fh%,dum%,cols%*elen%:REM Read entire palette
18750p%=dum%:REM Pointer
18760FOR c%=1 TO cols%:Pal%(c%)=p%?ro%<<16 OR p%?go%<<8 OR p%?bo%:p%+=elen%:NEXT
18770ENDPROC
18780
18790DEFFNistring(fh%,len%)
18800REM Returns string of from file
18810REM If len%>0 the number of characters is len%
18820REM If len%=-1 the string is CTRL-character terminated
18830LOCAL _%,r$,c%
18840_$="":IFlen%>0 THEN FOR _%=1 TO len%:r$+=CHR$FNibf(fh%):NEXT ELSE IFlen%=-1 THEN c%=FNibf(fh%):WHILE c%>=ASC" ":r$+=CHR$c%:c%=FNibf(fh%):ENDWHILE
18850=r$
18860
18870DEFPROCiskip(fh%,amount%)
18880REM Skips amount% bytes in file
18890PTR#fh%=amount%+PTR#fh%
18900ENDPROC
18910
18920DEFPROCiptr(fh%,newptr%)
18930REM Sets new offset in file
18940PTR#fh%=newptr%
18950ENDPROC
18960
18970DEFFNiptr(fh%)
18980REM Returns current offset in file
18990=PTR#fh%
19000
19010DEFFNilen(fh%)
19020REM Returns length of file
19030=EXT#fh%
19040
19050DEFFNieof(fh%)
19060REM Returns end-of-file status of file
19070=EOF#fh%
19080
19090DEFPROCiclose
19100REM Closes all input files
19110IFF1%<>0 THEN SYS "XOS_Find",0,F1%:F1%=0
19120IFF2%<>0 THEN SYS "XOS_Find",0,F2%:F2%=0
19130ENDPROC
19140
19150DEFPROCiget(fh%,adr%,amount%)
19160REM Returns amount% bytes at adr% from file
19170SYS "OS_GBPB",4,fh%,adr%,amount%
19180ENDPROC
19190
19200DEFFNib:=BGET#F1%
19210DEFFNidb:=BGET#F1%<<8 OR BGET#F1%
19220DEFFNitb:=BGET#F1%<<16 OR BGET#F1%<<8 OR BGET#F1%
19230DEFFNiwb:=BGET#F1%<<24 OR BGET#F1%<<16 OR BGET#F1%<<8 OR BGET#F1%
19240DEFFNidl:=BGET#F1% OR BGET#F1%<<8
19250DEFFNitl:=BGET#F1% OR BGET#F1%<<8 OR BGET#F1%<<16
19260DEFFNiwl:=BGET#F1% OR BGET#F1%<<8 OR BGET#F1%<<16 OR BGET#F1%<<24
19270DEFFNibf(fh%):=BGET#fh%
19280DEFFNiwlf(fh%):=BGET#fh% OR BGET#fh%<<8 OR BGET#fh%<<16 OR BGET#fh%<<24
19290
19300DEFPROCobf(fh%,val%):BPUT#fh%,val%:ENDPROC
19310DEFPROCotbf(fh%,val%):BPUT#fh%,val%>>>16:BPUT#fh%,val%>>>8:BPUT#fh%,val%:ENDPROC
19320DEFPROCotlf(fh%,val%):BPUT#fh%,val%:BPUT#fh%,val%>>>8:BPUT#fh%,val%>>>16:ENDPROC
19330DEFPROCowlf(fh%,val%):BPUT#fh%,val%:BPUT#fh%,val%>>>8:BPUT#fh%,val%>>>16:BPUT#fh%,val%>>>24:ENDPROC
19340
19350DEFPROCostring(fh%,w$)
19360REM Outputs string to file
19370LOCAL i%
19380FOR i%=1 TO LENw$:BPUT#fh%,ASCMID$(w$,i%,1):NEXT
19390ENDPROC
19400
19410DEFPROCinit_module
19420REM Initialises module
19430SYS "Translator_MakeMaps":REM Initialise maps
19440SYS "Translator_TaskStart":REM Register task
19450ENDPROC
19460
19470DEFPROCvar(varname$,value%)
19480REM Writes module variable
19490$dum%=varname$:SYS "Translator_SetVariable",!dum%,value%
19500ENDPROC
19510
19520DEFFNvar(varname$)
19530REM Reads module variable
19540LOCAL value%
19550$dum%=varname$:SYS "Translator_ReadVariable",!dum% TO value%
19560=value%
19570
19580DEFFNOSvar(name$)
19590REM Attempts to return OS-var's string value
19600LOCAL _r$,_l%
19610_r$=STRING$(100," "):SYS "XOS_ReadVarVal",name$,_r$,LEN_r$,0,3 TO ,_r$,_l%
19620=LEFT$(_r$,_l%)
19630
� >!RunImage
K��������������������������������������������������������������������
3� Converts foreign graphics files to Archimedes
(-� Version date : Thu,25 Apr 1991.23:16:49
2� � 1991 Zeridajh software
<� by John Kortink
FK��������������������������������������������������������������������
P1� � �0:�'"Error"''"'";�$;"' (code ";�;")"'':�
Z-tversion%=644:� Translator version number
d;� window &A00,iconsprites 2048,icondata 4096,icondend 0
nE� menuico% 256,poll 256,block 256,err 256,wimppal 256,pointer 512
x<� InPal%(256),ImgPal%(256),ShowPal%(256),UserModeSet%(4)
�7� arg% 1024,dum% 5*1024,transtab% 256,Buffer%(32,1)
�5� buffer% 32*8,freq% 1024,palrgb% 1024,hambas% 64
�� intmap% 1024,pbmint% 256
�@Progneed%=150*1024:� Estimated space needed for program+vars
�@LowHeap%=1024:� Lowest size for heap (sprite, buffers, etc.)
�7Totalfree%=�-�:� Total free for program+vars+sprbuf
�EMidHimem%=�+Progneed%:� Pseudo HIMEM (top of prog, start of heap)
�DHeap%=MidHimem%:HeapSize%=Totalfree%-Progneed%:� Set heap + size
�>�HeapSize%<LowHeap% � � 1,"No room to start up Translator"
�4�=MidHimem%:� Lower himem to below sprite buffer
�(�initialise:� Initialise application
�7�mode_change(-1):� Reselect current mode to tidy up
��Lname$=�OSvar("Translator$File"):�Lname$<>"" � ș "OS_CLI","Unset Translator$File":Ltype%=�image_type(Lname$,�):�Ltype%>0 � Action=ActLoad:� Auto-boot, pending load
-� � �error(�,�$+" (code "+Þ+")"):�iclose
� Poll and action
D�DataLoadRef% � pollmask%=48 � pollmask%=49:� No nulls if wasted
"Ȏ �poll(pollmask%) �
, � 0 : �null
6 � 1 : �redraw
@ � 2 : �open
J � 3 : �close
T �Kill � Kill=�:SlotDown=�
^ � 6 : �mouseclick
h � 7 : �dragdrop
r � 8 : �key
| � 9 : �menuselect
� � 17,18 : �message
��
�
�Action �
�< SlotDown=�:�=&1000000:�new_slot:�=MidHimem%:� Claim max
� Ȏ Action �
�" � ActLoad : � Load new image
�# Action=0:� Reset action flag
�6 Ok=�load(Ltype%,Lname$):� Attempt to load image
� �Ok � Action=ActPostLoad
�" � ActRotate : � Rotate image
�# Action=0:� Reset action flag
�8 free%=Heap%+HeapSize%-SprEnd%:� Free above sprite
� �free%>8*1024 �
q �hour_on:�var("rotb",SprEnd%):�var("rots",free%):ș "Translator_Rotate",SprPtr%:�hour_off:� Rotate sprite
@ Sprite%!12=Sprite%!8+!(Sprite%+Sprite%!8):Ȕ SprH%,SprW%
, �new_image_window:� New image window
&1 � �error(-1,"No room for rotate buffer !")
0 �
: �
D�
N�SlotDown �
X0 �Img � �=(SprEnd%+1023)��1023 � �=MidHimem%
b �new_slot:�=MidHimem%
l SlotDown=�
v�
��(Action=ActPostLoad) �
�! Action=0:� Reset action flag
�, �set_mode(ImgMode%):� Select image mode
�) ZoomX=1:ZoomY=1:� Reset zoom factors
�A �AutoPal � �set_palette(1):� Select image palette if enabled
�- �new_image_window:� Open window on image
��
�D� �TNA:� Sorry, I have to. Current BASIC restrictions with END=.
�
���new_slot
�� Slot changed, reset info
�,HeapSize%=�-MidHimem%:� New size of heap
��
��menuselect
?ș WDecodeM%,,menu1,poll,�100," ") � ,,,select$:� Selection
-� Decode main/sub/subsub selection string
**menupath$=select$:� Remember menu path
4fselect2=�:select3=�:select4=�:select5=�:select2$="":select3$="":select4$="":select5$="":� Defaults
>�p%=�select$,"."):�p%>0 � select2=�:select2$=�select$,p%+1):select$=�select$,p%-1):p%=�select2$,"."):�p%>0 � select3=�:select3$=�select2$,p%+1):select2$=�select2$,p%-1):p%=�select3$,".")
H��p%>0 � select4=�:select4$=�select3$,p%+1):select3$=�select3$,p%-1):p%=�select4$,"."):�p%>0 � select5=�:select5$=�select4$,p%+1):select4$=�select4$,p%-1)
R4� Filter clicks on roots of entries with submenu
\Ȏ menupath$ �
f\ � "Image info","Pop up","Process","Manipulate","Examine","Misc" : �select2 � select$=""
p� � "Pop up.Mode set","Process.Colour","Process.Sprite output","Process.Scaling","Process.Misc","Examine.Zoom","Manipulate.Mirror","Misc.Save","Misc.Status" : �select3 � select$=""
z� � "Process.Sprite output.Output mode","Process.Sprite output.Output palette","Process.Sprite output.Error spreading","Process.Scaling.x","Process.Scaling.y","Examine.Zoom.In","Examine.Zoom.Out" : �select4 � select$=""
��
�Ȏ select$ �
� � "" : � Do nothing
� � "Quit" : � Quit program
� �die:� Tidy up and exit
�" � "Pop up" : � Pop up options
� Ȏ select2$ �
�) � "Auto mode" : AutoMode=�AutoMode
�* � "Auto palette" : AutoPal=�AutoPal
�+ � "Mode set" : � Select new mode set
� Ȏ �select3$,4) �
�) � "Root" : � No selection (root)
�+ � "None" : ModeSet=0:� No mode set
7 � "Norm" : ModeSet=1:� Normal monitor mode set
: � "Mult" : ModeSet=2:� Multisync monitor mode set
5 : � User mode set, check and if ok, change
$� s$=select3$:p%=�s$,","):�p%>0 � m1%=�s$:s$=�s$,p%+1):p%=�s$,","):�p%>0 � m2%=�s$:s$=�s$,p%+1):p%=�s$,","):�p%>0 � m3%=�s$:s$=�s$,p%+1):m4%=�s$
.� �p%>0 � UserModeSet%(1)=m1%:UserModeSet%(2)=m2%:UserModeSet%(3)=m3%:UserModeSet%(4)=m4%:ModeSet=3 � �error(-1,"Bad user mode set. Please use '<2colmode>,<4colmode>,<16colmode>,<256colmode>', e.g. '1,2,3,4'.")
8 �
B) � "Auto zoom" : AutoZoom=�AutoZoom
L) � "View mode" : ViewMode=�ViewMode
V �
`' � "Process" : � Processing options
j Ȏ select2$ �
t/ � "Colour" : � Colour processing options
~ Ȏ select3$ �
�5 � "Black and white" : BlackWhite=�BlackWhite
�6 � "Correct gamma" : � Gamma correction factor
�[ �(select4$+select5$)="" � GammaF=1 � GammaF=�(select4$+"."+select5$):� New factor
�: Gamma=(GammaF<>1)�(GammaF>0):� Gamma in effect ?
�6 � "Correct black" : � Black correction factor
�C �select4$="" � BlackF=0 � BlackF=�(select4$):� New factor
�: Black=(BlackF<>0):� Black correction in effect ?
�( � "Expand range" : Range=�Range
�. � "Invert RGB" : InvertRGB=�InvertRGB
� �
�2 � "Sprite output" : � Sprite output options
� Ȏ select3$ �
9 � "Output mode" : � Change output mode selection
2 �select4$="Auto" � OutMode=1 � OutMode=2
? � "Output palette" : � Change output palette selection
T �select4$="Current" � OutPal=1 � �select4$="Default" � OutPal=2 � OutPal=3
(4 � "Error spreading" : � Set error spreading
2 Ȏ select4$ �
<# � "Simple" : ErrSpread=1
F, � "Floyd Steinberg" : ErrSpread=2
P � "Off" : ErrSpread=0
Z �
d% � "Zig zag" : ZigZag=�ZigZag
n �
x1 � "Clear output" : � Clear output file off
�: �ClearFile � ș "OS_File",6,ClearSave$:ClearFile=�
�+ � "Scaling" : � Change scale factors
�# xm%=-1:ym%=-1:xd%=-1:yd%=-1
� Ȏ select3$ �
�* � "1:1" : xm%=1:ym%=1:xd%=1:yd%=1
�* � "1:2" : xm%=1:ym%=1:xd%=2:yd%=2
�* � "2:1" : xm%=2:ym%=2:xd%=1:yd%=1
Ȁ � "x","y" : s$=select4$:p%=�s$,":"):mul%=�s$:�p%>0 � s$=�s$,p%+1):div%=�s$ � div%=0:� Determine scaling ratio (0=inpix)
�? �select3$="x" � xm%=mul%:xd%=div% � ym%=mul%:yd%=div%
� �
�9 �xm%=-1 � XMul%=xm%:XDiv%=xd%:DivIsInX=(XDiv%<=0)
�9 �ym%=-1 � YMul%=ym%:YDiv%=yd%:DivIsInY=(YDiv%<=0)
�( � "Misc" : � Miscelaneous options
Ȏ select3$ �
1 � "Screen blanking" : Blanking=�Blanking
( � "GIF scan" : GIFScan=�GIFScan
"* � "Image number" : � Image number
,: �select4$="" � ImageNr%=1 � ImageNr%=�(select4$)
6A � "Next image","Previous image" : � Image number up/down
@ Ȏ �select3$,1) �
J � "N" : ImageNr%+=1
T, � "P" : �ImageNr%>1 � ImageNr%-=1
^ �
h~ �InFile$<>"" � Lname$=InFile$:Ltype%=InType%:Action=ActLoad � �error(-1,"Load an image file first !"):� Pending load
r* � "Percentage" : Percent=�Percent
| �
� �
�, � "Manipulate" : � Manipulation options
� Ȏ select2$ �
�# � "Rotate" : � Rotate sprite
�' Action=ActRotate:� Pending load
�" � "Mirror" : � Mirror image
�; �var("imgx",SprW%):�var("imgy",SprH%):� Module info
� �hour_on
�i �select3$="x" � ș "Translator_MirrorX",SprPtr% � ș "Translator_MirrorY",SprPtr%:� Mirror sprite
� �hour_off
�4 �new_window(win_img%):� Freshen image window
� �
�( � "Examine" : � Examination options
Ȏ select2$ �
- � "Zoom" : � Zoom in, out, normal size
A OldZoomX=ZoomX:OldZoomY=ZoomY:� Remember old zoom factors
& Ȏ select3$ �
0 � "In": �select4$="Both" � ZoomX=ZoomX*2:ZoomY=ZoomY*2 � �select4$="x" � ZoomX=ZoomX*2 � �select4$="y" � ZoomY=ZoomY*2
:� � "Out": �select4$="Both" � ZoomX=ZoomX/2:ZoomY=ZoomY/2 � �select4$="x" � ZoomX=ZoomX/2 � �select4$="y" � ZoomY=ZoomY/2
D! � "1:1": ZoomX=1:ZoomY=1
N �
XL � Set image window extent and title according to current zoom factor
bC !block=0:block!4=0:block!8=�sprW*ZoomX:block!12=�sprH*ZoomY
lC ș WSetE%,win_img%,block:� Set window extent to zoomed size
v( $IMWtt%=�image_title:� New title
�B !block=win_img%:ș WGetWS%,,block:� Read window's position
�L dx%=(block!12-block!4)/2:dy%=(block!16-block!8)/2:� Half window size
�H vx%=block!20+dx%:vy%=block!24-dy%:� Vector from centre to origin
�I � Calculate new scroll offsets by scaling vector and re-transpose
�G block!20=vx%*ZoomX/OldZoomX-dx%:block!24=vy%*ZoomY/OldZoomY+dy%
�< �close_window(win_img%):�open_window(win_img%,block)
�+ � "Magnifier" : � Pop up zoom window
�D ZoomWin=�:ZoomWX%=0:ZoomWY%=0:ZoomW=ZoomD:� Init zoom window
�5 �open_window(win_zoom%,-1):� Open zoom window
� �
�' � "Misc" : � Miscellaneous options
� Ȏ select2$ �
�1 � "Reload last" : � Reload last image file
| �InFile$<>"" � Lname$=InFile$:Ltype%=InType%:Action=ActLoad � �error(-1,"Load an image file first !"):� Pending load
/ � "Save" : � Save whole or part of image
Ȏ select3$ �
/ � "Include palette" : SavePal=�SavePal
*/ � "Same leafname" : SameLeaf=�SameLeaf
47 : SaveKind$=select3$:� Remember type of save
>K $SAVfn%=SaveSpr$:$SAVsn%="file_ff9":� Set file window for sprite
H8 �open_window(win_file%,-1):� Open file window
R2 ș WSetCa%,win_file%,1,,,-1,�(SaveSpr$)
\ �
f1 � "Image palette" : � Select image palette
p �set_palette(1)
z) � "Status" : � Manipulate defaults
� Ȏ select3$ �
�� � "Save" : Status=�("<Translator$Dir>.Status"):�#Status,AutoMode,AutoPal,ModeSet,ErrSpread,SavePal,UserModeSet%(1),UserModeSet%(2),UserModeSet%(3),UserModeSet%(4),AutoZoom,BlackWhite,GIFScan,Blanking,InvertRGB
�k �#Status,ZigZag,ViewMode,OutMode,OutPal,Percent,GammaF,Gamma,BlackF,Black,Range,SameLeaf:�#Status
�d � "Load" : �load_status � �error(-1,"I cannot find my status file ! Have you saved one ?")
�< � "Kill" : ș "OS_File",6,"<Translator$Dir>.Status"
� �
� �
��
�(ș WGetPI%,,block:� Get pointer info
�5�((block!8)�1)>0 � �main_menu:� Adjust -> re-open
��
�
���close
)Kill=�:� Flag returned : image killed
win%=poll!0:� Window handle
&�close_window(win%):� Close window
$
Ȏ win% �
.3 � win_img% : �invalidate_image:�set_palette(0)
8 �close_window(win_file%)
B( �close_window(win_zoom%):ZoomWin=�
L' �ViewMode � �mode_change(PreMode)
V Kill=�
` � win_zoom% : ZoomWin=�
j�
t�
~
�
��open
��open_window(0,poll)
��
�
���redraw
��redraw_window(poll!0,�)
��
�
�
��null
��DataLoadRef% �
�D DataLoadRef%=�:ș "OS_File",6,Save$:� Delete file saved/created
�C �error(-1,"Bad data transfer, receiver dead"):� No DataLoadAck
�
�
��key
(Ewin%=poll!0:ico%=poll!4:char%=poll!24:� Window, icon, key pressed
2"�(win%=win_file%) � (ico%=1) �
< Ȏ char% �
F � 13 : � Return pressed
PJ �error(-1,"Please drag the sprite file icon to a directory viewer")
Z � 27 : � Escape pressed
d �close_window(win_file%)
n �
x�
��
�
�
��message
�-� Ignore messages originating from myself
�6�(poll!4)=TaskHandle% � msgnr%=-1 � msgnr%=poll!16
�Ȏ msgnr% �
� � -1 : � Don't react
�+ � 0 : �die:� Request to terminate task
�. � 1 : � DataSave, transfer via scrap file
�7 scrap$=�OSvar("Wimp$Scrap"):� Read scrap filename
�� �scrap$<>"" � poll!12=poll!8:poll!16=2:poll!36=-1:$(poll+44)=scrap$+�0:poll!0=44+(�scrap$+1+3)��3:ș WSendMsg%,18,poll,poll!4 � �error(-1,"Wimp$Scrap not defined"):� Send DataSaveAck if scrap file defined
�# � 2 : � DataSaveAck, save file
� �poll!12=DataSaveRef% �
I Save$=�string(poll+44):� Full pathname of file to be saved/created
. � Save sprite file or 'open' Clear file
� �$SAVsn%="file_ff9" � SprSave$=Save$:�save_sprite(SprSave$) � ClearSave$=Save$:ș "OS_File",11,ClearSave$,&690,0,0:ClearFile=�
"? poll!12=poll!8:poll!16=3:� Amend data block for DataLoad
,2 ș WSendMsg%,18,poll,poll!4:� Send DataLoad
6@ DataLoadRef%=poll!8:� Await a DataLoadAck, remember myref
@ �
J. � 3,5 : � DataLoad/Open : attempt to load
TB type%=poll!40:name$=�string(poll+44):� Filetype and filename
^ Ȏ type% �
hT � &FF9,&DE2,&DFA,&D58,&004 : �msgnr%=3 � type%=�image_type(name$,�) � type%=0
r, type%=�image_type(name$,(msgnr%=3))
| �
� �type%>0 �
�I poll!12=poll!8:poll!16=4:ș WSendMsg%,17,poll,poll!4:� DataLoadAck
�> Lname$=name$:Ltype%=type%:Action=ActLoad:� Pending load
�r � �msgnr%=3 � �error(-1,"I don't recognize this file. Please filetype it appropiately."):� Drag unrecognized
� �
�) � 4 : � DataLoadAck, check or ignore
�< �DataLoadRef% � �poll!12=DataLoadRef% � DataLoadRef%=�
�! � &400C0 : � Submenu warning
�G pointer%=poll!20:x%=poll!24:y%=poll!28:� Get pointer/proposed x/y
�A ș WDecodeM%,,menu1,poll+32,�100," ") � ,,,path$:� Get path
� Ȏ path$ �
� � "Process.Clear output" : $SAVfn%=SaveClear$:$SAVsn%="file_690":ș WCreateSM%,,pointer%,x%,y%:ș WSetCa%,win_file%,1,,,-1,�(SaveClear$):� Open file window for Clear file
� �
@ � &400C1 : � Mode has changed (and it may not have been me)
�mode_change(-1):� Tidy up
�
&�
0
:��mouseclick
D?but%=poll!8:win%=poll!12:ico%=poll!16:� Buttons/window/icon
N
Ȏ win% �
X � -2 : � Click on iconbar
b �ico%=Iiconbar% �
l � Iconbar icon clicked
v Ȏ but% � 7 �
�* � 2 : �mouse(x%,_%,_%):m%=menuico%
�� $m%="Translator":m%?12=tf%:m%?13=tb%:m%?14=wf%:m%?15=wb%:m%!16=10*16:m%!20=40:m%!24=0:m%!28=0:m%!32=win_info%:m%!36=(wb%<<28)+(wf%<<24)+1:$(m%+40)="Info":m%!52=0:m%!56=win_filet%:m%!60=m%!36
�w $(m%+64)="Filetypes":m%!76=&80:m%!80=-1:m%!84=m%!36:$(m%+88)="Quit":menu1=m%:ș WCreateM%,,menu1,x%-64,96+3*40
�" � 1,4 : From%=1:�main_menu
� �
� �
�) � win_img% : � Click on image window
� Ȏ but% � 7 �
� � 2 : From%=2:�main_menu
�B : � Wandering over image, recalculate zoom window if open
� �ZoomWin �
�� xs%=Xstep%:ys%=Ystep%:x%=poll!0:y%=poll!4:!block=win_img%:ș WGetWS%,,block:ox%=block!4-block!20:oy%=block!16-block!24:rx%=x%-ox%:ry%=y%-oy%:ex%=rx%/ZoomX/xs%:ey%=ry%/ZoomY/ys%:� Pixel coordinates in image
�: �ZoomX<1 � ex%=ex%+1/ZoomX-1:� Display correction
: �ZoomY<1 � ey%=ey%+1/ZoomY-1:� Display correction
~ �(ZoomWX%<>ex%)�(ZoomWY%<>ey%) � ZoomWX%=ex%:ZoomWY%=ey%:�redraw_window(win_zoom%,�):� If changed, redraw zoom window
�
�
*) � win_zoom% : � Click on zoom window
4 Ȏ but% � 7 �
>) � 1 : �ZoomW>ZoomD � ZoomW=ZoomW-1
H � 2 : ZoomW=ZoomD
R/ � 4 : �(ZoomW/ZoomD)<100 � ZoomW=ZoomW+1
\ �
f6 �redraw_window(win_zoom%,�):� Redraw zoom window
p) � win_file% : � Click on file window
z �ico%=0 �
� Ȏ but% � &7F �
�9 � 16,64 : � Drag,calculate drag box and create it
�� !block=win%:ș WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:ș WGetIS%,,block:!block=win%:block!4=5:block!8+=x%:block!12+=y%:block!16=block!8+68:block!20=block!12+68:block!24=0:block!28=0:block!32=ScrW%:block!36=ScrH%
�, ș WDragB%,,block:� Create drag box
� �
� �
�/ � win_rgbbits% : � RGB slider manipulation
ʏ !block=win%:ș WGetWS%,,block:x%=block!4:y%=block!8:block!4=ico%:ș WGetIS%,,block:x%+=block!8+2:y%+=block!12+8:� Position in slider icon
�F mx%=!poll:dx%=mx%-x%-8:val%=dx% � 16:�val%>8 � val%=8:� Position
ކ �ico%=3 � col%=11:sn$="R":bit%=16 � �ico%=4 � col%=10:sn$="G":bit%=8 � col%=8:sn$="B":bit%=0:� Slider colours, names, bitoffsets
�$ � Plot slider in slider sprite
�~ ș OSSpop%,60+256,iconsprites,"slider"+sn$,0 � r0,r1,r2,r3:�0,0:ȓ Ȑ 2,8,8*16,16:�0,col%:�val%>0 � ȓ Ȑ 2,8,val%*16,16
�2 ș OSSpop%,r0,r1,r2,r3:� Restore VDU context
� RGBbits%=(RGBbits% � � (255<<bit%)) � (val%<<bit%):!block=win%:block!4=ico%:block!8=0:block!12=0:ș WSetIS%,,block:� Update code and icon
�
�
$
.��dragdrop
8!ș WCreateM%,,-1:� Close menu
B,ș WGetPI%,,block:� Get pointer position
LGdropwin%=block!12:dropico%=block!16:� Window/icon where box dropped
V(save$=�string(SAVfn%):� Get leafname
`o�$SAVsn%="file_ff9" � SaveSpr$=save$:ft%=&FF9 � SaveClear$=save$:ft%=&690:� Remember leafname, set filetype
j�block!20=block!12:block!24=block!16:block!28=block!0:block!32=block!4:block!12=0:block!16=1:block!36=0:block!40=ft%:$(block+44)=save$+�0:!block=(44+�save$+4)��3
t;ș WSendMsg%,17,block,dropwin%,dropico%:� Send DataSave
~6DataSaveRef%=block!8:� Remember myref for DataSave
�0�close_window(win_file%):� Close file window
��
�
�ݤimage_type(name$,check)
�:� Examines file and returns filetype <>0 if image file
�=� If check=TRUE, contents are checked as well as filetype
�"� obj%,load%,type%,Head,id$,i%
�7ș "OS_File",5,name$ � obj%,,load%:� Read file info
��obj%<>1 � =0:� Not a file
�9�(load%>>>20)=&FFF � type%=(load%>>>8)�&FFF � type%=0
�Ȏ type% �
�� � &690,&691,&692,&693,&694,&695,&697,&698,&699,&69A,&69B,&69C,&69D,&69E,&69F,&FC9,&FF0,&FF9,&DE2,&DFA,&D58,&004 : � Recognized by filetype
�check � =0
3 Head=�(name$):� Open file to examine contents
- type%=0:� Not recognized anything (yet)
) id$="":� i%=1 � 12:id$+=�(�#Head):�
(� �id$,6)="GIF87a" � type%=&695 � �(�id$,4)="FORM") � (�id$,4)="ILBM") � type%=&693 � �id$,4)=�&59+�&A6+�&6A+�&95 � type%=&FC9
2� �type%<>0 � �(�id$,2)="II") � (�id$,2)="MM") � type%=&FF0 � �id$,5)="Irlam" � type%=&69B � �id$,2)="BM" � type%=&69C � �(�"P1P2P3P4P5P6",�id$,2))�2)>0 � type%=&69E
<. �type%<>0 � �id$,4)="ZVDA" � type%=&69F
FX �type%<>0 � �#Head=&41:id$="":� i%=1 � 4:id$+=�(�#Head):�:�id$="PNTG" � type%=&694
P] �type%<>0 � �#Head=&10:id$="":� i%=1 � 9:id$+=�(�#Head):�:�id$="MILLIPEDE" � type%=&69A
Z �#Head:� Close image file
d�
n
=type%
x
�ݤload(type%,name$)
�� Loads image file
�0� Returns TRUE if succesful load, else FALSE
�/InFile$=name$:InType%=type%:� Set file info
�{pos%=�name$:� pos%-=1:period=(�name$,pos%,1)="."):� (pos%=1) � period:�period � Leaf$=�name$,�name$-pos%) � Leaf$=name$
�4ș "OS_File",5,name$ � ,,,,Flen%:� File's length
�=F1%=�(name$):d%=�ib:�iptr(F1%,0):� Open file, ensure disc
�5�var("fha1",F1%):�var("ifp1",0):� REM Module info
��hour_on
�B�Percent � ș "Hourglass_Percentage",0:� Init percentage if on
�?�win_img%>0 � �close_window(win_img%):� Old image discarded
�(�Img � �invalidate_image � PreMode=�
�!�deallocate:� Free all memory
Ȏ type% �
� � &FF9 : p%=�"."+�upstring(name$),".HIP."):�p%>0 � loppath$=name$:�loppath$,p%,3)="LOP":F2%=�(loppath$):�F2%=0 � �error(-1,"I cannot find the ArVis LOP file !"):�
^ �p%=0 � Ok=�pic_ARC � �var("fha2",F2%):�var("ifp2",0):Ok=�pic_ARVIS:� What's this then ?
" � &DE2 : Ok=�pic_PROART
, � &DFA : Ok=�pic_WATFORD
6 � &D58 : Ok=�pic_RENDER
@ � &004 : Ok=�pic_AIM
J � &690 : Ok=�pic_CLEAR
T � &691 : Ok=�pic_DEGAS
^ � &692 : Ok=�pic_IMG
h � &693 : Ok=�pic_IFF
r � &694 : Ok=�pic_MAC
| � &695 : Ok=�pic_GIF
� � &697 : Ok=�pic_PCX
� � &698 : Ok=�pic_QRT
� � &699 : Ok=�pic_MTV
� � &69A : Ok=�pic_CADSOFT
� � &69B : Ok=�pic_IRLAM
� � &69C : Ok=�pic_BMP
� � &69D : Ok=�pic_TARGA
� � &69E : Ok=�pic_PBMPLUS
� � &69F : Ok=�pic_ZVDA
� � &FC9 : Ok=�pic_SUN
� � &FF0 : Ok=�pic_TIFF
��
�$Img=Ok:� Image ok if all is well
�Img �
ImgMode%=Mode%
�SameLeaf � SaveSpr$=Leaf$
&�
0
�hour_off
:!�iclose:� Close input file(s)
D=Img
N
X��save_sprite(out$)
b� Saves image as spritefile
lȎ SaveKind$ �
v1 � "Full" : � Full resolution sprite, no edit
� � "Whole" : �edit_part(�,�)
�) � "Whole (scaled)" : �edit_part(�,�)
� � "Part" : �edit_part(�,�)
�( � "Part (scaled)" : �edit_part(�,�)
��
��hour_on
��SaveKind$="Full" �
�8 � Full sprite, save image with palette (optionally)
�# Out=�(out$):� Open sprite file
�- spr%=Sprite%+Sprite%!8:� Start of sprite
�, cols%=2^SprColbits%:� Colours in sprite
� �SavePal �
�" � Save with palette included
; �cols%=256 � ents%=64 � ents%=cols%:� Palette entries
- extra%=ents%*8:� Extra room for palette
E ș "OS_GBPB",1,Out,Sprite%+4,8,0:� Output part of control block
D !arg%=extra%+Sprite%!12:ș "OS_GBPB",2,Out,arg%,4:� New offset
*? !arg%=extra%+!spr%:ș "OS_GBPB",2,Out,arg%,4:� New offset
4A ș "OS_GBPB",2,Out,spr%+4,28:� Output part of sprite header
>A !arg%=extra%+spr%!32:ș "OS_GBPB",2,Out,arg%,4:� New offset
HA !arg%=extra%+spr%!36:ș "OS_GBPB",2,Out,arg%,4:� New offset
R9 ș "OS_GBPB",2,Out,spr%+40,4:� Output sprite's mode
\� � c%=1 � ents%:arg%!(c%*8-8)=�readpalval(ImgPal%(c%)):arg%!(c%*8-4)=arg%!(c%*8-8):�:ș "OS_GBPB",2,Out,arg%,ents%*8:� Output palette
fF ș "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:� Data
p) � � No palette, output the whole lot
z> ș "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:� Output all
� �
�? �#Out:ș "OS_CLI","SetType "+out$+" Sprite":� Close & type
�0� � Edited part in window on screen, save it
�( �invalidate_screen:� Screen invalid
� �SavePal � pal%=1 � pal%=0
�4 ș OSSpop%,2,,out$,pal%:� Save screen in window
�/ �24,0;0;ScrW%;ScrH%;:� Reset screen window
��
�
�hour_off
��
�
�ݤpic_DEGAS
�/� Makes Atari Degas image (PI1/2/3,PC1/2/3)
3compr%=�ib:res%=�ib:� Flags, resolution (1/2/3)
7compressed=((compr%�%10000000)>0):� Compressed flag
#total%=32000:� Total data bytes
$
Ȏ res% �
., � 0 : width%=320:height%=200:colbits%=4
8, � 1 : width%=640:height%=200:colbits%=2
B, � 2 : width%=640:height%=400:colbits%=1
L�
V+colours%=2^colbits%:� Number of colours
`'�set(width%,height%,colours%,Mode%)
j>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
t�new_image(0) � =�
~/�iget(F1%,dum%,32):� Read palette from file
��InPal%(0)=colbits%:� c%=0 � colours%-1:v%=dum%!(c%*2):r%=(v%�7)*32:g%=((v%>>12)�7)*32:b%=((v%>>8)�7)*32:InPal%(colours%-c%)=(r%<<16)+(g%<<8)+b%:�
�[�compressed � compr$="Run length":type$="PC"+�(res%+1) � compr$="":type$="PI"+�(res%+1)
�_�image_info("Atari Degas "+type$,width%,height%,0,colbits%,Mode%,compr$,"",Flen%-34,total%)
�~�var("comp",compressed):�var("rest",res%):�var("imgx",width%):�var("imgy",height%):�var("ifp1",&22):�unpack("DEGAS") � =�
�=�
�
�
ݤpic_IMG
�� Makes Atari IMG image
�Kversion%=�idb:headlen%=�idb:nplanes%=�idb:� Version, headlength, planes
�Kpatlen%=�idb:pw%=�idb:ph%=�idb:� Pattern length, pixel width and height
�9width%=�idb:height%=�idb:� Width and height in pixels
�+colours%=2^nplanes%:� Number of colours
'�set(width%,height%,colours%,Mode%)
�colours%<>2 � patlen%<>2 � �error(-1,"I cannot display Atari IMG images with more than 2 colours or patternlength<>2 !"):�
>�allocate_std(width%,(width%*nplanes%+7)�8,width%,0) � =�
�new_image(0) � =�
(/�greypal(InPal%(),nplanes%,1):� Set palette
2{�image_info("Atari IMG",width%,height%,0,nplanes%,Mode%,"Several ways","",Flen%-headlen%*2,(width%*height%*nplanes%)�8)
<Y�var("imgx",width%):�var("imgy",height%):�var("ifp1",headlen%*2):�unpack("IMG") � =�
F=�
P
Z
ݤpic_MAC
d$� Makes MacIntosh MacPaint image
n2width%=576:height%=720:colbits%=1:� Resolution
x)�set(width%,height%,2^colbits%,Mode%)
�>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
��new_image(0) � =�
�/�greypal(InPal%(),colbits%,1):� Set palette
�k�image_info("MacIntosh MacPaint",width%,height%,0,colbits%,Mode%,"Run length","",Flen%-640,(576*720)�8)
�R�var("imgx",width%):�var("imgy",height%):�var("ifp1",640):�unpack("MAC") � =�
�=�
�
�
ݤpic_IFF
�� Makes Amiga IFF image
�%bmhd=�:cmap=�:body=�:� Init flags
�2ham=�:lace=�:hires=�:halfbright=�:� Init flags
�2� Check if this is a standard IFF picture file
��form$=�istring(F1%,4):�iskip(F1%,4):form$+=�istring(F1%,4):�form$<>"FORMILBM" � �error(-1,"This screen file is not an IFF screen file !"):=�
)� � Follow BMHD,CMAP and BODY headers
9head$=�istring(F1%,4):hlen%=�iwb:startptr%=�iptr(F1%)
Ȏ head$ �
"& � "BMHD" : bmhd=�:� Bitmap header
,= � Read picture/screen width, height, colours, etc.
6K width%=�idb:height%=�idb:�iskip(F1%,4):planes%=�ib:�iskip(F1%,1)
@H compressed=(�ib=1):�iskip(F1%,5):s_width%=�idb:s_height%=�idb
J> � "CAMG" : flags%=�iwb:� Get flag bits, set flags from it
T5 ham=((flags%�&800)>0):lace=((flags%�&4)>0)
^? hires=((flags%�&8000)>0):halfbright=((flags%�&80)>0)
h- � "CMAP" : cmap=�:� Colour map (palette)
r7 paldefs%=hlen%�3:� Number of palette entries
|4 �read24pal(F1%,InPal%(),paldefs%,0,1,2,3)
�$ � "BODY" : body=�:� Screen data
�) � Check if all parts are there
�� �bmhd � �error(-1,"IFF error : I did not find a 'BMHD' block. Cannot proceed !"):� �:=� � �cmap � �error(-1,"IFF error : I did not find a 'CMAP' block. Cannot proceed !"):� �:=�
�6 � Determine suitable Archimedes screen mode
� �ham �
�� �set(width%,height%,256,Mode%):colbits%=12:info$="HAM (Hold And Modify)":InPal%(0)=colbits%:� c%=0 � 15:hambas%!(c%<<2)=InPal%(c%+1):�:�var("map1",hambas%)
�* Mode%=�mode(320,s_height%,256)
�9 �allocate_std(width%,width%*4,0,width%) � =�
�o � colours%=2^planes%:�set(width%,height%,colours%,Mode%):colbits%=planes%:InPal%(0)=planes%:info$=""
�x �halfbright � info$="Half-bright":half%=colours%�2:� c%=1 � half%:InPal%(c%+half%)=(InPal%(c%)�&E0E0E0)>>1:�
�2 �allocate_std(width%,width%,0,0) � =�
� �
� �new_image(0) � =�
8 �compressed � compr$="Run length" � compr$=""
& �colbits%>8 � ci%=2 � ci%=0
~ �image_info("Amiga IFF",width%,height%,ci%,colbits%,Mode%,compr$,info$,Flen%-�iptr(F1%),(width%*height%*planes%)�8)
&1 �ham � �var("scty",1) � �var("scty",0)
0� �var("ifp1",�iptr(F1%)):�var("plan",planes%):�var("imgx",width%):�var("imgy",height%):�var("comp",compressed):�unpack("IFF") � =�
:�
DG�head$<>"BODY" � �iskip(F1%,hlen%-(�iptr(F1%)-startptr%)):� To next
N
� body
X=�
b
l
ݤpic_GIF
v3� Makes GIF (Graphics Interchange Format) image
�&� g_InPal%(),Pic_ptr%(),Pic_len%()
�/� g_InPal%(256),Pic_ptr%(256),Pic_len%(256)
�3signature$=�istring(F1%,6):� Read GIF signature
�X�signature$,3)<>"GIF" � �error(-1,"This screen file is not a GIF screen file !"):=�
�$� Read data in Screen Descriptor
�.r_width%=�idl:r_height%=�idl:� Raster size
�@flags%=�ib:backgr%=�ib:�iskip(F1%,1):� Flags and back colour
�;global=((flags%�&80)>0):� Global colour map following ?
�3g_pixbits%=(flags%�7)+1:� Global bits per pixel
�:colbits%=((flags%>>4)�7)+1:� Bits of colour resolution
�
�global �
� � Read Global Colour Map
�4 �read24pal(F1%,g_InPal%(),2^g_pixbits%,0,1,2,3)
- g_InPal%(0)=g_pixbits%:� Palette entries
%� InPal%(0)=-1:� No palette found
�
)� Scan data for pictures, make a list
*picture%=0:�
4?�skip_GIF_extension:� Skip extension blocks preceding Image
>&� Search for next Image Descriptor
HE� _%=�ib:image=(_%=�","):end=(_%=�";"):� image � end � �ieof(F1%)
R~�image � �end � �error(-1,"Warning ! GIF file is not properly terminated !"):end=�:�hour_off:�hour_on:� Read beyond file
\�image �
f" � Register picture's position
p0 picture%+=1:Pic_ptr%(picture%)=�iptr(F1%)-1
zk �iskip(F1%,8):_%=�ib:�(_%�&80)>0 � �iskip(F1%,3*2^((_%�7)+1)):� If there's a local colour map, skip it
� �GIFScan �
�0 � Determine picture data length, skip data
�2 �iskip(F1%,1):� c%=�ib:�iskip(F1%,c%):� c%=0
�6 Pic_len%(picture%)=�iptr(F1%)-Pic_ptr%(picture%)
�= � Pic_len%(picture%)=�ilen(F1%)-Pic_ptr%(picture%):end=�
� �
��
� � end
�1pictures%=picture%:� Number of pictures found
�N�pictures%>0 � �error(-1,"I cannot find any images in this GIF file !"):=�
��GIFScan �
� �(ImageNr%>0) � (ImageNr%<=pictures%) � picture%=ImageNr% � �error(-1,"This GIF file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'Image number' submenu !"):=�
�� picture%=1
�
K�iptr(F1%,Pic_ptr%(picture%)+1):len%=Pic_len%(picture%):� Pic pos & len
� Read Image Descriptor data
$0i_left%=�idl:i_top%=�idl:� Position in frame
.<i_width%=�idl:i_height%=�idl:flags%=�ib:� Size and flags
87local=(flags%�&80)>0:� Local colour map following ?
B<ibit=(flags%�&40)>0:� Image stored in interlaced order ?
L2l_pixbits%=(flags%�7)+1:� Local bits per pixel
V�local �
`@ pixbits%=l_pixbits%:� Read and use Local Colour Map palette
j2 �read24pal(F1%,InPal%(),2^l_pixbits%,0,1,2,3)
t+ InPal%(0)=l_pixbits%:� Palette entries
~?� pixbits%=g_pixbits%:InPal%()=g_InPal%():� Use Global data
��
�N�InPal%(0)=-1 � �error(-1,"I cannot find a palette in this GIF file !"):=�
�+colours%=2^pixbits%:� Number of colours
�=width%=i_width%:height%=i_height%:� True width and height
�'�set(width%,height%,colours%,Mode%)
�f�allocate(B_lzwtable%,32*1024) � �error(-1,"I have no room for the LZW decompression table !"):=�
�*�allocate_std(width%,0,width%,0) � =�
�;� Room needed for decompression data and de-interlacing
�d�pixbits%<=2 � rbits%=pixbits% � �pixbits%<=4 � rbits%=4 � rbits%=8:� Round up bpp to sprite bpp
�@room%=(((width%*rbits%+31)>>5)<<2)*(height%+1):� Room needed
��new_image(room%) � =�
�'�GIFScan � np$=�pictures% � np$="?"
��image_info(signature$,width%,height%,0,pixbits%,Mode%,"LZW",np$+" pics (this is "+�times(picture%)+")",len%,(height%*width%*pixbits%)�8)
+�ibit � �var("lace",1) � �var("lace",0)
Y�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�unpack("GIF") � =�
=�
(
2��skip_GIF_extension
<?� Skips a GIF Extension Block if present at current pointer
F� _%
P�(�ib)=�"!" �
Z' �iskip(F1%,1):� Skip function code
d; � _%=�ib:�iskip(F1%,_%):� _%=0:� Skip data byte blocks
n� �iskip(F1%,-1)
x�
��
�
�
ݤpic_ARC
�#� Loads Archimedes sprite image
�Dpictures%=�iwl:ofirst%=�iwl:� Number of sprites, offset to first
���(ImageNr%>0) � (ImageNr%<=pictures%) � picture%=ImageNr% � �error(-1,"This sprite file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'Image number' submenu !"):=�
�3�iskip(F1%,ofirst%-8-4):� Start of first sprite
�=skip%=picture%-1:ȕ skip%>0:�iskip(F1%,�iwl-4):skip%-=1:�
�Kstart%=�iptr(F1%):�iskip(F1%,16):� Remember start, skip offset and name
�Bwords%=�iwl+1:height%=�iwl+1:� Width in words, height in lines
�3bfirst%=�iwl:blast%=�iwl:� First/last bits used
�Doimage%=�iwl:�iskip(F1%,4):sprMode%=�iwl:� Offset to image, mode
�Bcolbits%=2^�mode_var(sprMode%,9):colours%=2^colbits%:� Colours
+�colbits%=8 � ents%=64 � ents%=colours%
�oimage%<=44 �
9 �stdpal(InPal%(),colbits%):� No palette, set default
"N� �read24pal(F1%,InPal%(),ents%,1,2,3,8):InPal%(0)=colbits%:� Read palette
,� �colbits%=8 � � c%=1 � ents%:p%=InPal%(c%):InPal%(c%+64)=p% � 1<<15:InPal%(c%+128)=p% � 1<<7:InPal%(c%+192)=p% � 1<<15 � 1<<7:�
6�
@5width%=(words%*32-bfirst%-(31-blast%)) � colbits%
J��available_mode(sprMode%) � Mode%=sprMode% � Mode%=�mode(width%,height%,colours%):� Determine other mode if sprite's mode won't do
T$�set(width%,height%,colours%,_%)
^>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
h�new_image(0) � =�
r��image_info("Archimedes sprite",width%,height%,0,colbits%,Mode%,"",�pictures%+" sprites (this is "+�times(picture%)+")",1,1)
|��var("ifp1",start%+oimage%):�var("imgx",width%):�var("imgy",height%):�var("wrds",words%):�var("bfir",bfirst%):�unpack("ARC") � =�
�=�
�
�ݤpic_PROART
�� Makes ProArtisan image
�+width%=640:height%=256:� Set resolution
�"�set(width%,height%,256,Mode%)
�/�allocate_std(width%,width%,width%,0) � =�
�Croom%=(width%*height%+3)��3:� Room needed for unpack (coltable)
��new_image(room%) � =�
�Ccollen%=�iwl:comflag%=�iwl:� Length of colour table/compression
�6coltable%=SprTop%-collen%:� Space for colour table
�4�iget(F1%,coltable%,collen%):� Read colour table
�5�stdpal(InPal%(),8):� Standard 256 colour palette
]�image_info("ProArtisan",width%,height%,0,8,Mode%,"Run length","",Flen%-8,width%*height%)
��var("ifp1",�iptr(F1%)):�var("prot",coltable%):�var("comp",comflag%):�var("imgx",width%):�var("imgy",height%):�unpack("PROART") � =�
=�
&
0ݤpic_WATFORD
:#� Makes Watford digitiser image
D+width%=512:height%=256:� Set resolution
N"�set(width%,height%,256,Mode%)
X/�allocate_std(width%,width%,width%,0) � =�
b�new_image(0) � =�
l0�greypal(InPal%(),6,1):� Palette is 64 greys
vh�image_info("Watford digitiser",width%,height%,1,6,Mode%,"Run length","",Flen%,(width%*height%*6)�8)
�T�var("imgx",width%):�var("imgy",height%):�var("ifp1",0):�unpack("WATFORD") � =�
�=�
�
�ݤpic_RENDER
�� Makes Render Bender image
�!Mode%=�ib:� Read image's mode
���mode_var(Mode%,9)<>3 � �error(-1,"This Render Bender image was not defined in a 256 colour mode !") � width%=�mode_var(Mode%,11)+1:height%=�mode_var(Mode%,12)+1
�"�set(width%,height%,256,Mode%)
�/�allocate_std(width%,width%,width%,0) � =�
��new_image(0) � =�
�5�stdpal(InPal%(),8):� Standard 256 colour palette
�`�image_info("Render Bender",width%,height%,0,8,Mode%,"Run length","",Flen%-1,width%*height%)
�S�var("ifp1",1):�var("imgx",width%):�var("imgy",height%):�unpack("RENDER") � =�
=�
ݤpic_AIM
� Makes AIM image
*+width%=256:height%=256:� Set resolution
4"�set(width%,height%,256,Mode%)
>/�allocate_std(width%,width%,width%,0) � =�
H�new_image(0) � =�
R1�greypal(InPal%(),8,1):� Palette is 256 greys
\C�image_info("AIM",width%,height%,1,8,Mode%,"","",Flen%,256*256)
fP�var("imgx",width%):�var("imgy",height%):�var("ifp1",0):�unpack("AIM") � =�
p=�
z
�
ݤpic_SUN
�� Makes SUN image
�Zmagic%=�iwb:�magic%<>&59A66A95 � �error(-1,"This is no standard SUN raster file !"):=�
�<width%=�iwb:height%=�iwb:colbits%=�iwb:� Read resolution
�Flength%=�iwb:type%=�iwb:maptype%=�iwb:maplength%=�iwb:� Extra info
�O�type%>2 � �error(-1,"I can only read uncompressed or RLE Sun images !"):=�
�+colours%=2^colbits%:� Number of colours
�Ȏ colbits% �
�, � 1,8 : �(maptype%<>1)�(maplength%=0) �
�m �colbits%>1 � �error(-1,"This SUN image file contains no palette ! I will use a greyscale.")
�. �greypal(InPal%(),colbits%,1)
�s � InPal%()=0:� i%=1 � 3:� c%=1 � maplength%�3:InPal%(c%)=(InPal%(c%)<<8)+�ib:�:�:InPal%(0)=colbits%
� �
L : �error(-1,"I can only read 1- and 8-bit per pixel Sun images !"):=�
�
'�set(width%,height%,colours%,Mode%)
$>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
.�new_image(0) � =�
8.�type%=2 � compr$="Run length" � compr$=""
Bp�image_info("SUN",width%,height%,0,colbits%,Mode%,compr$,"",Flen%-32-maplength%,(width%*height%*colbits%)�8)
Lo�var("ifp1",32+maplength%):�var("imgx",width%):�var("imgy",height%):�var("comp",type%):�unpack("SUN") � =�
V=�
`
j
ݤpic_PCX
t� Makes PCX image
~.man%=�ib:� Manufacture code (should be 10)
�>�man%<>10 � �error(-1,"This is no standard PCX file !"):=�
�)version%=�ib:� Version code (0/2/3/5)
�Dencoding%=�ib:� Encoding code (0-none, 1-PCX runlength encoding)
�0bits%=�ib:� Bits per 'pixel' (1-EGA, 8-MCGA)
�Hwxmin%=�idl:wymin%=�idl:wxmax%=�idl:wymax%=�idl:� Window coordinates
�Iwidth%=wxmax%-wxmin%+1:height%=wymax%-wymin%+1:� Resolution in pixels
�"�iskip(F1%,4):� Skip Hres/Vres
�InPal%()=0:� Clear palette
�B�read24pal(F1%,InPal%(),16,0,1,2,3):� Read colourmap in header
�&�iskip(F1%,1):� Skip reserved byte
�planes%=�ib:� Colourplanes
�"linelen%=�idl:� Bytes per line
�� roundlen%=((width%*bits%+7)DIV8):IFroundlen%<>linelen% THEN width%=linelen%*8/bits%:REM Correct width if window and linelength data conflict
+pixbits%=bits%*planes%:� Bits per pixel
��(pixbits%=1) � (pixbits%=2) � (pixbits%=4) � (pixbits%=8) � �error(-1,"I cannot handle "+�(2^pixbits%)+" colour EGA PCX files !"):=�
+colours%=2^pixbits%:� Number of colours
(A�iptr(F1%,�ilen(F1%)-769):code%=�ib:� Try end-769 for palette
2�code%<>12 �
<\ �allocate(B_infile%,1024) � �error(-1,"I have no room for the input file buffer !"):=�
F �var("ifp1",128):�var("totl",linelen%*planes%*height%):�var("comp",encoding%):�unpack_phase("PCX",2):� Get (packed) length
PD len%=�var("pakl"):�iptr(F1%,128+len%):� Go to end of image data
Z= code%=�ib:� Get code (12 indicates palette info follows)
d�
n9�code%=12 � �read24pal(F1%,InPal%(),colours%,0,1,2,3)
x.grey=�:� Flag to indicate forced greyscale
���bits%=8 � �code%<>12 � �error(-1,"I cannot find the palette in this 256-colour PCX image ! I will use a greyscale."):grey=�
�}�grey � �Ǝ(InPal%())=0 � �error(-1,"I cannot find a decent palette in this PCX image ! I will use a greyscale."):grey=�
�>�grey � �greypal(InPal%(),pixbits%,1) � InPal%(0)=pixbits%
�y�(pixbits%=1)�(pixbits%=8) � size%=0 � size%=(width%*pixbits%+7)�8:� Intermediate pixel data buffer for 'planed' data
�'�set(width%,height%,colours%,Mode%)
�B�allocate_std(width%,(width%*pixbits%+7)�8,width%,size%) � =�
��new_image(0) � =�
�2�encoding%=1 � compr$="Run length" � compr$=""
�f�image_info("PCX",width%,height%,0,pixbits%,Mode%,compr$,"",Flen%-128,(width%*height%*pixbits%)�8)
��var("ifp1",128):�var("imgx",width%):�var("imgy",height%):�var("comp",encoding%):�var("line",linelen%):�unpack("PCX") � =�
�=�
�
�ݤpic_TIFF
� Makes TIFF image
(headbytes%=2:� Count bytes in header
-id$=�istring(F1%,2):� TIFF identification
"Ȏ id$ �
,5 � "II" : Ttype%=0:� Set low-to-high type of data
65 � "MM" : Ttype%=1:� Set high-to-low type of data
@2 : �error(-1,"This is not a TIFF file !"):=�
J�
T+version%=�tiff(3):� TIFF version number
^P�version%<>42 � �error(-1,"I cannot handle this TIFF version's images !"):=�
h+offFIFD%=�tiff(4):� Offset to first IFD
r)�iptr(F1%,offFIFD%):� Go to first IFD
|-entries%=�tiff(3):� Number of IFD entries
�%InPal%()=0:pal=�:� No palette yet
�qrowsperstrip%=-1:bits%=1:compression%=1:planar%=1:fillorder%=1:greyunit%=3:pixsamples%=1:softw$="":� Defaults
�� e%=1 � entries%
�@tag%=�tiff(3):type%=�tiff(3):length%=�tiff(4):� Tag and info
���length%>1 � value%=�tiff(4) � �type%=1 � value%=�tiff(1):�iskip(F1%,3) � �type%=3 � value%=�tiff(3):�iskip(F1%,2) � value%=�tiff(4):� Read value
�8cptr%=�iptr(F1%):� Remember current position in file
�
Ȏ tag% �
� � 256 : width%=value%
� � 257 : height%=value%
� � 258 : �length%=1 �
� bits%=value%
�n � �iptr(F1%,value%):p%=�tiff(type%):s%=2:ok=�:ȕ s%<=length%:ok=ok � (�tiff(type%)=p%):s%+=1:�
�\ �ok � �error(-1,"I cannot handle unequal bits per sample plane TIFF !"):=�
2 �iptr(F1%,cptr%):bits%=p%*length%
�
� 259 : compression%=value%
& � 262 : photometric%=value%
0 � 266 : fillorder%=value%
:l � 273 : �allocate(B_stroff%,4+length%*4) � �error(-1,"I have no room for the TIFF strip offsets !"):=�
D� stroff%=Buffer%(B_stroff%,0):!stroff%=length%:�length%=1 � stroff%!4=value% � �iptr(F1%,value%):p%=stroff%+4:� s%=1 � length%:!p%=�tiff(type%):p%+=4:�:�iptr(F1%,cptr%)
N � 277 : pixsamples%=value%
X! � 278 : rowsperstrip%=value%
b � 284 : planar%=value%
l � 290 : greyunit%=value%
v� � 291 : �iptr(F1%,value%):div%=2*10^greyunit%:� g%=1 � length%:c%=�tiff(type%)*255:i%=c%/div%:InPal%(g%)=i%+(i%<<8)+(i%<<16):�:pal=�:�iptr(F1%,cptr%)
�C � 305 : �iptr(F1%,value%):softw$=�tiff(type%):�iptr(F1%,cptr%)
�� � 320 : �iptr(F1%,value%):InPal%()=0:� p%=1 � 3:� c%=1 � length%�3:v%=�tiff(type%):InPal%(c%)=(InPal%(c%)<<8)+(v%>>8):�:�:pal=�:�iptr(F1%,cptr%)
��
��
�-�rowsperstrip%=-1 � rowsperstrip%=height%
�Ȏ compression% �
� � 1 : compr$=""
� � 32773 : compr$="Packbits"
� � 5 : compr$="LZW"
�P : �error(-1,"I cannot handle TIFF compression #"+�(compression%)+" !"):=�
��
��((pixsamples%=1)�((bits%=1)�(bits%=2)�(bits%=4)�(bits%=8))) � ((bits%=24)�(pixsamples%=3)) � �error(-1,"I can only handle TIFF images with 1,2,4,8 or 24 bits per pixel !"):=�
�T�planar%<>1 � �error(-1,"I cannot handle TIFF images with multiple planes !"):=�
!pInPal%(0)=bits%:�pal � �bits%>8 � �photometric%=0 � �greypal(InPal%(),bits%,-1) � �greypal(InPal%(),bits%,1)
!p�bits%=24 � colours%=256:size1%=width%*4:size2%=0 � colours%=2^bits%:size1%=(width%*bits%+7)�8:size2%=width%
!'�set(width%,height%,colours%,Mode%)
! Ȏ compression% �
!*$ � 1 : size3%=0:� No temp buffer
!4. � 32773 : size3%=1024:� Small temp buffer
!>G � 5 : size3%=((width%*bits%+7)�8)*rowsperstrip%:� Temp for 1 strip
!Hp �allocate(B_lzwtable%,32*1024) � �error(-1,"I have no room for the LZW decompression table !"):=�
!R�
!\4�allocate_std(width%,size1%,size2%,size3%) � =�
!f�new_image(0) � =�
!p>�bits%=24 � code%=2 � �photometric%<=1 � code%=1 � code%=0
!z/�softw$<>"" � softw$=�"Made by "+softw$,25)
!�p�image_info("TIFF",width%,height%,code%,bits%,Mode%,compr$,softw$,Flen%-headbytes%,(width%*height%*bits%)�8)
!���var("ifp1",stroff%!4):�var("imgx",width%):�var("imgy",height%):�var("rops",rowsperstrip%):�var("bito",fillorder%):�var("comp",compression%):�unpack("TIFF") � =�
!�=�
!�
!�ݤtiff(type%)
!�� Returns tiff data type
!�� i$,b%
!�Ȏ type% �
!� � 1 : headbytes%+=1:=�ib
!�G � 2 : i$="":b%=�ib:ȕ b%<>0:i$+=�b%:b%=�ib:�:headbytes%+=�i$+1:=i$
!�2 � 3 : headbytes%+=2:�Ttype%=0 � =�idl � =�idb
!�2 � 4 : headbytes%+=4:�Ttype%=0 � =�iwl � =�iwb
!�
� 5 : =0
"�
"=0
"
"$
ݤpic_QRT
".� Makes QRT image
"8.width%=�idl:height%=�idl:� Read resolution
"B"�set(width%,height%,256,Mode%)
"L3�allocate_std(width%,width%*4,0,width%*3) � =�
"V�new_image(0) � =�
"`.InPal%(0)=24:� No palette, pure 24-bit RGB
"j>�image_info("QRT RAW",width%,height%,2,24,Mode%,"","",1,1)
"tP�var("ifp1",4):�var("imgx",width%):�var("imgy",height%):�unpack("QRT") � =�
"~=�
"�
"�ݤpic_ARVIS
"�� Makes ArVis image
"�g�iptr(F1%,4):�iptr(F1%,�iwl-4):�iskip(F1%,16):width%=�iwl*4+4:height%=�iwl+1:� Get width and height
"���iskip(F1%,8):�iskip(F1%,�iwl-36):�iptr(F2%,4):�iptr(F2%,�iwlf(F2%)-4):�iskip(F2%,32):�iskip(F2%,�iwlf(F2%)-36):� Go to sprite data
"�-colbits%=15:colours%=2^colbits%:� Colours
"�"�set(width%,height%,256,Mode%)
"�3�allocate_std(width%,width%*4,0,width%*2) � =�
"��new_image(0) � =�
"�.InPal%(0)=15:� No palette, pure 15-bit RGB
"�<�image_info("ArVis",width%,height%,2,15,Mode%,"","",1,1)
"�s�var("ifp1",�iptr(F1%)):�var("ifp2",�iptr(F2%)):�var("imgx",width%):�var("imgy",height%):�unpack("ARVIS") � =�
# =�
#
#ݤpic_CLEAR
#� Makes Clear image
#(?maker$=�istring(F1%,-1):version%=�iwl:� Creator information
#2<width%=�iwl:height%=�iwl:bits%=�iwl:� Width, height, bpp
#<T�bits%<=8 � colbits%=bits%:�read24pal(F1%,InPal%(),2^bits%,0,1,2,3) � colbits%=8
#F$InPal%(0)=bits%:� Bits per pixel
#P-�bits%<=8 � size%=width% � size%=width%*4
#Z)�set(width%,height%,2^colbits%,Mode%)
#d)�allocate_std(width%,size%,0,0) � =�
#n�new_image(0) � =�
#x}�image_info("Clear",width%,height%,code%,bits%,Mode%,"","by "+maker$+" "+�(version%�100)+"."+�"0"+�(version%�100),2),1,1)
#�[�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�unpack("CLEAR") � =�
#�=�
#�
#�
ݤpic_MTV
#�� Makes MTV image
#�9size$=�istring(F1%,-1):� String containing resolution
#�=width%=�size$:height%=�(�size$,�size$," "))):� Resolution
#�"�set(width%,height%,256,Mode%)
#�,�allocate_std(width%,width%*4,0,0) � =�
#��new_image(0) � =�
#�.InPal%(0)=24:� No palette, pure 24-bit RGB
#�:�image_info("MTV",width%,height%,2,24,Mode%,"","",1,1)
#�Y�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�unpack("MTV") � =�
$=�
$
$ݤpic_CADSOFT
$"� Makes Cadsoft image
$,B�iptr(F1%,9):width%=(�idl+2)/2:height%=(�idl+2)/2:� Resolution
$65�iptr(F1%,26):compression%=�ib:� Compression code
$@{�iptr(F1%,512):InPal%()=0:InPal%(0)=8:� rgb%=16 � 0 � -8:� c%=1 � 256:InPal%(c%)=InPal%(c%) � (�ib<<rgb%):�:�:� Palette
$J"�set(width%,height%,256,Mode%)
$T*�allocate_std(width%,width%,0,0) � =�
$^�new_image(0) � =�
$h5�compression%=2 � compr$="Run length" � compr$=""
$rW�image_info("CadSoft",width%,height%,0,8,Mode%,compr$,"",Flen%-&600,width%*height%)
$|q�var("ifp1",&600):�var("imgx",width%):�var("imgy",height%):�var("comp",compression%):�unpack("CADSOFT") � =�
$�=�
$�
$�ݤpic_IRLAM
$�� Makes Irlam image
$�Did$=�istring(F1%,-1):p%=�id$,":"):� String containing image info
$�3width%=��id$,p%+1):height%=��id$,p%+2+��width%)
$�"�set(width%,height%,256,Mode%)
$�3�allocate_std(width%,width%*4,0,width%*3) � =�
$��new_image(0) � =�
$�.InPal%(0)=24:� No palette, pure 24-bit RGB
$�<�image_info("Irlam",width%,height%,2,24,Mode%,"","",1,1)
$�[�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�unpack("IRLAM") � =�
$�=�
%
%
ݤpic_BMP
%!� Makes BMP (Windows 3) image
%&1�iptr(F1%,18):width%=�iwl:height%=�iwl:� Size
%0/�iptr(F1%,28):colbits%=�ib:� Bits per pixel
%:��(colbits%=1)�(colbits%=2)�(colbits%=4)�(colbits%=8) � �error(-1,"I can only handle 1,2,4 or 8 bit per pixel BMP images ! This is "+�colbits%+" bpp."):=�
%D9rowbytes%=(colbits%*width%+7)�8:� Bytes per pixel row
%N=�iptr(F1%,54):�read24pal(F1%,InPal%(),2^colbits%,2,1,0,4)
%XInPal%(0)=colbits%
%b)�set(width%,height%,2^colbits%,Mode%)
%l2�allocate_std(width%,rowbytes%,width%,0) � =�
%v�new_image(0) � =�
%�J�image_info("Windows 3 BMP",width%,height%,0,colbits%,Mode%,"","",1,1)
%�Y�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�unpack("BMP") � =�
%�=�
%�
%�ݤpic_TARGA
%�"� Makes Truevision TARGA image
%�Didlen%=�ib:colmaptype%=�ib:� Length of ID string, colourmap type
%�imagetype%=�ib:� Image type
%�?index%=�idl:length%=�idl:� Colourmap first index & #indices
%�#cmapsize%=�ib:� Bits per colour
%�&xorg%=�idl:xorg%=�idl:� X/Y origin
%�,width%=�idl:height%=�idl:� Size of image
%�4pixbits%=�ib:flags%=�ib:� Bits per pixel & flags
&'�iskip(F1%,idlen%):� Skip ID string
&Efattr%=flags%�&0F:flips%=(flags%�&30)>>4:� Attributes, flip-flags
&-fleave%=(flags%�&C0)>>6:� Interleave code
& b�pixbits%>8 � �colmaptype%<>0 � �error(-1,"I cannot handle >8 bit TARGA with colourmaps !"):=�
&*D�fleave%<>0 � �error(-1,"I cannot handle interlaced TARGA !"):=�
&4 InPal%()=0:� Clear colourmap
&>�colmaptype%<>0 �
&H# � c%=index%+1 � index%+length%
&R Ȏ cmapsize% �
&\1 � 8 : i%=�ib:InPal%(c%)=i% � i%<<8 � i%<<16
&fO � 15,16 : i%=�idl:InPal%(c%)=((i%�&7C00)<<9)+((i%�&3E0)<<6)+((i%�&1F)<<3)
&p � 24 : InPal%(c%)=�itl
&z& � 32 : InPal%(c%)=�iwl � &FFFFFF
&� �
&� �
&�� �greypal(InPal%(),8,1)
&��
&�'InPal%(0)=pixbits%:� Bits per pixel
&�?rle=(imagetype%>=9)�(imagetype%<=11):� Run length encoded ?
&�l�pixbits%>8 � code%=2:size2%=width%*4 � size2%=width%:�(cmapsize%=8)�(colmaptype%=0) � code%=1 � code%=0
&�"�set(width%,height%,256,Mode%)
&�/�allocate_std(width%,size2%,0,size2%) � =�
&��new_image(room%) � =�
&�*�rle � compr$="Run length" � compr$=""
&�~�image_info("Truevision TARGA",width%,height%,code%,pixbits%,Mode%,compr$,"",Flen%-�iptr(F1%),(width%*height%*pixbits%)�8)
&���var("ordr",flips%):�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�var("comp",rle):�unpack("TARGA") � =�
'=�
'
'ݤpic_PBMPLUS
'$� Makes PBMPLUS image
'.3type$=�istring(F1%,2):�pbm_white:� PBMPLUS type
'8$type%=�(�type$,2)):� Type number
'B=width%=�pbm_decval:height%=�pbm_decval:� Width and height
'LȎ type% �
'V0 � 1,4 : code%=1:maxval%=-1:bpp%=1:� Bilevel
'`A �greypal(InPal%(),1,-1):� Bilevel palette (0=white,1=black)
'j+ � 2,5 : maxval%=�pbm_decval:� Max grey
'tJ �maxval%>255 � �error(-1,"I cannot read >256-level grey PBMPLUS"):=�
'~> code%=1:bpp%=�colstobpp(1+maxval%):� Grey, calculate bpp
'�q InPal%(0)=bpp%:step=255/maxval%:v=0:� c%=0 � maxval%:v%=�v:InPal%(c%+1)=v%�v%<<8�v%<<16:v+=step:�:� Palette
'�, � 3,6 : maxval%=�pbm_decval:� Max r/g/b
'�I �maxval%>255 � �error(-1,"I cannot read >256-level RGB PBMPLUS"):=�
'�. code%=2:bpc%=�colstobpp(1+maxval%):� RGB
'�$ �bpc%<3 � bpp%=9 � bpp%=3*bpc%
'�[ InPal%(0)=bpp%:step=255/maxval%:v=0:� c%=0 � maxval%:pbmint%?c%=�v:v+=step:�:� Intmap
'��
'�T�type%<=3 � �pbm_white � c%=�ib:�(c%=32)�(c%=9)�(c%=10)�(c%=13) � �iskip(F1%,-1)
'�L�bpp%>8 � rowbytes%=4*width%:colbits%=8 � rowbytes%=width%:colbits%=bpp%
'�)�set(width%,height%,2^colbits%,Mode%)
'�'�type%=4 � size1%=width% � size1%=0
'�2�allocate_std(width%,rowbytes%,size1%,0) � =�
( �new_image(0) � =�
(
K�image_info("PBMPLUS "+type$,width%,height%,code%,bpp%,Mode%,"","",1,1)
(��var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�var("scty",type%):�var("map1",pbmint%):�unpack("PBMPLUS") � =�
(=�
((
(2��pbm_white
(<+� Skips PBMPLUS whitespace and comments
(F� c%,ok
(Pok=�:� Exit flag
(Z�
(d0� c%=�ib:� �((c%=32)�(c%=9)�(c%=13)�(c%=10))
(n0�c%=�"#" � � c%=�ib:� (c%=13)�(c%=10) � ok=�
(x� ok
(�0�iskip(F1%,-1):� Step back to last non-white
(��
(�
(�ݤpbm_decval
(�9� Skips whitespace, returns decimal value for PBMPLUS
(�� c%,v$
(��pbm_white
(�c%=�ib:v$="":� Init
(�-ȕ (c%>=�"0")�(c%<=�"9"):v$+=�c%:c%=�ib:�
(�=�v$
(�
(�ݤpic_ZVDA
(�4� Makes Zeridajh Video Digitiser Animation image
)mid$=�istring(F1%,4):�id$<>"ZVDA" � �error(-1,"This is not a Zeridajh Video Digitiser Animation file !"):�
)>version%=�iwl:mode%=�iwl:� Version of maker & mode of pics
)+width%=�iwl:height%=�iwl:� Size of pics
)"?pictures%=�iwl:off1%=�iwl:� Number of pics, offset to first
),��(ImageNr%>0) � (ImageNr%<=pictures%) � picture%=ImageNr% � �error(-1,"This ZVDA file contains "+�(pictures%)+" images. Select '1'-'"+�(pictures%)+"' in the 'Image number' submenu !"):=�
)6$compr%=�iwl:� Compression method
)@Q�compr%<>1 � �error(-1,"I only know Bitmap compression, no #"+�(compr%)+" !")
)J,�iptr(F1%,off1%):� Skip to first picture
)T>s%=1:ȕ s%<picture%:�iskip(F1%,�iwl-4):s%+=1:�:� Go to pic
)^*complen%=�iwl:� Length of picture data
)h2colbits%=2^�mode_var(mode%,9):� Bits per pixel
)r1�greypal(InPal%(),colbits%,1):� Pics are grey
)|?rowbytes%=((colbits%*width%+63)�64)*8:� Bytes per pixel row
)�)�set(width%,height%,2^colbits%,Mode%)
)�5bitmaplen%=height%*rowbytes%�8:� Length of bitmap
)�;�allocate_std(width%,rowbytes%,width%,bitmaplen%) � =�
)��new_image(0) � =�
)���image_info("Zeridajh VDA",width%,height%,1,colbits%,Mode%,"Bitmap",�pictures%+" images (this is "+�times(picture%)+")",complen%,rowbytes%*height%)
)�p�var("ifp1",�iptr(F1%)):�var("imgx",width%):�var("imgy",height%):�var("maxc",complen%):�unpack("ZVDA") � =�
)�=�
)�
)�Y��image_info(type$,width%,height%,code%,colbits%,mode%,compr$,info$,datalen%,piclen%)
)�&� Sets information about the image
)�� factor%,w%,h%,c%,i%,id$
)�FImgW%=width%:ImgH%=height%:ImgBits%=colbits%:� Register resolution
)�$IMIfn%=Leaf$:$IMIit%=type$
*+�info$="" � $IMIin%="-" � $IMIin%=info$
*$IMIif%=�Flen%+" bytes"
*n�compr$="" � $IMIco%="None (0%)" � factor%=100-�(100*(datalen%/piclen%)):$IMIco%=compr$+" ("+�factor%+"%)"
*&,$IMIwh%=�width%+" x "+�height%+" pixels"
*0_�(width%<>SprW%)�(height%<>SprH%) � $IMIsc%="to "+�SprW%+" x "+�SprH% � $IMIsc%="Full size"
*:?$IMIbp%=�(colbits%)+"-bit "+�"colourgrey RGB",1+code%*6,6)
*DJ�mode_info(mode%,w%,h%,c%):$IMIsm%=�mode%+" ("+�w%+"x"+�h%+"x"+�c%+")"
*N�
*X
*b��new_image_window
*lA� Creates new image window of appropiate size in current mode
*v� w%
*�$�autozoom:� Auto zoom if enabled
*�@!block=win_img%:ș WGetWI%,,block:� Read window's definition
*�=!dum%=win_img%:ș WDeleteW%,,dum%:� Delete old definition
*�uw%=block+4:w%!40=0:w%!44=0:w%!48=�sprW*ZoomX:w%!52=�sprH*ZoomY:$IMWtt%=�image_title:� Rewrite work area and title
*�3ș WCreateW%,,w% � win_img%:� Create new window
*�#�Img � �open_window(win_img%,0)
*��
*�
*�ݤimage_title
*�:� Returns image window title depending on zoom factors
*�� title$
*�title$="Image":� Base
*�K�ZoomX<1 � title$+=" x/"+�(1/ZoomX) � �ZoomX>1 � title$+=" x*"+�(ZoomX)
+K�ZoomY<1 � title$+=" y/"+�(1/ZoomY) � �ZoomY>1 � title$+=" y*"+�(ZoomY)
+=title$+" "+InFile$
+
+ ��set(w%,h%,c%,� m%)
+*K� Some presetting : determines mode, sets deferred scaling, sets outpix
+4A� Given are width, height, colours of image, returned is mode
+>2m%=�mode(w%,h%,c%):� Return most suitable mode
+H!OutMode%=m%:� Set output mode
+R@�DivIsInX � XDiv%=w%:� Select Xin as XDiv (deferred scaling)
+\$�DivIsInY � YDiv%=h%:� Idem YDiv
+fF�XMul%<=XDiv% � OutX%=w%*XMul%/XDiv% � OutX%=�ceil(w%*XMul%/XDiv%)
+pF�YMul%<=YDiv% � OutY%=h%*YMul%/YDiv% � OutY%=�ceil(h%*YMul%/YDiv%)
+z�
+�
+�ݤnew_image(room%)
+�� Allocates image sprite
+�A� There are at least room% bytes from sprite start to 'lomem'
+�-� Returns TRUE if all is well, else FALSE
+�?� colbits%,bits%,bitsrot%,words%,wordsrot%,sizeup%,sizerot%
+�$� datasize%,sptr%,sprdoff%,size%
+�Gxres%=OutX%:yres%=OutY%:mode%=OutMode%:� Output image size and mode
+�`�(yres%<=0)�(xres%<=0) � �error(-1,"There are no pixels left with the current scaling !"):=�
+�2colbits%=2^�mode_var(mode%,9):� Bits per pixel
+�?bits%=xres%*colbits%:bitsrot%=yres%*colbits%:� Bits per row
+�Cwords%=(bits%+31)>>5:wordsrot%=(bitsrot%+31)>>5:� Words per row
+�Fsizeup%=words%*yres%<<2:sizerot%=wordsrot%*xres%<<2:� Sprite sizes
,Kdatasize%=�max(sizeup%,sizerot%):� Maximum sprite size (normal/rotated)
,8datasize%=�max(datasize%,room%):� More room needed ?
,X�allocate(B_area%,16) � �error(-1,"I have no room for the sprite area header !"):=�
,$:sprdoff%=44:� Offset to sprite data/sprite header size
,.a�allocate(B_sprite%,sprdoff%) � �error(-1,"I have no room for the image sprite header !"):=�
,8��allocate(B_sprimg%,datasize%) � �error(-1,"I have no room to store this image ! I need at least "+�((Short%+1023)�1024)+"K more !"):=�
,B6�datasize%<room% � size%=room%-datasize% � size%=0
,L��allocate(B_imgtop%,size%) � �error(-1,"I have no room to process this image ! I need at least "+�((Short%+1023)�1024)+"K more !"):=�
,VJSprTop%=Buffer%(B_imgtop%,0)+Buffer%(B_imgtop%,1):� End of sprite room
,`�Sprite%=Buffer%(B_area%,0):!Sprite%=Buffer%(B_area%,1)+Buffer%(B_sprite%,1)+Buffer%(B_sprimg%,1):Sprite%!4=1:Sprite%!8=16:Sprite%!12=Sprite%!8+sprdoff%+sizeup%:� Init sprite area
,j0sptr%=Buffer%(B_sprite%,0):� Start of sprite
,t4SprEnd%=sptr%+sprdoff%+datasize%:� End of sprite
,~3!sptr%=sprdoff%+sizeup%:� Offset to next sprite
,�0$(sptr%+4)=ImageSpr$+�12,�0):� Sprite's name
,�(sptr%!16=words%-1:� Width in words-1
,�,sptr%!20=yres%-1:� Height in scanlines-1
,�=sptr%!24=0:sptr%!28=31-(words%*32-bits%):� Start/end bits
,�Dsptr%!32=sprdoff%:sptr%!36=sptr%!32:� Offset to sprite data/mask
,�#sptr%!40=mode%:� Mode of sprite
,�Hș "Translator_WriteWords",sptr%+sprdoff%,0,sizeup%>>2:� Wipe sprite
,�(�var("rowl",words%<<2):� Module info
,�'�var("outb",colbits%):� Module info
,�-�var("spri",sptr%+sptr%!32):� Module info
,�JSprColbits%=colbits%:SprPtr%=sptr%:SprMode%=mode%:� Global sprite info
,�DSprW%=xres%:SprH%=yres%:� Remember sprite's resolution in pixels
- =�
-
-��deallocate
-� Deallocates all buffers
-(&Buffer%()=0:� Wipe all buffer info
-2GStore%=�align(Heap%):Free%=HeapSize%:� Deallocate all storage space
-<�
-F
-Pݤallocate(nr%,bytes%)
-Z@� Allocates bytes% bytes to buffer number nr% (word-aligned)
-d+� Returns TRUE if succesful, else FALSE
-nq�(bytes%<0)�(bytes%>16*1024*1024) � �error(-1,"Are you NUTS ?"):Short%=999999*1024:=�:� Enormous amount asked
-x&bytes%=�align(bytes%):� Word-align
-�*�Free%<bytes% � Short%=bytes%-Free%:=�
-�ABuffer%(nr%,0)=Store%:Buffer%(nr%,1)=bytes%:� Allocate buffer
-�:Store%+=bytes%:Free%-=bytes%:� Deallocate storage used
-�=�
-�
-�4ݤallocate_std(width%,pixbuf1%,pixval%,pixbuf2%)
-�6� Allocates standard buffers (pixel buffers, etc.)
-�� times%
-�Z�allocate(B_pixbuf1%,pixbuf1%) � �error(-1,"I have no room for pixel buffer #1 !"):=�
-�]�allocate(B_pixval%,pixval%) � �error(-1,"I have no room for a pixel value buffer !"):=�
-�Z�allocate(B_pixbuf2%,pixbuf2%) � �error(-1,"I have no room for pixel buffer #2 !"):=�
-��XMul%<>XDiv% �
-�� �allocate(B_pixscaled%,�max(pixbuf1%,pixval%)*�ceil(XMul%/XDiv%)) � �error(-1,"I have no room for the scaled pixel buffer !"):=�
.�
.�ErrSpread=2 �
.& �BlackWhite � times%=1 � times%=4
."� �allocate(B_fserr%,(width%+2)*times%*4*�ceil(XMul%/XDiv%)) � �error(-1,"I have no room for Floyd Steinberg error spreading !"):=�
.,�
.6=�
.@
.J
��hour_on
.T� Turns hourglass on
.^ș "Hourglass_On"
.h�
.r
.|��hour_off
.�� Turns hourglass off
.�ș "Hourglass_Off"
.��
.�
.���edit_part(size,part)
.�7� Edits image size and part (if enabled with flags)
.�C� Returns with (scaled) image in graphics window ready for save
.�A� _%,ox%,oy%,x%,y%,but%,x1%,x2%,y1%,y2%,xs%,ys%,sizex%,sizey%
.�"� sprW%,sprH%,ptr$,r0,r1,r2,r3
.�!pointer=512:pointer!4=0:pointer!8=16:pointer!12=16:ptr$="ptr":ș "OS_SpriteOp",15+256,pointer,ptr$,0,32,32,8:� Initialise pointer sprite area
.�ș OSSpop%,60+256,pointer,ptr$,0 � r0,r1,r2,r3:� 0,124:�0,3:�1,0,-32:�0,0,32:�1,40,0:�0,-40,0:�1,60,-30:�0,-60,26:�1,60,-30:ș OSSpop%,r0,r1,r2,r3:� Plot arrow in pointer sprite
.�?�24,0;0;ScrW%;ScrH%;:� Whole screen window for image sprite
.�:sprW%=�sprW:sprH%=�sprH:� True OS size of image sprite
/,xs%=2^�mode_var(�,4):� X coordinate step
/,ys%=2^�mode_var(�,5):� Y coordinate step
/>�ScrW%>sprW% � sizex%=sprW% � sizex%=ScrW%:� Initial width
/&?�ScrH%>sprH% � sizey%=sprH% � sizey%=ScrH%:� Initial height
/0K!arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH%:� Initial scaling
/:/�:�plot_image(0,0,0,arg%):� Initial display
/D�size �
/N? ȗ ȓ 0,0,ScrW%-xs%,ScrH%-ys%:� Restrict pointer to screen
/X6 ox%=sizex%-xs%:oy%=sizey%-ys%:� 'Old' coordinates
/b0 ȗ � ox%,oy%:� Pointer to upper left corner
/l? � �rmouse(_%,_%,but%):� but%=0:� Wait for buttons released
/v( � �value_ptr(sizex%�xs%,sizey%�ys%)
/�: � �rmouse(x%,y%,but%):� (x%<>ox%)�(y%<>oy%)�(but%<>0)
/� �but%=0 �
/�> �oy%>y% � � 0,y%:� 103,�max(x%,ox%),oy%:� Wipe Y-portion
/�> �ox%>x% � � x%,0:� 103,ox%,�max(y%,oy%):� Wipe X-portion
/�: sizex%=x%+xs%:sizey%=y%+ys%:� True scaled image size
/�; !arg%=sizex%:arg%!4=sizey%:arg%!8=sprW%:arg%!12=sprH%
/� �plot_image(0,0,0,arg%)
/�. ox%=x%:oy%=y%:� Remember old coordinates
/� �
/� � but%<>0
/�6 ș "OS_CLI","Pointer 1":� Restore default pointer
/��
/��part �
0> � �mouse(_%,_%,but%):� but%=0:� Wait for buttons released
0@ ȗ ȓ 0,0,sizex%-xs%,sizey%-ys%:� Restrict pointer to image
0< ȗ � 0,sizey%-ys%:� Mouse to top right of scaled sprite
0 8 � �rmouse(x1%,y2%,but%):�value_ptr(x1%�xs%,y2%�ys%)
0*# � but%<>0:� Get top left point
04> � �mouse(_%,_%,but%):� but%=0:� Wait for buttons released
0>, x2%=x1%:y1%=y2%:� Initial window corner
0H> ȗ ȓ x1%,0,sizex%-xs%-x1%,y2%:� Trap mouse to down/right
0R3 ș WSetCol%,(4<<4)+0:� Invert colour on screen
0\A ox%=x2%:oy%=y1%:ȓ x1%,y1%,x2%-x1%,y2%-y1%:� First rectangle
0f � �rmouse(x2%,y1%,but%)
0p0 �value_ptr((x2%-x1%)�xs%+1,(y2%-y1%)�ys%+1)
0z �(x2%<>ox%)�(y1%<>oy%) �
0�5 ȓ x1%,oy%,ox%-x1%,y2%-oy%:� Wipe old rectangle
0�0 ȓ x1%,y1%,x2%-x1%,y2%-y1%:� New rectangle
0�* ox%=x2%:oy%=y1%:� Old mouse position
0� �
0�* � but%<>0:� Until second button press
0�B ȗ ȓ 0,0,ScrW%,ScrH%:� Reset mouse rectangle to whole screen
0�0 ȓ x1%,y1%,x2%-x1%,y2%-y1%:� Wipe rectangle
0�" � 0,0:� Wipe surrounding area
0�: _%=x1%-xs%:�_%>=0 � � 103,_%,1024-ys% � � _%,1024-ys%
0�= _%=y2%+ys%:�_%<ScrH% � � 103,1280-xs%,_% � � 1280-xs%,_%
0�/ _%=x2%+xs%:�_%<ScrW% � � 103,_%,0 � � _%,0
0�8 _%=y1%-ys%:�_%>=0 � � 103,x1%-xs%,_% � � x1%-xs%,_%
0�6 ș "OS_CLI","Pointer 1":� Restore default pointer
1E� x1%=0:y1%=0:x2%=sizex%-xs%:y2%=sizey%-ys%:� Whole sprite window
1�
1&�24,x1%;y1%;x2%;y2%;:� Clip window
1$�
1.
18��rmouse(� x%,� y%,� but%)
1BJ� Returns mouse coordinates and buttons, rounded to exact pixel coords
1L$�mouse(x%,y%,but%):� Mouse state
1V*x%-=x% � xs%:y%-=y% � ys%:� Round down
1`�
1j
1t��value_ptr(val1%,val2%)
1~� Puts values in pointer
1�Eș OSSpop%,60+256,pointer,ptr$,0 � r0,r1,r2,r3:� Output to sprite
1�w�129:�2:�0,2);�" "+�val1%,4)'�" "+�val2%,4);:ș OSSpop%,36+256,pointer,ptr$,%0000010:� Print values and define
1�5ș OSSpop%,r0,r1,r2,r3:� Restore output to screen
1��
1�
1���main_menu
1�� Creates main menu
1�� x%,y%
1�!�setmenu:� Set flags and data
1�3�mouse(x%,y%,_%):�From%=2 � y%+=24 � y%=96+6*40
1�0menu1=menumain%:ș WCreateM%,,menu1,x%-64,y%
1��
2
2
��setmenu
25� Writes current flags and icon data to main menu
2
� Main
2(�ifl(ipTrImageinfo,0,�Img)
22�ifl(ipTrManipulate,0,�Img)
2<�ifl(ipTrExamine,0,�Img)
2F� Main.Pop up
2P!�ifl(ipPoAutomode,AutoMode,0)
2Z#�ifl(ipPoAutopalette,AutoPal,0)
2d!�ifl(ipPoAutozoom,AutoZoom,0)
2n!�ifl(ipPoViewmode,ViewMode,0)
2x+�ifl(ipPoModeset,(ModeSet>0),�AutoMode)
2�� Main.Pop up.Mode set
2� �ifl(ipMoNone,(ModeSet=0),0)
2�"�ifl(ipMoNormal,(ModeSet=1),0)
2�%�ifl(ipMoMultisync,(ModeSet=2),0)
2��ifl(ipMoums,(ModeSet=3),0)
2��ida(idMoums,�ums)
2�� Main.Process
2�%�ifl(ipPrClearoutput,ClearFile,0)
2�7�ifl(ipPrScaling,((XMul%<>XDiv%)�(YMul%<>YDiv%)),0)
2�� Main.Process.Colour
2�(�ifl(ipCoBlackandwhite,BlackWhite,0)
2�"�ifl(ipCoCorrectgamma,Gamma,0)
2�"�ifl(ipCoCorrectblack,Black,0)
3!�ifl(ipCoExpandrange,Range,0)
3#�ifl(ipCoInvertRGB,InvertRGB,0)
3 � Main.Process.Sprite output
3")�ifl(ipSpOutputpalette,0,(OutMode=1))
3,-�ifl(ipSpErrorspreading,(ErrSpread<>0),0)
36�ifl(ipSpZigzag,ZigZag,0)
3@� Main.Process.Scaling
3J �ifl(ipScx,(XMul%<>XDiv%),0)
3T �ifl(ipScy,(YMul%<>YDiv%),0)
3^� Main.Process.Misc
3h'�ifl(ipMiScreenblanking,Blanking,0)
3r�ifl(ipMiGIFscan,GIFScan,0)
3|"�ifl(ipMiPercentage,Percent,0)
3�'� Main.Process.Colour.Correct gamma
3��ida(idGagam,�(GammaF))
3�'� Main.Process.Colour.Correct black
3��ida(idBlbla,�(BlackF))
3�0� Main.Process.Sprite output.Error spreading
3�$�ifl(ipSpSimple,(ErrSpread=1),0)
3�,�ifl(ipSpFloydSteinberg,(ErrSpread=2),0)
3�!�ifl(ipSpOff,(ErrSpread=0),0)
3�,� Main.Process.Sprite output.Output mode
3� �ifl(ipMoAuto,(OutMode=1),0)
3�#�ifl(ipMoCurrent,(OutMode=2),0)
3�/� Main.Process.Sprite output.Output palette
3�"�ifl(ipPaCurrent,(OutPal=1),0)
4"�ifl(ipPaDefault,(OutPal=2),0)
4$�ifl(ipPaGreyscale,(OutPal=3),0)
4� Main.Process.Scaling.x
4&6d$=�(XMul%)+":":�DivIsInX � d$+="x" � d$+=�(XDiv%)
40�ida(idXxsc,d$)
4:� Main.Process.Scaling.y
4D6d$=�(YMul%)+":":�DivIsInY � d$+="y" � d$+=�(YDiv%)
4N�ida(idYysc,d$)
4X$� Main.Process.Misc.Image number
4b�ida(idNunum,�(ImageNr%))
4l� Main.Examine.Zoom
4v(�ifl(ipZo11,((ZoomX=1)�(ZoomY=1)),0)
4�� Main.Misc
4�!�ifl(ipMiImagepalette,0,�Img)
4�� Main.Misc.Save
4��ifl(ipSaFull,0,�Img)
4��ifl(ipSaWhole,0,�Img)
4��ifl(ipSaPart,0,�Img)
4� �ifl(ipSaWholescaled,0,�Img)
4��ifl(ipSaPartscaled,0,�Img)
4�&�ifl(ipSaIncludepalette,SavePal,0)
4�%�ifl(ipSaSameleafname,SameLeaf,0)
4��
4�
4���ifl(fl%,t%,d%)
5� Sets menu icon flags
5t%=-(t%<>0):d%=-(d%<>0)
5!fl%=((!fl%)��1)+t%:� Tick
5 .fl%!8=((fl%!8)��(1<<22))+(d%<<22):� Shaded
5*�
54
5>��ida(dp%,d$)
5H� Sets menu icon data
5R$dp%=d$
5\�
5f
5p��set_mode(mode%)
5z2� Sets new mode (if enabled) for image display
5�� log2bpp%
5�>�AutoMode � �set_trans:�:� Auto mode selection not enabled
5�)log2bpp%=�mode_var(mode%,9):� Log2BPP
5�Ȏ ModeSet �
5�4 � 0 : � No mode set : no change of display mode
5�: � 1 : mode%=��" 0 81215",log2bpp%*2+1,2):� Normal set
5�= � 2 : mode%=��"18192021",log2bpp%*2+1,2):� Multisync set
5�4 � 3 : mode%=UserModeSet%(log2bpp%+1):� User set
5��
5�}�MultiSync � �(mode%>=18)�(mode%<=28) � mode%=�(�"0008121515002400081215",(mode%-18)*2+1,2)):� Map to non-multisync mode
5�%�mode_change(mode%):� Select mode
5��
5�
6��mode_change(mode%)
6)� Mode has changed or select new mode
6)� If mode%>=0, mode mode% is selected
6$J� _%,xwind%,ywind%,othermode,colours%,pos%,altmode$,modecols%,sprcols%
6.3ș WReadP%,,wimppal:� Read current WIMP palette
68�(mode%>=0) � (mode%<>�) �
6B" ș WSetM%,mode%:� Change mode
6L �mode%<>� �
6VG � 1,-10,180,1:� Alert user that 'ideal' mode couldn't be selected
6`: colours%=2^(2^�mode_var(mode%,9)):� Colours required
6j� �colours%=2 � altmode$="|1800" � �colours%=4 � altmode$="|1908|0801" � �colours%=16 � altmode$="|2012|1612|1209" � �colours%=256 � altmode$="|2115|2415|1513|1310"
6t �
6~� ��=mode% � pos%=�altmode$,"|"+�"0"+�mode%,2)):�pos%>0 � mode%=�(�altmode$,pos%+3)) � �error(-1,"I failed to select the ideal mode, nor any alternative mode ! Now you try it !"):mode%=-1
6�# ș WSetM%,mode%:� Change mode
6� � (�=mode%) � (mode%<0)
6� �
6��
6�@othermode=(�<>CurrMode%):CurrMode%=�:� Mode other than old ?
6�AXeig%=�mode_var(�,4):Yeig%=�mode_var(�,5):� Read X/YEigFactor
6�4Xstep%=2^Xeig%:Ystep%=2^Yeig%:� Coordinate steps
6�Bxwind%=�mode_var(�,11)+1:ywind%=�mode_var(�,12)+1:� Resolution
6�AScrW%=(1<<Xeig%)*xwind%:ScrH%=(1<<Yeig%)*ywind%:� Screen size
6�
�Img �
6�+ �set_trans:� Re-set sprite translation
6�A �AutoPal � �set_palette(1):� Select image palette if enabled
7 # �othermode � �new_image_window
7
�
7�
7
7(��set_trans
72C� Sets translation factors (transtab & palette) for sprite plot
7<!� mc%,sc%,v%,c%,gv%,gi%,i%,p%
7F<mc%=2^(2^�log2BPP):sc%=2^SprColbits%:� Colours available
7PGShowPal%()=ImgPal%():ShowPal%(0)=2^ShowPal%(0):� Copy image palette
7Z%�mc%=sc% � TransTabId=�:�:� Ideal
7d%TransTabId=�:� Always translation
7n�mc%>sc% �
7x: �mc%<=16 � � c%=0 � sc%-1:transtab%?c%=c%�(mc%-1):�:�
7�; ș "Translator_Palette",8,dum%,2:� Get default palette
7�4 �stdpal(ShowPal%(),8):� Show in default palette
7�^ � c%=0 � sc%-1:ș "Translator_ClosestToRGB",ImgPal%(c%+1),256,dum% � v%:transtab%?c%=v%:�
7�1� � Less colours than required, so compromise
7�
�hour_on
7�r �FreqCalc � ș "Translator_PixelFreq",SprPtr%,freq%:FreqCalc=�:� Calculate pixel frequencies in image sprite
7�� p1%=freq%:p2%=dum%:pc%=0:� c%=0 � sc%-1:f%=!p1%:p1%+=4:�f%>0 � !p2%=ImgPal%(c%+1)�&F0F0F0:p2%!4=f%:p2%+=8:pc%+=1:transtab%?c%=1:� � transtab%?c%=0:�
7�: ș "Translator_Heckbert",dum%,pc%,mc% � p1%,p2%,used%
7Ҋ � c%=1 � used%:ShowPal%(c%)=(!p1%)�&F0F0F0:p1%+=4:�:ShowPal%(0)=used%:� c%=0 � sc%-1:�transtab%?c%=1 � transtab%?c%=!p2%:p2%+=4:� � �
7� �hour_off
7��
7��
7�
8��autozoom
83� Adjust zoom factor for auto zoom (if enabled)
8� _%
8"�AutoZoom �
8,7 _%=�sprW*ZoomX:ȕ _%>ScrW%:ZoomX=ZoomX/2:_%=_%/2:�
866 �ZoomX<1 � ȕ _%*2<=ScrW%:ZoomX=ZoomX*2:_%=_%*2:�
8@7 _%=�sprH*ZoomY:ȕ _%>ScrH%:ZoomY=ZoomY/2:_%=_%/2:�
8J6 �ZoomY<1 � ȕ _%*2<=ScrH%:ZoomY=ZoomY*2:_%=_%*2:�
8T�
8^�
8h
8r#��plot_image(x%,y%,act%,scale%)
8|/� Plots image sprite with translation table
8��TransTabId � ș OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale% � ș OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale%,transtab%
8��
8�
8�ݤunpack(type$)
8�+� Unpacks image (final unpacking phase)
8�-� Returns TRUE if all is well, else FALSE
8�>� c%,bpp%,pc%,b%,gf,bf,min%,max%,rgb%,s%,v%,sub%,mul,r%,g%
8� � rm%,gm%,bm%,i,ri,gi,bi,Out
8�o�Free%>2*1024 � �allocate(B_infile%,Free%-16) � �error(-1,"I have no room for the input file buffer !"):=�
8�)bpp%=InPal%(0):� Bits per pixel input
8�4�var("inbi",bpp%):� Input (image) bits per pixel
8�&�var("bwhi",BlackWhite):� B/w flag
8�1�var("espr",ErrSpread):� Error spreading flag
9&�var("zigz",ZigZag):� Zig zag flag
9#�var("clfh",0):� No Clear (yet)
9=�var("outx",OutX%):�var("outy",OutY%):� Output resolution
9&=�var("ymul",YMul%):�var("ydiv",YDiv%):� Scaling factors Y
90=�var("xmul",XMul%):�var("xdiv",XDiv%):� Scaling factors X
9:o�Percent � �Blanking � �var("perc",1):�var("pinc",(100<<16)/ImgH%) � �var("perc",0):� Hourglass percentage
9D8� Set palette (if relevant, i.e. not pure RGB input)
9N?�bpp%<=8 � � c%=0 � 2^bpp%-1:palrgb%!(c%<<2)=InPal%(c%+1):�
9Xf� b%=0 � 31:buffer%!(b%*8)=Buffer%(b%,0):buffer%!(b%*8+4)=Buffer%(b%,1):�:� Buffer locations/sizes
9b9�OutMode=1 � pc%=0 � pc%=OutPal:� Select palette code
9l<� Build R/G/B intensity map for gamma/invert/rgbbits/b&w
9v:�Gamma � �GammaF>0 � gf=1/GammaF � gf=0:� Gamma factor
9�=�Black � �BlackF<>0 � bf=BlackF � bf=0:� Black correction
9��Range � (bpp%<=8) �
9� �bpp%<=8 �
9�� min%=256:max%=0:� c%=0 � 2^bpp%-1:rgb%=InPal%(c%+1):� s%=1 � 3:v%=rgb%�&FF:rgb%=rgb%>>8:min%=�min(min%,v%):max%=�max(max%,v%):�:�
9�? � ș "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap%
9�7 �unpack_phase(type$,3):� Gather info on RGB range
9�A min%=�var("inmi"):max%=�var("inma"):� Get min/max intensity
9� �
9�= sub%=min%:mul=255/(max%-min%):� Range correction factors
9�5 RangeMin%=min%:RangeMax%=max%:� Remember min/max
9�\ $IMIrn%=�(RangeMin%)+"-"+�(RangeMax%)+" ("+�(�((max%-min%)/2.55))+"%)":� Set range info
9� RangeI=�:� Info present
9� � RangeI=�:$IMIrn%="Unknown"
:�
:vr%=(RGBbits%>>16)�&FF:g%=(RGBbits%>>8)�&FF:b%=RGBbits%�&FF:v%=&FF00:rm%=v%>>r%:gm%=v%>>g%:bm%=v%>>b%:� R/G/B masks
:4rg=0.300:gg=0.586:bg=0.114:� Greyvalues of R/G/B
: � c%=0 � 255
:*#�Range � i=(c%-sub%)*mul � i=c%
:4.�bf=0 � i=i+bf:�i<0 � i=0 � �i>255 � i=255
:>%�gf>0 � �i>0 � i=((i/255)^gf)*255
:H�InvertRGB � i=255-i
:R$ri=i � rm%:gi=i � gm%:bi=i � bm%
:\,�BlackWhite � ri=ri*rg:gi=gi*gg:bi=bi*bg
:f'intmap%!(c%<<2)=(ri<<16)+(gi<<8)+bi
:p�
:zDGreyRgb=(bpp%>8) � BlackWhite:� Flag to indicate grey RGB output
:�Hș "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap% � ,truepal%
:�tImgPal%()=0:ImgPal%(0)=SprColbits%:� c%=0 � 2^SprColbits%-1:ImgPal%(c%+1)=palrgb%!(c%<<2):�:� Read image palette
:��ClearFile �
:�( Out=�(ClearSave$):� Open Clear file
:�k �ostring(Out,"Translator"):�obf(Out,0):�owlf(Out,tversion%):�owlf(Out,OutX%):�owlf(Out,OutY%):� Header
:�z �GreyRgb � �owlf(Out,8):� c%=0 � 255:�otlf(Out,c%�c%<<8�c%<<16):� � �owlf(Out,ImgBits%):� Bpp and greypal if grey RGB
:�q �ImgBits%<=8 � � c%=0 � 2^ImgBits%-1:rgb%=truepal%!(c%<<2):�otbf(Out,rgb%):�:� Set palette to 'true' palette
:�^ �var("clfh",Out):�var("clfp",�#Out):�var("clgr",GreyRgb):� Inform clear writer on outfile
:�5 bytes%=OutX%*OutY%:�ImgBits%>8 � bytes%=3*bytes%
:ސ ș "XOS_Args",6,Out,bytes%+�#Out � ;f%:�f%�1 � �#Out:ClearFile=�:ș "OS_File",6,ClearSave$:�error(-1,"No room for Clear file on disc !"):=�
:� � �var("clfh",0):� Clear off
:��
:�7�unpack_phase(type$,1):� Execute final unpack phase
;�ClearFile �
;� ClearFile=�:�#Out:�var("clfh")=0 � ș "OS_File",6,ClearSave$:�error(-1,"Error during output to Clear file : "+�string(�var("erro")+4)):� Remove Clear file if error
;�
;$=�
;.
;8 ��unpack_phase(type$,phase%)
;B5� Executes unpack phase, blanks screen if enabled
;L-�var("phas",phase%):� Set unpacking phase
;V+$dum%=�type$+" ",4):� Type to unpack
;`=�Blanking � ș "Translator_VideoDMA",0:� Blank if enabled
;j7ș "Translator_Unpack",!dum%:� Execute unpack phase
;tA�Blanking � ș "Translator_VideoDMA",1:� Re-enable if blanked
;~?�phase%<>1 � result%=0 � result%=�var("resu"):� Result code
;�Ȏ result% �
;� � 0 : � All OK
;�V � 1,2,3 : �error(-1,"File is too short ! Image may be corrupted !"):� Out of data
;�n � 16 : �error(-1,"Error in TIFF file : strip(s) missing ! Image may be corrupted !"):� Out of TIFF strips
;�c : �error(-1,"Some mysterious error #"+�result%+"occured ! Image may be corrupted !"):� Huh ?
;��
;��
;�
;���set_palette(palette%)
;�*� Sets a palette according to palette%
;�� 0 - Desktop palette
;�.� 1 - Image's own palette (when possible)
<