?? aafont.pas
字號:
{*******************************************************************************
AAFont - 平滑特效字體控件包
---------------------------
(C)Copyright 2001-2003
與月共舞工作室 周勁羽
這一控件包是自由軟件,您可以遵照自由軟件基金會出版的GNU 較
寬松通用公共許可證協議來修改和重新發布這一程序,或者用許可證的
第二版,或者(根據您的選擇)用任何更新的版本。
發布這一控件包的目的是希望它有用,但沒有任何擔保。甚至沒有
適合特定目的而隱含的擔保。更詳細的情況請參閱 GNU 較寬松通用公
共許可證。
您應該已經和控件包一起收到一份 GNU 較寬松通用公共許可證的
副本。如果還沒有,寫信給:
Free Software Foundation, Inc., 59 Temple Place - Suite
330, Boston, MA 02111-1307, USA.
原始文件名:AAFont.pas
單元作者:周勁羽
下載地址:http://www.yygw.net
電子郵件:yygw@yygw.net
最后更新:2003.12.02
*******************************************************************************}
unit AAFont;
{* |<PRE>
================================================================================
* 軟件名稱:平滑特效字體控件包 V2.59
* 單元名稱:平滑特效字體單元
* 單元作者:與月共舞工作室 周勁羽
* 下載網址:http://www.yygw.net
* Eamil :yygw@yygw.net
* 開發平臺:PWin2000Pro + Delphi 5.01
* 兼容測試:PWin9X/2000/XP + Delphi 5/6/7 + C++Build 5/6
* 備 注:平滑字體算法由李文松朋友提供的AAFont修改而來
* 最后更新:2003.12.02
================================================================================
|</PRE>}
interface
{$I AAFont.inc}
uses
Windows, Messages, Classes, Graphics, SysUtils, Consts, Controls, Forms,
Registry, StdCtrls, ExtCtrls, Math, IniFiles;
type
TAAQuality = (aqHigh, aqNormal, aqLow, aqNone);
{* 平滑字體顯示精度類型
|<PRE>
aqHigh - 4X4采樣的最高顯示精度,速度較慢
aqNormal - 3X3采樣的普通顯示精度,最佳性能速度比
aqLow - 2X2采樣的低顯示精度,速度較快
aqNone - 無平滑效果
|</PRE>}
TAlpha = 0..100;
{* 不透明度類型,0為完全透明,100為完全不透明}
TBlurStrength = 0..100;
{* 模糊度類型,0為不模糊,100為最大模糊度}
TOffset = -20..20;
{* 陰影偏移量范圍}
TSprayRange = 0..100;
{* 噴濺效果參數范圍}
TAngle = -360..360;
{* 旋轉角度}
TGradualStyle = (gsLeftToRight, gsRightToLeft, gsTopToBottom, gsBottomToTop,
gsCenterToLR, gsCenterToTB);
{* 漸變方式類型
|<PRE>
gsLeftToRight - 從左向右漸變
gsRightToLeft - 從右向左漸變
gsTopToBottom - 從上向下漸變
gsBottomToTop - 從下向上漸變
gsCenterToLR - 從中間向左右漸變
gsCenterToTB - 從中間向上下漸變
|</PRE>}
TTextureMode = (tmTiled, tmStretched, tmCenter, tmNormal);
{* 紋理圖像顯示模式
|<PRE>
tmTiled - 平鋪顯示
tmStretched - 自動縮放顯示
tmCenter - 在中心位置顯示
tmNormal - 在左上角顯示
|</PRE>}
TAAEffect = class;
TAAMask = class;
TAABlend = class;
TAAFont = class;
TAAFontEx = class;
{ TNotifyClass }
TNotifyClass = class(TPersistent)
{* 帶更新通知的持久性類,控件包中大部分持久類的基類,一般不需要直接使用}
private
FOnChanged: TNotifyEvent;
protected
FOwner: TPersistent;
procedure Changed; virtual;
procedure OnChildChanged(Sender: TObject); virtual;
function GetOwner: TPersistent; override;
public
constructor Create(ChangedProc: TNotifyEvent); virtual;
{* 類構造器,參數為通知事件}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
property OnChanged: TNotifyEvent read FOnChanged write FOnChanged;
{* 屬性已變更事件}
end;
{ TEnabledClass }
TEnabledClass = class(TNotifyClass)
{* 帶Enabled功能的更新通知的持久性類,一般不需要直接使用}
private
FEnabled: Boolean;
protected
procedure SetEnabled(const Value: Boolean); virtual;
procedure Changed; override;
public
constructor Create(ChangedProc: TNotifyEvent); override;
{* 類構造器,參數為通知事件}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
published
property Enabled: Boolean read FEnabled write SetEnabled default False;
{* 是否允許使用}
end;
{ TAAShadow }
TAAShadow = class(TEnabledClass)
{* 平滑特效字體陰影顯示參數類,一般不需要用戶直接創建}
private
FBlur: TBlurStrength;
FAlpha: TAlpha;
FColor: TColor;
FOffsetX: TOffset;
FOffsetY: TOffset;
procedure SetBlur(const Value: TBlurStrength);
procedure SetColor(const Value: TColor);
procedure SetOffsetX(const Value: TOffset);
procedure SetOffsetY(const Value: TOffset);
procedure SetAlpha(const Value: TAlpha);
public
constructor Create(ChangedProc: TNotifyEvent); override;
{* 類構造器,參數為通知事件}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
published
property Blur: TBlurStrength read FBlur write SetBlur default 80;
{* 陰影模糊度,參數范圍為0..100,0為不模糊}
property Alpha: TAlpha read FAlpha write SetAlpha default 70;
{* 陰影不透明度,參數范圍為0..100,0為全透明,100為不透明}
property Color: TColor read FColor write SetColor default $00444444;
{* 陰影顏色}
property OffsetX: TOffset read FOffsetX write SetOffsetX default 2;
{* 陰影水平方向偏移量,為負值時向左偏移}
property OffsetY: TOffset read FOffsetY write SetOffsetY default 2;
{* 陰影垂直方向偏移量,為負值時向上偏移}
end;
{ TAAGradual }
TAAGradual = class(TEnabledClass)
{* 平滑特效字體漸變顯示參數類,一般不需要用戶直接創建}
private
FStyle: TGradualStyle;
FStartColor: TColor;
FEndColor: TColor;
procedure SetStyle(const Value: TGradualStyle);
procedure SetStartColor(const Value: TColor);
procedure SetEndColor(const Value: TColor);
public
constructor Create(ChangedProc: TNotifyEvent); override;
{* 類構造器,參數為通知事件}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
published
property Style: TGradualStyle read FStyle write SetStyle default gsLeftToRight;
{* 漸變顯示風格}
property StartColor: TColor read FStartColor write SetStartColor
default clWhite;
{* 漸變起始色}
property EndColor: TColor read FEndColor write SetEndColor default clBlack;
{* 漸變結束色}
end;
{ TAATexture }
TAATexture = class(TEnabledClass)
{* 平滑特效字體紋理參數類,一般不需要用戶直接創建}
private
FPicture: TPicture;
FMode: TTextureMode;
procedure SetMode(const Value: TTextureMode);
procedure SetPicture(const Value: TPicture);
procedure PictureChanged(Sender: TObject);
public
constructor Create(ChangedProc: TNotifyEvent); override;
{* 類構造器,參數為通知事件}
destructor Destroy; override;
{* 類析構器}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
published
property Mode: TTextureMode read FMode write SetMode default tmTiled;
{* 紋理圖像顯示模式}
property Picture: TPicture read FPicture write SetPicture;
{* 紋理圖像}
end;
{ TAAEffect }
TAAEffect = class(TNotifyClass)
{* 平滑特效字體參數類,一般不需要用戶直接創建}
private
FAlpha: TAlpha;
FBlur: TBlurStrength;
FGradual: TAAGradual;
FShadow: TAAShadow;
FTexture: TAATexture;
FOutline: Boolean;
FNoise: Byte;
FSpray: TSprayRange;
FAngle: TAngle;
FHorzMirror: Boolean;
FVertMirror: Boolean;
procedure SetAlpha(const Value: TAlpha);
procedure SetBlur(const Value: TBlurStrength);
procedure SetGradual(const Value: TAAGradual);
procedure SetShadow(const Value: TAAShadow);
procedure SetTexture(const Value: TAATexture);
procedure SetOutline(const Value: Boolean);
procedure SetNoise(const Value: Byte);
procedure SetSpray(const Value: TSprayRange);
procedure SetAngle(const Value: TAngle);
procedure SetHorzMirror(const Value: Boolean);
procedure SetVertMirror(const Value: Boolean);
public
constructor Create(ChangedProc: TNotifyEvent); override;
{* 類構造器,參數為通知事件}
destructor Destroy; override;
{* 類析構器}
procedure Assign(Source: TPersistent); override;
procedure LoadFromIni(Ini: TCustomIniFile; const Section: string); virtual;
procedure SaveToIni(Ini: TCustomIniFile; const Section: string); virtual;
{* 對象賦值方法}
published
property Shadow: TAAShadow read FShadow write SetShadow;
{* 字體陰影參數}
property Gradual: TAAGradual read FGradual write SetGradual;
{* 漸變顯示參數}
property Texture: TAATexture read FTexture write SetTexture;
{* 字體紋理參數}
property Alpha: TAlpha read FAlpha write SetAlpha default 100;
{* 不透明度,參數范圍為0..100,0為完全透明,100為不透明}
property Blur: TBlurStrength read FBlur write SetBlur default 0;
{* 模糊度,參數范圍為0..100,0為不模糊}
property Angle: TAngle read FAngle write SetAngle default 0;
{* 字體旋轉角度,參數范圍為-360..360,單位為度}
property Noise: Byte read FNoise write SetNoise default 0;
{* 噪聲效果,參數范圍為0..255}
property Spray: TSprayRange read FSpray write SetSpray default 0;
{* 噴濺效果,參數范圍為0..100}
property Outline: Boolean read FOutline write SetOutline default False;
{* 是否顯示輪廓效果}
property HorzMirror: Boolean read FHorzMirror write SetHorzMirror default False;
{* 是否水平鏡象}
property VertMirror: Boolean read FVertMirror write SetVertMirror default False;
{* 是否垂直鏡象}
end;
{ TAAMask }
EInvalidPixel = class(Exception);
EInvalidLine = class(Exception);
PByteArray = ^TByteArray;
{* 字節數組指針}
TByteArray = array[0..32767] of Byte;
{* 字節數組類型}
PRGBArray = ^TRGBArray;
{* RGB數組指針}
TRGBArray = array[0..8192] of tagRGBTriple;
{* RGB數組類型}
TAAMask = class(TPersistent)
{* 平滑特效字體蒙板處理類,供繪制平滑字體時內部使用}
private
FQuality: TAAQuality;
FpMaskBuff: PByteArray;
FHeight: Integer;
FWidth: Integer;
BytesLineGray: Integer;
BytesLineMask: Integer;
Scale: Integer;
AAFont: TAAFont;
GrayBmp: TBitmap;
procedure InitGrayBmp;
procedure FreeGrayBmp;
procedure SetQuality(const Value: TAAQuality);
function TextExtentEx(s: string; var Point: TPoint): TSize;
protected
function ScanLine(Line: Integer; pAData: PByteArray): PByteArray; overload;
property pMaskBuff: PByteArray read FpMaskBuff;
public
constructor Create(AOwner: TAAFont);
{* 類構造器}
destructor Destroy; override;
{* 類析構器}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
procedure DrawMask(Text: string);
{* 繪制文本蒙板圖}
procedure DrawMaskEx(Text: string; Extend: TSize; Point: TPoint);
{* 繪制文本蒙板圖增強版}
procedure Blur(Blur: TBlurStrength);
{* 對蒙板圖進行模糊處理}
procedure Outline;
{* 對蒙板圖進行輪廓處理}
procedure Spray(Amount: Integer);
{* 對蒙板圖進行噴濺處理}
procedure HorzMirror;
{* 對蒙板圖進行水平鏡象處理}
procedure VertMirror;
{* 對蒙板圖進行垂直鏡象處理}
function TextExtent(s: string): TSize;
{* 返回文本高、寬}
function TextHeight(s: string): Integer;
{* 返回文本高度}
function TextWidth(s: string): Integer;
{* 返回文本寬度}
function ScanLine(Line: Integer): Pointer; overload;
{* 返回蒙板圖掃描線地址}
function Pixel(x, y: Integer): Byte;
{* 返回蒙板圖指定象素灰度值}
function PixelAddr(x, y: Integer): Pointer;
{* 返回蒙板圖指定象素地址}
property Height: Integer read FHeight;
{* 蒙板圖的高度}
property Width: Integer read FWidth;
{* 蒙板圖的寬度}
property Quality: TAAQuality read FQuality write SetQuality;
{* 平滑字體繪制精度}
end;
{ TAABlend }
EInvalidForeBmp = class(Exception);
TAABlend = class(TPersistent)
{* 平滑特效字體圖像混合處理類,供繪制平滑字體時內部使用}
private
FForeBmp: TBitmap;
RGBBmp: TBitmap;
AAFont: TAAFont;
procedure SetForeBmp(const Value: TBitmap);
public
constructor Create(AOwner: TAAFont);
{* 類構造器}
destructor Destroy; override;
{* 類析構器}
procedure Assign(Source: TPersistent); override;
{* 對象賦值方法}
procedure Blend(x, y: Integer; AColor: TColor; Alpha: TAlpha; Mask: TAAMask);
{* 按指定顏色進行混合}
procedure BlendEx(x, y: Integer; Alpha: TAlpha; Mask: TAAMask);
{* 使用前景圖ForeBmp進行混合}
property ForeBmp: TBitmap read FForeBmp write SetForeBmp;
{* 字體前景圖}
end;
{ TAAFont }
TAAFont = class
{* 平滑特效字體繪制類,封裝了基本的平滑字體繪制方法,用戶可手動使用。
|<BR>如果需要在其它地方繪制平滑字體,可使用下面的方法:
!var
! AAFont: TAAFont;
! W, H: Integer;
! S: string;
!begin
! // 創建TAAFont實例,并指定它使用PaintBox1的畫布進行繪制
! AAFont := TAAFont.Create(PaintBox1.Canvas);
! try
! with PaintBox1.Canvas do
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -