Home » Archimedes archive » Micro User » MU 1991-08.adf » PD-Stuff » Grafix/!Translatr/!RunImage
Grafix/!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-08.adf » PD-Stuff |
| Filename: | Grafix/!Translatr/!RunImage |
| Read OK: | ✔ |
| File size: | 1563A bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >!RunImage
20REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG
30REM Converts foreign graphics files to Archimedes
40REM Version date : Sat,16 Mar 1991.18:36:55
50REM LEN 1991 Zeridajh software
60REM by John Kortink
70REMLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOGLOG
80ON ERROR MODE0:PRINT'"Error"''"'";REPORT$;"' (code ";ERL;")"'':END
90tversion%=636: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% 2048,transtab% 256,Buffer%(32,1)
140DIM buffer% 32*8,freq% 1024,palrgb% 1024,hambas% 64
150DIM outpal% 1024,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
210LowHimem%=Heap%+LowHeap%:REM Lowest pseudo HIMEM
220IFHeapSize%<LowHeap% THEN ERROR 1,"No room to start up Translator"
230HIMEM=MidHimem%:REM Lower himem to below sprite buffer
240PROCinitialise:REM Initialise application
250PROCmode_change(-1):REM Reselect current mode to tidy up
260Lname$=FNOSvar("Translator$File"):IFLname$<>"" THEN SYS "OS_CLI","Unset Translator$File":Ltype%=FNimage_type(Lname$,TRUE):IFLtype%>0 THEN ActLoad=TRUE
270ON ERROR PROCerror(ERR,REPORT$+" (code "+STR$ERL+")"):PROCiclose
280REM Poll and action
290IFDataLoadRef% THEN pollmask%=48 ELSE pollmask%=49:REM No nulls if wasted
300CASE FNpoll(pollmask%) OF
310 WHEN 0 : PROCnull
320 WHEN 1 : PROCredraw
330 WHEN 2 : PROCopen
340 WHEN 3 : PROCclose
350 IFKill THEN
360 Kill=FALSE:REM Reset flag
370 END=LowHimem%:REM Image killed, memory back to minimum
380 PROCnew_slot:HIMEM=MidHimem%:REM New slotsize
390 ENDIF
400 WHEN 6 : PROCmouseclick
410 WHEN 7 : PROCdragdrop
420 WHEN 8 : PROCkey
430 WHEN 9 : PROCmenuselect
440 WHEN 17,18 : PROCmessage
450ENDCASE
460CASE TRUE OF
470 WHEN ActLoad : REM Load new image
480 ActLoad=FALSE:REM Reset flag
490 END=&1000000:PROCnew_slot:HIMEM=MidHimem%:REM Claim
500 Loaded=FNload(Ltype%,Lname$):REM Attempt to load image
510 IFImg THEN END=(SprEnd%+1023)ANDNOT1023 ELSE END=MidHimem%:REM Return
520 PROCnew_slot:HIMEM=MidHimem%:REM New slotsize
530 IFLoaded THEN
540 PROCset_mode(ImgMode%):REM Select image mode
550 ZoomX=1:ZoomY=1:REM Reset zoom factors
560 IFAutoPal THEN PROCset_palette(1):REM Select image palette if enabled
570 PROCnew_image_window:REM Open window on image
580 ENDIF
590 WHEN ActRotate : REM Rotate image
600 ActRotate=FALSE:REM Reset flag
610 END=&1000000:REM Claim
620 PROChour_on:REM Hourglass on
630 PROCvar("rotb",SprEnd%):PROCvar("rots",HIMEM-SprEnd%):REM Set buffer
640 SYS "Translator_Rotate",SprPtr%:REM Rotate sprite
650 END=(SprEnd%+1023)ANDNOT1023:REM Return
660 PROChour_off:REM Hourglass off
670 Sprite%!12=Sprite%!8+!(Sprite%+Sprite%!8):SWAP SprH%,SprW%
680 PROCnew_image_window:PROCnew_window(win_img%):REM New image window
690ENDCASE
700GOTO 280:REM Sorry, I have to. Current BASIC restrictions with END=.
710
720DEFPROCnew_slot
730REM Slot changed, reset info
740HeapSize%=HIMEM-MidHimem%:REM New size of heap
750ENDPROC
760
770DEFPROCmenuselect
780ActRotate=FALSE:REM Flag returned to rotate image
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 "Reload last","Next image","Previous image" : REM Reloaders
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%:ActLoad=TRUE ELSE PROCerror(-1,"Load an image file first !")
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 ActRotate=TRUE:REM Set rotate flag
1720 WHEN "Mirror" : REM Mirror image
1730 PROCvar("imgx",SprW%):PROCvar("imgy",SprH%):REM Module info
1740 PROChour_on:REM Hourglass on
1750 IFselect3$="x" THEN SYS "Translator_MirrorX",SprPtr% ELSE SYS "Translator_MirrorY",SprPtr%:REM Mirror sprite
1760 PROChour_off:REM Hourglass 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 "Save" : REM Save whole or part of image
2050 CASE select3$ OF
2060 WHEN "Include palette" : SavePal=NOTSavePal
2070 WHEN "Same leafname" : SameLeaf=NOTSameLeaf
2080 OTHERWISE : SaveKind$=select3$:REM Remember type of save
2090 $SAVfn%=SaveSpr$:$SAVsn%="file_ff9":REM Set file window for sprite
2100 PROCopen_window(win_file%,-1):REM Open file window
2110 SYS WSetCa%,win_file%,1,,,-1,LEN(SaveSpr$)
2120 ENDCASE
2130 WHEN "Image palette" : REM Select image palette
2140 PROCset_palette(1)
2150 WHEN "Status" : REM Manipulate defaults
2160 CASE select3$ OF
2170 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
2180 PRINT#Status,ZigZag,ViewMode,OutMode,OutPal,Percent,GammaF,Gamma,BlackF,Black,Range,SameLeaf:CLOSE#Status
2190 WHEN "Load" : IFFNload_status ELSE PROCerror(-1,"I cannot find my status file ! Have you saved one ?")
2200 WHEN "Kill" : SYS "OS_File",6,"<Translator$Dir>.Status"
2210 ENDCASE
2220 ENDCASE
2230ENDCASE
2240SYS WGetPI%,,block:REM Get pointer info
2250IF((block!8)AND1)>0 THEN PROCmain_menu:REM Adjust -> re-open
2260ENDPROC
2270
2280DEFPROCclose
2290Kill=FALSE:REM Flag returned : image killed
2300win%=poll!0:REM Window handle
2310PROCclose_window(win%):REM Close window
2320CASE win% OF
2330 WHEN win_img% : PROCinvalidate_image:PROCset_palette(0)
2340 PROCclose_window(win_file%)
2350 PROCclose_window(win_zoom%):ZoomWin=FALSE
2360 IFViewMode THEN PROCmode_change(PreMode)
2370 Kill=TRUE
2380 WHEN win_zoom% : ZoomWin=FALSE
2390ENDCASE
2400ENDPROC
2410
2420DEFPROCopen
2430PROCopen_window(0,poll)
2440ENDPROC
2450
2460DEFPROCredraw
2470PROCredraw_window(poll!0,FALSE)
2480ENDPROC
2490
2500DEFPROCnull
2510IFDataLoadRef% THEN
2520 DataLoadRef%=FALSE:SYS "OS_File",6,Save$:REM Delete file saved/created
2530 PROCerror(-1,"Bad data transfer, receiver dead"):REM No DataLoadAck
2540ENDIF
2550ENDPROC
2560
2570DEFPROCkey
2580win%=poll!0:ico%=poll!4:char%=poll!24:REM Window, icon, key pressed
2590IF(win%=win_file%) AND (ico%=1) THEN
2600 CASE char% OF
2610 WHEN 13 : REM Return pressed
2620 PROCerror(-1,"Please drag the sprite file icon to a directory viewer")
2630 WHEN 27 : REM Escape pressed
2640 PROCclose_window(win_file%)
2650 ENDCASE
2660ENDIF
2670ENDPROC
2680
2690DEFPROCmessage
2700REM Ignore messages originating from myself
2710IF(poll!4)=TaskHandle% THEN msgnr%=-1 ELSE msgnr%=poll!16
2720CASE msgnr% OF
2730 WHEN -1 : REM Don't react
2740 WHEN 0 : PROCdie:REM Request to terminate task
2750 WHEN 1 : REM DataSave, transfer via scrap file
2760 scrap$=FNOSvar("Wimp$Scrap"):REM Read scrap filename
2770 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
2780 WHEN 2 : REM DataSaveAck, save file
2790 IFpoll!12=DataSaveRef% THEN
2800 Save$=FNstring(poll+44):REM Full pathname of file to be saved/created
2810 REM Save sprite file or 'open' Clear file
2820 IF$SAVsn%="file_ff9" THEN SprSave$=Save$:PROCsave_sprite(SprSave$) ELSE ClearSave$=Save$:SYS "OS_File",11,ClearSave$,&690,0,0:ClearFile=TRUE
2830 poll!12=poll!8:poll!16=3:REM Amend data block for DataLoad
2840 SYS WSendMsg%,18,poll,poll!4:REM Send DataLoad
2850 DataLoadRef%=poll!8:REM Await a DataLoadAck, remember myref
2860 ENDIF
2870 WHEN 3,5 : REM DataLoad/Open : attempt to load
2880 type%=poll!40:name$=FNstring(poll+44):REM Filetype and filename
2890 CASE type% OF
2900 WHEN &FF9,&DE2,&DFA,&D58,&004 : IFmsgnr%=3 THEN type%=FNimage_type(name$,TRUE) ELSE type%=0
2910 OTHERWISE type%=FNimage_type(name$,(msgnr%=3))
2920 ENDCASE
2930 IFtype%>0 THEN
2940 poll!12=poll!8:poll!16=4:SYS WSendMsg%,17,poll,poll!4:REM DataLoadAck
2950 Lname$=name$:Ltype%=type%:ActLoad=TRUE:REM Pending load
2960 ELSE IFmsgnr%=3 THEN PROCerror(-1,"I don't recognize this file. Please filetype it appropiately."):REM Drag unrecognized
2970 ENDIF
2980 WHEN 4 : REM DataLoadAck, check or ignore
2990 IFDataLoadRef% THEN IFpoll!12=DataLoadRef% THEN DataLoadRef%=FALSE
3000 WHEN &400C0 : REM Submenu warning
3010 pointer%=poll!20:x%=poll!24:y%=poll!28:REM Get pointer/proposed x/y
3020 SYS WDecodeM%,,menu1,poll+32,STRING$(100," ") TO ,,,path$:REM Get path
3030 CASE path$ OF
3040 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
3050 ENDCASE
3060 WHEN &400C1 : REM Mode has changed (and it may not have been me)
3070 PROCmode_change(-1):REM Tidy up
3080ENDCASE
3090ENDPROC
3100
3110DEFPROCmouseclick
3120but%=poll!8:win%=poll!12:ico%=poll!16:REM Buttons/window/icon
3130CASE win% OF
3140 WHEN -2 : REM Click on iconbar
3150 IFico%=Iiconbar% THEN
3160 REM Iconbar icon clicked
3170 CASE but% AND 7 OF
3180 WHEN 2 : PROCmouse(x%,_%,_%):m%=menuico%
3190 $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
3200 $(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
3210 WHEN 1,4 : From%=1:PROCmain_menu
3220 ENDCASE
3230 ENDIF
3240 WHEN win_img% : REM Click on image window
3250 CASE but% AND 7 OF
3260 WHEN 2 : From%=2:PROCmain_menu
3270 OTHERWISE : REM Wandering over image, recalculate zoom window if open
3280 IFZoomWin THEN
3290 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
3300 IFZoomX<1 THEN ex%=ex%+1/ZoomX-1:REM Display correction
3310 IFZoomY<1 THEN ey%=ey%+1/ZoomY-1:REM Display correction
3320 IF(ZoomWX%<>ex%)OR(ZoomWY%<>ey%) THEN ZoomWX%=ex%:ZoomWY%=ey%:PROCredraw_window(win_zoom%,TRUE):REM If changed, redraw zoom window
3330 ENDIF
3340 ENDCASE
3350 WHEN win_zoom% : REM Click on zoom window
3360 CASE but% AND 7 OF
3370 WHEN 1 : IFZoomW>ZoomD THEN ZoomW=ZoomW-1
3380 WHEN 2 : ZoomW=ZoomD
3390 WHEN 4 : IF(ZoomW/ZoomD)<100 THEN ZoomW=ZoomW+1
3400 ENDCASE
3410 PROCredraw_window(win_zoom%,TRUE):REM Redraw zoom window
3420 WHEN win_file% : REM Click on file window
3430 IFico%=0 THEN
3440 CASE but% AND &7F OF
3450 WHEN 16,64 : REM Drag,calculate drag box and create it
3460 !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%
3470 SYS WDragB%,,block:REM Create drag box
3480 ENDCASE
3490 ENDIF
3500 WHEN win_rgbbits% : REM RGB slider manipulation
3510 !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
3520 mx%=!poll:dx%=mx%-x%-8:val%=dx% DIV 16:IFval%>8 THEN val%=8:REM Position
3530 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
3540 REM Plot slider in slider sprite
3550 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
3560 SYS OSSpop%,r0,r1,r2,r3:REM Restore VDU context
3570 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
3580ENDCASE
3590ENDPROC
3600
3610DEFPROCdragdrop
3620SYS WCreateM%,,-1:REM Close menu
3630SYS WGetPI%,,block:REM Get pointer position
3640dropwin%=block!12:dropico%=block!16:REM Window/icon where box dropped
3650save$=FNstring(SAVfn%):REM Get leafname
3660IF$SAVsn%="file_ff9" THEN SaveSpr$=save$:ft%=&FF9 ELSE SaveClear$=save$:ft%=&690:REM Remember leafname, set filetype
3670block!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
3680SYS WSendMsg%,17,block,dropwin%,dropico%:REM Send DataSave
3690DataSaveRef%=block!8:REM Remember myref for DataSave
3700PROCclose_window(win_file%):REM Close file window
3710ENDPROC
3720
3730DEFFNimage_type(name$,check)
3740REM Examines file and returns filetype <>0 if image file
3750REM If check=TRUE, contents are checked as well as filetype
3760LOCAL obj%,load%,type%,Head,id$,i%
3770SYS "OS_File",5,name$ TO obj%,,load%:REM Read file info
3780IFobj%<>1 THEN =0:REM Not a file
3790IF(load%>>>20)=&FFF THEN type%=(load%>>>8)AND&FFF ELSE type%=0
3800CASE type% OF
3810 WHEN &690,&691,&692,&693,&694,&695,&696,&697,&698,&699,&69A,&69B,&69C,&69D,&69E,&69F,&FF0,&FF9,&DE2,&DFA,&D58,&004 : REM Recognized by filetype
3820 OTHERWISE IFcheck ELSE =0
3830 Head=OPENIN(name$):REM Open file to examine contents
3840 type%=0:REM Not recognized anything (yet)
3850 id$="":FOR i%=1 TO 8:id$+=CHR$(BGET#Head):NEXT
3860 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%=&696
3870 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
3880 IFtype%<>0 ELSE IFLEFT$(id$,4)="ZVDA" THEN type%=&69F
3890 IFtype%<>0 ELSE PTR#Head=&41:id$="":FOR i%=1 TO 4:id$+=CHR$(BGET#Head):NEXT:IFid$="PNTG" THEN type%=&694
3900 IFtype%<>0 ELSE PTR#Head=&10:id$="":FOR i%=1 TO 9:id$+=CHR$(BGET#Head):NEXT:IFid$="MILLIPEDE" THEN type%=&69A
3910 CLOSE#Head:REM Close image file
3920ENDCASE
3930=type%
3940
3950DEFFNload(type%,name$)
3960REM Loads image file
3970REM Returns TRUE if succesful load, else FALSE
3980InFile$=name$:InType%=type%:REM Set file info
3990pos%=LENname$:REPEAT pos%-=1:period=(MID$(name$,pos%,1)="."):UNTIL (pos%=1) OR period:IFperiod THEN Leaf$=RIGHT$(name$,LENname$-pos%) ELSE Leaf$=name$
4000SYS "OS_File",5,name$ TO ,,,,Flen%:REM File's length
4010F1%=OPENIN(name$):d%=FNib:PROCiptr(F1%,0):REM Open file, ensure disc
4020PROCvar("fha1",F1%):PROCvar("ifp1",0):REM REM Module info
4030PROChour_on:REM Hourglass on
4040IFPercent THEN SYS "Hourglass_Percentage",0:REM Init percentage if on
4050IFwin_img%>0 THEN PROCclose_window(win_img%):REM Old image discarded
4060PROCinvalidate_image:REM New image to come, invalidate old image
4070PreMode=MODE:REM Remember current mode
4080PROCdeallocate:REM Free all memory
4090CASE type% OF
4100 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
4110 IFp%=0 THEN Ok=FNpic_ARC ELSE PROCvar("fha2",F2%):PROCvar("ifp2",0):Ok=FNpic_ARVIS:REM What's this then ?
4120 WHEN &DE2 : Ok=FNpic_PROART
4130 WHEN &DFA : Ok=FNpic_WATFORD
4140 WHEN &D58 : Ok=FNpic_RENDER
4150 WHEN &004 : Ok=FNpic_AIM
4160 WHEN &690 : Ok=FNpic_CLEAR
4170 WHEN &691 : Ok=FNpic_DEGAS
4180 WHEN &692 : Ok=FNpic_IMG
4190 WHEN &693 : Ok=FNpic_IFF
4200 WHEN &694 : Ok=FNpic_MAC
4210 WHEN &695 : Ok=FNpic_GIF
4220 WHEN &696 : Ok=FNpic_SUN
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 &FF0 : Ok=FNpic_TIFF
4330ENDCASE
4340Img=Ok:REM Image ok if all is well
4350IFImg THEN
4360 ImgMode%=Mode%
4370 IFSameLeaf THEN SaveSpr$=Leaf$
4380ENDIF
4390PROChour_off:REM Hourglass off
4400PROCiclose:REM Close input file(s)
4410=Img
4420
4430DEFPROCsave_sprite(out$)
4440REM Saves image as spritefile
4450CASE SaveKind$ OF
4460 WHEN "Full" : REM Full resolution sprite, no edit
4470 WHEN "Whole" : PROCedit_part(FALSE,FALSE)
4480 WHEN "Whole (scaled)" : PROCedit_part(TRUE,FALSE)
4490 WHEN "Part" : PROCedit_part(FALSE,TRUE)
4500 WHEN "Part (scaled)" : PROCedit_part(TRUE,TRUE)
4510ENDCASE
4520PROChour_on:REM Hourglass on
4530IFSaveKind$="Full" THEN
4540 REM Full sprite, save image with palette (optionally)
4550 Out=OPENOUT(out$):REM Open sprite file
4560 spr%=Sprite%+Sprite%!8:REM Start of sprite
4570 cols%=2^SprColbits%:REM Colours in sprite
4580 IFSavePal THEN
4590 REM Save with palette included
4600 IFcols%=256 THEN ents%=64 ELSE ents%=cols%:REM Palette entries
4610 extra%=ents%*8:REM Extra room for palette
4620 SYS "OS_GBPB",1,Out,Sprite%+4,8,0:REM Output part of control block
4630 !arg%=extra%+Sprite%!12:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4640 !arg%=extra%+!spr%:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4650 SYS "OS_GBPB",2,Out,spr%+4,28:REM Output part of sprite header
4660 !arg%=extra%+spr%!32:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4670 !arg%=extra%+spr%!36:SYS "OS_GBPB",2,Out,arg%,4:REM New offset
4680 SYS "OS_GBPB",2,Out,spr%+40,4:REM Output sprite's mode
4690 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
4700 SYS "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:REM Data
4710 ELSE REM No palette, output the whole lot
4720 SYS "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:REM Output all
4730 ENDIF
4740 CLOSE#Out:SYS "OS_CLI","SetType "+out$+" Sprite":REM Close & type
4750ELSE REM Edited part in window on screen, save it
4760 PROCinvalidate_screen:REM Screen invalid
4770 IFSavePal THEN pal%=1 ELSE pal%=0
4780 SYS OSSpop%,2,,out$,pal%:REM Save screen in window
4790 VDU24,0;0;ScrW%;ScrH%;:REM Reset screen window
4800ENDIF
4810PROChour_off:REM Hourglass off
4820ENDPROC
4830
4840DEFFNpic_DEGAS
4850REM Makes Atari Degas image (PI1/2/3,PC1/2/3)
4860compr%=FNib:res%=FNib:REM Flags, resolution (1/2/3)
4870compressed=((compr%AND%10000000)>0):REM Compressed flag
4880total%=32000:REM Total data bytes
4890CASE res% OF
4900 WHEN 0 : width%=320:height%=200:colbits%=4
4910 WHEN 1 : width%=640:height%=200:colbits%=2
4920 WHEN 2 : width%=640:height%=400:colbits%=1
4930ENDCASE
4940colours%=2^colbits%:REM Number of colours
4950PROCset(width%,height%,colours%,Mode%)
4960IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
4970IFFNnew_image(0) ELSE =FALSE
4980PROCiget(F1%,dum%,32):REM Read palette from file
4990InPal%(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
5000IFcompressed THEN compr$="Run length":type$="PC"+STR$(res%+1) ELSE compr$="":type$="PI"+STR$(res%+1)
5010PROCimage_info("Atari Degas "+type$,width%,height%,0,colbits%,Mode%,compr$,"",Flen%-34,total%)
5020PROCvar("comp",compressed):PROCvar("rest",res%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",&22):IFFNunpack("DEGAS") ELSE =FALSE
5030=TRUE
5040
5050DEFFNpic_IMG
5060REM Makes Atari IMG image
5070version%=FNidb:headlen%=FNidb:nplanes%=FNidb:REM Version, headlength, planes
5080patlen%=FNidb:pw%=FNidb:ph%=FNidb:REM Pattern length, pixel width and height
5090width%=FNidb:height%=FNidb:REM Width and height in pixels
5100colours%=2^nplanes%:REM Number of colours
5110PROCset(width%,height%,colours%,Mode%)
5120IFcolours%<>2 OR patlen%<>2 THEN PROCerror(-1,"I cannot display Atari IMG images with more than 2 colours or patternlength<>2 !"):ENDPROC
5130IFFNallocate_std(width%,(width%*nplanes%+7)DIV8,width%,0) ELSE =FALSE
5140IFFNnew_image(0) ELSE =FALSE
5150PROCgreypal(InPal%(),nplanes%,1):REM Set palette
5160PROCimage_info("Atari IMG",width%,height%,0,nplanes%,Mode%,"Several ways","",Flen%-headlen%*2,(width%*height%*nplanes%)DIV8)
5170PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",headlen%*2):IFFNunpack("IMG") ELSE =FALSE
5180=TRUE
5190
5200DEFFNpic_MAC
5210REM Makes MacIntosh MacPaint image
5220width%=576:height%=720:colbits%=1:REM Resolution
5230PROCset(width%,height%,2^colbits%,Mode%)
5240IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
5250IFFNnew_image(0) ELSE =FALSE
5260PROCgreypal(InPal%(),colbits%,1):REM Set palette
5270PROCimage_info("MacIntosh MacPaint",width%,height%,0,colbits%,Mode%,"Run length","",Flen%-640,(576*720)DIV8)
5280PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",640):IFFNunpack("MAC") ELSE =FALSE
5290=TRUE
5300
5310DEFFNpic_IFF
5320REM Makes Amiga IFF image
5330bmhd=FALSE:cmap=FALSE:body=FALSE:REM Init flags
5340ham=FALSE:lace=FALSE:hires=FALSE:halfbright=FALSE:REM Init flags
5350REM Check if this is a standard IFF picture file
5360form$=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
5370REPEAT REM Follow BMHD,CMAP and BODY headers
5380head$=FNistring(F1%,4):hlen%=FNiwb:startptr%=FNiptr(F1%)
5390CASE head$ OF
5400 WHEN "BMHD" : bmhd=TRUE:REM Bitmap header
5410 REM Read picture/screen width, height, colours, etc.
5420 width%=FNidb:height%=FNidb:PROCiskip(F1%,4):planes%=FNib:PROCiskip(F1%,1)
5430 compressed=(FNib=1):PROCiskip(F1%,5):s_width%=FNidb:s_height%=FNidb
5440 WHEN "CAMG" : flags%=FNiwb:REM Get flag bits, set flags from it
5450 ham=((flags%AND&800)>0):lace=((flags%AND&4)>0)
5460 hires=((flags%AND&8000)>0):halfbright=((flags%AND&80)>0)
5470 WHEN "CMAP" : cmap=TRUE:REM Colour map (palette)
5480 paldefs%=hlen%DIV3:REM Number of palette entries
5490 PROCread24pal(F1%,InPal%(),paldefs%,0,1,2,3)
5500 WHEN "BODY" : body=TRUE:REM Screen data
5510 REM Check if all parts are there
5520 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
5530 REM Determine suitable Archimedes screen mode
5540 IFham THEN
5550 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%)
5560 Mode%=FNmode(320,s_height%,256)
5570 IFFNallocate_std(width%,width%*4,0,width%) ELSE =FALSE
5580 ELSE colours%=2^planes%:PROCset(width%,height%,colours%,Mode%):colbits%=planes%:InPal%(0)=planes%:info$=""
5590 IFhalfbright THEN info$="Half-bright":half%=colours%DIV2:FOR c%=1 TO half%:InPal%(c%+half%)=(InPal%(c%)AND&E0E0E0)>>1:NEXT
5600 IFFNallocate_std(width%,width%,0,0) ELSE =FALSE
5610 ENDIF
5620 IFFNnew_image(0) ELSE =FALSE
5630 IFcompressed THEN compr$="Run length" ELSE compr$=""
5640 IFcolbits%>8 THEN ci%=2 ELSE ci%=0
5650 PROCimage_info("Amiga IFF",width%,height%,ci%,colbits%,Mode%,compr$,info$,Flen%-FNiptr(F1%),(width%*height%*planes%)DIV8)
5660 IFham THEN PROCvar("scty",1) ELSE PROCvar("scty",0)
5670 PROCvar("ifp1",FNiptr(F1%)):PROCvar("plan",planes%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",compressed):IFFNunpack("IFF") ELSE =FALSE
5680ENDCASE
5690IFhead$<>"BODY" THEN PROCiskip(F1%,hlen%-(FNiptr(F1%)-startptr%)):REM To next
5700UNTIL body
5710=TRUE
5720
5730DEFFNpic_GIF
5740REM Makes GIF (Graphics Interchange Format) image
5750LOCAL g_InPal%(),Pic_ptr%(),Pic_len%()
5760DIM g_InPal%(256),Pic_ptr%(256),Pic_len%(256)
5770signature$=FNistring(F1%,6):REM Read GIF signature
5780IFLEFT$(signature$,3)<>"GIF" THEN PROCerror(-1,"This screen file is not a GIF screen file !"):=FALSE
5790REM Read data in Screen Descriptor
5800r_width%=FNidl:r_height%=FNidl:REM Raster size
5810flags%=FNib:backgr%=FNib:PROCiskip(F1%,1):REM Flags and back colour
5820global=((flags%AND&80)>0):REM Global colour map following ?
5830g_pixbits%=(flags%AND7)+1:REM Global bits per pixel
5840colbits%=((flags%>>4)AND7)+1:REM Bits of colour resolution
5850IFglobal THEN
5860 REM Read Global Colour Map
5870 PROCread24pal(F1%,g_InPal%(),2^g_pixbits%,0,1,2,3)
5880 g_InPal%(0)=g_pixbits%:REM Palette entries
5890ELSE InPal%(0)=-1:REM No palette found
5900ENDIF
5910REM Scan data for pictures, make a list
5920picture%=0:REPEAT
5930PROCskip_GIF_extension:REM Skip extension blocks preceding Image
5940REM Search for next Image Descriptor
5950REPEAT _%=FNib:image=(_%=ASC","):end=(_%=ASC";"):UNTIL image OR end OR FNieof(F1%)
5960IFNOTimage THEN IFNOTend THEN PROCerror(-1,"Warning ! GIF file is not properly terminated !"):end=TRUE:PROChour_off:PROChour_on:REM Read beyond file
5970IFimage THEN
5980 REM Register picture's position
5990 picture%+=1:Pic_ptr%(picture%)=FNiptr(F1%)-1
6000 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
6010 IFGIFScan THEN
6020 REM Determine picture data length, skip data
6030 PROCiskip(F1%,1):REPEAT c%=FNib:PROCiskip(F1%,c%):UNTIL c%=0
6040 Pic_len%(picture%)=FNiptr(F1%)-Pic_ptr%(picture%)
6050 ELSE Pic_len%(picture%)=FNilen(F1%)-Pic_ptr%(picture%):end=TRUE
6060 ENDIF
6070ENDIF
6080UNTIL end
6090pictures%=picture%:REM Number of pictures found
6100IFpictures%>0 ELSE PROCerror(-1,"I cannot find any images in this GIF file !"):=FALSE
6110IFGIFScan THEN
6120 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
6130ELSE picture%=1
6140ENDIF
6150PROCiptr(F1%,Pic_ptr%(picture%)+1):len%=Pic_len%(picture%):REM Pic pos & len
6160REM Read Image Descriptor data
6170i_left%=FNidl:i_top%=FNidl:REM Position in frame
6180i_width%=FNidl:i_height%=FNidl:flags%=FNib:REM Size and flags
6190local=(flags%AND&80)>0:REM Local colour map following ?
6200ibit=(flags%AND&40)>0:REM Image stored in interlaced order ?
6210l_pixbits%=(flags%AND7)+1:REM Local bits per pixel
6220IFlocal THEN
6230 pixbits%=l_pixbits%:REM Read and use Local Colour Map palette
6240 PROCread24pal(F1%,InPal%(),2^l_pixbits%,0,1,2,3)
6250 InPal%(0)=l_pixbits%:REM Palette entries
6260ELSE pixbits%=g_pixbits%:InPal%()=g_InPal%():REM Use Global data
6270ENDIF
6280IFInPal%(0)=-1 THEN PROCerror(-1,"I cannot find a palette in this GIF file !"):=FALSE
6290colours%=2^pixbits%:REM Number of colours
6300width%=i_width%:height%=i_height%:REM True width and height
6310PROCset(width%,height%,colours%,Mode%)
6320IFFNallocate(B_lzwtable%,32*1024) ELSE PROCerror(-1,"I have no room for the LZW decompression table !"):=FALSE
6330IFFNallocate_std(width%,0,width%,0) ELSE =FALSE
6340REM Room needed for decompression data and de-interlacing
6350IFpixbits%<=2 THEN rbits%=pixbits% ELSE IFpixbits%<=4 THEN rbits%=4 ELSE rbits%=8:REM Round up bpp to sprite bpp
6360room%=(((width%*rbits%+31)>>5)<<2)*(height%+1):REM Room needed
6370IFFNnew_image(room%) ELSE =FALSE
6380IFGIFScan THEN np$=STR$pictures% ELSE np$="?"
6390PROCimage_info(signature$,width%,height%,0,pixbits%,Mode%,"LZW",np$+" pics (this is "+FNtimes(picture%)+")",len%,(height%*width%*pixbits%)DIV8)
6400IFibit THEN PROCvar("lace",1) ELSE PROCvar("lace",0)
6410PROCvar("ifp1",FNiptr(F1%)):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("GIF") ELSE =FALSE
6420=TRUE
6430
6440DEFPROCskip_GIF_extension
6450REM Skips a GIF Extension Block if present at current pointer
6460LOCAL _%
6470IF(FNib)=ASC"!" THEN
6480 PROCiskip(F1%,1):REM Skip function code
6490 REPEAT _%=FNib:PROCiskip(F1%,_%):UNTIL _%=0:REM Skip data byte blocks
6500ELSE PROCiskip(F1%,-1)
6510ENDIF
6520ENDPROC
6530
6540DEFFNpic_ARC
6550REM Loads Archimedes sprite image
6560pictures%=FNiwl:ofirst%=FNiwl:REM Number of sprites, offset to first
6570IF(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
6580PROCiskip(F1%,ofirst%-8-4):REM Start of first sprite
6590skip%=picture%-1:WHILE skip%>0:PROCiskip(F1%,FNiwl-4):skip%-=1:ENDWHILE
6600start%=FNiptr(F1%):PROCiskip(F1%,16):REM Remember start, skip offset and name
6610words%=FNiwl+1:height%=FNiwl+1:REM Width in words, height in lines
6620bfirst%=FNiwl:blast%=FNiwl:REM First/last bits used
6630oimage%=FNiwl:PROCiskip(F1%,4):sprMode%=FNiwl:REM Offset to image, mode
6640colbits%=2^FNmode_var(sprMode%,9):colours%=2^colbits%:REM Colours
6650IFcolbits%=8 THEN ents%=64 ELSE ents%=colours%
6660IFoimage%<=44 THEN
6670 PROCstdpal(InPal%(),colbits%):REM No palette, set default
6680ELSE PROCread24pal(F1%,InPal%(),ents%,1,2,3,8):InPal%(0)=colbits%:REM Read palette
6690 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
6700ENDIF
6710width%=(words%*32-bfirst%-(31-blast%)) DIV colbits%
6720IFFNavailable_mode(sprMode%) THEN Mode%=sprMode% ELSE Mode%=FNmode(width%,height%,colours%):REM Determine other mode if sprite's mode won't do
6730PROCset(width%,height%,colours%,_%)
6740IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
6750IFFNnew_image(0) ELSE =FALSE
6760PROCimage_info("Archimedes sprite",width%,height%,0,colbits%,Mode%,"",STR$pictures%+" sprites (this is "+FNtimes(picture%)+")",1,1)
6770PROCvar("ifp1",start%+oimage%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("wrds",words%):PROCvar("bfir",bfirst%):IFFNunpack("ARC") ELSE =FALSE
6780=TRUE
6790
6800DEFFNpic_PROART
6810REM Makes ProArtisan image
6820width%=640:height%=256:REM Set resolution
6830PROCset(width%,height%,256,Mode%)
6840IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
6850room%=(width%*height%+3)ANDNOT3:REM Room needed for unpack (coltable)
6860IFFNnew_image(room%) ELSE =FALSE
6870collen%=FNiwl:comflag%=FNiwl:REM Length of colour table/compression
6880coltable%=SprTop%-collen%:REM Space for colour table
6890PROCiget(F1%,coltable%,collen%):REM Read colour table
6900PROCstdpal(InPal%(),8):REM Standard 256 colour palette
6910PROCimage_info("ProArtisan",width%,height%,0,8,Mode%,"Run length","",Flen%-8,width%*height%)
6920PROCvar("ifp1",FNiptr(F1%)):PROCvar("prot",coltable%):PROCvar("comp",comflag%):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("PROART") ELSE =FALSE
6930=TRUE
6940
6950DEFFNpic_WATFORD
6960REM Makes Watford digitiser image
6970width%=512:height%=256:REM Set resolution
6980PROCset(width%,height%,256,Mode%)
6990IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7000IFFNnew_image(0) ELSE =FALSE
7010PROCgreypal(InPal%(),6,1):REM Palette is 64 greys
7020PROCimage_info("Watford digitiser",width%,height%,1,6,Mode%,"Run length","",Flen%,(width%*height%*6)DIV8)
7030PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",0):IFFNunpack("WATFORD") ELSE =FALSE
7040=TRUE
7050
7060DEFFNpic_RENDER
7070REM Makes Render Bender image
7080Mode%=FNib:REM Read image's mode
7090IFFNmode_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
7100PROCset(width%,height%,256,Mode%)
7110IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7120IFFNnew_image(0) ELSE =FALSE
7130PROCstdpal(InPal%(),8):REM Standard 256 colour palette
7140PROCimage_info("Render Bender",width%,height%,0,8,Mode%,"Run length","",Flen%-1,width%*height%)
7150PROCvar("ifp1",1):PROCvar("imgx",width%):PROCvar("imgy",height%):IFFNunpack("RENDER") ELSE =FALSE
7160=TRUE
7170
7180DEFFNpic_AIM
7190REM Makes AIM image
7200width%=256:height%=256:REM Set resolution
7210PROCset(width%,height%,256,Mode%)
7220IFFNallocate_std(width%,width%,width%,0) ELSE =FALSE
7230IFFNnew_image(0) ELSE =FALSE
7240PROCgreypal(InPal%(),8,1):REM Palette is 256 greys
7250PROCimage_info("AIM",width%,height%,1,8,Mode%,"","",Flen%,256*256)
7260PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("ifp1",0):IFFNunpack("AIM") ELSE =FALSE
7270=TRUE
7280
7290DEFFNpic_SUN
7300REM Makes SUN image
7310magic%=FNiwb:IFmagic%<>&59A66A95 THEN PROCerror(-1,"This is no standard SUN raster file !"):=FALSE
7320width%=FNiwb:height%=FNiwb:colbits%=FNiwb:REM Read resolution
7330length%=FNiwb:type%=FNiwb:maptype%=FNiwb:maplength%=FNiwb:REM Extra info
7340IFtype%>2 THEN PROCerror(-1,"I can only read uncompressed or RLE Sun images !"):=FALSE
7350colours%=2^colbits%:REM Number of colours
7360CASE colbits% OF
7370 WHEN 1,8 : IF(maptype%<>1)OR(maplength%=0) THEN
7380 IFcolbits%>1 THEN PROCerror(-1,"This SUN image file contains no palette ! I will use a greyscale.")
7390 PROCgreypal(InPal%(),colbits%,1)
7400 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%
7410 ENDIF
7420 OTHERWISE : PROCerror(-1,"I can only read 1- and 8-bit per pixel Sun images !"):=FALSE
7430ENDCASE
7440PROCset(width%,height%,colours%,Mode%)
7450IFFNallocate_std(width%,(width%*colbits%+7)DIV8,width%,0) ELSE =FALSE
7460IFFNnew_image(0) ELSE =FALSE
7470IFtype%=2 THEN compr$="Run length" ELSE compr$=""
7480PROCimage_info("SUN",width%,height%,0,colbits%,Mode%,compr$,"",Flen%-32-maplength%,(width%*height%*colbits%)DIV8)
7490PROCvar("ifp1",32+maplength%):PROCvar("imgx",width%):PROCvar("imgy",height%):PROCvar("comp",type%):IFFNunpack("SUN") ELSE =FALSE
7500=TRUE
7510
7520DEFFNpic_PCX
7530REM Makes PCX image
7540man%=FNib:REM Manufacture code (should be 10)
7550IFman%<>10 THEN PROCerror(-1,"This is no standard PCX file !"):=FALSE
7560version%=FNib:REM Version code (0/2/3/5)
7570IFversion%<5 THEN PROCerror(-1,"I cannot handle old PCX files (only version 5 and up) !"):=FALSE
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$("colour grey RGB",1+code%*8,8)
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 IFNOTFreqCalc THEN PROChour_on:SYS "Translator_PixelFreq",SprPtr%,freq%:PROChour_off:FreqCalc=TRUE:REM Calculate pixel frequencies in image sprite
14260 PROChour_on:REM Hourglass on
14270 p%=dum%:FOR c%=1 TO sc%:!p%=ImgPal%(c%):p%+=4:NEXT:REM Image's palette
14280 REM Calculate translation table and palette for display
14290 SYS "Translator_CalcTrans",sc%,freq%,dum%,mc%,transtab%,arg% TO ,,,used%
14300 p%=arg%:FOR c%=1 TO used%:ShowPal%(c%)=!p%:p%+=4:NEXT:REM Read palette
14310 ShowPal%(0)=used%:REM Colours used in display palette
14320 PROChour_off:REM Hourglass off
14330ENDIF
14340ENDPROC
14350
14360DEFPROCautozoom
14370REM Adjust zoom factor for auto zoom (if enabled)
14380LOCAL _%
14390IFAutoZoom THEN
14400 _%=FNsprW*ZoomX:WHILE _%>ScrW%:ZoomX=ZoomX/2:_%=_%/2:ENDWHILE
14410 IFZoomX<1 THEN WHILE _%*2<=ScrW%:ZoomX=ZoomX*2:_%=_%*2:ENDWHILE
14420 _%=FNsprH*ZoomY:WHILE _%>ScrH%:ZoomY=ZoomY/2:_%=_%/2:ENDWHILE
14430 IFZoomY<1 THEN WHILE _%*2<=ScrH%:ZoomY=ZoomY*2:_%=_%*2:ENDWHILE
14440ENDIF
14450ENDPROC
14460
14470DEFPROCplot_image(x%,y%,act%,scale%)
14480REM Plots image sprite with translation table
14490IFTransTabId THEN SYS OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale% ELSE SYS OSSpop%,564,Sprite%,SprPtr%,x%,y%,act%,scale%,transtab%
14500ENDPROC
14510
14520DEFFNunpack(type$)
14530REM Unpacks image (final unpacking phase)
14540REM Returns TRUE if all is well, else FALSE
14550LOCAL c%,bpp%,pc%,b%,gf,bf,min%,max%,rgb%,s%,v%,sub%,mul,r%,g%
14560LOCAL rm%,gm%,bm%,i,ri,gi,bi,Out
14570IFFree%>2*1024 THEN IFFNallocate(B_infile%,Free%-16) ELSE PROCerror(-1,"I have no room for the input file buffer !"):=FALSE
14580bpp%=InPal%(0):REM Bits per pixel input
14590PROCvar("inbi",bpp%):REM Input (image) bits per pixel
14600PROCvar("bwhi",BlackWhite):REM B/w flag
14610PROCvar("espr",ErrSpread):REM Error spreading flag
14620PROCvar("zigz",ZigZag):REM Zig zag flag
14630PROCvar("clfh",0):REM No Clear (yet)
14640PROCvar("outx",OutX%):PROCvar("outy",OutY%):REM Output resolution
14650PROCvar("ymul",YMul%):PROCvar("ydiv",YDiv%):REM Scaling factors Y
14660PROCvar("xmul",XMul%):PROCvar("xdiv",XDiv%):REM Scaling factors X
14670IFPercent THEN IFNOTBlanking THEN PROCvar("perc",1):PROCvar("pinc",(100<<16)/ImgH%) ELSE PROCvar("perc",0):REM Hourglass percentage
14680REM Set palette (if relevant, i.e. not pure RGB input)
14690IFbpp%<=8 THEN FOR c%=0 TO 2^bpp%-1:palrgb%!(c%<<2)=InPal%(c%+1):NEXT
14700FOR b%=0 TO 31:buffer%!(b%*8)=Buffer%(b%,0):buffer%!(b%*8+4)=Buffer%(b%,1):NEXT:REM Buffer locations/sizes
14710IFOutMode=1 THEN pc%=0 ELSE pc%=OutPal:REM Select palette code
14720REM Build R/G/B intensity map for gamma/invert/rgbbits/b&w
14730IFGamma THEN IFGammaF>0 THEN gf=1/GammaF ELSE gf=0:REM Gamma factor
14740IFBlack THEN IFBlackF<>0 THEN bf=BlackF ELSE bf=0:REM Black correction
14750IFRange THEN
14760 IFbpp%<=8 THEN
14770 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
14780 ELSE SYS "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap%
14790 PROCunpack_phase(type$,3):REM Gather info on RGB range
14800 min%=FNvar("inmi"):max%=FNvar("inma"):REM Get min/max intensity
14810 ENDIF
14820 sub%=min%:mul=255/(max%-min%):REM Range correction factors
14830 RangeMin%=min%:RangeMax%=max%:REM Remember min/max
14840 $IMIrn%=STR$(RangeMin%)+"-"+STR$(RangeMax%)+" ("+STR$(INT((max%-min%)/2.55))+"%)":REM Set range info
14850ELSE $IMIrn%="Unknown"
14860ENDIF
14870r%=(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
14880rg=0.300:gg=0.586:bg=0.114:REM Greyvalues of R/G/B
14890FOR c%=0 TO 255
14900IFRange THEN i=(c%-sub%)*mul ELSE i=c%
14910IFbf=0 ELSE i=i+bf:IFi<0 THEN i=0 ELSE IFi>255 THEN i=255
14920IFgf>0 THEN IFi>0 THEN i=((i/255)^gf)*255
14930IFInvertRGB THEN i=255-i
14940ri=i AND rm%:gi=i AND gm%:bi=i AND bm%
14950IFBlackWhite THEN ri=ri*rg:gi=gi*gg:bi=bi*bg
14960intmap%!(c%<<2)=(ri<<16)+(gi<<8)+bi
14970NEXT
14980GreyRgb=(bpp%>8) AND BlackWhite:REM Flag to indicate grey RGB output
14990SYS "Translator_UnpackPre",palrgb%,pc%,buffer%,32,intmap% TO ,truepal%
15000ImgPal%()=0:ImgPal%(0)=SprColbits%:FOR c%=0 TO 2^SprColbits%-1:ImgPal%(c%+1)=palrgb%!(c%<<2):NEXT:REM Read image palette
15010IFClearFile THEN
15020 Out=OPENOUT(ClearSave$):REM Open Clear file
15030 PROCostring(Out,"Translator"):PROCobf(Out,0):PROCowlf(Out,tversion%):PROCowlf(Out,OutX%):PROCowlf(Out,OutY%):REM Header
15040 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
15050 IFImgBits%<=8 THEN FOR c%=0 TO 2^ImgBits%-1:rgb%=truepal%!(c%<<2):PROCotbf(Out,rgb%):NEXT:REM Set palette to 'true' palette
15060 PROCvar("clfh",Out):PROCvar("clfp",PTR#Out):PROCvar("clgr",GreyRgb):REM Inform clear writer on outfile
15070 bytes%=OutX%*OutY%:IFImgBits%>8 THEN bytes%=3*bytes%
15080 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
15090ELSE PROCvar("clfh",0):REM Clear off
15100ENDIF
15110PROCunpack_phase(type$,1):REM Execute final unpack phase
15120IFClearFile THEN
15130 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
15140ENDIF
15150=TRUE
15160
15170DEFPROCunpack_phase(type$,phase%)
15180REM Executes unpack phase, blanks screen if enabled
15190PROCvar("phas",phase%):REM Set unpacking phase
15200$dum%=LEFT$(type$+" ",4):REM Type to unpack
15210IFBlanking THEN SYS "Translator_VideoDMA",0:REM Blank if enabled
15220SYS "Translator_Unpack",!dum%:REM Execute unpack phase
15230IFBlanking THEN SYS "Translator_VideoDMA",1:REM Re-enable if blanked
15240IFphase%<>1 THEN result%=0 ELSE result%=FNvar("resu"):REM Result code
15250CASE result% OF
15260 WHEN 0 : REM All OK
15270 WHEN 1,2,3 : PROCerror(-1,"File is too short ! Image may be corrupted !"):REM Out of data
15280 WHEN 16 : PROCerror(-1,"Error in TIFF file : strip(s) missing ! Image may be corrupted !"):REM Out of TIFF strips
15290 OTHERWISE : PROCerror(-1,"Some mysterious error #"+STR$result%+"occured ! Image may be corrupted !"):REM Huh ?
15300ENDCASE
15310ENDPROC
15320
15330DEFPROCset_palette(palette%)
15340REM Sets a palette according to palette%
15350REM 0 - Desktop palette
15360REM 1 - Image's own palette (when possible)
15370LOCAL c%
15380CASE palette% OF
15390 WHEN 0 : IFFNlog2BPP=3 THEN SYS "Translator_Palette",8,dum%,2:SYS "Translator_SetPalette",256,dum% ELSE SYS WSetP%,,wimppal
15400 WHEN 1 : FOR c%=0 TO ShowPal%(0)-1:dum%!(c%<<2)=ShowPal%(c%+1):NEXT:SYS "Translator_SetPalette",ShowPal%(0),dum%
15410ENDCASE
15420ENDPROC
15430
15440DEFPROCstdpal(RETURN Pal%(),bpp%)
15450REM Sets a palette to standard Archimedes 2,4,16 or 256 colour palette
15460LOCAL c%,p%
15470SYS "Translator_Palette",bpp%,dum%,2:REM Calculate standard palette
15480p%=dum%:REM Pointer
15490FOR c%=1 TO 2^bpp%:Pal%(c%)=!p%:p%+=4:NEXT
15500Pal%(0)=bpp%
15510ENDPROC
15520
15530DEFPROCgreypal(RETURN Pal%(),bpp%,dir%)
15540REM Sets a palette to greyscale for bpp% bits per pixel
15550REM dir%=1 gives black to white, dir%=-1 gives white to black
15560LOCAL cols%,step,i,c%
15570cols%=2^bpp%:step=255/(cols%-1):i=0
15580IFdir%=-1 THEN step=-step:i=255 ELSE i=0
15590FOR c%=1 TO 2^bpp%:Pal%(c%)=i OR i<<8 OR i<<16:i+=step:NEXT
15600Pal%(0)=bpp%
15610ENDPROC
15620
15630DEFPROCmode_info(mode%,RETURN width%,RETURN height%,RETURN colours%)
15640REM Returns information about a particular mode
15650colours%=2^(2^FNmode_var(mode%,9)):width%=1+FNmode_var(mode%,11):height%=1+FNmode_var(mode%,12):REM Return info
15660ENDPROC
15670
15680DEFPROCinvalidate_screen
15690REM Invalidates entire screen
15700SYS WForce%,-1,0,0,ScrW%,ScrH%:REM Force redraw whole screen
15710ENDPROC
15720
15730DEFPROCinvalidate_image
15740REM Invalidates image
15750Img=FALSE:FreqCalc=FALSE:REM Reset image flags
15760ENDPROC
15770
15780DEFPROCnew_window(handle%)
15790REM Redraws entire window area
15800PROCredraw_window(handle%,TRUE)
15810ENDPROC
15820
15830DEFPROCredraw_window(handle%,force)
15840REM Redraws window with handle handle%
15850REM If force=TRUE the window's entire work area is updated
15860LOCAL more%,nx%,ny%,vw%,vh%,x%,y%,ox%,oy%,z
15870LOCAL x1%,x2%,x3%,x4%,y1%,y2%,y3%,y4%,w1%,w2%,w3%,w4%,h1%,h2%,h3%,h4%
15880!block=handle%:REM Set window's handle
15890IFforce THEN block!4=0:block!8=0:block!12=&7FFF:block!16=&7FFF:SYS WUpdateW%,,block TO more% ELSE SYS WRedrawW%,,block TO more%
15900vw%=block!12+Xstep%-block!4:vh%=block!16+Ystep%-block!8:REM Visible size
15910CASE handle% OF
15920 WHEN win_img% : REM Redraw image window
15930 nx%=(block!4-block!20):ny%=(block!16-block!24):REM Work area origin
15940 IFZoomX>=1 THEN !arg%=ZoomX:arg%!8=1 ELSE !arg%=1:arg%!8=1/ZoomX
15950 IFZoomY>=1 THEN arg%!4=ZoomY:arg%!12=1 ELSE arg%!4=1:arg%!12=1/ZoomY
15960 IF(vw%<=160)OR(vh%<=160) THEN x%=block!4:y%=block!8 ELSE vw%=0
15970 WHILE more%:IFvw%>0 THEN SYS WSetCol%,0:RECTANGLE FILL x%,y%,vw%,vh%
15980 PROCplot_image(nx%,ny%,0,arg%):REM Display image sprite
15990 SYS WGetR%,,block TO more%:ENDWHILE:REM Get next rectangle
16000 WHEN win_zoom% : REM Redraw zoom window
16010 x%=block!4:y%=block!8:REM Visible area coordinates
16020 z=ZoomW/ZoomD:REM Zoom factor
16030 ox%=vw%/2-ZoomWX%*z*Xstep%:oy%=vh%/2-ZoomWY%*z*Ystep%:REM Offset
16040 nx%=SprW%*z*Xstep%:ny%=SprH%*z*Ystep%:REM Total externals
16050 w1%=0:w2%=0:w3%=0:w4%=0:REM No uncovered borders yet
16060 IFox%>0 THEN x1%=x%:y1%=y%:w1%=ox%-Xstep%:h1%=vh%
16070 IF(ox%+nx%)<vw% THEN x2%=x%+ox%+nx%:y2%=y%:w2%=vw%-(ox%+nx%):h2%=vh%
16080 IFoy%>0 THEN x3%=x%:y3%=y%:w3%=vw%:h3%=oy%-Ystep%
16090 IF(oy%+ny%)<vh% THEN x4%=x%:y4%=y%+oy%+ny%:w4%=vw%:h4%=vh%-(oy%+ny%)
16100 !arg%=ZoomW:arg%!8=ZoomD:arg%!4=ZoomW:arg%!12=ZoomD:REM Zoom factors
16110 nx%=x%+ox%:ny%=y%+oy%:REM Plot coordinates
16120 WHILE more%:IFw1%>0 THEN RECTANGLE FILL x1%,y1%,w1%,h1%
16130 IFw2%>0 THEN RECTANGLE FILL x2%,y2%,w2%,h2%
16140 IFw3%>0 THEN RECTANGLE FILL x3%,y3%,w3%,h3%
16150 IFw4%>0 THEN RECTANGLE FILL x4%,y4%,w4%,h4%
16160 PROCplot_image(nx%,ny%,0,arg%):REM Display image sprite
16170 SYS WGetR%,,block TO more%:ENDWHILE:REM Get next rectangle
16180ENDCASE
16190ENDPROC
16200
16210DEFPROCopen_window(handle%,info)
16220REM Opens window with handle handle%
16230REM If info>0 then info is ready at info, else get info, if -1 pop at top
16240LOCAL b%,px%,py%,_%,xs%,ys%
16250IFinfo>0 THEN
16260 FOR b%=0 TO 31 STEP 4:block!b%=info!b%:NEXT
16270ELSE !block=handle%:SYS WGetWS%,,block
16280 IFinfo=-1 THEN block!28=-1:REM Pop up at top if requested
16290 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
16300ENDIF
16310SYS WOpenW%,,block
16320ENDPROC
16330
16340DEFPROCclose_window(handle%)
16350REM Closes window with handle handle%
16360!block=handle%:SYS WCloseW%,,block
16370ENDPROC
16380
16390DEFFNpoll(mask%)
16400REM Returns poll reason code, masking with mask%, data at poll
16410LOCAL reasoncode
16420SYS WPoll%,mask%,poll TO reasoncode
16430=reasoncode
16440
16450DEFPROCinitialise
16460REM Initialises program
16470SYS "Wimp_ReadPalette",,wimppal:REM Read current WIMP palette
16480PROChour_on:PROCinit_module:PROChour_off:REM Initialise module
16490SYS "OS_CheckModeValid",18 TO _%:MultiSync=(_%<>-1):REM Monitor type
16500applname$="Translator":REM Name of application
16510SYS "Wimp_Initialise",200,&4B534154,applname$ TO version,TaskHandle%
16520IFversion<200 THEN ERROR 1,"I cannot work with WIMP pre-2.00"
16530W%=FNswi_to_nr("Wimp_Initialise"):REM Base SWI number
16540WCreateW%=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
16550WSetCa%=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
16560OSSpop%=FNswi_to_nr("OS_SpriteOp"):OSReadVV%=FNswi_to_nr("OS_ReadVduVariables"):OSReadMV%=FNswi_to_nr("OS_ReadModeVariable")
16570SYS WReadP%,,wimppal:REM Read current WIMP palette
16580tf%=7:tb%=2:wf%=7:wb%=0:si%=1:so%=3:REM Window/menu colours
16590!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
16600REM Load sprites for icons
16610!iconsprites=2048:iconsprites!4=0:iconsprites!8=16:iconsprites!12=16
16620SYS OSSpop%,10+256,iconsprites,"<Translator$Dir>.Sprites"
16630REM Load templates
16640SYS "Wimp_OpenTemplate",,"<Translator$Dir>.Templates"
16650ic=icondata:ie=icondend:REM Indirected icon data workspace
16660$dum%="save":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16670window!(88+24)=1:REM WIMP areaptr
16680SYS WCreateW%,,window TO win_file%
16690SAVsn%=FNiconaddr(win_file%,0):SAVfn%=FNiconaddr(win_file%,1)
16700$dum%="info":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16710SYS WCreateW%,,window TO win_info%
16720$dum%="filetypes":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16730SYS WCreateW%,,window TO win_filet%
16740$dum%="imageinfo":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16750SYS WCreateW%,,window TO win_iminfo%
16760w%=win_iminfo%:IMIfn%=FNiconaddr(w%,1):IMIit%=FNiconaddr(w%,3):IMIin%=FNiconaddr(w%,5):IMIif%=FNiconaddr(w%,7):IMIco%=FNiconaddr(w%,9)
16770IMIwh%=FNiconaddr(w%,11):IMIsc%=FNiconaddr(w%,13):IMIbp%=FNiconaddr(w%,15):IMIsm%=FNiconaddr(w%,17):IMIrn%=FNiconaddr(w%,19)
16780$dum%="rgbbits":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16790FOR i%=3 TO 5:ap%=window+88+i%*32+24:!ap%=iconsprites:NEXT:REM Areaptrs
16800SYS WCreateW%,,window TO win_rgbbits%
16810$dum%="image":IMWtt%=ic:SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16820window?35=&FF:REM Transparent background
16830SYS WCreateW%,,window TO win_img%
16840$dum%="zoom":SYS WLoadT%,,window,ic,ie,-1,dum%,0 TO ,,ic
16850SYS WCreateW%,,window TO win_zoom%
16860SYS "Wimp_CloseTemplate"
16870REM Load menu structure
16880SYS "OS_File",5,"<Translator$Dir>.MenuStruct" TO ,,,,slen%
16890DIM menustruct% slen%
16900SYS "OS_File",255,"<Translator$Dir>.MenuStruct",menustruct%
16910SYS "OS_File",5,"<Translator$Dir>.MenuData" TO ,,,,dlen%
16920DIM menudata% dlen%
16930SYS "OS_File",255,"<Translator$Dir>.MenuData",menudata%
16940FOR a%=menustruct%+4 TO a%+slen%-8 STEP 4
16950d%=!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%
16960NEXT
16970Vars=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$
16980d%=EVAL("FNcvar("+vn$+","+STR$vv%+")"):ENDWHILE:CLOSE#Vars
16990menumain%=menustruct%+!menustruct%
17000REM Init variables
17010SaveKind$="":Img=FALSE:SavePal=TRUE:ZoomX=1:ZoomY=1:ImageSpr$="image":Flen%=0:Load$="":SameLeaf=FALSE
17020DataSaveRef%=-1:DataLoadRef%=FALSE:YMul%=1:YDiv%=1:XMul%=1:XDiv%=1:ClearFile=FALSE:SaveSpr$="Image":SaveClear$="Clear":SprSave$="":ClearSave$=""
17030F1%=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
17040BlackWhite=FALSE:TransTabId=FALSE:ImgMode%=0:GIFScan=FALSE:RGBbits%=&080808:Blanking=FALSE:ZigZag=TRUE:InvertRGB=FALSE:FreqCalc=FALSE:OutMode=1:OutPal=1:InFile$="":InType%=0
17050Percent=TRUE:ActLoad=FALSE:ActRotate=FALSE:ViewMode=FALSE:PreMode=MODE:ZoomWin=FALSE:ZoomD=4:ZoomW=ZoomD:DivIsInX=FALSE:DivIsInY=FALSE
17060OutX%=1:OutY%=1:OutMode%=15:GammaF=1:Gamma=FALSE:BlackF=0:Black=FALSE:Range=FALSE:RangeMin%=0:RangeMax%=0:From%=1:GreyRgb=FALSE
17070B_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
17080IFFNload_status:REM Load default status (if any)
17090ENDPROC
17100
17110DEFFNcvar(RETURN var%,val%)
17120REM Creates new variable var%, value val%
17130var%=val%:=0
17140
17150DEFFNiconaddr(win%,ico%)
17160REM Returns indirected icon's data address
17170!block=win%:block!4=ico%:SYS WGetIS%,,block:REM Get icon info
17180=block!28
17190
17200DEFFNload_status
17210REM Loads default status (if any)
17220REM Returns TRUE if succesful, else FALSE (i.e. status file not found)
17230Status=OPENIN("<Translator$Dir>.Status"):IFStatus=0 THEN =FALSE
17240INPUT#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
17250INPUT#Status,Range,SameLeaf:CLOSE#Status
17260IFErrSpread=-1 THEN ErrSpread=1
17270=TRUE
17280
17290DEFFNums
17300REM Returns string representing current user mode set
17310=STR$(UserModeSet%(1))+","+STR$(UserModeSet%(2))+","+STR$(UserModeSet%(3))+","+STR$(UserModeSet%(4))
17320
17330DEFFNavailable_mode(mode%)
17340REM Checks if mode% is a valid WIMP mode and available on monitor
17350IFmode%=3 OR mode%=6 OR mode%=7 OR mode%=23 THEN =FALSE
17360IFmode%<0 OR mode%>28 THEN =FALSE
17370IFmode%=24 OR mode%<18 THEN =TRUE ELSE =MultiSync
17380
17390DEFFNalign(val%)
17400REM Returns next-up word aligned value of val%
17410=(val%+3)ANDNOT3
17420
17430DEFFNreadpalval(rgb%)
17440REM Returns 'OS_ReadPalette' word from &RGB value
17450=((rgb%AND&FF)<<24)+((rgb%AND&FF00)<<8)+((rgb%AND&FF0000)>>8)+&10
17460
17470DEFFNstring(addr%)
17480REM Returns CTRL-char terminated string at addr%
17490LOCAL _%,_c%,_$
17500_%=-1:REPEAT _%+=1:UNTIL addr%?_%<32
17510_c%=addr%?_%:addr%?_%=13:_$=$addr%:addr%?_%=_c%
17520=_$
17530
17540DEFFNupstring(m$)
17550REM Returns upper case m$
17560LOCAL c%,v%,u$
17570u$=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)
17580NEXT:=u$
17590
17600DEFPROCmouse(RETURN x%,RETURN y%,RETURN but%)
17610REM Returns x,y and button state of mouse
17620MOUSE x%,y%,but%
17630ENDPROC
17640
17650DEFFNlog2BPP
17660REM Returns Log2BPP for current mode
17670=FNmode_var(MODE,9)
17680
17690DEFFNcolstobpp(cols%)
17700REM Returns bits per pixel needed for cols% colours
17710IFcols%<=1 THEN =1 ELSE =FNceil(LOG(cols%)/LOG2)
17720
17730DEFFNvdu_var(varnr%)
17740REM Returns VDU variable varnr%
17750!arg%=varnr%:arg%!4=-1:SYS OSReadVV%,arg%,arg%+8:=arg%!8
17760
17770DEFFNmode_var(mode%,varnr%)
17780REM Returns mode mode% variable varnr%
17790LOCAL result%
17800SYS OSReadMV%,mode%,varnr% TO ,,result%:=result%
17810
17820DEFFNOS_var(_$)
17830REM Attempts to return OS-var's string value
17840LOCAL _r$,_l%
17850SYS "XOS_ReadVarVal",_$,STRING$(100," "),100,0,3 TO ,_r$,_l%
17860_r$=LEFT$(_r$,_l%):=_r$
17870
17880DEFFNswi_to_nr(swi$)
17890REM Returns SWI number of SWI call swi$
17900LOCAL swinr%
17910SYS "XOS_SWINumberFromString",,swi$ TO swinr%
17920=swinr%
17930
17940DEFPROCerror(errnr,errmsg$)
17950REM Handles errors
17960LOCAL but%,opt%
17970SYS "Translator_VideoDMA",1:REM Ensure video DMA enabled
17980IFerrnr=-1 THEN errnr=1:opt%=1 ELSE opt%=3
17990!err=errnr:$(err+4)=errmsg$
18000SYS "Translator_Palette",2^FNlog2BPP,dum%,1:REM Read current palette
18010PROCset_palette(0):REM Select WIMP palette
18020SYS WReport%,err,opt%,applname$ TO ,but%
18030IFbut%<>1 THEN PROCdie
18040SYS "Translator_SetPalette",2^(2^FNlog2BPP),dum%:REM Reset palette
18050ENDPROC
18060
18070DEFFNsprW
18080REM Returns image sprite's width in OS pixels in current mode
18090=SprW%*Xstep%
18100
18110DEFFNsprH
18120REM Returns image sprite's height in OS pixels in current mode
18130=SprH%*Ystep%
18140
18150DEFFNmax(v1%,v2%)
18160REM Returns maximum of v1% and v2%
18170IFv1%>v2% THEN =v1% ELSE =v2%
18180
18190DEFFNmin(v1%,v2%)
18200REM Returns minimum of v1% and v2%
18210IFv1%<v2% THEN =v1% ELSE =v2%
18220
18230DEFFNceil(v)
18240REM Returns 'ceiling' of value (i.e. round up)
18250IFv=INTv THEN =v ELSE =INTv+1
18260
18270DEFPROCdie
18280REM Tidies up and exits
18290PROCfinish:REM Tidy up
18300SYS "OS_Exit"
18310ENDPROC
18320
18330DEFPROCfinish
18340REM Tidies up
18350SYS "Translator_TaskQuit" TO tasks%:IFtasks%<=0 THEN SYS "OS_Module",4,"Translator":REM Kill module if no other tasks are using it
18360SYS WSetP%,,wimppal:REM Reset palette
18370SYS "Wimp_CloseDown",TaskHandle%,&4B534154
18380ENDPROC
18390
18400DEFFNmode(width%,height%,colours%)
18410REM Returns, if possible, a standard screen mode that is most suitable for
18420REM displaying a picture of (width%)x(height%) pixels in colours% colours
18430REM Returns -1 if number of colours greater than 256
18440LOCAL arccols%,arcwidth%,archeight%,mode%
18450IFOutMode=2 THEN =MODE
18460REM Range check for colours, width and height
18470IFcolours%>256 THEN =-1:REM Impossible !
18480REM Determine closest colours/width/height
18490IFcolours%>16 THEN arccols%=256 ELSE IFcolours%>4 THEN arccols%=16 ELSE IFcolours%>2 THEN arccols%=4 ELSE arccols%=2
18500IFwidth%>640 THEN arcwidth%=1056 ELSE IFwidth%>320 THEN arcwidth%=640 ELSE arcwidth%=320
18510IFheight%<=256 THEN archeight%=256 ELSE archeight%=512
18520CASE arccols% OF
18530 WHEN 2 : IFarcheight%=512 THEN mode%=18 ELSE mode%=0
18540 WHEN 4 : IFarcheight%=512 THEN mode%=19 ELSE IFarcwidth%<=320 THEN mode%=1 ELSE mode%=8
18550 WHEN 16 : IFarcheight%=512 THEN mode%=20 ELSE IFarcwidth%<=320 THEN mode%=9 ELSE IFarcwidth%=640 THEN mode%=12 ELSE mode%=16
18560 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
18570ENDCASE
18580=mode%
18590
18600DEFFNtimes(value%)
18610REM Returns STR$value% with 'plural extension'
18620LOCAL _d%
18630_d%=value%MOD10:REM Last digit determines extension
18640IF(((value%MOD100)DIV10)=1)OR(_d%>3)OR(_d%=0) THEN =STR$value%+"th"
18650CASE _d% OF
18660 WHEN 1 : =STR$value%+"st"
18670 WHEN 2 : =STR$value%+"nd"
18680 WHEN 3 : =STR$value%+"rd"
18690ENDCASE
18700
18710DEFPROCread24pal(fh%,RETURN Pal%(),cols%,ro%,go%,bo%,elen%)
18720REM Reads 24-bit palette from input file
18730REM Entries are cols%*elen%-byte, R,G,B at r0%/go%/bo% offsets
18740LOCAL p%,c%,m%
18750SYS "OS_GBPB",4,fh%,dum%,cols%*elen%:REM Read entire palette
18760p%=dum%:REM Pointer
18770FOR c%=1 TO cols%:Pal%(c%)=p%?ro%<<16 OR p%?go%<<8 OR p%?bo%:p%+=elen%:NEXT
18780ENDPROC
18790
18800DEFFNistring(fh%,len%)
18810REM Returns string of from file
18820REM If len%>0 the number of characters is len%
18830REM If len%=-1 the string is CTRL-character terminated
18840LOCAL _%,r$,c%
18850_$="":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
18860=r$
18870
18880DEFPROCiskip(fh%,amount%)
18890REM Skips amount% bytes in file
18900PTR#fh%=amount%+PTR#fh%
18910ENDPROC
18920
18930DEFPROCiptr(fh%,newptr%)
18940REM Sets new offset in file
18950PTR#fh%=newptr%
18960ENDPROC
18970
18980DEFFNiptr(fh%)
18990REM Returns current offset in file
19000=PTR#fh%
19010
19020DEFFNilen(fh%)
19030REM Returns length of file
19040=EXT#fh%
19050
19060DEFFNieof(fh%)
19070REM Returns end-of-file status of file
19080=EOF#fh%
19090
19100DEFPROCiclose
19110REM Closes all input files
19120IFF1%<>0 THEN SYS "XOS_Find",0,F1%:F1%=0
19130IFF2%<>0 THEN SYS "XOS_Find",0,F2%:F2%=0
19140ENDPROC
19150
19160DEFPROCiget(fh%,adr%,amount%)
19170REM Returns amount% bytes at adr% from file
19180SYS "OS_GBPB",4,fh%,adr%,amount%
19190ENDPROC
19200
19210DEFFNib:=BGET#F1%
19220DEFFNidb:=BGET#F1%<<8 OR BGET#F1%
19230DEFFNitb:=BGET#F1%<<16 OR BGET#F1%<<8 OR BGET#F1%
19240DEFFNiwb:=BGET#F1%<<24 OR BGET#F1%<<16 OR BGET#F1%<<8 OR BGET#F1%
19250DEFFNidl:=BGET#F1% OR BGET#F1%<<8
19260DEFFNitl:=BGET#F1% OR BGET#F1%<<8 OR BGET#F1%<<16
19270DEFFNiwl:=BGET#F1% OR BGET#F1%<<8 OR BGET#F1%<<16 OR BGET#F1%<<24
19280DEFFNibf(fh%):=BGET#fh%
19290DEFFNiwlf(fh%):=BGET#fh% OR BGET#fh%<<8 OR BGET#fh%<<16 OR BGET#fh%<<24
19300
19310DEFPROCobf(fh%,val%):BPUT#fh%,val%:ENDPROC
19320DEFPROCotbf(fh%,val%):BPUT#fh%,val%>>>16:BPUT#fh%,val%>>>8:BPUT#fh%,val%:ENDPROC
19330DEFPROCotlf(fh%,val%):BPUT#fh%,val%:BPUT#fh%,val%>>>8:BPUT#fh%,val%>>>16:ENDPROC
19340DEFPROCowlf(fh%,val%):BPUT#fh%,val%:BPUT#fh%,val%>>>8:BPUT#fh%,val%>>>16:BPUT#fh%,val%>>>24:ENDPROC
19350
19360DEFPROCostring(fh%,w$)
19370REM Outputs string to file
19380LOCAL i%
19390FOR i%=1 TO LENw$:BPUT#fh%,ASCMID$(w$,i%,1):NEXT
19400ENDPROC
19410
19420DEFPROCinit_module
19430REM Initialises module
19440SYS "Translator_MakeMaps":REM Initialise maps
19450SYS "Translator_TaskStart":REM Register task
19460ENDPROC
19470
19480DEFPROCvar(varname$,value%)
19490REM Writes module variable
19500$dum%=varname$:SYS "Translator_SetVariable",!dum%,value%
19510ENDPROC
19520
19530DEFFNvar(varname$)
19540REM Reads module variable
19550LOCAL value%
19560$dum%=varname$:SYS "Translator_ReadVariable",!dum% TO value%
19570=value%
19580
19590DEFFNOSvar(name$)
19600REM Attempts to return OS-var's string value
19610LOCAL _r$,_l%
19620_r$=STRING$(100," "):SYS "XOS_ReadVarVal",name$,_r$,LEN_r$,0,3 TO ,_r$,_l%
19630=LEFT$(_r$,_l%)
19640
� >!RunImage
K��������������������������������������������������������������������
3� Converts foreign graphics files to Archimedes
(-� Version date : Sat,16 Mar 1991.18:36:55
2� � 1991 Zeridajh software
<� by John Kortink
FK��������������������������������������������������������������������
P1� � �0:�'"Error"''"'";�$;"' (code ";�;")"'':�
Z-tversion%=636:� 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)
�5� arg% 1024,dum% 2048,transtab% 256,Buffer%(32,1)
�5� buffer% 32*8,freq% 1024,palrgb% 1024,hambas% 64
�+� outpal% 1024,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
�2LowHimem%=Heap%+LowHeap%:� Lowest pseudo HIMEM
�>�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 � ActLoad=�
-� � �error(�,�$+" (code "+Þ+")"):�iclose
� Poll and action
"D�DataLoadRef% � pollmask%=48 � pollmask%=49:� No nulls if wasted
,Ȏ �poll(pollmask%) �
6 � 0 : �null
@ � 1 : �redraw
J � 2 : �open
T � 3 : �close
^
�Kill �
h Kill=�:� Reset flag
r9 �=LowHimem%:� Image killed, memory back to minimum
|+ �new_slot:�=MidHimem%:� New slotsize
� �
� � 6 : �mouseclick
� � 7 : �dragdrop
� � 8 : �key
� � 9 : �menuselect
� � 17,18 : �message
��
�
Ȏ � �
�! � ActLoad : � Load new image
� ActLoad=�:� Reset flag
�. �=&1000000:�new_slot:�=MidHimem%:� Claim
�9 Loaded=�load(Ltype%,Lname$):� Attempt to load image
�: �Img � �=(SprEnd%+1023)��1023 � �=MidHimem%:� Return
* �new_slot:�=MidHimem%:� New slotsize
�Loaded �
. �set_mode(ImgMode%):� Select image mode
&+ ZoomX=1:ZoomY=1:� Reset zoom factors
0C �AutoPal � �set_palette(1):� Select image palette if enabled
:/ �new_image_window:� Open window on image
D �
N! � ActRotate : � Rotate image
X ActRotate=�:� Reset flag
b �=&1000000:� Claim
l �hour_on:� Hourglass on
v> �var("rotb",SprEnd%):�var("rots",�-SprEnd%):� Set buffer
�4 ș "Translator_Rotate",SprPtr%:� Rotate sprite
�% �=(SprEnd%+1023)��1023:� Return
� �hour_off:� Hourglass off
�> Sprite%!12=Sprite%!8+!(Sprite%+Sprite%!8):Ȕ SprH%,SprW%
�@ �new_image_window:�new_window(win_img%):� New image window
��
�D� �TXA:� Sorry, I have to. Current BASIC restrictions with END=.
�
���new_slot
�� Slot changed, reset info
�,HeapSize%=�-MidHimem%:� New size of heap
��
�
��menuselect
/ActRotate=�:� Flag returned to rotate image
?ș 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$)
6D � "Reload last","Next image","Previous image" : � Reloaders
@ Ȏ �select3$,1) �
J � "N" : ImageNr%+=1
T, � "P" : �ImageNr%>1 � ImageNr%-=1
^ �
hj �InFile$<>"" � Lname$=InFile$:Ltype%=InType%:ActLoad=� � �error(-1,"Load an image file first !")
r* � "Percentage" : Percent=�Percent
| �
� �
�, � "Manipulate" : � Manipulation options
� Ȏ select2$ �
�# � "Rotate" : � Rotate sprite
�% ActRotate=�:� Set rotate flag
�" � "Mirror" : � Mirror image
�; �var("imgx",SprW%):�var("imgy",SprH%):� Module info
� �hour_on:� Hourglass on
�i �select3$="x" � ș "Translator_MirrorX",SprPtr% � ș "Translator_MirrorY",SprPtr%:� Mirror sprite
�! �hour_off:� Hourglass 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$ �
�/ � "Save" : � Save whole or part of image
Ȏ select3$ �
/ � "Include palette" : SavePal=�SavePal
/ � "Same leafname" : SameLeaf=�SameLeaf
7 : SaveKind$=select3$:� Remember type of save
*K $SAVfn%=SaveSpr$:$SAVsn%="file_ff9":� Set file window for sprite
48 �open_window(win_file%,-1):� Open file window
>2 ș WSetCa%,win_file%,1,,,-1,�(SaveSpr$)
H �
R1 � "Image palette" : � Select image palette
\ �set_palette(1)
f) � "Status" : � Manipulate defaults
p Ȏ select3$ �
z� � "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)
$ �close_window(win_file%)
.( �close_window(win_zoom%):ZoomWin=�
8' �ViewMode � �mode_change(PreMode)
B Kill=�
L � win_zoom% : ZoomWin=�
V�
`�
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
"�(win%=win_file%) � (ico%=1) �
( Ȏ char% �
2 � 13 : � Return pressed
<J �error(-1,"Please drag the sprite file icon to a directory viewer")
F � 27 : � Escape pressed
P �close_window(win_file%)
Z �
d�
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
"@ DataLoadRef%=poll!8:� Await a DataLoadAck, remember myref
, �
6. � 3,5 : � DataLoad/Open : attempt to load
@B type%=poll!40:name$=�string(poll+44):� Filetype and filename
J Ȏ type% �
TT � &FF9,&DE2,&DFA,&D58,&004 : �msgnr%=3 � type%=�image_type(name$,�) � type%=0
^, type%=�image_type(name$,(msgnr%=3))
h �
r �type%>0 �
|I poll!12=poll!8:poll!16=4:ș WSendMsg%,17,poll,poll!4:� DataLoadAck
�9 Lname$=name$:Ltype%=type%: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
�
�
&��mouseclick
0?but%=poll!8:win%=poll!12:ico%=poll!16:� Buttons/window/icon
:
Ȏ win% �
D � -2 : � Click on iconbar
N �ico%=Iiconbar% �
X � Iconbar icon clicked
b Ȏ but% � 7 �
l* � 2 : �mouse(x%,_%,_%):m%=menuico%
v� $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
Ȏ but% � 7 �
*) � 1 : �ZoomW>ZoomD � ZoomW=ZoomW-1
4 � 2 : ZoomW=ZoomD
>/ � 4 : �(ZoomW/ZoomD)<100 � ZoomW=ZoomW+1
H �
R6 �redraw_window(win_zoom%,�):� Redraw zoom window
\) � win_file% : � Click on file window
f �ico%=0 �
p Ȏ but% � &7F �
z9 � 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
$!ș WCreateM%,,-1:� Close menu
.,ș WGetPI%,,block:� Get pointer position
8Gdropwin%=block!12:dropico%=block!16:� Window/icon where box dropped
B(save$=�string(SAVfn%):� Get leafname
Lo�$SAVsn%="file_ff9" � SaveSpr$=save$:ft%=&FF9 � SaveClear$=save$:ft%=&690:� Remember leafname, set filetype
V�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
`;ș WSendMsg%,17,block,dropwin%,dropico%:� Send DataSave
j6DataSaveRef%=block!8:� Remember myref for DataSave
t0�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,&696,&697,&698,&699,&69A,&69B,&69C,&69D,&69E,&69F,&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 � 8:id$+=�(�#Head):�
� �id$,6)="GIF87a" � type%=&695 � �(�id$,4)="FORM") � (�id$,4)="ILBM") � type%=&693 � �id$,4)=�&59+�&A6+�&6A+�&95 � type%=&696
� �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
2X �type%<>0 � �#Head=&41:id$="":� i%=1 � 4:id$+=�(�#Head):�:�id$="PNTG" � type%=&694
<] �type%<>0 � �#Head=&10:id$="":� i%=1 � 9:id$+=�(�#Head):�:�id$="MILLIPEDE" � type%=&69A
F �#Head:� Close image file
P�
Z
=type%
d
nݤload(type%,name$)
x� 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:� Hourglass on
�B�Percent � ș "Hourglass_Percentage",0:� Init percentage if on
�?�win_img%>0 � �close_window(win_img%):� Old image discarded
�?�invalidate_image:� New image to come, invalidate old image
�%PreMode=�:� Remember current mode
�!�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
, � &D58 : Ok=�pic_RENDER
6 � &004 : Ok=�pic_AIM
@ � &690 : Ok=�pic_CLEAR
J � &691 : Ok=�pic_DEGAS
T � &692 : Ok=�pic_IMG
^ � &693 : Ok=�pic_IFF
h � &694 : Ok=�pic_MAC
r � &695 : Ok=�pic_GIF
| � &696 : Ok=�pic_SUN
� � &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
� � &FF0 : Ok=�pic_TIFF
��
�$Img=Ok:� Image ok if all is well
�
�Img �
ImgMode%=Mode%
�SameLeaf � SaveSpr$=Leaf$
�
&�hour_off:� Hourglass off
0!�iclose:� Close input file(s)
:=Img
D
N��save_sprite(out$)
X� Saves image as spritefile
bȎ SaveKind$ �
l1 � "Full" : � Full resolution sprite, no edit
v � "Whole" : �edit_part(�,�)
�) � "Whole (scaled)" : �edit_part(�,�)
� � "Part" : �edit_part(�,�)
�( � "Part (scaled)" : �edit_part(�,�)
��
��hour_on:� Hourglass 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
*A ș "OS_GBPB",2,Out,spr%+4,28:� Output part of sprite header
4A !arg%=extra%+spr%!32:ș "OS_GBPB",2,Out,arg%,4:� New offset
>A !arg%=extra%+spr%!36:ș "OS_GBPB",2,Out,arg%,4:� New offset
H9 ș "OS_GBPB",2,Out,spr%+40,4:� Output sprite's mode
R� � 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
\F ș "OS_GBPB",2,Out,spr%+spr%!32,(spr%!16+1)*(spr%!20+1)*4:� Data
f) � � No palette, output the whole lot
p> ș "OS_GBPB",1,Out,Sprite%+4,Sprite%!12-4,0:� Output all
z �
�? �#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:� Hourglass 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
., � 1 : width%=640:height%=200:colbits%=2
8, � 2 : width%=640:height%=400:colbits%=1
B�
L+colours%=2^colbits%:� Number of colours
V'�set(width%,height%,colours%,Mode%)
`>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
j�new_image(0) � =�
t/�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
({�image_info("Atari IMG",width%,height%,0,nplanes%,Mode%,"Several ways","",Flen%-headlen%*2,(width%*height%*nplanes%)�8)
2Y�var("imgx",width%):�var("imgy",height%):�var("ifp1",headlen%*2):�unpack("IMG") � =�
<=�
F
P
ݤpic_MAC
Z$� Makes MacIntosh MacPaint image
d2width%=576:height%=720:colbits%=1:� Resolution
n)�set(width%,height%,2^colbits%,Mode%)
x>�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.
,K width%=�idb:height%=�idb:�iskip(F1%,4):planes%=�ib:�iskip(F1%,1)
6H compressed=(�ib=1):�iskip(F1%,5):s_width%=�idb:s_height%=�idb
@> � "CAMG" : flags%=�iwb:� Get flag bits, set flags from it
J5 ham=((flags%�&800)>0):lace=((flags%�&4)>0)
T? hires=((flags%�&8000)>0):halfbright=((flags%�&80)>0)
^- � "CMAP" : cmap=�:� Colour map (palette)
h7 paldefs%=hlen%�3:� Number of palette entries
r4 �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)
&� �var("ifp1",�iptr(F1%)):�var("plan",planes%):�var("imgx",width%):�var("imgy",height%):�var("comp",compressed):�unpack("IFF") � =�
0�
:G�head$<>"BODY" � �iskip(F1%,hlen%-(�iptr(F1%)-startptr%)):� To next
D
� body
N=�
X
b
ݤpic_GIF
l3� Makes GIF (Graphics Interchange Format) image
v&� 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:�
*?�skip_GIF_extension:� Skip extension blocks preceding Image
4&� Search for next Image Descriptor
>E� _%=�ib:image=(_%=�","):end=(_%=�";"):� image � end � �ieof(F1%)
H~�image � �end � �error(-1,"Warning ! GIF file is not properly terminated !"):end=�:�hour_off:�hour_on:� Read beyond file
R�image �
\" � Register picture's position
f0 picture%+=1:Pic_ptr%(picture%)=�iptr(F1%)-1
pk �iskip(F1%,8):_%=�ib:�(_%�&80)>0 � �iskip(F1%,3*2^((_%�7)+1)):� If there's a local colour map, skip it
z �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
.7local=(flags%�&80)>0:� Local colour map following ?
8<ibit=(flags%�&40)>0:� Image stored in interlaced order ?
B2l_pixbits%=(flags%�7)+1:� Local bits per pixel
L�local �
V@ pixbits%=l_pixbits%:� Read and use Local Colour Map palette
`2 �read24pal(F1%,InPal%(),2^l_pixbits%,0,1,2,3)
j+ InPal%(0)=l_pixbits%:� Palette entries
t?� 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") � =�
=�
(��skip_GIF_extension
2?� Skips a GIF Extension Block if present at current pointer
<� _%
F�(�ib)=�"!" �
P' �iskip(F1%,1):� Skip function code
Z; � _%=�ib:�iskip(F1%,_%):� _%=0:� Skip data byte blocks
d� �iskip(F1%,-1)
n�
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:�
,�
65width%=(words%*32-bfirst%-(31-blast%)) � colbits%
@��available_mode(sprMode%) � Mode%=sprMode% � Mode%=�mode(width%,height%,colours%):� Determine other mode if sprite's mode won't do
J$�set(width%,height%,colours%,_%)
T>�allocate_std(width%,(width%*colbits%+7)�8,width%,0) � =�
^�new_image(0) � =�
h��image_info("Archimedes sprite",width%,height%,0,colbits%,Mode%,"",�pictures%+" sprites (this is "+�times(picture%)+")",1,1)
r��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") � =�
=�
&ݤpic_WATFORD
0#� Makes Watford digitiser image
:+width%=512:height%=256:� Set resolution
D"�set(width%,height%,256,Mode%)
N/�allocate_std(width%,width%,width%,0) � =�
X�new_image(0) � =�
b0�greypal(InPal%(),6,1):� Palette is 64 greys
lh�image_info("Watford digitiser",width%,height%,1,6,Mode%,"Run length","",Flen%,(width%*height%*6)�8)
vT�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
*"�set(width%,height%,256,Mode%)
4/�allocate_std(width%,width%,width%,0) � =�
>�new_image(0) � =�
H1�greypal(InPal%(),8,1):� Palette is 256 greys
RC�image_info("AIM",width%,height%,1,8,Mode%,"","",Flen%,256*256)
\P�var("imgx",width%):�var("imgy",height%):�var("ifp1",0):�unpack("AIM") � =�
f=�
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) � =�
..�type%=2 � compr$="Run length" � compr$=""
8p�image_info("SUN",width%,height%,0,colbits%,Mode%,compr$,"",Flen%-32-maplength%,(width%*height%*colbits%)�8)
Bo�var("ifp1",32+maplength%):�var("imgx",width%):�var("imgy",height%):�var("comp",type%):�unpack("SUN") � =�
L=�
V
`
ݤpic_PCX
j� Makes PCX image
t.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)
�Y�version%<5 � �error(-1,"I cannot handle old PCX files (only version 5 and up) !"):=�
�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"
*:C$IMIbp%=�(colbits%)+"-bit "+�"colour grey RGB",1+code%*8,8)
*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�� �FreqCalc � �hour_on:ș "Translator_PixelFreq",SprPtr%,freq%:�hour_off:FreqCalc=�:� Calculate pixel frequencies in image sprite
7� �hour_on:� Hourglass on
7�C p%=dum%:� c%=1 � sc%:!p%=ImgPal%(c%):p%+=4:�:� Image's palette
7�: � Calculate translation table and palette for display
7�K ș "Translator_CalcTrans",sc%,freq%,dum%,mc%,transtab%,arg% � ,,,used%
7�C p%=arg%:� c%=1 � used%:ShowPal%(c%)=!p%:p%+=4:�:� Read palette
7�8 ShowPal%(0)=used%:� Colours used in display palette
7� �hour_off:� Hourglass off
7��
8�
8
8��autozoom
8"3� Adjust zoom factor for auto zoom (if enabled)
8,� _%
86�AutoZoom �
8@7 _%=�sprW*ZoomX:ȕ _%>ScrW%:ZoomX=ZoomX/2:_%=_%/2:�
8J6 �ZoomX<1 � ȕ _%*2<=ScrW%:ZoomX=ZoomX*2:_%=_%*2:�
8T7 _%=�sprH*ZoomY:ȕ _%>ScrH%:ZoomY=ZoomY/2:_%=_%/2:�
8^6 �ZoomY<1 � ȕ _%*2<=ScrH%:ZoomY=ZoomY*2:_%=_%*2:�
8h�
8r�
8|
8�#��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
9&�var("bwhi",BlackWhite):� B/w flag
91�var("espr",ErrSpread):� Error spreading flag
9&�var("zigz",ZigZag):� Zig zag flag
9&#�var("clfh",0):� No Clear (yet)
90=�var("outx",OutX%):�var("outy",OutY%):� Output resolution
9:=�var("ymul",YMul%):�var("ydiv",YDiv%):� Scaling factors Y
9D=�var("xmul",XMul%):�var("xdiv",XDiv%):� Scaling factors X
9No�Percent � �Blanking � �var("perc",1):�var("pinc",(100<<16)/ImgH%) � �var("perc",0):� Hourglass percentage
9X8� Set palette (if relevant, i.e. not pure RGB input)
9b?�bpp%<=8 � � c%=0 � 2^bpp%-1:palrgb%!(c%<<2)=InPal%(c%+1):�
9lf� b%=0 � 31:buffer%!(b%*8)=Buffer%(b%,0):buffer%!(b%*8+4)=Buffer%(b%,1):�:� Buffer locations/sizes
9v9�OutMode=1 � pc%=0 � pc%=OutPal:� Select palette code
9�<� Build R/G/B intensity map for gamma/invert/rgbbits/b&w
9�:�Gamma � �GammaF>0 � gf=1/GammaF � gf=0:� Gamma factor
9�=�Black � �BlackF<>0 � bf=BlackF � bf=0:� Black correction
9��Range �
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
:� $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
:4#�Range � i=(c%-sub%)*mul � i=c%
:>.�bf=0 � i=i+bf:�i<0 � i=0 � �i>255 � i=255
:H%�gf>0 � �i>0 � i=((i/255)^gf)*255
:R�InvertRGB � i=255-i
:\$ri=i � rm%:gi=i � gm%:bi=i � bm%
:f,�BlackWhite � ri=ri*rg:gi=gi*gg:bi=bi*bg
:p'intmap%!(c%<<2)=(ri<<16)+(gi<<8)+bi
:z�
:�DGreyRgb=(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
;B ��unpack_phase(type$,phase%)
;L5� Executes unpack phase, blanks screen if enabled
;V-�var("phas",phase%):� Set unpacking phase
;`+$dum%=�type$+" ",4):� Type to unpack
;j=�Blanking � ș "Translator_VideoDMA",0:� Blank if enabled
;t7ș "Translator_Unpack",!dum%:� Execute unpack phase
;~A�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
<