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