
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@44 8e941d3f-bd1b-0410-a28a-d453659cc2b4
374 lines
10 KiB
ObjectPascal
374 lines
10 KiB
ObjectPascal
{*********************************************************}
|
|
{* OVCTGRES.PAS 4.06 *}
|
|
{*********************************************************}
|
|
|
|
{* ***** BEGIN LICENSE BLOCK ***** *}
|
|
{* Version: MPL 1.1 *}
|
|
{* *}
|
|
{* The contents of this file are subject to the Mozilla Public License *}
|
|
{* Version 1.1 (the "License"); you may not use this file except in *}
|
|
{* compliance with the License. You may obtain a copy of the License at *}
|
|
{* http://www.mozilla.org/MPL/ *}
|
|
{* *}
|
|
{* Software distributed under the License is distributed on an "AS IS" basis, *}
|
|
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *}
|
|
{* for the specific language governing rights and limitations under the *}
|
|
{* License. *}
|
|
{* *}
|
|
{* The Original Code is TurboPower Orpheus *}
|
|
{* *}
|
|
{* The Initial Developer of the Original Code is TurboPower Software *}
|
|
{* *}
|
|
{* Portions created by TurboPower Software Inc. are Copyright (C)1995-2002 *}
|
|
{* TurboPower Software Inc. All Rights Reserved. *}
|
|
{* *}
|
|
{* Contributor(s): *}
|
|
{* *}
|
|
{* ***** END LICENSE BLOCK ***** *}
|
|
|
|
{$I OVC.INC}
|
|
|
|
{$B-} {Complete Boolean Evaluation}
|
|
{$I+} {Input/Output-Checking}
|
|
{$P+} {Open Parameters}
|
|
{$T-} {Typed @ Operator}
|
|
{.W-} {Windows Stack Frame}
|
|
{$X+} {Extended Syntax}
|
|
|
|
unit ovctgres;
|
|
{-Orpheus glyph resource manager}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFNDEF LCL} Windows, {$ELSE} LclIntf, {$ENDIF}
|
|
SysUtils, Classes, Graphics, OvcMisc;
|
|
|
|
type
|
|
TOvcCellGlyphs = class(TPersistent)
|
|
protected {private}
|
|
{.Z+}
|
|
FResource : pointer;
|
|
FActiveGlyphCount : Integer;
|
|
FGlyphCount : Integer;
|
|
FOnCfgChanged : TNotifyEvent;
|
|
{.Z-}
|
|
protected
|
|
{.Z+}
|
|
function GetBitMap : TBitMap;
|
|
function GetIsDefault : boolean;
|
|
procedure SetActiveGlyphCount(G : Integer);
|
|
procedure SetBitMap(BM : TBitMap);
|
|
procedure SetGlyphCount(G : Integer);
|
|
procedure SetIsDefault(D : boolean);
|
|
|
|
procedure CalcGlyphCount;
|
|
function IsNotDefault : boolean;
|
|
procedure DoCfgChanged;
|
|
{.Z-}
|
|
public {protected}
|
|
{.Z+}
|
|
property OnCfgChanged : TNotifyEvent
|
|
read FOnCfgChanged write FOnCfgChanged;
|
|
{.Z-}
|
|
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
|
|
procedure Assign(Source : TPersistent); override;
|
|
|
|
published
|
|
{Note: must be in this order--IsDefault, BitMap, GlyphCount, ActiveGlyphCount}
|
|
property IsDefault : boolean
|
|
read GetIsDefault write SetIsDefault
|
|
stored true;
|
|
|
|
property BitMap : TBitMap
|
|
read GetBitMap write SetBitMap
|
|
stored IsNotDefault;
|
|
|
|
property GlyphCount : Integer
|
|
read FGlyphCount write SetGlyphCount;
|
|
|
|
property ActiveGlyphCount : Integer
|
|
read FActiveGlyphCount write SetActiveGlyphCount;
|
|
end;
|
|
|
|
implementation
|
|
|
|
|
|
type
|
|
PCellGlyphResource = ^TCellGlyphResource;
|
|
TCellGlyphResource = packed record
|
|
BitMap : TBitMap;
|
|
ResourceCount : Integer;
|
|
Next : PCellGlyphResource;
|
|
end;
|
|
|
|
TGlyphResourceManager = class
|
|
private
|
|
FList : PCellGlyphResource;
|
|
DefRes : PCellGlyphResource;
|
|
protected
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
|
|
function AllocResource(BM : TBitMap) : PCellGlyphResource;
|
|
procedure FreeResource(CBGR : PCellGlyphResource);
|
|
function ReallocResource(ToCBGR, FromCBGR : PCellGlyphResource) : PCellGlyphResource;
|
|
function DefaultResource : PCellGlyphResource;
|
|
end;
|
|
|
|
var
|
|
CBResMgr : TGlyphResourceManager;
|
|
|
|
function CreateNewResource : PCellGlyphResource;
|
|
var
|
|
Size : Integer;
|
|
begin
|
|
Size := sizeof(TCellGlyphResource);
|
|
GetMem(Result, Size);
|
|
FillChar(Result^, Size, 0);
|
|
with Result^ do
|
|
begin
|
|
ResourceCount := 1;
|
|
end;
|
|
end;
|
|
|
|
procedure DestroyResource(ARes : PCellGlyphResource);
|
|
begin
|
|
FreeMem(ARes, sizeof(TCellGlyphResource));
|
|
end;
|
|
|
|
{===TGlyphResourceManager=========================================}
|
|
constructor TGlyphResourceManager.Create;
|
|
begin
|
|
DefRes := CreateNewResource;
|
|
with DefRes^ do
|
|
begin
|
|
BitMap := TBitMap.Create;
|
|
{$IFNDEF LCL}
|
|
BitMap.Handle := LoadBaseBitmap('ORTCCHECKGLYPHS');
|
|
{$ELSE}
|
|
BitMap.LoadFromLazarusResource('ORTCCHECKGLYPHS');
|
|
{$ENDIF}
|
|
end;
|
|
FList := DefRes;
|
|
end;
|
|
{--------}
|
|
destructor TGlyphResourceManager.Destroy;
|
|
var
|
|
Temp : PCellGlyphResource;
|
|
begin
|
|
while Assigned(FList) do
|
|
begin
|
|
Temp := FList;
|
|
FList := Temp^.Next;
|
|
Temp^.BitMap.Free;
|
|
DestroyResource(Temp);
|
|
end;
|
|
end;
|
|
{--------}
|
|
function TGlyphResourceManager.AllocResource(BM : TBitMap) : PCellGlyphResource;
|
|
var
|
|
NewRes : PCellGlyphResource;
|
|
begin
|
|
NewRes := CreateNewResource;
|
|
with NewRes^ do
|
|
begin
|
|
BitMap := TBitMap.Create;
|
|
BitMap.Assign(BM);
|
|
Next := FList;
|
|
end;
|
|
FList := NewRes;
|
|
Result := NewRes;
|
|
end;
|
|
{--------}
|
|
procedure TGlyphResourceManager.FreeResource(CBGR : PCellGlyphResource);
|
|
var
|
|
Temp, Dad : PCellGlyphResource;
|
|
begin
|
|
Temp := FList;
|
|
Dad := nil;
|
|
while (Temp <> nil) do
|
|
if (Temp = CBGR) then
|
|
begin
|
|
dec(Temp^.ResourceCount);
|
|
if (Temp^.ResourceCount = 0) then
|
|
begin
|
|
with Temp^ do
|
|
begin
|
|
if (Dad = nil) then
|
|
FList := Next
|
|
else Dad^.Next := Next;
|
|
BitMap.Free;
|
|
end;
|
|
DestroyResource(Temp);
|
|
end;
|
|
Temp := nil; {get out of loop}
|
|
end
|
|
else
|
|
begin
|
|
Dad := Temp;
|
|
Temp := Temp^.Next;
|
|
end;
|
|
end;
|
|
{--------}
|
|
function TGlyphResourceManager.ReallocResource(ToCBGR, FromCBGR : PCellGlyphResource)
|
|
: PCellGlyphResource;
|
|
var
|
|
Temp : PCellGlyphResource;
|
|
begin
|
|
FreeResource(FromCBGR);
|
|
Temp := FList;
|
|
while (Temp <> nil) do
|
|
if (Temp = ToCBGR) then
|
|
begin
|
|
inc(Temp^.ResourceCount);
|
|
Result := Temp;
|
|
Exit;
|
|
end
|
|
else
|
|
Temp := Temp^.Next;
|
|
Result := DefaultResource;
|
|
end;
|
|
{--------}
|
|
function TGlyphResourceManager.DefaultResource : PCellGlyphResource;
|
|
begin
|
|
inc(DefRes^.ResourceCount);
|
|
Result := DefRes;
|
|
end;
|
|
{====================================================================}
|
|
|
|
{===TOvcCellGlyphs==================================================}
|
|
constructor TOvcCellGlyphs.Create;
|
|
begin
|
|
FResource := CBResMgr.DefaultResource;
|
|
CalcGlyphCount;
|
|
end;
|
|
{--------}
|
|
destructor TOvcCellGlyphs.Destroy;
|
|
begin
|
|
CBResMgr.FreeResource(PCellGlyphResource(FResource));
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.Assign(Source : TPersistent);
|
|
begin
|
|
if Source is TOvcCellGlyphs then begin
|
|
if (Source = nil) then
|
|
begin
|
|
CBResMgr.FreeResource(PCellGlyphResource(FResource));
|
|
FResource := CBResMgr.DefaultResource;
|
|
end
|
|
else if (FResource <> TOvcCellGlyphs(Source).FResource) then
|
|
FResource :=
|
|
CBResMgr.ReallocResource(PCellGlyphResource(TOvcCellGlyphs(Source).FResource),
|
|
PCellGlyphResource(FResource));
|
|
CalcGlyphCount;
|
|
DoCfgChanged
|
|
end else inherited Assign(Source);
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.CalcGlyphCount;
|
|
var
|
|
Temp : Integer;
|
|
begin
|
|
FGlyphCount := 1;
|
|
FActiveGlyphCount := 1;
|
|
with BitMap do
|
|
begin
|
|
if (Height > 0) then
|
|
begin
|
|
Temp := Width div Height;
|
|
if ((Temp * Height) = Width) then
|
|
begin
|
|
FGlyphCount := Temp;
|
|
FActiveGlyphCount := Temp;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
{--------}
|
|
function TOvcCellGlyphs.GetBitMap : TBitMap;
|
|
begin
|
|
with PCellGlyphResource(FResource)^ do
|
|
Result := Bitmap;
|
|
end;
|
|
{--------}
|
|
function TOvcCellGlyphs.GetIsDefault : boolean;
|
|
begin
|
|
Result := FResource = pointer(CBResMgr.DefRes);
|
|
end;
|
|
{--------}
|
|
function TOvcCellGlyphs.IsNotDefault : boolean;
|
|
begin
|
|
Result := not IsDefault;
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.DoCfgChanged;
|
|
begin
|
|
if Assigned(FOnCfgChanged) then
|
|
FOnCfgChanged(Self);
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.SetActiveGlyphCount(G : Integer);
|
|
begin
|
|
if (G <> FActiveGlyphCount) and
|
|
(1 <= G) and (G <= GlyphCount)then
|
|
begin
|
|
FActiveGlyphCount := G;
|
|
DoCfgChanged;
|
|
end;
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.SetBitMap(BM : TBitMap);
|
|
begin
|
|
CBResMgr.FreeResource(PCellGlyphResource(FResource));
|
|
if (BM = nil) then
|
|
FResource := CBResMgr.DefaultResource
|
|
else
|
|
FResource := CBResMgr.AllocResource(BM);
|
|
CalcGlyphCount;
|
|
DoCfgChanged;
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.SetGlyphCount(G : Integer);
|
|
begin
|
|
if (G <> FGlyphCount) then
|
|
begin
|
|
FGlyphCount := G;
|
|
FActiveGlyphCount := G;
|
|
DoCfgChanged;
|
|
end;
|
|
end;
|
|
{--------}
|
|
procedure TOvcCellGlyphs.SetIsDefault(D : boolean);
|
|
begin
|
|
if (D <> IsDefault) then
|
|
begin
|
|
if D then
|
|
Assign(nil)
|
|
else
|
|
BitMap := BitMap; {note: this actually does do something!}
|
|
CalcGlyphCount;
|
|
DoCfgChanged;
|
|
end;
|
|
end;
|
|
{====================================================================}
|
|
|
|
|
|
procedure DestroyManager; far;
|
|
begin
|
|
CBResMgr.Free;
|
|
end;
|
|
|
|
|
|
initialization
|
|
CBResMgr := TGlyphResourceManager.Create;
|
|
|
|
finalization
|
|
DestroyManager;
|
|
end.
|