home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 December / Chip_2002-12_cd1.bin / zkuste / delphi / kompon / d6 / AHICON32.ZIP / Icon32 / Icon32.pas < prev    next >
Pascal/Delphi Source File  |  2002-09-18  |  10KB  |  397 lines

  1. {
  2.   Icon32
  3.  
  4.   This notice may not be removed from or altered in any source distribution.
  5.  
  6.   "Author" herein refers to Abduraghman Hendricks (the creator of the Icon32). "Software" refers to all files
  7.   included with Icon32 distribution package.
  8.  
  9.   Please note that the Author hereby states that this package is provided "as is" and without any express or
  10.   implied warranties, including, but not without limitation, the implied warranties of merchantability and fitness
  11.   for a particular purpose. In other words, the Author accepts no liability for any damage that may result from
  12.   using Icon32.
  13.  
  14.   Icon32 is distributed as a freeware. You are free to use Icon32 as part of your application for any purpose
  15.   including freeware, commercial and shareware applications, provided an explicit credit is given to the author
  16.   in application's about box and/or accompanying documentation.
  17.  
  18.   The origin of this software must not be misrepresented; you must not claim your authorship.
  19.   All redistributions must retain the original copyright notice.
  20.  
  21. }
  22. unit Icon32;
  23.  
  24. interface
  25.  
  26. uses
  27.   Windows, Messages, SysUtils, Classes, Graphics, Controls,
  28.   Forms, Dialogs;
  29.  
  30. type
  31.   ByteArray = array of Byte;
  32.   TIcon32FileString = type string;
  33.   TBlendMode = (bmColor, bmAlpha);
  34.   TIconSize = (is16,is24,is32,is48);
  35.  
  36.   TIcon32 = class(TGraphicControl)
  37.   private
  38.     FData      : Pointer;
  39.     FDataSize  : Integer;
  40.     FIcon32Name: TIcon32FileString;
  41.     FBMP       : TBitmap;
  42.     FBlendMode : TBlendMode;
  43.     FBGColor     : TColor;
  44.     FIconSize  : TIconSize;
  45.     FUpdate    : boolean;
  46.     procedure WriteData(Stream: TStream);
  47.     procedure ReadData(Stream: TStream);
  48.  
  49.     procedure SetBGColor(const Value: TColor);
  50.     procedure SetBlendMode(const Value: TBlendMode);
  51.     procedure SetIconSize(const Value: TIconSize);
  52.     procedure SetIcon32Name(const Value: TIcon32FileString);
  53.   protected
  54.     procedure DefineProperties(Filer: TFiler); override;
  55.   public
  56.     constructor Create(AOwner : TComponent); override;
  57.     destructor Destroy; override;
  58.     procedure Paint; override;
  59.     function Empty: Boolean;
  60.     procedure LoadFromFile(const FileName: String);
  61.     procedure LoadFromStream(S: TStream);
  62.     procedure SaveToFile(const FileName: String);
  63.     procedure SaveToStream(S: TStream);
  64.     procedure LoadBMP;
  65.     function Equal(Ico: TIcon32): Boolean;
  66.   published
  67.     property Icon32Name : TIcon32FileString read FIcon32Name write SetIcon32Name;
  68.     property BGColor: TColor read FBGColor Write SetBGColor default clBtnface;
  69.     property BlendMode: TBlendMode read FBlendMode Write SetBlendMode default bmColor;
  70.     property IconSize: TIconSize read FIconSize Write SetIconSize default is32;
  71.   end;
  72.  
  73. function BlendColors(const Color1, Color2: TColor; Amount: Extended): TColor;
  74.  
  75. procedure Register;
  76.  
  77. implementation
  78.  
  79. { TIcon32 }
  80.  
  81. procedure Register;
  82. begin
  83.   RegisterComponents('Portrix', [TIcon32]);
  84. end;
  85.  
  86. constructor TIcon32.Create(AOwner: TComponent);
  87. begin
  88.   inherited Create(AOwner);
  89.   ControlStyle := ControlStyle + [csOpaque];
  90.   FBMP   := TBitmap.Create;
  91.   FBGColor := clBtnFace;
  92.   FIconSize := is32;
  93.   Width  := 32;
  94.   Height := 32;
  95.   FUpdate := True;
  96. end;
  97.  
  98. procedure TIcon32.DefineProperties(Filer: TFiler);
  99.   function DoWrite: Boolean;
  100.   begin
  101.     if Filer.Ancestor <> nil then
  102.       Result := not (Filer.Ancestor is TIcon32) or
  103.         not Equal(TIcon32(Filer.Ancestor))
  104.     else
  105.       Result := not Empty;
  106.   end;
  107.  
  108. begin
  109.   inherited DefineProperties(Filer);
  110.   Filer.DefineBinaryProperty('Data', ReadData, WriteData, DoWrite);
  111. end;
  112.  
  113. destructor TIcon32.Destroy;
  114. begin
  115.   FBMP.Free;
  116.   inherited;
  117. end;
  118.  
  119. function StreamsEqual(S1, S2: TMemoryStream): Boolean;
  120. begin
  121.   Result := (S1.Size = S2.Size) and CompareMem(S1.Memory, S2.Memory, S1.Size);
  122. end;
  123.  
  124. function TIcon32.Empty: Boolean;
  125. begin
  126.   Result := FDataSize = 0;
  127. end;
  128.  
  129. function TIcon32.Equal(Ico: TIcon32): Boolean;
  130. var
  131.   MyImage, WavImage: TMemoryStream;
  132. begin
  133.   Result := (Ico <> nil) and (ClassType = Ico.ClassType);
  134.   if Empty or Ico.Empty then
  135.   begin
  136.     Result := Empty and Ico.Empty;
  137.     Exit;
  138.   end;
  139.   if Result then
  140.   begin
  141.     MyImage := TMemoryStream.Create;
  142.     try
  143.       SaveToStream(MyImage);
  144.       WavImage := TMemoryStream.Create;
  145.       try
  146.         Ico.SaveToStream(WavImage);
  147.         Result := StreamsEqual(MyImage, WavImage);
  148.       finally
  149.         WavImage.Free;
  150.       end;
  151.     finally
  152.       MyImage.Free;
  153.     end;
  154.   end;
  155. end;
  156.  
  157. procedure TIcon32.LoadBMP;
  158. var
  159.   buf: ByteArray;
  160.   i,x,y,DataSize,bw,bs: Integer;
  161.   BPP: Byte;
  162.   col: TColor;
  163.   bmp2: TBitmap;
  164.   dc: HDC;
  165. begin
  166.   buf := nil;
  167.  
  168.   if FDataSize < 1 then Exit;
  169.  
  170. {    FBMP.Canvas.Brush.Style := bsSolid;
  171.   FBMP.Canvas.Brush.Color := FBGColor;
  172.   FBMP.Canvas.FillRect(Rect(0,0,FBMP.Width,FBMP.Height));
  173.   Invalidate;}
  174.  
  175.   buf := ByteArray(FData);
  176.  
  177.   BPP        := buf[12];
  178.  
  179.   if BPP <> 32 then begin
  180.     MessageDlg('Invalid icon',mtError,[mbOk],0);
  181.     FIcon32Name := '';
  182.     if not Empty then
  183.       FreeMem(FData, FDataSize);
  184.     FDataSize := 0;
  185.     Exit;
  186.   end;
  187.  
  188.   DataSize   := buf[14] + (buf[15] shl 8) + (buf[16] shl 16) + (buf[17] shl 24);
  189.   bw         := buf[26] + (buf[27] shl 8) + (buf[28] shl 16) + (buf[29] shl 24);
  190.   bs         := buf[42] + (buf[43] shl 8) + (buf[44] shl 16) + (buf[45] shl 24);
  191.  
  192.   case bw of
  193.     16: IconSize := is16;
  194.     24: IconSize := is24;
  195.     32: IconSize := is32;
  196.     48: IconSize := is48;
  197.   end;
  198.  
  199.   if bs < 100 then
  200.     bs := DataSize - 104;
  201.  
  202.   FBMP.Width := buf[6];
  203.   FBMP.Height := buf[6];
  204.  
  205.   bmp2 := TBitmap.Create;
  206.   bmp2.Width  := FBMP.Width;
  207.   bmp2.height := FBMP.Height;
  208.  
  209.   Self.Visible := False;
  210.   Self.Invalidate;
  211.  
  212.   dc := GetDc(0);
  213.  
  214.   bitblt(bmp2.Canvas.Handle,0,0,bw,bw,dc,
  215.          Parent.Left+4+Self.Left,
  216.          Parent.Top+23+Self.Top,
  217.          SRCCOPY
  218.   );
  219.  
  220.   x := 0; y := bw-1;
  221.   i := 62;
  222.   while i < bs+62 do begin
  223.     col := RGB(buf[i+2],buf[i+1],buf[i]);
  224.  
  225.     if BPP = 32 then begin
  226.       if FBlendMode = bmColor then
  227.         col := BlendColors(FBGColor,RGB(buf[i+2],buf[i+1],buf[i]),buf[i+3] / 256)
  228.       else begin
  229.         col := BlendColors(bmp2.Canvas.Pixels[x,y],RGB(buf[i+2],buf[i+1],buf[i]),buf[i+3] / 256);
  230.       end;
  231.     end;
  232.  
  233.     FBMP.Canvas.Pixels[x,y] := col;
  234.  
  235.     Inc(i,BPP div 8);
  236.     Inc(x);
  237.     if x > bw-1 then begin
  238.       x := 0;
  239.       Dec(y);
  240.     end;
  241.     if y = -1 then begin
  242.       break;
  243.     end;
  244.   end;
  245.   bmp2.Free;
  246.  
  247.   Self.Visible := true;
  248.   Invalidate;
  249. end;
  250.  
  251. procedure TIcon32.LoadFromFile(const FileName: String);
  252. var
  253.   F: TFileStream;
  254. begin
  255.   F := TFileStream.Create(FileName, fmOpenRead);
  256.   try
  257.     LoadFromStream(F);
  258.   finally
  259.     F.Free;
  260.   end;
  261. end;
  262.  
  263. procedure TIcon32.LoadFromStream(S: TStream);
  264. begin
  265.   if not Empty then
  266.     FreeMem(FData, FDataSize);
  267.   FDataSize := 0;
  268.   FData := AllocMem(S.Size);
  269.   FDataSize := S.Size;
  270.   S.Read(FData^, FDataSize);
  271.   LoadBMP;
  272. end;
  273.  
  274. procedure TIcon32.Paint;
  275. begin
  276.   inherited;
  277.   if FBlendMode = bmAlpha then begin
  278.     if FUpdate then begin
  279.         LoadBMP;
  280.       FUpdate := False;
  281.     end;
  282.   end;
  283.   Canvas.Draw(0,0,FBMP);
  284. end;
  285.  
  286. procedure TIcon32.ReadData(Stream: TStream);
  287. begin
  288.   LoadFromStream(Stream);
  289. end;
  290.  
  291. procedure TIcon32.SaveToFile(const FileName: String);
  292. var
  293.   F: TFileStream;
  294. begin
  295.   F := TFileStream.Create(FileName, fmCreate);
  296.   try
  297.     SaveToStream(F);
  298.   finally
  299.     F.Free;
  300.   end;
  301. end;
  302.  
  303. procedure TIcon32.SaveToStream(S: TStream);
  304. begin
  305.   if not Empty then
  306.     S.Write(FData^, FDataSize);
  307. end;
  308.  
  309. procedure TIcon32.SetBGColor(const Value: TColor);
  310. begin
  311.   FBGColor := Value;
  312.   if FIcon32Name <> '' then LoadBMP;
  313. end;
  314.  
  315. procedure TIcon32.SetBlendMode(const Value: TBlendMode);
  316. begin
  317.   FBlendMode := Value;
  318.   if FIcon32Name <> '' then LoadBMP;
  319. end;
  320.  
  321. procedure TIcon32.SetIcon32Name(const Value: TIcon32FileString);
  322. begin
  323.   if Value <> '' then begin
  324.     if not FileExists(Value) then Exit;
  325.     FIcon32Name := ExtractFileName(Value);
  326.     if (not (csLoading in ComponentState)) and FileExists(Value) then
  327.       LoadFromFile(Value);
  328.   end
  329.   else begin
  330.     FIcon32Name := '';
  331.     if not Empty then
  332.       FreeMem(FData, FDataSize);
  333.     FDataSize := 0;
  334.   end;
  335. end;
  336.  
  337. procedure TIcon32.SetIconSize(const Value: TIconSize);
  338. begin
  339.   FIconSize := Value;
  340.   case Value of
  341.     is16 :     begin
  342.               Width  := 16;
  343.               Height := 16;
  344.             end;
  345.     is24 :     begin
  346.               Width  := 24;
  347.               Height := 24;
  348.             end;
  349.     is32 :     begin
  350.               Width  := 32;
  351.               Height := 32;
  352.             end;
  353.     is48 :     begin
  354.               Width  := 48;
  355.               Height := 48;
  356.             end;
  357.   end;
  358. end;
  359.  
  360. function BlendColors(const Color1, Color2: TColor; Amount: Extended): TColor;
  361. var
  362.   R,R2,G,G2,B,B2: Integer;
  363.   win1, win2: Integer;
  364. begin
  365.   win1 := ColorToRGB(color1);
  366.   win2 := ColorToRGB(color2);
  367.  
  368.   R := GetRValue(win1);
  369.   G := GetGValue(win1);
  370.   B := GetBValue(win1);
  371.  
  372.   R2 := GetRValue(win2);
  373.   G2 := GetGValue(win2);
  374.   B2 := GetBValue(win2);
  375.  
  376.   b2:=round((1-amount)*b+amount*b2);
  377.   g2:=round((1-amount)*g+amount*g2);
  378.   r2:=round((1-amount)*r+amount*r2);
  379.  
  380.   if R2 < 0 then R2 := 0;
  381.   if G2 < 0 then G2 := 0;
  382.   if B2 < 0 then B2 := 0;
  383.  
  384.   if R2 > 255 then R2 := r;
  385.   if G2 > 255 then G2 := r;
  386.   if B2 > 255 then B2 := r;
  387.  
  388.   Result := TColor(RGB(R2, G2, B2));
  389. end;
  390.  
  391. procedure TIcon32.WriteData(Stream: TStream);
  392. begin
  393.   SaveToStream(Stream);
  394. end;
  395.  
  396. end.
  397.