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 <