Syntax20b.Scn.Fnt ParcElems Alloc Syntax24b.Scn.Fnt Syntax10.Scn.Fnt Syntax10b.Scn.Fnt FoldElems (* AMIGA *) MODULE AmigaIFF; (* Ralf Degner 04.08.1995 *) IMPORT SYSTEM, i:=AmigaIFFParse, Amiga, G:=AmigaGraphics, AmigaIntuition, Display, Pictures, PictureFrames, Log; CONST FORM*=0464F524DH; FTXT*=046545854H; CHRS*=043485253H; OBRO*=04F42524FH; ILBM*=0494C424DH; BMHD*=424D4844H; CMAP*=434D4150H; CAMG*=43414D47H; BODY*=0424F4459H; mskNone*=0; mskHasMask*=1; cmpNone*=0; cmpByteRun1*=1; (* for Bitmapheader *) WindowPtr = POINTER TO AmigaIntuition.Window; ScreenPtr = POINTER TO AmigaIntuition.Screen; BitmapPtr=POINTER TO G.BitMap; RPPtr=POINTER TO G.RastPort; BitmapHeaderPtr*= POINTER TO BitmapHeader; BitmapHeader*= RECORD w*, h*, x*, y*: INTEGER; nPlanes*: CHAR; masking*, compression*, pad1*: SHORTINT; transparentColor*: INTEGER; xAspect*, yAspect*: SHORTINT; pageWidth*, pageHeight*: INTEGER END; (* Test Color of a Picture, if there is only black, use Colors of Display *) PROCEDURE TestSetPictColor(P: Pictures.Picture); i, k, r, g, b: INTEGER; status: BOOLEAN; BEGIN status:=FALSE;k:=SHORT(ASH(1, P.depth));i:=0; REPEAT Pictures.GetColor(P, i, r, g, b); status:=status OR (r#0) OR (g#0) OR (b#0); INC(i) UNTIL status OR (i=k); IF ~status THEN FOR i:=0 TO SHORT(ASH(1, P.depth)-1) DO Display.GetColor(i,r,g,b); Pictures.SetColor(P,i,r,g,b) END END TestSetPictColor; (* Procedures for working with ILBMs *) PROCEDURE StoreBMHD*(iff: i.IFFHandlePtr; w, h, planes: INTEGER; compr: SHORTINT); b: BitmapHeader; error: LONGINT; BEGIN b.w:=w; b.h:=h; b.x:=0; b.y:=0; b.nPlanes:=CHR(planes); b.masking:=mskNone; b.compression:=compr; b.pad1:=0; b.transparentColor:=0; b.xAspect:=1; b.yAspect:=1; b.pageWidth:=w; b.pageHeight:=h; IF i.PushChunk(iff, 0, BMHD, i.sizeUnknown)=0 THEN error:=i.WriteChunkBytes(iff, SYSTEM.ADR(b), SIZE(BitmapHeader)); error:=i.PopChunk(iff) END StoreBMHD; PROCEDURE LoadDisplayColors*(iff: i.IFFHandlePtr); buffer: ARRAY 768 OF CHAR; n, anz: LONGINT; Count: INTEGER; cn: i.ContextNodePtr; BEGIN IF i.StopChunk(iff, ILBM, CMAP)=0 THEN IF i.ParseIFF(iff, i.parseScan)=0 THEN cn:=i.CurrentChunk(iff); IF cn#NIL THEN anz:=(i.ReadChunkBytes(iff, SYSTEM.ADR(buffer), 768)) DIV 3; n:=ASH(1, Amiga.Depth); IF anz=len THEN len:=i.ReadChunkBytes(iff, DumAdr, 4096); ptr:=0 END; RETURN DumBuf[ptr] END GetByte; PROCEDURE ReadPackedLine(Dest: LONGINT); VAR Nr: LONGINT; Wert: SHORTINT; Count: INTEGER; ch: CHAR; BEGIN Nr:=0; REPEAT Wert:=SYSTEM.VAL(SHORTINT, GetByte()); IF Wert>=0 THEN FOR Count:=0 TO Wert DO ch:=GetByte(); IF Nr=0 THEN FOR Count:=0 TO Wert DO ch:=GetByte(); INC(Nr) END ELSIF Wert#-128 THEN ch:=GetByte(); FOR Count:=0 TO ABS(Wert) DO INC(Nr) END END UNTIL Nr=wb END SkipPackedLine; BEGIN rp:=SYSTEM.VAL(G.RastPortPointer, p.rp); bm:=SYSTEM.VAL(G.BitMapPointer, rp.bitMap); bpr:=bm.bytesPerRow; wb:=((w+15) DIV 16)*2; restb:=wb-bpr; IF restb<0 THEN restb:=0 END; DumAdr:=SYSTEM.ADR(DumBuf); FOR plane:=0 TO d-1 DO maps[plane]:=bm.planes[plane] END; IF comp=0 THEN (* No Compression *) FOR line:=0 TO h-1 DO FOR plane:=0 TO iffd-1 DO IF planeAmiga.Depth THEN Planes:=Amiga.Depth END; Pictures.Create(P, bh.w, bh.h, Planes); IF P=NIL THEN RETURN NIL END; P.notify := PictureFrames.NotifyDisplay; LoadPictBitmap(iff, P, bh.w, bh.h, Planes, OriPlanes, bh.compression); IF colors#0 THEN FOR Count:=0 TO SHORT(colors)-1 DO Pictures.SetColor(P, Count, ORD(CB[Count*3]), ORD(CB[Count*3+1]), ORD(CB[Count*3+2])) END END; RETURN P END END END END LoadILBMToPict; PROCEDURE FitColors*(P: Pictures.Picture); Map, dr, dg, db: ARRAY 256 OF INTEGER; CountP, CountD: INTEGER; r, g, b, Col, x, y: INTEGER; sr, sg, sb, n, l: LONGINT; BEGIN Log.Str("Saerching for new colors ..."); Log.Ln; FOR CountD:=0 TO 255 DO Display.GetColor(CountD, dr[CountD], dg[CountD], db[CountD]) END; FOR CountP:=0 TO SHORT(ASH(1, P.depth))-1 DO Pictures.GetColor(P, CountP, r, g, b); l:=256*256*3; FOR CountD:=0 TO SHORT(ASH(1, Amiga.Depth))-1 DO sr:=dr[CountD]-r; sg:=dg[CountD]-g; sb:=db[CountD]-b; n:=sr*sr+sg*sg+sb*sb; IF n