home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / nastroje / d3456 / KBMWABD.ZIP / WABD_Graphics.pas < prev    next >
Pascal/Delphi Source File  |  2001-07-12  |  6KB  |  214 lines

  1. unit WABD_Graphics;
  2.  
  3. // TWAPBitmap created by Kim Madsen/Optical Services - Scandinavia.
  4. // Copyright 2001 (C) All rights reserved.
  5. //
  6. // TWAPBitmap may not be used in part or whole to create commercial
  7. // or shareware programs/tools, unless in combination with kbmWABD or unless
  8. // a specific written agreement has been made between the author Kim Madsen
  9. // and the user. It cannot be included in whole or part, in other development
  10. // packages without specific written agreement with the author Kim Madsen.
  11. //
  12. // The use of this code is _FULLY_ your responsibility, and the author can
  13. // never be made responsible for any problems (legal or other) or injuries caused
  14. // directly or indirectly by the use of this code.
  15. //
  16. // You MUST send an email to kbm@optical.dk specifying what you are using this
  17. // code for!
  18. //
  19. // By using this code, the user agrees to this license agreement.
  20. //
  21.  
  22. interface
  23.  
  24. uses SysUtils,Windows,Classes,Graphics;
  25.  
  26. type
  27.    TkbmWAPBitmapHeader = record
  28.       wbhTypeField:byte;
  29.       wbhFixHeaderField:byte;
  30.       wbhWidth:integer;
  31.       wbhHeight:integer;
  32.    end;
  33.  
  34.    TkbmWAPBitmap = class(TBitmap)
  35.    protected
  36.       FHeader:TkbmWAPBitmapHeader;
  37.  
  38.       function BytesPerRow:integer;
  39.  
  40.       function ReadCh(AStream:TStream):integer;
  41.       function ReadInt(AStream:TStream):integer; virtual;
  42.       procedure WriteCh(AStream:TStream; Value:integer);
  43.       procedure WriteInt(AStream:TStream; Value:integer); virtual;
  44.       procedure ReadHeader(AStream:TStream); virtual;
  45.       procedure ReadBitmap(AStream:TStream); virtual;
  46.       procedure WriteHeader(AStream:TStream); virtual;
  47.       procedure WriteBitmap(AStream:TStream); virtual;
  48.  
  49.    public
  50.       constructor Create; override;
  51.  
  52.       procedure LoadFromStream(Stream: TStream); override;
  53.       procedure SaveToStream(Stream: TStream); override;
  54.       procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE); override;
  55.       procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE); override;
  56.    end;
  57.  
  58. // WBMP Clipboard format identifier for use by LoadFromClipboardFormat and SaveToClipboardFormat.
  59. var
  60.   CF_WBMP: WORD;
  61.  
  62. implementation
  63.  
  64. const
  65.   sDescription='WAP Bitmap Image';
  66.  
  67. constructor TkbmWAPBitmap.Create;
  68. begin
  69.      inherited;
  70. end;
  71.  
  72. function TkbmWAPBitmap.BytesPerRow:integer;
  73. begin
  74.      // Assumes 1 bit/pixel.
  75.      Result:=(Width+7) div 8;
  76. end;
  77.  
  78. function TkbmWAPBitmap.ReadCh(AStream:TStream):integer;
  79. var
  80.    b:byte;
  81. begin
  82.      AStream.Read(b,sizeof(byte));
  83.      Result:=b;
  84. end;
  85.  
  86. function TkbmWAPBitmap.ReadInt(AStream:TStream):integer;
  87. var
  88.    c,p,s:integer;
  89. begin
  90.      p:=0;
  91.      s:=0;
  92.      repeat
  93.        c:=ReadCh(AStream);
  94.        s:=(s shl p) or (c and $7F);
  95.        inc(p,7);
  96.      until (c and $80)=0;
  97.      Result:=s;
  98. end;
  99.  
  100. procedure TkbmWAPBitmap.ReadHeader(AStream:TStream);
  101. begin
  102.      FHeader.wbhTypeField:=ReadCh(AStream);
  103.      if FHeader.wbhTypeField<>0 then
  104.         raise Exception.CreateFmt('WAP Bitmap type %d not supported.',[FHeader.wbhTypeField]);
  105.  
  106.      FHeader.wbhFixHeaderField:=ReadCh(AStream);
  107.      if FHeader.wbhFixHeaderField<>0 then
  108.         raise Exception.CreateFmt('WAP Bitmap Fixed Header %d not supported.',[FHeader.wbhFixHeaderField]);
  109.  
  110.      FHeader.wbhWidth:=ReadInt(AStream);
  111.      FHeader.wbhHeight:=ReadInt(AStream);
  112.      Width:=FHeader.wbhWidth;
  113.      Height:=FHeader.wbhHeight;
  114.  
  115.      PixelFormat:=pf1Bit;
  116. end;
  117.  
  118. procedure TkbmWAPBitmap.ReadBitmap(AStream:TStream);
  119. var
  120.    p:PByte;
  121.    w,x,y:integer;
  122. begin
  123.      w:=BytesPerRow;
  124.      for y:=0 to FHeader.wbhHeight-1 do
  125.      begin
  126.           p:=ScanLine[y];
  127.           for x:=0 to w-1 do
  128.           begin
  129.                p^:=Byte((ReadCh(AStream) and $FF));
  130.                inc(p);
  131.           end;
  132.      end;
  133. end;
  134.  
  135. procedure TkbmWAPBitmap.WriteCh(AStream:TStream; Value:integer);
  136. var
  137.    b:Byte;
  138. begin
  139.      b:=Value and $FF;
  140.      AStream.Write(b,sizeof(byte));
  141. end;
  142.  
  143. procedure TkbmWAPBitmap.WriteInt(AStream:TStream; Value:integer);
  144. var
  145.    s:integer;
  146. begin
  147.      s:=Value;
  148.      repeat
  149.        WriteCh(AStream,s and $FF);
  150.        s:=s shr 7;
  151.      until s=0;
  152. end;
  153.  
  154. procedure TkbmWAPBitmap.WriteHeader(AStream:TStream);
  155. begin
  156.      WriteCh(AStream,FHeader.wbhTypeField);
  157.      WriteCh(AStream,FHeader.wbhFixHeaderField);
  158.      WriteInt(AStream,FHeader.wbhWidth);
  159.      WriteInt(AStream,FHeader.wbhHeight);
  160. end;
  161.  
  162. procedure TkbmWAPBitmap.WriteBitmap(AStream:TStream);
  163. var
  164.    p:PByte;
  165.    w,x,y:integer;
  166. begin
  167.      w:=BytesPerRow;
  168.      for y:=0 to FHeader.wbhHeight-1 do
  169.      begin
  170.           p:=ScanLine[y];
  171.           for x:=0 to w-1 do
  172.           begin
  173.                WriteCh(AStream,p^);
  174.                inc(p);
  175.           end;
  176.      end;
  177. end;
  178.  
  179. procedure TkbmWAPBitmap.LoadFromStream(Stream: TStream);
  180. begin
  181.      ReadHeader(Stream);
  182.      ReadBitmap(Stream);
  183. end;
  184.  
  185. procedure TkbmWAPBitmap.SaveToStream(Stream: TStream);
  186. begin
  187.      if PixelFormat<>pf1Bit then
  188.         raise Exception.Create('Only monochrome bitmapformats supported.');
  189.      FHeader.wbhTypeField:=0;
  190.      FHeader.wbhFixHeaderField:=0;
  191.      FHeader.wbhWidth:=Width;
  192.      FHeader.wbhHeight:=Height;
  193.      WriteHeader(Stream);
  194.      WriteBitmap(Stream);
  195. end;
  196.  
  197. procedure TkbmWAPBitmap.LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE);
  198. begin
  199. end;
  200.  
  201. procedure TkbmWAPBitmap.SaveToClipboardFormat(var AFormat: Word; var AData: THandle; var APalette: HPALETTE);
  202. begin
  203. end;
  204.  
  205. initialization
  206.   TPicture.RegisterFileFormat('WBMP',sDescription,TkbmWAPBitmap);
  207.   CF_WBMP := RegisterClipboardFormat(PChar(sDescription));
  208.   TPicture.RegisterClipboardFormat(CF_WBMP, TkbmWAPBitmap);
  209.  
  210. finalization
  211.     TPicture.UnregisterGraphicClass(TkbmWAPBitmap);
  212.  
  213. end.
  214.