home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / util / wb / picticon / source / picticon.e < prev    next >
Text File  |  1994-07-24  |  47KB  |  1,618 lines

  1. MODULE 'exec/nodes','exec/ports','exec/types','exec/memory',
  2.        'intuition/intuition','intuition/screens','intuition/gadgetclass',
  3.        'intuition/screens','dos/dos','dos/dosextens','gadtools',
  4.        'libraries/gadtools','graphics/rastport','graphics/gfx','graphics/text',
  5.        'graphics/view','graphics/gfxbase','workbench/workbench',
  6.        'workbench/startup','wb','icon','graphics/clip','diskfont',
  7.        'libraries/diskfont','libraries/iffparse','iffparse','Asl','libraries/Asl',
  8.        'datatypes/datatypes','datatypes/datatypesclass','datatypes/pictureclass',
  9.        'utility/hooks','intuition/classes','intuition/classusr',
  10.        'libraries/locale',
  11.        'datatypes','layers','keymap','devices/inputevent','mathtrans','locale'
  12.  
  13. /* options:
  14.  
  15.   MAXIWIDTH=x       ;buffer size width
  16.   MAXIHEIGHT=x      ;buffer size height
  17.   APPICON=$         ;name of App-icon image
  18.   TEMPLATE_ICON=$   ;name of icon to modify (tooltypes, positions)
  19.   BACKGROUND_ICON=$ ;Name of background icon.
  20.   CHUNKYMODE=B      ;save icon with ReadPixels, not bitmap->image.
  21.   FORCE_EIGHT=B     ;If YES then eight planes are saved.
  22.   PIC_X_POS=x       ;Offset for image.
  23.   PIC_Y_POS=x       ;Offset for image.
  24.   PIC_X_SIZE=x      ;Real size of image (not always, but at least < than)
  25.   PIC_Y_SIZE=x      ;Real size of image.
  26.   CENTER=B          ;Center icon? Only valid with PIC_X_SIZE/PIC_Y_SIZE
  27.   SHOWSIZE_X=x      ;X pos for size coords
  28.   SHOWSIZE_Y=x      ;Y pos for size coords
  29.   LOWPRI=B          ;If= "yes" then run at priority -1
  30.   FREE_ICON_POS=B   ;Set icon to "unsnapshot"
  31.   HIGHPEN=x         ;topmost pen to use
  32.   SHOWSIZE_OUTLINE=B;If yes, then outline the size, otherwise, shadow it
  33.   SHOWSIZE_NORMAL=B ;If yes, then no shadow, no outline.
  34.   SHOWSIZE_TALL=B   ;If yes, then font is 8 high, not 6.
  35.   QUIET=B           ;If yes then surpress ALL output.
  36.   APP_X_POS=x       ;x pos of appicon
  37.   APP_Y_POS=y       ;y pos of appicon
  38.     DITHER=B                    ;if YES then do dithering
  39.  
  40.                          ;      The following are EXPERT tooltypes, only...
  41.     TWOPASS=B                    ;if YES and dithering on, then do left to right, right to left passes.
  42.     D_THRESHOLD=x            ;a pos value for the minimum addition value (dithering)  (EXPERT)
  43.     D_IGNORE=x                ;a pos value.  If error<x then igrnore error in dithering.  (EXPERT)
  44.     D_LIMIT=x                    ;a pos value for the maximum addition value (dithering)  (EXPERT)
  45.     D_TYPE=x                    ;0 is default    3/8 , 0/0 , 3/8 , 1/4            x  1st value  (x=from here)
  46.                                         ;1 is FS?        7/16, 3/16, 5/16, 1/16      2nd 3rd 4th values
  47.                                         ;2 is alternate  1/2 , 0/0,  1/2,  0/0
  48.                                         ;3 is crosshatch 0/0 , 1/2,  0/0,  1/2             (all EXPERT tooltypes!)
  49.                     ;4 is linear     1/1 , 0/0,  0/0,  0/0
  50.                                         ;5 is equal      1/4 , 1/4,  1/4,  1/4
  51. */
  52.  
  53. ENUM E_NONE,L_OK,
  54.   L_E_GENERAL,L_E_FILE,L_E_NOFILE,L_E_BADICON,L_E_NOWRITEICON,L_E_CLIP,
  55.   L_E_DATATYPE,L_E_NOPICTURE,L_E_GADGET,
  56.   L_EF_LIBRARY,L_EF_FATAL,L_EF_PUBSCREEN,L_EF_CHIPBUFFER,L_EF_VISUAL,L_EF_MENUS,
  57.   L_EF_MSGPORT,L_EF_WINDOW,L_EF_MEMORY,L_TEXTTITLE,
  58.   L_PICTURE,L_FILEOF,L_LOADING,L_SCALING,L_REMAPPING,L_SAVING,L_PERCENT,
  59.   L_TITLE,L_BODY,L_BUTTONS,L_RENDERING,L_ENDS
  60.  
  61. ENUM MODE_CLI,MODE_WB,MODE_QUIET,MODE_APP
  62. ENUM TEXT_NORMAL,TEXT_SHADOW,TEXT_OUTLINE
  63.   OBJECT mybitmapstruct
  64.     bytesperrow:INT;rows:INT;flags:CHAR;depth:CHAR;pad:INT
  65.     plane1:LONG;plane2:LONG;plane3:LONG;plane4:LONG
  66.     plane5:LONG;plane6:LONG;plane7:LONG;plane8:LONG
  67.   ENDOBJECT
  68.  
  69. DEF texttype=TEXT_SHADOW,tallfont=FALSE
  70. DEF iff:PTR TO iffhandle,ierror
  71. DEF sp=NIL:PTR TO storedproperty
  72. DEF freeme=FALSE
  73. DEF curfile=1,totfile=1
  74. DEF screenfont=NIL:PTR TO textfont
  75. DEF window=NIL:PTR TO window,rast,drawinfo,fgx,fgy,fgw,fgh
  76. DEF showflag=FALSE,showx=0,showy=0,bitsizex,bitsizey,sizestr[50]:STRING
  77. DEF black,white
  78. DEF posx=0,posy=0,sizex=0,sizey=0,centerflag=FALSE,posflag=FALSE
  79. DEF minimumx,minimumy
  80. DEF quietflag=FALSE,goodload
  81. DEF requestsizex,requestsizey,highestcolor
  82. DEF k[15]:LIST
  83. DEF redt[256]:LIST,grnt[256]:LIST,blut[256]:LIST
  84. DEF ditz,dang,dumb,body
  85. DEF newiconbase,newiconmode,osversion,quitter
  86. DEF radian,pointfive
  87. DEF catalog,sl[500]:LIST
  88. DEF iconianheader[80]:STRING
  89. DEF scratch,ret,dummy
  90. DEF appimagedata,diskobj=NIL:PTR TO diskobject
  91. DEF progname[500]:STRING,sleepername[500]:STRING,templatename[500]:STRING
  92. DEF backname[500]:STRING
  93. DEF toolobject=NIL:PTR TO diskobject
  94. DEF chunkyflag=FALSE,force8=FALSE,first4=FALSE
  95. DEF maxiwidth=128,maxiheight=100,maxiw=127,maxih=99
  96. DEF filename[500]:STRING
  97. DEF mode=MODE_CLI
  98. DEF scr=NIL:PTR TO screen,viewport:PTR TO viewport
  99. DEF bitmap:PTR TO bitmap,depth,colormap
  100. DEF currast=NIL:PTR TO rastport,curbitmap=NIL:PTR TO bitmap
  101. DEF appname[500]:STRING
  102. DEF visual=NIL,winx=-1,winy=-1
  103. DEF oldpx=-1
  104. DEF appx=-1,appy=-1
  105. DEF dither=TRUE
  106. DEF twopass=FALSE
  107. DEF rawdata=0
  108. DEF div1=3,div2=0,div3=3,div4=1,rem1=8,rem2=1,rem3=8,rem4=4
  109. DEF thres=2,ignore=16,lim=255,typ=0
  110. PROC main()
  111.   openlibs()
  112.   radian:=sp_div_tf_tf_f(10000,572958)
  113.   pointfive:=sp_div_tf_tf_f(10,5)
  114.   StrCopy(iconianheader,'Picticon 0.1',ALL)
  115.   loadwinpos()
  116.   handwb()
  117.   savewinpos()
  118.   leave(0)
  119. ENDPROC
  120.  
  121. versionstring:
  122. CHAR '\0$VER: picticon 0.6 (22.7.94)\0'
  123. CHAR 0,0,0,0
  124.  
  125. PROC setraw(x,y,r,g,b)
  126.   IF rawdata
  127.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+(limit(y,0,1)*12*maxiwidth),r)
  128.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+4+(limit(y,0,1)*12*maxiwidth),g)
  129.     PutLong(rawdata+(limit(x,0,maxiwidth)*12)+8+(limit(y,0,1)*12*maxiwidth),b)
  130.   ENDIF
  131. ENDPROC
  132.  
  133. PROC rawred(x,y)
  134.   RETURN Long(rawdata+(x*12)+(y*12*maxiwidth))
  135. ENDPROC
  136.  
  137. PROC rawgrn(x,y)
  138.   RETURN Long(rawdata+4+(x*12)+(y*12*maxiwidth))
  139. ENDPROC
  140.  
  141. PROC rawblu(x,y)
  142.   RETURN Long(rawdata+8+(x*12)+(y*12*maxiwidth))
  143. ENDPROC
  144.  
  145. PROC processicon() HANDLE
  146.   DEF gadget:PTR TO gadget
  147.   DEF backobj=NIL:PTR TO diskobject
  148.   DEF screenattr:PTR TO textattr,sfonth=8
  149.   DEF heystring[500]:STRING
  150.   DEF iiii,tttt,oldshowx
  151.     DEF inw,inh
  152.   oldshowx:=showx
  153.   window:=NIL
  154.   IF StrLen(filename)<1 THEN Raise(E_NONE)
  155.   IF ((scr:=LockPubScreen('Workbench'))=0) THEN Raise(L_EF_PUBSCREEN)
  156.   visual:=GetVisualInfoA(scr,NIL)
  157.   viewport:=scr.viewport
  158.   colormap:=viewport.colormap
  159.   bitmap:=scr.bitmap
  160.   depth:=bitmap.depth
  161.   IF (curbitmap:=myallocbitmap(maxiwidth,maxiheight,8,BMF_CLEAR OR BMF_STANDARD,NIL))=NIL THEN Raise(L_EF_CHIPBUFFER)
  162.  
  163.   IF (currast:=New(SIZEOF rastport))=NIL THEN Raise(L_EF_FATAL)
  164.   InitRastPort(currast);currast.bitmap:=curbitmap
  165.  
  166.   screenattr:=scr.font
  167.   sfonth:=screenattr.ysize
  168.  
  169.   IF mode<>MODE_QUIET
  170.         inw:=bigger(300,12*StrLen(FilePart(filename)))
  171.         inh:=sfonth*3+20-((totfile>1)*(sfonth+4))
  172.     IF winx=-1 THEN winx:=(((scr.width-300)/2))
  173.     IF winy=-1 THEN winy:=(((scr.height-(sfonth*2+16))/2))
  174.     window:=OpenWindowTagList(0,[WA_LEFT,winx,
  175.       WA_TOP,winy,
  176.       WA_INNERWIDTH,inw,
  177.       WA_INNERHEIGHT,inh,
  178.       WA_FLAGS,WFLG_DRAGBAR OR WFLG_DEPTHGADGET,
  179.       WA_TITLE,sl[L_TEXTTITLE],
  180.       WA_CUSTOMSCREEN,scr,
  181.       WA_AUTOADJUST,TRUE,
  182.       NIL,NIL])
  183.     rast:=window.rport
  184.     screenfont:=OpenFont(scr.font)
  185.     IF screenfont THEN SetFont(rast,screenfont)
  186.     fgx:=4+window.borderleft
  187.     fgw:=window.width-(8+window.borderleft+window.borderright)
  188.     fgh:=window.height-(window.bordertop+4+window.borderbottom)-(sfonth*2)-8+((totfile>1)*(sfonth+4))
  189.     fgy:=window.height-(sfonth*2)-18
  190.  
  191.  
  192.         SetAPen(rast,2)
  193.         shadowtext(rast,fgx,fgy+6+fgh+screenfont.baseline,'0%',2)
  194.         shadowtext(rast,fgx+fgw-TextLength(rast,'100%',4),fgy+fgh+6+screenfont.baseline,'100%',4)
  195.         shadowtext(rast,fgx+(fgw/2)-(TextLength(rast,'50%',3)/2),fgy+fgh+6+screenfont.baseline,'50%',3)
  196.         shadowtext(rast,fgx+(fgw/4)-(TextLength(rast,'25%',3)/2),fgy+fgh+6+screenfont.baseline,'25%',3)
  197.         shadowtext(rast,fgx+(fgw*3/4)-(TextLength(rast,'75%',3)/2),fgy+fgh+6+screenfont.baseline,'75%',3)
  198.  
  199.     StringF(heystring,sl[L_PICTURE],FilePart(filename))
  200.     SetAPen(rast,1)
  201.     Move(rast,fgx+(fgw/2)-(TextLength(rast,heystring,StrLen(heystring))/2),window.bordertop+3+screenfont.baseline)
  202.     Text(rast,heystring,StrLen(heystring))
  203.  
  204.         shadowline(rast,fgx,fgy+1+fgh,fgx,fgy+4+fgh)
  205.         shadowline(rast,fgx+fgw-2,fgy+1+fgh,fgx+fgw-2,fgy+4+fgh)
  206.         shadowline(rast,fgx+(fgw/2),fgy+1+fgh,fgx+(fgw/2),fgy+4+fgh)
  207.         shadowline(rast,fgx+(fgw/4),fgy+1+fgh,fgx+(fgw/4),fgy+4+fgh)
  208.         shadowline(rast,fgx+(fgw*3/4),fgy+1+fgh,fgx+(fgw*3/4),fgy+4+fgh)
  209.  
  210.     IF totfile>1
  211.       StringF(heystring,sl[L_FILEOF],curfile,totfile)
  212.       Move(rast,fgx+(fgw/2)-(TextLength(rast,heystring,StrLen(heystring))/2),window.bordertop+5+screenfont.baseline+screenfont.ysize)
  213.       Text(rast,heystring,StrLen(heystring))
  214.     ENDIF
  215.   ENDIF
  216.  
  217.   IF (diskobj:=GetDiskObject(templatename))=NIL
  218.     IF (diskobj:=GetDiskObject('ENV:sys/def_picture'))=NIL
  219.       diskobj:=GetDefDiskObject(WBPROJECT)
  220.     ENDIF
  221.   ENDIF
  222.   SetAPen(currast,0)
  223.   SetBPen(currast,0)
  224.   RectFill(currast,0,0,maxiw,maxih)
  225.   IF (backobj:=GetDiskObject(backname))
  226.     gadget:=backobj.gadget
  227.     copyimagerast(currast,gadget.gadgetrender)
  228.   ENDIF
  229.   doloaddt(currast,filename)
  230.  
  231.   IF showflag
  232.     StringF(sizestr,'\dx\d',bitsizex,bitsizey)
  233.     IF showx=-1 THEN showx:=posx+(sizex/2)-((StrLen(sizestr)*6)/2)
  234.     IF showy=-1 THEN showy:=1
  235.  
  236.     IF texttype=TEXT_OUTLINE
  237.       FOR tttt:=-1 TO 1
  238.         FOR iiii:=-1 TO 1
  239.           showpicsize(showx+iiii,showy+tttt,black,sizestr)
  240.         ENDFOR
  241.       ENDFOR
  242.     ENDIF
  243.     IF texttype=TEXT_SHADOW THEN showpicsize(showx+1,showy+1,black,sizestr)
  244.     showpicsize(showx,showy,white,sizestr)
  245.   ENDIF
  246.   showx:=oldshowx
  247.   IF goodload
  248.     saveicon()
  249.   ENDIF
  250.   Raise(E_NONE)
  251. EXCEPT
  252.   IF visual THEN FreeVisualInfo(visual);visual:=NIL
  253.   IF scr THEN UnlockPubScreen(0,scr);scr:=NIL
  254.   IF curbitmap THEN myfreebitmap(curbitmap);curbitmap:=NIL
  255.   IF currast THEN Dispose(currast);currast:=NIL
  256.   IF diskobj THEN FreeDiskObject(diskobj);diskobj:=NIL
  257.   IF backobj THEN FreeDiskObject(backobj);backobj:=NIL
  258.   IF window
  259.     winx:=window.leftedge;winy:=window.topedge
  260.     CloseWindow(window);window:=NIL
  261.   ENDIF
  262.   IF screenfont THEN CloseFont(screenfont);screenfont:=NIL
  263.   handleexception(exception)
  264. ENDPROC
  265.  
  266. PROC shadowline(rast,x1,y1,x2,y2)
  267.     DEF drawinfo=NIL:PTR TO drawinfo
  268.     IF (drawinfo:=GetScreenDrawInfo(scr))
  269.         SetAPen(rast,Int(drawinfo.pens+(SHINEPEN*2)))
  270.         Move(rast,x1+1,y1+1)
  271.         Draw(rast,x2+1,y2+1)
  272.         SetAPen(rast,Int(drawinfo.pens+(SHADOWPEN*2)))
  273.         Move(rast,x1,y1)
  274.         Draw(rast,x2,y2)
  275.         FreeScreenDrawInfo(scr,drawinfo)
  276.     ENDIF
  277. ENDPROC
  278.  
  279. PROC shadowtext(rast,x1,y1,x2,y2)
  280.     DEF drawinfo=NIL:PTR TO drawinfo
  281.     IF (drawinfo:=GetScreenDrawInfo(scr))
  282.         SetDrMd(rast,RP_JAM1)
  283. /*        SetAPen(rast,Int(drawinfo.pens+(SHINEPEN*2)))
  284.         Move(rast,x1+1,y1+1)
  285.         Text(rast,x2,y2)*/
  286.         SetAPen(rast,Int(drawinfo.pens+(SHADOWPEN*2)))
  287.         Move(rast,x1,y1)
  288.         Text(rast,x2,y2)
  289.         FreeScreenDrawInfo(scr,drawinfo)
  290.         SetDrMd(rast,RP_JAM2)
  291.     ENDIF
  292. ENDPROC
  293.  
  294. PROC saveicon() HANDLE
  295.  
  296.   DEF ire
  297.   DEF mydiskobj=NIL:PTR TO diskobject
  298.  
  299.   mydiskobj:=diskobj
  300.  
  301.   IF mode=MODE_CLI THEN WriteF('\n')
  302.   displaymessage(sl[L_SAVING],TRUE)
  303.   creatediskobj(mydiskobj,currast)
  304.  
  305.   IF (ire:=PutDiskObject(filename,mydiskobj))=NIL THEN Raise(L_E_NOWRITEICON)
  306.  
  307.   Raise(E_NONE)
  308. EXCEPT
  309.   restorediskobj(mydiskobj)
  310.   handleexception(exception)
  311. ENDPROC
  312.  
  313. PROC displaypercent(done,max)
  314.   DEF perc,newpx
  315.   perc:=done*100/max
  316.   IF mode=MODE_CLI
  317.     WriteF(sl[L_PERCENT],{controlstring},perc)
  318.   ELSE
  319.     IF (((mode=MODE_WB) OR (mode=MODE_APP)) AND (window) AND (rast))
  320.       IF oldpx<0 THEN oldpx:=fgx+3
  321.       SetAPen(rast,3)
  322.       newpx:=fgx+(((fgw-5)*100)/(10000/(bigger(perc,1))))
  323.       RectFill(rast,oldpx,fgy+2,fgx+(((fgw-5)*100)/(10000/(bigger(perc,1)))),fgy+fgh-4)
  324.       oldpx:=newpx
  325.       IF visual
  326.         DrawBevelBoxA(rast,fgx,fgy,fgw,fgh,[GT_VISUALINFO,visual,
  327.           GTBB_RECESSED,TRUE,GTBB_FRAMETYPE,BBFT_BUTTON,NIL,NIL])
  328.       ENDIF
  329.     ENDIF
  330.   ENDIF
  331. ENDPROC
  332.  
  333. PROC displaymessage(msg,flag)
  334.   IF mode=MODE_CLI
  335.     WriteF('\s\n',msg)
  336.   ELSE
  337.     IF (((mode=MODE_WB) OR (mode=MODE_APP)) AND (window) AND (rast))
  338.       IF flag<>0
  339.         SetAPen(rast,0)
  340.         RectFill(rast,fgx+2,fgy+1,fgx+fgw-4,fgy+fgh-2)
  341.       ELSE
  342.         SetDrMd(rast,RP_JAM1)
  343.       ENDIF
  344.       Move(rast,fgx+(fgw/2)-(TextLength(rast,msg,StrLen(msg))/2),fgy+fgh-(screenfont.ysize-screenfont.baseline)-3)
  345.       SetAPen(rast,1)
  346.       Text(rast,msg,StrLen(msg))
  347.       SetDrMd(rast,RP_JAM2)
  348.       IF visual
  349.         DrawBevelBoxA(rast,fgx,fgy,fgw,fgh,[GT_VISUALINFO,visual,
  350.           GTBB_RECESSED,TRUE,GTBB_FRAMETYPE,BBFT_BUTTON,NIL,NIL])
  351.       ENDIF
  352.     ENDIF
  353.   ENDIF
  354. ENDPROC
  355.  
  356. PROC doloaddt(destination,unitnumber) HANDLE
  357.   DEF dtf=NIL:PTR TO dtframebox,fri=NIL:PTR TO frameinfo
  358.   DEF obj=NIL,gpl=NIL:PTR TO gplayout
  359.   DEF destrgb1[260]:LIST
  360.   DEF cregs=NIL,numcolors,bmhd=NIL:PTR TO bitmapheader,bm=NIL:PTR TO bitmap
  361.   DEF dtrast=NIL:PTR TO rastport
  362.   DEF destbm
  363.   DEF cmap,asshole
  364.   DEF scale
  365.   DEF red[260]:LIST,grn[260]:LIST,blu[260]:LIST
  366.   DEF cx,cy,cred,cgrn,cblu,resu,nco,collate
  367.   DEF oposx,oposy,a1,a2,a3
  368.   DEF scratchscale,dummyscale
  369.   DEF rdiff,gdiff,bdiff,radd,gadd,badd,rreal,greal,breal
  370.  
  371.   goodload:=FALSE;destbm:=curbitmap;cmap:=colormap
  372.   displaymessage(sl[L_LOADING],TRUE)
  373.   obj:=NewDTObjectA(unitnumber,[DTA_SOURCETYPE,DTST_FILE,
  374.                 DTA_GROUPID,GID_PICTURE,
  375.                 PDTA_REMAP,FALSE,
  376.                 NIL,NIL])
  377.   IF obj
  378.     dtf:=New(60)
  379.     fri:=New(60)
  380.     PutLong(dtf,DTM_FRAMEBOX)
  381.     dtf.frameinfo:=fri
  382.     dtf.contentsinfo:=fri
  383.     dtf.sizeframeinfo:=SIZEOF frameinfo
  384.     IF (domethod(obj,dtf))
  385.       gpl:=New(60)
  386.       PutLong(gpl,DTM_PROCLAYOUT)
  387.       gpl.ginfo:=NIL
  388.       gpl.initial:=1
  389.       IF (domethod(obj,gpl))
  390.         GetDTAttrsA(obj,
  391.             [PDTA_CREGS,{cregs},
  392.             PDTA_BITMAP,{bm},
  393.             PDTA_NUMCOLORS,{numcolors},
  394.             PDTA_BITMAPHEADER,{bmhd},
  395.             NIL,NIL])
  396.         body:=cregs
  397.         dtrast:=New(SIZEOF rastport)
  398.         dtrast.bitmap:=bm
  399.         IF dtrast.bitmap<>NIL
  400.  
  401.           displaymessage(sl[L_SCALING],TRUE);oldpx:=-1
  402.  
  403.           white:=findcolor(cmap,255,255,255)
  404.           black:=findcolor(cmap,0,0,0)
  405.           asshole:=1
  406.           bitsizey:=bmhd.height;bitsizex:=bmhd.width
  407.           IF ((sizey<bitsizey) OR (sizex<bitsizex)) THEN asshole:=0
  408.           FOR scratch:=0 TO (Shl(1,(bmhd.depth))-1)
  409.             ditz:=Char(body)  /* RED 0-255 */
  410.             body:=body+4
  411.             dang:=Char(body)  /* GREEN 0-255 */
  412.             body:=body+4
  413.             dumb:=Char(body)  /* BLUE 0-255 */
  414.             body:=body+4
  415.             IF asshole<>0
  416.               destrgb1[scratch]:=findcolor(cmap,ditz,dang,dumb)
  417.             ENDIF
  418.             red[scratch]:=ditz
  419.             grn[scratch]:=dang
  420.             blu[scratch]:=dumb
  421.           ENDFOR
  422.  
  423. /*          IF (asshole=1)
  424.             minimumx:=smaller((sizex-posx),bitsizex)-1
  425.             minimumy:=smaller((sizey-posy),bitsizey)-1
  426.             oposx:=posx;oposy:=posy
  427.             IF centerflag
  428.               oposx:=posx+( (sizex-minimumx)/2 )
  429.               oposy:=posy+( (sizey-minimumy)/2 )
  430.             ENDIF
  431.             FOR scratch:=0 TO minimumy
  432.               FOR dummy:=0 TO minimumx
  433.                 SetAPen(destination,destrgb1[ReadPixel(dtrast,dummy,scratch)])
  434.                 WritePixel(destination,oposx+dummy,oposy+scratch)
  435.               ENDFOR
  436.               displaypercent(scratch,minimumy)
  437.               IF mode<>MODE_CLI THEN displaymessage(sl[L_REMAPPING],0)
  438.             ENDFOR
  439.             goodload:=TRUE
  440.           ELSE */
  441.  
  442.             grabrgbtables()
  443.             IF dither
  444.               rawdata:=New(Mul(maxiwidth,32))
  445.               IF rawdata=0 THEN Raise(L_EF_MEMORY)
  446.             ENDIF
  447.             IF asshole
  448.               minimumx:=smaller((sizex-posx),bitsizex)-1
  449.               minimumy:=smaller((sizey-posy),bitsizey)-1
  450.               oposx:=posx;oposy:=posy
  451.               IF centerflag
  452.                 oposx:=posx+( (sizex-minimumx)/2 )
  453.                 oposy:=posy+( (sizey-minimumy)/2 )
  454.               ENDIF
  455.               scale:=1
  456.             ELSE
  457.               scale:=bigger(((bitsizex/sizex)),((bitsizey/sizey)))+1
  458.               minimumx:=(bitsizex/scale)-1
  459.               minimumy:=(bitsizey/scale)-1
  460.               oposx:=posx;oposy:=posy
  461.               IF centerflag
  462.                 oposx:=posx+( (sizex-(bitsizex/scale))/2 )
  463.                 oposy:=posy+( (sizey-(bitsizey/scale))/2 )
  464.               ENDIF
  465.             ENDIF
  466.                         a1:=0;a2:=minimumx;a3:=1
  467.             FOR scratch:=0 TO minimumy
  468.                             dummy:=a1
  469.                             WHILE (dummy<>(a2+a3))
  470.                 nco:=NIL;cred:=NIL;cgrn:=NIL;cblu:=NIL
  471.                 dummyscale:=dummy*scale
  472.                 scratchscale:=scratch*scale
  473.                 FOR cy:=0 TO scale-1
  474.                   FOR cx:=0 TO scale-1
  475.                     collate:=ReadPixel(dtrast,dummyscale+cx,scratchscale+cy)
  476.                     cred:=cred+red[collate]
  477.                     cgrn:=cgrn+grn[collate]
  478.                     cblu:=cblu+blu[collate]
  479.                     nco:=nco+1
  480.                   ENDFOR
  481.                 ENDFOR
  482.                 IF dither=FALSE
  483.                   resu:=findcolor(cmap,(cred/nco),(cgrn/nco),(cblu/nco))
  484.                   SetAPen(destination,resu)
  485.                   WritePixel(destination,dummy+oposx,scratch+oposy)
  486.                 ELSE
  487.  
  488.                   resu:=findcolor(cmap,limit(((cred/nco)+rawred(dummy,0)),0,255),limit(((cgrn/nco)+rawgrn(dummy,0)),0,255),limit(((cblu/nco)+rawblu(dummy,0)),0,255))
  489.  
  490.  
  491.                   rdiff:=(cred/nco)-redt[resu]
  492.                   gdiff:=(cgrn/nco)-grnt[resu]
  493.                   bdiff:=(cblu/nco)-blut[resu]
  494.  
  495.                   SetAPen(destination,resu)
  496.                   WritePixel(destination,dummy+oposx,scratch+oposy)
  497.  
  498.                                     IF ((Abs(rdiff)+Abs(gdiff)+Abs(bdiff))>ignore)
  499.  
  500.                       rreal:=threshold(limit((rdiff*div1)/rem1,0-lim,lim),thres)
  501.                       greal:=threshold(limit((gdiff*div1)/rem1,0-lim,lim),thres)
  502.                       breal:=threshold(limit((bdiff*div1)/rem1,0-lim,lim),thres)
  503.                       radd:=rawred(dummy+a3,0)+rreal
  504.                       gadd:=rawgrn(dummy+a3,0)+greal
  505.                       badd:=rawblu(dummy+a3,0)+breal
  506.                       setraw(dummy+a3,0,radd,gadd,badd)
  507.     
  508.                       rreal:=threshold(limit((rdiff*div2)/rem2,-lim,lim),thres)
  509.                       greal:=threshold(limit((gdiff*div2)/rem2,-lim,lim),thres)
  510.                       breal:=threshold(limit((bdiff*div2)/rem2,-lim,lim),thres)
  511.                       radd:=rawred(dummy-a3,1)+rreal
  512.                       gadd:=rawgrn(dummy-a3,1)+greal
  513.                       badd:=rawblu(dummy-a3,1)+breal
  514.                       setraw(dummy-a3,1,radd,gadd,badd)
  515.     
  516.                       rreal:=threshold(limit((rdiff*div3)/rem3,-lim,lim),thres)
  517.                       greal:=threshold(limit((gdiff*div3)/rem3,-lim,lim),thres)
  518.                       breal:=threshold(limit((bdiff*div3)/rem3,-lim,lim),thres)
  519.                       radd:=rawred(dummy,1)+rreal
  520.                       gadd:=rawgrn(dummy,1)+greal
  521.                       badd:=rawblu(dummy,1)+breal
  522.                       setraw(dummy,1,radd,gadd,badd)
  523.  
  524.                       rreal:=threshold(limit((rdiff*div4)/rem4,-lim,lim),thres)
  525.                       greal:=threshold(limit((gdiff*div4)/rem4,-lim,lim),thres)
  526.                       breal:=threshold(limit((bdiff*div4)/rem4,-lim,lim),thres)
  527.                       radd:=rawred(dummy+a3,1)+rreal
  528.                       gadd:=rawgrn(dummy+a3,1)+greal
  529.                       badd:=rawblu(dummy+a3,1)+breal
  530.                       setraw(dummy+a3,1,radd,gadd,badd)
  531.                                     ENDIF
  532.                 ENDIF
  533.                                 dummy:=dummy+a3
  534.               ENDWHILE
  535.                             IF twopass=TRUE;dummy:=a1;a1:=a2;a2:=dummy;a3:=0-a3;ENDIF
  536.               displaypercent(scratch,minimumy)
  537.               IF mode<>MODE_CLI THEN displaymessage(sl[L_SCALING],0)
  538.               IF ((dither) AND (rawdata))
  539.                 FOR dummy:=0 TO maxiw
  540.                   setraw(dummy,0,rawred(dummy,1),rawgrn(dummy,1),rawblu(dummy,1))
  541.                   setraw(dummy,1,0,0,0)
  542.                 ENDFOR
  543.               ENDIF
  544.             ENDFOR
  545.             goodload:=TRUE
  546. /*          ENDIF*/
  547.         ELSE
  548.           Raise(L_E_DATATYPE)
  549.         ENDIF
  550.       ELSE
  551.         Raise(L_E_DATATYPE)
  552.       ENDIF
  553.     ELSE
  554.       Raise(L_E_DATATYPE)
  555.     ENDIF
  556.   ELSE
  557.     Raise(L_E_NOPICTURE)
  558.   ENDIF
  559.   Raise(E_NONE)
  560. EXCEPT
  561.   IF rawdata THEN Dispose(rawdata);rawdata:=NIL
  562.   IF dtrast THEN Dispose(dtrast);dtrast:=NIL
  563.   IF obj THEN DisposeDTObject(obj);obj:=NIL
  564.   IF gpl THEN Dispose(gpl);gpl:=NIL
  565.   IF dtf THEN Dispose(dtf);dtf:=NIL
  566.   IF fri THEN Dispose(fri);fri:=NIL
  567.   IF exception<>E_NONE
  568.     errormessage(exception)
  569.   ENDIF
  570.   IF quitter THEN leave(quitter)
  571. ENDPROC
  572.  
  573. PROC showpicsize(x,y,p,s)
  574.   DEF ii,tt,uu,mm,charptr,xptr,ysize=6
  575.   charptr:={chardata}
  576.   xptr:={xdata}
  577.   IF tallfont
  578.     ysize:=8
  579.     charptr:={chardatal}
  580.     xptr:={xdatal}
  581.   ENDIF
  582.   SetAPen(currast,p)
  583.   FOR ii:=0 TO (StrLen(s)-1)
  584.     mm:=Char(s+ii)
  585.     FOR tt:=0 TO (ysize-1)
  586.       FOR uu:=0 TO 5
  587.         IF mm<>"x"
  588.           IF Char(charptr+uu+(tt*8)+((mm-48)*(8*ysize)))="x"
  589.             WritePixel(currast,smaller(bigger(x+uu+(ii*6),0),maxiw),smaller(bigger(y+tt,0),maxih))
  590.           ENDIF
  591.         ELSE
  592.           IF Char(xptr+uu+(tt*8))="x"
  593.             WritePixel(currast,smaller(bigger(x+uu+(ii*6),0),maxiw),smaller(bigger(y+tt,0),maxih))
  594.           ELSE
  595.           ENDIF
  596.         ENDIF
  597.       ENDFOR
  598.     ENDFOR
  599.   ENDFOR
  600.  
  601. ENDPROC
  602. PROC dosleep()
  603.   DEF sleepobject=NIL:PTR TO diskobject
  604.   DEF appobject=NIL:PTR TO diskobject
  605.   DEF appport=NIL:PTR TO mp
  606.   DEF appflag=NIL
  607.   DEF appicon,appitem,newproj[250]:STRING
  608.   DEF lockname[250]:STRING,newlock=NIL
  609.   DEF amsg:PTR TO appmessage
  610.   DEF argptr:PTR TO wbarg
  611.   DEF lofal
  612.   DEF agadget:PTR TO gadget
  613.  
  614.   StrCopy(appname,sleepername,ALL)
  615.   IF (sleepobject:=GetDiskObject(appname))=NIL
  616.     IF (sleepobject:=GetDiskObject('ENV:SYS/def_appicon'))=NIL
  617.       StrCopy(appname,progname,ALL)
  618.       IF (sleepobject:=GetDiskObject(appname))=NIL
  619.         sleepobject:=GetDefDiskObject(WBTOOL)
  620.       ENDIF
  621.     ENDIF
  622.   ENDIF
  623.   IF sleepobject
  624.     sleepobject.type:=NIL
  625.     appobject:=sleepobject
  626.     agadget:=appobject.gadget
  627.     IF appx<0
  628.       agadget.leftedge:=NO_ICON_POSITION
  629.       appobject.currentx:=NO_ICON_POSITION
  630.     ELSE
  631.       agadget.leftedge:=appx
  632.       appobject.currentx:=appx
  633.     ENDIF
  634.     IF appy<0
  635.       agadget.topedge:=NO_ICON_POSITION
  636.       appobject.currenty:=NO_ICON_POSITION
  637.     ELSE
  638.       agadget.topedge:=appy
  639.       appobject.currenty:=appy
  640.     ENDIF
  641.  
  642.     IF (appport:=CreateMsgPort())
  643.       IF (appicon:=AddAppIconA(0,0,'Picticon',appport,0,appobject,NIL))<>NIL
  644.                 IF (appitem:=AddAppMenuItemA(0,0,'Picticon',appport,0))<>NIL
  645.             WHILE appflag=NIL
  646.               WaitPort(appport)
  647.               WHILE (amsg:=GetMsg(appport))<>NIL
  648.                 IF amsg.numargs=0
  649.                   IF EasyRequestArgs(0, [20, 0, sl[L_TITLE], sl[L_BODY],sl[L_BUTTONS]], 0, 0)
  650.                     appflag:=TRUE
  651.                   ENDIF
  652.                 ELSE
  653.                   argptr:=amsg.arglist
  654.                   curfile:=0;totfile:=amsg.numargs
  655.                   FOR lofal:=1 TO amsg.numargs
  656.                     StrCopy(newproj,argptr.name,ALL)
  657.                     newlock:=argptr.lock
  658.                     IF newlock
  659.                       NameFromLock(newlock,lockname,250)
  660.                       processname(filename,lockname,newproj)
  661.                       curfile:=curfile+1
  662.                       processicon()
  663.                     ENDIF
  664.                     argptr:=argptr+(SIZEOF wbarg)
  665.                   ENDFOR
  666.                 ENDIF
  667.                 ReplyMsg(amsg)
  668.               ENDWHILE
  669.             ENDWHILE
  670.             RemoveAppMenuItem(appitem)
  671.                 ENDIF
  672.            RemoveAppIcon(appicon)
  673.       ENDIF
  674.          WHILE (amsg:=GetMsg(appport))<>NIL
  675.            ReplyMsg(amsg)
  676.          ENDWHILE
  677.       DeleteMsgPort(appport)
  678.     ENDIF
  679.     IF sleepobject THEN FreeDiskObject(sleepobject);sleepobject:=NIL
  680.   ENDIF
  681. ENDPROC
  682. PROC handwb()
  683.   DEF wb:PTR TO wbstartup,args:PTR TO wbarg
  684.   DEF argarray[30]:LIST,olddir,rdarg,s,wstr[500]:STRING
  685.   DEF locs
  686.  
  687.   IF wbmessage<>NIL /* E provides us with WB's startup message in this variable */
  688.     wb:=wbmessage;args:=wb.arglist
  689.     olddir:=CurrentDir(args.lock)
  690.  
  691.     IF args.name>0
  692.       GetCurrentDirName(progname,500)
  693.       StrAdd(progname,args.name,ALL)
  694.       toolobject:=GetDiskObjectNew(progname)
  695.     ENDIF
  696.  
  697.     IF toolobject<>NIL  /* If we succeded in opening our program icon. */
  698.       IF s:=FindToolType(toolobject.tooltypes,'MAXIWIDTH')
  699.         StrToLong(s,{maxiwidth})
  700.       ENDIF
  701.       IF s:=FindToolType(toolobject.tooltypes,'MAXIHEIGHT')
  702.         StrToLong(s,{maxiheight})
  703.       ENDIF
  704.       IF s:=FindToolType(toolobject.tooltypes,'APPICON')
  705.         StrCopy(sleepername,s,ALL)
  706.       ENDIF
  707.       IF s:=FindToolType(toolobject.tooltypes,'TEMPLATE_ICON')
  708.         StrCopy(templatename,s,ALL)
  709.       ENDIF
  710.       IF s:=FindToolType(toolobject.tooltypes,'BACKGROUND_ICON')
  711.         StrCopy(backname,s,ALL)
  712.       ENDIF
  713.       IF s:=FindToolType(toolobject.tooltypes,'CHUNKYMODE')
  714.         IF MatchToolValue(s,'yes')
  715.           chunkyflag:=TRUE
  716.         ENDIF
  717.       ENDIF
  718.       IF s:=FindToolType(toolobject.tooltypes,'FORCE_EIGHT')
  719.         IF MatchToolValue(s,'yes')
  720.           force8:=TRUE
  721.         ENDIF
  722.       ENDIF
  723.       IF s:=FindToolType(toolobject.tooltypes,'CENTER')
  724.         IF MatchToolValue(s,'yes')
  725.           centerflag:=TRUE
  726.         ENDIF
  727.       ENDIF
  728.       IF s:=FindToolType(toolobject.tooltypes,'HIGHPEN')
  729.         StrToLong(s,{first4})
  730.       ENDIF
  731.       IF s:=FindToolType(toolobject.tooltypes,'FIRSTFOUR')
  732.         IF MatchToolValue(s,'yes')
  733.           first4:=3
  734.         ENDIF
  735.       ENDIF
  736.       IF s:=FindToolType(toolobject.tooltypes,'FREE_ICON_POS')
  737.         IF MatchToolValue(s,'yes')
  738.           freeme:=TRUE
  739.         ENDIF
  740.       ENDIF
  741.       IF s:=FindToolType(toolobject.tooltypes,'PIC_X_POS')
  742.         StrToLong(s,{posx})
  743.       ENDIF
  744.       IF s:=FindToolType(toolobject.tooltypes,'PIC_Y_POS')
  745.         StrToLong(s,{posy})
  746.       ENDIF
  747.       IF s:=FindToolType(toolobject.tooltypes,'APP_X_POS')
  748.         StrToLong(s,{appx})
  749.       ENDIF
  750.       IF s:=FindToolType(toolobject.tooltypes,'APP_Y_POS')
  751.         StrToLong(s,{appy})
  752.       ENDIF
  753.       IF s:=FindToolType(toolobject.tooltypes,'PIC_X_SIZE')
  754.         StrToLong(s,{sizex})
  755.       ENDIF
  756.       IF s:=FindToolType(toolobject.tooltypes,'PIC_Y_SIZE')
  757.         StrToLong(s,{sizey})
  758.       ENDIF
  759.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_X')
  760.         StrToLong(s,{showx})
  761.         showflag:=TRUE
  762.       ENDIF
  763.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_Y')
  764.         StrToLong(s,{showy})
  765.         showflag:=TRUE
  766.       ENDIF
  767.       IF s:=FindToolType(toolobject.tooltypes,'LOWPRI')
  768.         IF MatchToolValue(s,'yes')
  769.           SetTaskPri(FindTask(0),-1)
  770.         ENDIF
  771.       ENDIF
  772.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_OUTLINE')
  773.         IF MatchToolValue(s,'yes')
  774.           texttype:=TEXT_OUTLINE
  775.         ENDIF
  776.       ENDIF
  777.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_NORMAL')
  778.         IF MatchToolValue(s,'yes')
  779.           texttype:=TEXT_NORMAL
  780.         ENDIF
  781.       ENDIF
  782.       IF s:=FindToolType(toolobject.tooltypes,'SHOWSIZE_TALL')
  783.         IF MatchToolValue(s,'yes')
  784.           tallfont:=TRUE
  785.         ENDIF
  786.       ENDIF
  787.       IF s:=FindToolType(toolobject.tooltypes,'QUIET')
  788.         IF MatchToolValue(s,'yes')
  789.           quietflag:=TRUE
  790.         ENDIF
  791.       ENDIF
  792.       IF s:=FindToolType(toolobject.tooltypes,'DITHER')
  793.         IF MatchToolValue(s,'no')
  794.           dither:=FALSE
  795.         ENDIF
  796.       ENDIF
  797.       IF s:=FindToolType(toolobject.tooltypes,'TWOPASS')
  798.         IF MatchToolValue(s,'yes')
  799.           twopass:=TRUE
  800.                 ELSE
  801.           twopass:=FALSE
  802.         ENDIF
  803.       ENDIF
  804.       IF s:=FindToolType(toolobject.tooltypes,'D_THRESHOLD')
  805.         StrToLong(s,{thres})
  806.                 thres:=limit(thres,0,128)
  807.       ENDIF
  808.       IF s:=FindToolType(toolobject.tooltypes,'D_IGNORE')
  809.         StrToLong(s,{ignore})
  810.                 ignore:=limit(ignore,0,750)
  811.       ENDIF
  812.       IF s:=FindToolType(toolobject.tooltypes,'D_LIMIT')
  813.         StrToLong(s,{lim})
  814.                 lim:=limit(lim,thres,1024)
  815.       ENDIF
  816.       IF s:=FindToolType(toolobject.tooltypes,'D_TYPE')
  817.         StrToLong(s,{typ})
  818.                 typ:=limit(typ,0,5)
  819.                 SELECT typ
  820.                 CASE 1
  821.                     div1:=7;rem1:=16;div2:=3;rem2:=16;div3:=5;rem3:=16;div4:=1;rem4:=16
  822.                 CASE 2
  823.                     div1:=1;rem1:=2;div2:=0;rem2:=1;div3:=1;rem3:=2;div4:=0;rem4:=1
  824.                 CASE 3
  825.                     div1:=0;rem1:=1;div2:=1;rem2:=2;div3:=0;rem3:=1;div4:=1;rem4:=2
  826.                 CASE 4
  827.                     div1:=1;rem1:=1;div2:=0;rem2:=1;div3:=0;rem3:=1;div4:=0;rem4:=1
  828.                 CASE 5
  829.                     div1:=1;rem1:=4;div2:=1;rem2:=4;div3:=1;rem3:=4;div4:=1;rem4:=4
  830.                 ENDSELECT
  831.       ENDIF
  832.  
  833.     ENDIF
  834.     IF wb.numargs>1
  835.       totfile:=wb.numargs-1
  836.       curfile:=1
  837.       FOR locs:=2 TO wb.numargs
  838.         olddir:=args[].lock++
  839.         IF args.lock
  840.           olddir:=CurrentDir(args.lock)
  841.           GetCurrentDirName(filename,250)
  842.           NameFromLock(args.lock,wstr,240)
  843.           CurrentDir(olddir)
  844.           processname(filename,wstr,args.name)
  845.           mode:=MODE_WB
  846.           enforcemax()
  847.           processicon()
  848.         ENDIF
  849.         curfile:=curfile+1
  850.       ENDFOR
  851.     ELSE
  852.       mode:=MODE_APP
  853.       enforcemax()
  854.       dosleep()
  855.     ENDIF
  856.   ELSE
  857.     FOR scratch:=0 TO 30
  858.       argarray[scratch]:=NIL
  859.     ENDFOR
  860.     rdarg:=ReadArgs('FILE,TEMPLATE=T/K,MAXIWIDTH=MW/N,MAXIHEIGHT=MH/N,CHUNKY=CM/S,FORCEEIGHT=F8/S,HIGHPEN=HP/N,BACKICON=BI/K',argarray,0)
  861.     IF rdarg
  862.       IF argarray[0]
  863.         StrCopy(filename,argarray[0],ALL)
  864.       ENDIF
  865.       IF argarray[1]
  866.         StrCopy(templatename,argarray[1],ALL)
  867.         stripinfo(templatename)
  868.       ENDIF
  869.       IF argarray[2]
  870.         maxiwidth:=argarray[2]
  871.         maxiwidth:=^maxiwidth
  872.       ENDIF
  873.       IF argarray[3]
  874.         maxiheight:=argarray[3]
  875.         maxiheight:=^maxiheight
  876.       ENDIF
  877.       IF argarray[4]
  878.         chunkyflag:=TRUE
  879.       ENDIF
  880.       IF argarray[5]
  881.         force8:=TRUE
  882.       ENDIF
  883.       IF argarray[6]
  884.         first4:=argarray[6]
  885.         first4:=^first4
  886.       ENDIF
  887.       IF argarray[7]
  888.         StrCopy(backname,argarray[7],ALL)
  889.         stripinfo(backname)
  890.       ENDIF
  891.       FreeArgs(rdarg);rdarg:=NIL
  892.     ENDIF
  893.     mode:=MODE_CLI
  894.     enforcemax()
  895.     processicon()
  896.   ENDIF
  897. ENDPROC
  898. PROC enforcemax()
  899.     IF maxiwidth<32 THEN maxiwidth:=32
  900.     IF maxiwidth>1024 THEN maxiwidth:=1024
  901.     IF maxiheight<32 THEN maxiheight:=32
  902.     IF maxiheight>1024 THEN maxiheight:=1024
  903.     maxiw:=maxiwidth-1
  904.     maxih:=maxiheight-1
  905.     IF quietflag
  906.       mode:=MODE_QUIET
  907.     ENDIF
  908.     IF sizex>maxiw THEN sizex:=maxiw
  909.     IF sizey>maxih THEN sizey:=maxih
  910.     IF posx>=maxiw THEN posx:=maxiw-1
  911.     IF posy>=maxih THEN posy:=maxih-1
  912.     IF posx+sizex>maxiw THEN sizex:=maxiw-posx
  913.     IF posy+sizey>maxih THEN sizey:=maxih-posy
  914.     IF ((posx) OR (posy) OR (sizex) OR (sizey)) THEN posflag:=TRUE
  915.     IF sizex=0 THEN sizex:=maxiw-posx
  916.     IF sizey=0 THEN sizey:=maxih-posy
  917. ENDPROC
  918. PROC loadcatalog()
  919.   IF localebase
  920.     catalog:=OpenCatalogA(NIL,'picticon.catalog',[OC_BUILTINLANGUAGE,'english',NIL,NIL])
  921.   ENDIF
  922.   readstrings()
  923.   FOR scratch:=0 TO L_ENDS
  924.     sl[scratch]:=locale(scratch)
  925.   ENDFOR
  926. ENDPROC
  927. PROC locale(strnum)
  928.   DEF stpoint,defstr
  929.   defstr:=sl[strnum]
  930.   IF ((localebase) AND (catalog))
  931.     stpoint:=GetCatalogStr(catalog,strnum,defstr)
  932.   ELSE
  933.     stpoint:=defstr
  934.   ENDIF
  935. ENDPROC stpoint
  936. PROC readstrings()
  937.   DEF buf,res=0
  938.   buf:={catstrs}
  939.   WHILE(Int(buf))<>0
  940.     res:=res+1
  941.     IF res>0 AND res<300
  942.       sl[res]:=buf
  943.     ENDIF
  944.     WHILE Char(buf)<>"¶"
  945.       buf:=buf+1
  946.     ENDWHILE
  947.     PutChar(buf,0)
  948.     buf:=buf+2
  949.     buf:=(Mul(Div((buf+1),2),2))
  950.   ENDWHILE
  951. ENDPROC
  952. PROC savewinpos() HANDLE
  953.   DEF buffer=NIL
  954.  
  955.   iff:=AllocIFF()
  956.   iff.stream:=Open('ENV:Picticon.prefs',MODE_NEWFILE)
  957.   IF (iff.stream)=NIL THEN Raise(E_NONE)
  958.   InitIFFasDOS(iff)
  959.   buffer:=New(100)
  960.   ierror:=OpenIFF(iff,IFFF_WRITE)
  961.   IF ierror THEN Raise(E_NONE)
  962.   PushChunk(iff,"PREF","FORM",IFFSIZE_UNKNOWN)
  963.  
  964.    PushChunk(iff,"PREF","PRHD",IFFSIZE_UNKNOWN)
  965.     PutLong(buffer,0);PutLong(buffer+2,0)
  966.     WriteChunkBytes(iff,buffer,6)
  967.    PopChunk(iff)
  968.  
  969.    PushChunk(iff,"PREF","WIND",IFFSIZE_UNKNOWN)
  970.     dumb:=buffer
  971.     PutLong(dumb,winx);PutLong(dumb+4,winy)
  972.     WriteChunkBytes(iff,buffer,8)
  973.    PopChunk(iff)
  974.  
  975.   PopChunk(iff)
  976.   Raise(E_NONE)
  977. EXCEPT
  978.   IF buffer THEN Dispose(buffer);buffer:=NIL
  979.   freeiff(666)
  980.   handleexception(exception)
  981. ENDPROC
  982. PROC loadwinpos() HANDLE
  983.   DEF buffer=NIL
  984.  
  985.   iff:=AllocIFF()
  986.   iff.stream:=Open('ENV:Picticon.prefs',MODE_OLDFILE)
  987.   IF (iff.stream)=NIL THEN Raise(E_NONE)
  988.   InitIFFasDOS(iff)
  989.   buffer:=New(100)
  990.   ierror:=OpenIFF(iff,IFFF_READ)
  991.   IF ierror THEN Raise(E_NONE)
  992.   ierror:=PropChunk(iff,"PREF","WIND")
  993.   ierror:=StopOnExit(iff,"PREF","FORM")
  994.   ierror:=ParseIFF(iff,IFFPARSE_SCAN)
  995.  
  996.   IF (sp:=FindProp(iff,"PREF","WIND"))
  997.     dumb:=sp.data
  998.     winx:=Long(dumb);winy:=Long(dumb+4)
  999.   ENDIF
  1000.  
  1001.   Raise(E_NONE)
  1002. EXCEPT
  1003.   IF buffer THEN Dispose(buffer)
  1004.   freeiff(666)
  1005.   handleexception(exception)
  1006. ENDPROC
  1007. PROC freeiff(unit)
  1008.   IF iff
  1009.     CloseIFF(iff)
  1010.     IF (iff.stream) THEN Close(iff.stream)
  1011.     FreeIFF(iff)
  1012.     iff:=NIL
  1013.   ENDIF
  1014. ENDPROC
  1015. PROC openlibs()
  1016.   IF (aslbase:=OpenLibrary('asl.library', 36))=NIL THEN CleanUp(25)
  1017.   localebase:=OpenLibrary('locale.library',37)
  1018.   loadcatalog()
  1019.   datatypesbase:=safeopenlibrary('datatypes.library',39)
  1020.   mathtransbase:=safeopenlibrary('mathtrans.library',36)
  1021.   gadtoolsbase:=safeopenlibrary('gadtools.library',36)
  1022.   workbenchbase:=safeopenlibrary('workbench.library',36)
  1023.   iconbase:=safeopenlibrary('icon.library', 36)
  1024.   iffparsebase:=safeopenlibrary('iffparse.library',36)
  1025.   diskfontbase:=safeopenlibrary('diskfont.library', 36)
  1026. /*  newiconbase:=OpenLibrary('newicon.library', 36)
  1027.   IF newiconbase THEN newiconmode:=TRUE */
  1028.   IF KickVersion(39);osversion:=TRUE;ELSE;osversion:=FALSE;ENDIF
  1029. ENDPROC
  1030. PROC safeopenlibrary(name,vers) HANDLE
  1031.   DEF lret
  1032.   IF ((lret:=OpenLibrary(name,vers))=NIL) THEN Raise(L_EF_LIBRARY)
  1033.   Raise(E_NONE)
  1034. EXCEPT
  1035.   handleexception(exception)
  1036. ENDPROC lret
  1037. PROC handleexception(except)
  1038.   IF except<>E_NONE THEN errormessage(except)
  1039.   IF quitter THEN leave(quitter)
  1040. ENDPROC
  1041. PROC closelibs()
  1042.   IF newiconbase THEN CloseLibrary(newiconbase)
  1043.   IF diskfontbase THEN CloseLibrary(diskfontbase)
  1044.   IF aslbase THEN CloseLibrary(aslbase)
  1045.   IF iffparsebase THEN CloseLibrary(iffparsebase)
  1046.   IF iconbase THEN CloseLibrary(iconbase)
  1047.   IF workbenchbase THEN CloseLibrary(workbenchbase)
  1048.   IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  1049.   IF datatypesbase THEN CloseLibrary(datatypesbase)
  1050.   IF layersbase THEN CloseLibrary(layersbase)
  1051.   IF keymapbase THEN CloseLibrary(keymapbase)
  1052.   IF mathtransbase THEN CloseLibrary(mathtransbase)
  1053.   IF localebase THEN CloseLibrary(localebase)
  1054. ENDPROC
  1055. PROC errormessage(errnum)
  1056.   IF errnum>=L_EF_FATAL
  1057.     errmsg(sl[errnum])
  1058.     quitter:=TRUE
  1059.   ELSE
  1060.     IF errnum>=L_E_GENERAL
  1061.       errmsg(sl[errnum])
  1062.     ELSE
  1063.       errmsg(sl[L_E_GENERAL])
  1064.     ENDIF
  1065.   ENDIF
  1066. ENDPROC
  1067. PROC errmsg(msgptr)
  1068.   IF mode=MODE_CLI
  1069.     WriteF('\s\n\n',msgptr)
  1070.   ELSE
  1071.     IF ((mode=MODE_WB) OR (mode=MODE_APP))
  1072.       displaymessage(msgptr,TRUE)
  1073.       Delay(80)
  1074.     ENDIF
  1075.   ENDIF
  1076. ENDPROC
  1077. PROC sp_div_tf_tf_f(int1,int2)
  1078.   RETURN SpDiv(SpFlt(int1),SpFlt(int2))
  1079. ENDPROC
  1080. PROC leave(flag)
  1081.   IF catalog THEN CloseCatalog(catalog)
  1082.   IF appimagedata THEN FreeMem(appimagedata,3200);appimagedata:=NIL
  1083.   IF curbitmap THEN myfreebitmap(curbitmap);curbitmap:=NIL
  1084.   IF diskobj THEN FreeDiskObject(diskobj);diskobj:=NIL
  1085.   IF visual THEN FreeVisualInfo(visual);visual:=NIL
  1086.   IF toolobject THEN FreeDiskObject(toolobject);toolobject:=NIL
  1087.  
  1088.   closelibs()
  1089.   IF flag
  1090.     IF flag=TRUE
  1091.       CleanUp(0)
  1092.     ELSE
  1093.       CleanUp(flag)
  1094.     ENDIF
  1095.   ENDIF
  1096. ENDPROC
  1097.  
  1098. PROC myallocbitmap(w,h,d,type,tags)
  1099.   IF osversion=TRUE
  1100.     RETURN AllocBitMap(w,h,d,type,tags)
  1101.   ENDIF
  1102. ENDPROC
  1103.  
  1104. PROC myfreebitmap(bm)
  1105.   IF osversion=TRUE
  1106.     RETURN FreeBitMap(bm)
  1107.   ELSE
  1108.   ENDIF
  1109. ENDPROC
  1110.  
  1111. PROC findcolor(colap,ared,agrn,ablu)
  1112.   DEF pointred,pointgrn,pointblu,mpen
  1113.   mpen:=-1
  1114.   IF (first4>0) THEN mpen:=first4
  1115.   pointred:=Shl(Shl(Shl(ared,8),8),8)
  1116.   pointgrn:=Shl(Shl(Shl(agrn,8),8),8)
  1117.   pointblu:=Shl(Shl(Shl(ablu,8),8),8)
  1118.   RETURN FindColor(colap,pointred,pointgrn,pointblu,mpen)
  1119. ENDPROC
  1120.  
  1121. PROC mygetrgb32(colmap,first,ncolors,table)
  1122.   DEF rre,eee
  1123.   IF osversion=TRUE
  1124.     GetRGB32(colmap,first,ncolors,table)
  1125.   ELSE
  1126.     rre:=GetRGB4(colmap,first)
  1127.     eee:=(rre AND $F)
  1128.     PutChar(table,eee)
  1129.     PutChar(table+1,eee)
  1130.     PutChar(table+2,eee)
  1131.     PutChar(table+3,eee)
  1132.     eee:=Shr((rre AND $F0),4)
  1133.     PutChar(table+4,eee)
  1134.     PutChar(table+5,eee)
  1135.     PutChar(table+6,eee)
  1136.     PutChar(table+7,eee)
  1137.     eee:=Shr((rre AND $F00),8)
  1138.     PutChar(table+8,eee)
  1139.     PutChar(table+9,eee)
  1140.     PutChar(table+10,eee)
  1141.     PutChar(table+11,eee)
  1142.   ENDIF
  1143. ENDPROC
  1144. PROC processname(name,dir,file)
  1145.  
  1146.   DEF wish[20]:STRING
  1147.  
  1148.   StrCopy(name,dir,ALL)
  1149.   IF StrLen(file)            /* IF a file (NOT DISK/DRAWER) */
  1150.     RightStr(wish,name,1)
  1151.     IF StrCmp(wish,':',1)=NIL       /*  DISK:DIR/NAME */
  1152.       StrAdd(name,'/',ALL)
  1153.     ENDIF
  1154.     StrAdd(name,file,ALL)
  1155.   ELSE
  1156.     RightStr(wish,name,1)
  1157.     IF StrCmp(wish,':',1)        /* DISK:  (so add disk) */
  1158.       StrAdd(name,'disk',ALL)
  1159.     ENDIF
  1160.     IF StrCmp(wish,'/',1)        /* DISK:DIR/DIR/  (delete '/' */
  1161.       MidStr(name,name,0,StrLen(name)-1)
  1162.     ENDIF
  1163.   ENDIF
  1164.   MidStr(wish,name,0,1)
  1165.   IF StrCmp(wish,'/',1)
  1166.     MidStr(name,name,1,ALL)
  1167.   ENDIF
  1168.   stripinfo(name)
  1169. ENDPROC
  1170. PROC stripinfo(name)
  1171.   DEF comp1[6]:STRING,comp2[6]:STRING
  1172.  
  1173.   StrCopy(comp1,'.INFO',ALL)
  1174.   MidStr(comp2,name,StrLen(name)-5,5)
  1175.   UpperStr(comp2)
  1176.   IF StrCmp(comp1,comp2,5)
  1177.     MidStr(name,name,0,(StrLen(name)-5))
  1178.   ENDIF
  1179. ENDPROC
  1180. PROC grabrgbtables()
  1181.   DEF cmtable
  1182.   cmtable:=[0,0,0,0,0,0]:LONG
  1183.   FOR scratch:=0 TO Shl(1,depth)-1
  1184.     mygetrgb32(colormap,scratch,1,cmtable)
  1185.     redt[scratch]:=Char(cmtable)
  1186.     grnt[scratch]:=Char(cmtable+4)
  1187.     blut[scratch]:=Char(cmtable+8)
  1188.   ENDFOR
  1189. ENDPROC
  1190.  
  1191. PROC stripselect(flags)
  1192.   IF (flags AND GFLG_GADGHIMAGE) THEN flags:=flags-GFLG_GADGHIMAGE
  1193.   IF (flags AND GFLG_GADGHCOMP) THEN flags:=flags-GFLG_GADGHCOMP
  1194.   IF (flags AND GADGBACKFILL) THEN flags:=flags-GADGBACKFILL
  1195. ENDPROC flags
  1196.  
  1197.  
  1198. PROC copybitmap2image(sb,di,nb,ys,dp,savedepth)
  1199.  
  1200.   DEF plane,cp,cr,cb,byte,sbs=NIL:PTR TO mybitmapstruct
  1201.  
  1202.   sbs:=sb;byte:=di
  1203.   FOR plane:=1 TO savedepth
  1204.     IF plane>dp         /* If save plane is not edited, use highest that was */
  1205.       SELECT dp
  1206.         CASE 1;cp:=sbs.plane1
  1207.         CASE 2;cp:=sbs.plane2
  1208.         CASE 3;cp:=sbs.plane3
  1209.         CASE 4;cp:=sbs.plane4
  1210.         CASE 5;cp:=sbs.plane5
  1211.         CASE 6;cp:=sbs.plane6
  1212.         CASE 7;cp:=sbs.plane7
  1213.         CASE 8;cp:=sbs.plane8
  1214.       ENDSELECT
  1215.     ELSE
  1216.       SELECT plane
  1217.         CASE 1;cp:=sbs.plane1
  1218.         CASE 2;cp:=sbs.plane2
  1219.         CASE 3;cp:=sbs.plane3
  1220.         CASE 4;cp:=sbs.plane4
  1221.         CASE 5;cp:=sbs.plane5
  1222.         CASE 6;cp:=sbs.plane6
  1223.         CASE 7;cp:=sbs.plane7
  1224.         CASE 8;cp:=sbs.plane8
  1225.       ENDSELECT
  1226.     ENDIF
  1227.     FOR cr:=0 TO ys-1
  1228.       FOR cb:=0 TO nb-1
  1229.         MOVE.L byte,A0
  1230.         MOVE.L cp,A1
  1231.         MOVE.B (A1),(A0)
  1232.         byte:=byte+1;cp:=cp+1
  1233.       ENDFOR
  1234.       cp:=cp+(sbs.bytesperrow-nb)
  1235.     ENDFOR
  1236.   ENDFOR
  1237. ENDPROC
  1238.  
  1239. PROC copyrast2image(sb,di,nb,ys,dp,savedepth)
  1240.  
  1241.   DEF plane,cp,cr,cb,byte,sbs=NIL:PTR TO mybitmapstruct
  1242.  
  1243.   byte:=di
  1244.   FOR plane:=0 TO savedepth-1
  1245.     ditz:=Shl(1,smaller(plane,dp))
  1246.     FOR cr:=0 TO ys-1
  1247.       FOR cb:=0 TO nb-1
  1248.         body:=0
  1249.         FOR dang:=7 TO 0 STEP -1
  1250.           dumb:=ReadPixel(sb,(cb*8)+(7-dang),cr)
  1251.           IF (dumb AND ditz) THEN body:=(body OR Shl(1,dang))
  1252.         ENDFOR
  1253.         PutChar(byte,body)
  1254.         byte:=byte+1
  1255.       ENDFOR
  1256.     ENDFOR
  1257.   ENDFOR
  1258. ENDPROC
  1259.  
  1260. PROC findsize(rast1)
  1261.   DEF li,lt,a
  1262.   requestsizex:=NIL;requestsizey:=NIL
  1263.   FOR li:=0 TO maxih;FOR lt:=0 TO maxiw
  1264.       a:=ReadPixel(rast1,lt,li)
  1265.       IF (a)
  1266.         IF lt>requestsizex;requestsizex:=lt;ENDIF
  1267.         IF li>requestsizey;requestsizey:=li;ENDIF
  1268.       ENDIF
  1269.       IF a>highestcolor;highestcolor:=a;ENDIF
  1270.     ENDFOR;ENDFOR
  1271.   requestsizex:=requestsizex+1;requestsizey:=requestsizey+2
  1272. ENDPROC
  1273.  
  1274. PROC restorediskobj(diskobj:PTR TO diskobject)
  1275.   DEF gadget:PTR TO gadget
  1276.   gadget:=diskobj.gadget
  1277.   gadget.gadgetrender:=k[0]
  1278.   gadget.selectrender:=k[1]
  1279.   gadget.flags:=k[2]
  1280.   diskobj.drawerdata:=k[3]
  1281.   Dispose(k[4]);k[4]:=NIL
  1282.   Dispose(k[5]);k[5]:=NIL
  1283.   Dispose(k[6]);k[6]:=NIL
  1284.   diskobj.type:=k[7]
  1285.   IF k[9]  THEN FreeMem(k[9], k[8])
  1286.   IF k[10] THEN FreeMem(k[10],k[8])
  1287.   k[9]:=NIL
  1288.   k[10]:=NIL
  1289. ENDPROC
  1290.  
  1291. PROC creatediskobj(diskobj:PTR TO diskobject,rast1:PTR TO rastport) HANDLE
  1292.   DEF gadget:PTR TO gadget
  1293.   DEF iconsizex,iconsizey,highplane
  1294.   DEF numbyteswide,savedepthhow,sizetmp
  1295.   DEF i1:PTR TO image,i2:PTR TO image
  1296.   DEF bitm1
  1297.  
  1298.   gadget:=diskobj.gadget
  1299.   k[0]:=gadget.gadgetrender
  1300.   k[1]:=gadget.selectrender
  1301.   k[2]:=gadget.flags
  1302.   k[3]:=diskobj.drawerdata
  1303.   k[4]:=New(SIZEOF image)
  1304.   k[5]:=New(SIZEOF image)
  1305.   k[6]:=New(SIZEOF drawerdata)
  1306.   k[7]:=diskobj.type
  1307.   k[8]:=0
  1308.   k[9]:=0
  1309.   highestcolor:=0
  1310.   bitm1:=curbitmap
  1311.  
  1312.   findsize(rast1)
  1313.   iconsizex:=bigger(bigger(requestsizex,10),minimumx)
  1314.   iconsizey:=bigger(bigger(requestsizey,10),minimumy)
  1315.  
  1316.   numbyteswide:=((iconsizex+15)/16)*2
  1317.   savedepthhow:=depth
  1318.   IF (force8) THEN savedepthhow:=8
  1319.   sizetmp:=(numbyteswide*iconsizey*savedepthhow)+1000
  1320.  
  1321.   k[8]:=sizetmp
  1322.   k[9]:=AllocMem(sizetmp,(MEMF_CHIP OR MEMF_CLEAR))
  1323.   k[10]:=AllocMem(sizetmp,(MEMF_CHIP OR MEMF_CLEAR))
  1324.   IF ((k[9]=NIL) OR (k[10]=NIL)) THEN Raise(L_EF_CHIPBUFFER)
  1325.  
  1326.   IF chunkyflag=NIL
  1327.     copybitmap2image(bitm1,k[9],numbyteswide,iconsizey-1,depth,savedepthhow)
  1328.   ELSE
  1329.     copyrast2image(rast1,k[9],numbyteswide,iconsizey-1,depth,savedepthhow)
  1330.   ENDIF
  1331.   i1:=k[4];i2:=k[5]
  1332.   i1.leftedge:=0;i1.topedge:=0;i1.width:=iconsizex
  1333.   i1.height:=iconsizey-1;i1.depth:=8;i1.imagedata:=k[9]
  1334.   i1.planepick:=0;i1.planeonoff:=0;i1.nextimage:=NIL
  1335.   i2.leftedge:=0;i2.topedge:=0;i2.width:=iconsizex
  1336.   i2.height:=iconsizey-1;i2.depth:=8;i2.imagedata:=k[10]
  1337.   i2.planepick:=0;i2.planeonoff:=0;i2.nextimage:=NIL
  1338.  
  1339.   highplane:=1
  1340.   IF highestcolor>1;highplane:=2;ENDIF
  1341.   IF highestcolor>3;highplane:=3;ENDIF
  1342.   IF highestcolor>7;highplane:=4;ENDIF
  1343.   IF highestcolor>15;highplane:=5;ENDIF
  1344.   IF highestcolor>31;highplane:=6;ENDIF
  1345.   IF highestcolor>63;highplane:=7;ENDIF
  1346.   IF highestcolor>127;highplane:=8;ENDIF
  1347.   IF (force8)
  1348.     i1.depth:=8
  1349.     i2.depth:=8
  1350.   ELSE
  1351.     i1.depth:=highplane
  1352.     i2.depth:=highplane
  1353.   ENDIF
  1354.   gadget.width:=iconsizex;gadget.height:=iconsizey;gadget.gadgetrender:=i1
  1355.   gadget.selectrender:=NIL
  1356.   IF freeme=TRUE
  1357.     diskobj.currentx:=NO_ICON_POSITION
  1358.     diskobj.currenty:=NO_ICON_POSITION
  1359.   ENDIF
  1360.   gadget.flags:=stripselect(gadget.flags)
  1361.   gadget.flags:=(gadget.flags OR GFLG_GADGHCOMP)
  1362.   diskobj.type:=WBPROJECT
  1363.  
  1364.   Raise(E_NONE)
  1365. EXCEPT
  1366.   IF exception<>E_NONE
  1367.     errormessage(exception)
  1368.   ENDIF
  1369.   IF quitter THEN leave(quitter)
  1370. ENDPROC
  1371.  
  1372. PROC smaller(val1,val2);IF val1<val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  1373. PROC bigger(val1,val2);IF val1>val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  1374. PROC limit(val1,val2,val3);IF val1<val2 THEN RETURN val2
  1375.           IF val1>val3 THEN RETURN val3;ENDPROC val1
  1376. PROC threshold(val,th);IF Abs(val)<=th THEN RETURN 0;ENDPROC val
  1377.  
  1378. PROC domethod( obj:PTR TO object, msg:PTR TO msg )
  1379.   DEF h:PTR TO hook, o:PTR TO object, dispatcher
  1380.   IF obj
  1381.     o := obj-SIZEOF object     /* instance data is to negative offset */
  1382.     h := o.class
  1383.     dispatcher := h.entry      /* get dispatcher from hook in iclass */
  1384.     MOVEA.L h,A0
  1385.     MOVEA.L msg,A1
  1386.     MOVEA.L obj,A2           /* probably should use CallHookPkt, but the */
  1387.     MOVEA.L dispatcher,A3    /*   original code (DoMethodA()) doesn't. */
  1388.     JSR (A3)                 /* call classDispatcher() */
  1389.     MOVE.L D0,o
  1390.     RETURN o
  1391.   ENDIF
  1392. ENDPROC NIL
  1393.  
  1394. PROC copyimagerast(rastp:PTR TO rastport,image)
  1395.   DrawImage(rastp,image,0,0)
  1396. ENDPROC
  1397.  
  1398. catstrs:
  1399.   CHAR 'Ok¶'
  1400.   CHAR 'Error: A general error has occured.¶'
  1401.   CHAR 'Error: File not found.¶'
  1402.   CHAR 'Error: Could not open file.¶'
  1403.   CHAR 'Error: Problems with icon.¶'
  1404.   CHAR 'Error: Unable to write icon file.¶'
  1405.   CHAR 'Error: Problems opening clipboard.¶'
  1406.   CHAR 'Error: Problems with datatype.¶'
  1407.   CHAR 'Error: Datatype is not a picture.¶'
  1408.   CHAR 'Error: Problems creating gadgets.¶'
  1409.   CHAR 'Error: Could not open a required library.¶'
  1410.   CHAR 'Error: An undefined FATAL error has occured.¶'
  1411.   CHAR 'Fatal Error: Could not lock a public screen.¶'
  1412.   CHAR 'Fatal Error: Not enough CHIP memory\n        for a required buffer.¶'
  1413.   CHAR 'Fatal Error: Could not obtain a visual lock.¶'
  1414.   CHAR 'Fatal Error: Unable to create menus.¶'
  1415.   CHAR 'Fatal Error: Could not open a port.¶'
  1416.   CHAR 'Fatal Error: Unable to open window.¶'
  1417.   CHAR 'Error: Unable to allocate some memory.¶'
  1418.   CHAR 'Picticon Status¶'
  1419.   CHAR 'Picture "\s"¶'
  1420.   CHAR '(\d of \d)¶'
  1421.   CHAR 'Loading...¶'
  1422.   CHAR 'Scaling...¶'
  1423.   CHAR 'Remapping...¶'
  1424.   CHAR 'Saving icon.¶'
  1425.   CHAR '\n\s(\d%% done.)¶'
  1426.   CHAR 'Picticon¶'
  1427.   CHAR 'Copyright ©1993,94\n by Chad Randall\n\nThis software is freely re-distributable.\n\nDo you wish to quit?¶'
  1428.   CHAR 'Quit|Cancel¶'
  1429.   CHAR 'Rendering...¶'
  1430.   LONG 0,0,0
  1431.  
  1432. chardata:
  1433.  
  1434.   CHAR '.xxx..'
  1435.   CHAR 'x...x.'
  1436.   CHAR 'x...x.'
  1437.   CHAR 'x...x.'
  1438.   CHAR 'x...x.'
  1439.   CHAR '.xxx..'
  1440.  
  1441.   CHAR '..x...'
  1442.   CHAR '..x...'
  1443.   CHAR '..x...'
  1444.   CHAR '..x...'
  1445.   CHAR '..x...'
  1446.   CHAR '..x...'
  1447.  
  1448.   CHAR 'xxxxx.'
  1449.   CHAR '....x.'
  1450.   CHAR '..xxx.'
  1451.   CHAR '.x....'
  1452.   CHAR 'x.....'
  1453.   CHAR 'xxxxx.'
  1454.  
  1455.   CHAR 'xxxx..'
  1456.   CHAR '....x.'
  1457.   CHAR '..xx..'
  1458.   CHAR '....x.'
  1459.   CHAR '....x.'
  1460.   CHAR 'xxxx..'
  1461.  
  1462.   CHAR '...x..'
  1463.   CHAR '..xx..'
  1464.   CHAR '.x.x..'
  1465.   CHAR 'xxxxx.'
  1466.   CHAR '...x..'
  1467.   CHAR '...x..'
  1468.  
  1469.   CHAR 'xxxxx.'
  1470.   CHAR 'x.....'
  1471.   CHAR 'xxxx..'
  1472.   CHAR '....x.'
  1473.   CHAR '....x.'
  1474.   CHAR 'xxxx..'
  1475.  
  1476.   CHAR '.xxx..'
  1477.   CHAR 'x.....'
  1478.   CHAR 'xxxx..'
  1479.   CHAR 'x...x.'
  1480.   CHAR 'x...x.'
  1481.   CHAR '.xxx..'
  1482.  
  1483.   CHAR 'xxxxx.'
  1484.   CHAR '....x.'
  1485.   CHAR '...x..'
  1486.   CHAR '..x...'
  1487.   CHAR '..x...'
  1488.   CHAR '..x...'
  1489.  
  1490.   CHAR '.xxx..'
  1491.   CHAR 'x...x.'
  1492.   CHAR '.xxx..'
  1493.   CHAR 'x...x.'
  1494.   CHAR 'x...x.'
  1495.   CHAR '.xxx..'
  1496.  
  1497.   CHAR '.xxx..'
  1498.   CHAR 'x...x.'
  1499.   CHAR '.xxxx.'
  1500.   CHAR '....x.'
  1501.   CHAR '....x.'
  1502.   CHAR '.xxx..'
  1503.  
  1504. xdata:
  1505.   CHAR '......'
  1506.   CHAR '......'
  1507.   CHAR '.x.x..'
  1508.   CHAR '..x...'
  1509.   CHAR '.x.x..'
  1510.   CHAR '......'
  1511.  
  1512. chardatal:
  1513.  
  1514.   CHAR '.xxx..'
  1515.   CHAR 'x...x.'
  1516.   CHAR 'x...x.'
  1517.   CHAR 'x...x.'
  1518.   CHAR 'x...x.'
  1519.   CHAR 'x...x.'
  1520.   CHAR 'x...x.'
  1521.   CHAR '.xxx..'
  1522.  
  1523.   CHAR '..x...'
  1524.   CHAR '..x...'
  1525.   CHAR '..x...'
  1526.   CHAR '..x...'
  1527.   CHAR '..x...'
  1528.   CHAR '..x...'
  1529.   CHAR '..x...'
  1530.   CHAR '..x...'
  1531.  
  1532.   CHAR '.xxx..'
  1533.   CHAR 'x...x.'
  1534.   CHAR '....x.'
  1535.   CHAR '...x..'
  1536.   CHAR '..x...'
  1537.   CHAR '.x....'
  1538.   CHAR 'x.....'
  1539.   CHAR 'xxxxx.'
  1540.  
  1541.   CHAR '.xxx..'
  1542.   CHAR 'x...x.'
  1543.   CHAR '....x.'
  1544.   CHAR '..xx..'
  1545.   CHAR '....x.'
  1546.   CHAR '....x.'
  1547.   CHAR 'x...x.'
  1548.   CHAR '.xxx..'
  1549.  
  1550.   CHAR '...x..'
  1551.   CHAR '..xx..'
  1552.   CHAR '.x.x..'
  1553.   CHAR 'x..x..'
  1554.   CHAR 'xxxxx.'
  1555.   CHAR '...x..'
  1556.   CHAR '...x..'
  1557.   CHAR '...x..'
  1558.  
  1559.   CHAR 'xxxxx.'
  1560.   CHAR 'x.....'
  1561.   CHAR 'x.....'
  1562.   CHAR 'xxxx..'
  1563.   CHAR '....x.'
  1564.   CHAR '....x.'
  1565.   CHAR '....x.'
  1566.   CHAR 'xxxx..'
  1567.  
  1568.   CHAR '.xxx..'
  1569.   CHAR 'x.....'
  1570.   CHAR 'x.....'
  1571.   CHAR 'xxxx..'
  1572.   CHAR 'x...x.'
  1573.   CHAR 'x...x.'
  1574.   CHAR 'x...x.'
  1575.   CHAR '.xxx..'
  1576.  
  1577.   CHAR 'xxxxx.'
  1578.   CHAR '....x.'
  1579.   CHAR '....x.'
  1580.   CHAR '...x..'
  1581.   CHAR '..x...'
  1582.   CHAR '..x...'
  1583.   CHAR '..x...'
  1584.   CHAR '..x...'
  1585.  
  1586.   CHAR '.xxx..'
  1587.   CHAR 'x...x.'
  1588.   CHAR 'x...x.'
  1589.   CHAR '.xxx..'
  1590.   CHAR 'x...x.'
  1591.   CHAR 'x...x.'
  1592.   CHAR 'x...x.'
  1593.   CHAR '.xxx..'
  1594.  
  1595.   CHAR '.xxx..'
  1596.   CHAR 'x...x.'
  1597.   CHAR 'x...x.'
  1598.   CHAR '.xxxx.'
  1599.   CHAR '....x.'
  1600.   CHAR '....x.'
  1601.   CHAR 'x...x.'
  1602.   CHAR '.xxx..'
  1603.  
  1604. xdatal:
  1605.   CHAR '......'
  1606.   CHAR '......'
  1607.   CHAR 'x...x.'
  1608.   CHAR '.x.x..'
  1609.   CHAR '..x...'
  1610.   CHAR '.x.x..'
  1611.   CHAR 'x...x.'
  1612.   CHAR '......'
  1613.  
  1614. controlstring:
  1615.   CHAR $B,0,0,0,0
  1616.   CHAR $9B,"1",$53,$0,$0,$0,$0
  1617.  
  1618.