123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- {*****************************************************************************}
- {
- This file is part of the Free Pascal's "Free Components Library".
- Copyright (c) 2003 by Michael Van Canneyt of the Free Pascal development team
- TARGA writer implementation.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- }
- {*****************************************************************************}
- {$mode objfpc}{$h+}
- unit FPWriteTGA;
- interface
- uses FPImage, classes, sysutils;
- type
- TFPWriterTarga = class (TFPCustomImageWriter)
- protected
- function SaveHeader(Stream:TStream; Img: TFPCustomImage):boolean; virtual;
- procedure InternalWrite (Stream:TStream; Img: TFPCustomImage); override;
- end;
- implementation
- uses targacmn;
- function TFPWriterTarga.SaveHeader(Stream:TStream; Img : TFPCustomImage):boolean;
- var
- Header : TTargaHeader;
- ID : ShortString;
- begin
- Result:=False;
- ID:=Img.Extra[KeyIdentification];
- FillChar(Header,SizeOf(Header),0);
- With Header do
- begin
- IDLen:=Length(ID);
- MapType:=0; // No colormap. Uncompressed RGB Only.
- ImgType:=2; // Uncompressed RGB
- MapStart:=FromWord(0); // No data
- MapLength:=FromWord(0); // No colormap yet.
- MapEntrySize:=0; // No colormap yet.
- OriginX:= FromWord(0);
- OriginY:=FromWord(0);
- Width:=FromWord(Img.Width);
- Height:=FromWord(Img.Height);
- PixelSize:=24; // BGR data.
- Flags:=$20; // Top-town, non interlaced.
- end;
- Stream.WriteBuffer(Header,SizeOf(Header));
- If Header.IDlen>0 then
- Stream.WriteBuffer(Id[1],Header.IDLen);
- Result:=true;
- end;
- procedure TFPWriterTarga.InternalWrite (Stream:TStream; Img:TFPCustomImage);
- var
- Row,Col,WriteSize:Integer;
- Aline,P: PByte;
- C : TFPColor;
- begin
- SaveHeader(Stream,Img);
- WriteSize:=Img.Width*3;
- GetMem(aLine,WriteSize);
- Try
- for Row:=0 to Img.Height-1 do
- begin
- P:=ALine;
- For Col:=0 to Img.width-1 do
- begin
- C:=Img.Colors[Col,Row];
- P^:=C.Blue shr 8;
- Inc(P);
- P^:=C.Green shr 8;
- Inc(P);
- P^:=C.Red shr 8;
- Inc(P);
- end;
- Stream.Write(aLine[0],WriteSize);
- end;
- Finally
- FreeMem(aLine);
- end;
- end;
- initialization
- ImageHandlers.RegisterImageWriter ('TARGA Format', 'tga', TFPWriterTarga);
- end.
|