fpc/fcl/image/bmpcomn.pp
michael 9fe7ee0b81 * Patches from Giulio BERNA
- BMP Reader enhanced to full Microsoft specs:
    + support for 15,16 bit bitmaps. 
    + support for strange color masks at 16, 32 bpp
    + rle4 and rle8 decoding
    + top-down stored bitmaps.
    + Palette behaviour changed: use palette at 1,4,8 bits.
    + Support for OnProgress
  - BMP Writer support:
    + BitsPerPixel property.
    + Writing at all color depths.
    + RLE8 and RLE4 compression.
  - Functions to create standard palettes:
    CreateBlackAndWhitePalette
    CreateWebSafePalette 
    CreateGrayScalePalette
    CreateVGAPalette

git-svn-id: trunk@987 -
2005-08-30 19:26:31 +00:00

125 lines
3.2 KiB
ObjectPascal

{*****************************************************************************}
{
This file is part of the Free Pascal's "Free Components Library".
Copyright (c) 2003 by Mazen NEIFER of the Free Pascal development team
BMP reader/writer common code.
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 BMPcomn;
interface
const
{BMP magic word is always 19778 : 'BM'}
BMmagic=19778;
{ Values for Compression field }
BI_RGB = 0;
BI_RLE8 = 1;
BI_RLE4 = 2;
BI_BITFIELDS = 3;
BI_JPEG = 4;
BI_PNG = 5;
type
TBitMapFileHeader = packed record
{00+02 :File type}
bfType:word;
{02+04 :File size in bytes}
bfSize:longint;
{06+04 : Reserved}
bfReserved:longint;
{10+04 : Offset of image data : size if the file hieder + the info header + palette}
bfOffset:longint;
end;
PBitMapFileHeader = ^TBitMapFileHeader;
TBitMapInfoHeader = packed record
{14+04 : Size of the bitmap info header : sould be 40=$28}
Size:longint;
{18+04 : Image width in pixels}
Width:longint;
{22+04 : Image height in pixels}
Height:longint;
{26+02 : Number of image planes : should be 1 always}
Planes:word;
{28+02 : Color resolution : Number of bits per pixel (1,4,8,16,24,32)}
BitCount:word;
{30+04 : Compression Type}
Compression:longint;
{34+04 : Size of image data (not headers nor palette): can be 0 if no compression}
SizeImage:longint;
{38+04 : Horizontal resolution in pixel/meter}
XPelsPerMeter:Longint;
{42+04 : Vertical resolution in pixel/meter}
YPelsPerMeter:Longint;
{46+04 : Number of colors used}
ClrUsed:longint;
{50+04 : Number of imprtant colors used : usefull for displaying on VGA256}
ClrImportant:longint;
end;
PBitMapInfoHeader = ^TBitMapInfoHeader;
TColorRGB=packed record
B,G,R:Byte;
end;
PColorRGB = ^TColorRGB;
TColorRGBA=packed record
case Boolean of
False:(B,G,R,A:Byte);
True:(RGB:TColorRGB);
end;
PColorRGBA = ^TColorRGBA;
{54+?? : Color map : Lenght of color map is 4 bytes + the rest until the beginning of image data fixed in BFH.bfOffset}
TColorMap=TColorRGBA;
procedure SwapBMPFileHeader(var BFH : TBitMapFileHeader);
procedure SwapBMPInfoHeader(var BFI : TBitMapInfoHeader);
implementation
uses FPImgCmn;
procedure SwapBMPFileHeader(var BFH : TBitMapFileHeader);
begin
with BFH do
begin
bfType:=swap(bfType);
bfSize:=swap(bfSize);
bfReserved:=swap(bfReserved);
bfOffset:=swap(bfOffset);
end;
end;
procedure SwapBMPInfoHeader(var BFI : TBitMapInfoHeader);
begin
with BFI do
begin
Size:=swap(Size);
Width:=swap(Width);
Height:=swap(Height);
Planes:=swap(Planes);
BitCount:=swap(BitCount);
Compression:=swap(Compression);
SizeImage:=swap(SizeImage);
XPelsPerMeter:=swap(XPelsPerMeter);
YPelsPerMeter:=swap(YPelsPerMeter);
ClrUsed:=swap(ClrUsed);
ClrImportant:=swap(ClrImportant);
end;
end;
end.