(********************************************************************)
(* *)
(* OBJIMAGE.PAS *)
(* *)
(* Object Oriented Graphics Image Support *)
(* *)
(* Copyright (c) 2002 *)
(* Mark J Iuzzolino *)
(* *)
(* *)
(********************************************************************)
unit objImage;
interface
uses ObjGfx40;
type ogImageType = (NOGRAPHIC,BMP);
const ogImageTypeStr:array[ogImageType] of string[3]=('','BMP');
type
ogImagePtr = ^ogImage;
ogImage = object
private
tmpBuf:^ogSurface;
c_buf:pointer;
c_buf_size:uInt32;
c_buf_idx:uInt32;
public
constructor init;
function SaveGfx(var SrcObject:ogSurface; const gfxfile:string;GfxType:ogImageType):boolean; virtual;
function SaveGfxTo(var SrcObject:ogSurface; const gfxfile:string;
GfxType:ogImageType;offset:longint):boolean; virtual;
destructor done;
end;
type
ogImageFmt = record
pixFmt : ogPixelFmt;
xRes : uInt32;
yRes : uInt32;
end;
implementation
uses dos;
type
BitMapHeaDer = packed record
width,height : uInt16;
left,top : uInt16;
BitPlanes : byte;
Masking : byte;
Compress : byte;
Paddington : byte;
Transparency : word;
XAspectRatio : byte;
YAspectRatio : byte;
PageWidth : word;
PageHeight : word;
end;
type
WinBMPFileHeader = packed record
FileType : uInt16;
FileSize : uInt32;
Reserved1 : uInt16; {always 0}
Reserved2 : uInt16; {always 0}
BitmapOffset : uInt32;
end;
type
Win3xBitmapHeader = packed record
FileHeader : WinBMPFileHeader;
Size : uInt32;
Width,Height : Int32;
Planes : uInt16;
BitsPerPixel : uInt16;
{ Fields added for Windows 3.x follow this line}
Compression : uInt32;
SizeOfBitmap : uInt32;
HorzResolution : Int32;
VertResolution : Int32;
ColoursUsed : UInt32;
ColoursImportant : UInt32;
end;
type
Win3xPaletteElement = packed record
blue,green,red,pad : byte;
end;
function bswapl(input:uInt32):uInt32; assembler;
asm
mov eax,input
bswap eax
mov result, eax
(*
* mov ax,word ptr input+2
* xchg ah,al
* mov dx,word ptr input
* xchg dh,dl
*)
end;
function bswapw(input:uInt16):uInt16; assembler;
asm
mov ax,input
xchg ah,al
mov result, ax
end;
constructor ogImage.Init;
begin
tmpBuf:=NIL;
c_buf:=NIL;
c_buf_size:=0;
c_buf_idx:=0;
end;
function ogImage.saveGfx;
begin
saveGfx:=saveGfxTo(SrcObject,gfxfile,gfxtype,0);
end;
function ogImage.saveGfxTo;
const ID_S:array[0..7] of char='MOOISHI!';
var header:pointer;
ColourUsage:array[byte] of byte;
x,y,index,count,tmp,linesize:word;
cbuf:pointer;
colour:byte;
result:dword;
plte:Win3xPaletteElement;
ID_Chunk:array[0..3] of char;
bm:UInt32;
data:pointer;
f:file;
label SafeExit;
begin
SaveGfxTo:=FALSE;
if not(srcObject.ogAvail) then exit;
bm := (SrcObject.ogGetBPP+7) shr 3;
getmem(header,256);
fillchar(header^,256,0);
assign(f,gfxfile);
if (offset=0) then
rewrite(f,1)
else
begin
if (fsearch(gfxfile,'')='') then exit;
reset(f,1);
seek(f,offset);
end;
with Win3xBitmapHeader(header^) do
begin
{ fillchar(ColourUsage,sizeof(ColourUsage),0);
for y:=0 to SrcObject.GetMaxY do
for x:=0 to SrcObject.GetMaxX do
ColourUsage[SrcObject.getpixel(x,y)]:=1;
colour:=0;
for x:=0 to high(ColourUsage) do
inc(colour,ColourUsage[x]);}
Size:=sizeof(Win3xBitmapHeader)-sizeof(FileHeader);
width:=SrcObject.ogGetMaxX+1;
linesize:=((width*bm+3) shr 2) shl 2;
Height:=(SrcObject.ogGetMaxY+1);
with FileHeader do
begin
FileType:=$4D42;
BitMapOffset:=sizeof(Win3xBitmapHeader){+sizeof(Win3xPaletteElement)*256};
FileSize:=BitMapOffset+LineSize*dword(height);
Reserved1:=0;
Reserved2:=0;
end;
Planes:=1;
BitsPerPixel:=SrcObject.ogGetBPP;
Compression:=0;
HorzResolution:=0;
VertResolution:=0;
ColoursUsed:=0;
ColoursImportant:=0;
blockwrite(f,header^,sizeof(Win3xBitMapHeader));
plte.pad:=0;
plte.red:=0;
plte.green:=0;
plte.blue:=0;
tmp:=linesize-width*bm;
with SrcObject, plte do
case ogGetBPP of
24:for y:=ogGetMaxY downto 0 do
begin
data:=ogGetPtr(0,y);
blockwrite(f,data^,width*bm);
{ for x:=0 to GetMaxX do
begin
unpackRGB(getPixel(x,y),red, green, blue);
blockwrite(f,blue,1);
blockwrite(f,green,1);
blockwrite(f,red,1);
end;
plte.red:=0;
plte.green:=0;
plte.blue:=0;}
if tmp<>0 then blockwrite(f,plte,tmp)
end;
end; {case }
{ for y:=GetMaxY downto 0 do
begin
blockwrite(f,pointer(dword(Buffer)+LineOfs^[y])^,width);
if tmp<>0 then blockwrite(f,plte,tmp)
end}
end;
SaveGfxTo:=TRUE;
SafeExit:
close(f);
freemem(header,256);
end;
destructor ogImage.done;
begin
{ if (tmpBuf<>NIL) then dispose(tmpBuf,ogDone);}
end;
end.