亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? frxgraphicutils.pas

?? 一.安裝說明 1.[FastReport v4.3.rar]是控件4.3的安裝版 2.安裝完控件后,將這兩個文件[frxClass.pas,frxDesgn.pas,frxDBSet,frxGra
?? PAS
?? 第 1 頁 / 共 3 頁
字號:

{******************************************}
{                                          }
{             FastReport v4.0              }
{            Graphic routines              }
{                                          }
{         Copyright (c) 1998-2007          }
{         by Alexander Tzyganenko,         }
{            Fast Reports Inc.             }
{                                          }
{******************************************}

unit frxGraphicUtils;

interface

{$I frx.inc}

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
  frxClass, frxUnicodeUtils
{$IFDEF Delphi6}
, Variants
{$ENDIF};


type
  TIntArray = array[0..MaxInt div 4 - 1] of Integer;
  PIntArray = ^TIntArray;

  TfrxHTMLTag = class(TObject)
  public
    Position: Integer;
    Size: Integer;
    AddY: Integer;
    Style: TFontStyles;
    Color: Integer;
    Default: Boolean;
    Small: Boolean;
    procedure Assign(Tag: TfrxHTMLTag);
  end;

  TfrxHTMLTags = class(TObject)
  private
    FItems: TList;
    procedure Add(Tag: TfrxHTMLTag);
    function GetItems(Index: Integer): TfrxHTMLTag;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    function Count: Integer;
    property Items[Index: Integer]: TfrxHTMLTag read GetItems; default;
  end;

  TfrxHTMLTagsList = class(TObject)
  private
    FAllowTags: Boolean;
    FAddY: Integer;
    FColor: LongInt;
    FDefColor: LongInt;
    FDefSize: Integer;
    FDefStyle: TFontStyles;
    FItems: TList;
    FPosition: Integer;
    FSize: Integer;
    FStyle: TFontStyles;
    FTempArray: PIntArray;
    procedure NewLine;
    procedure Wrap(TagsCount: Integer; AddBreak: Boolean);
    function Add: TfrxHTMLTag;
    function FillCharSpacingArray(var ar: PIntArray; const s: WideString;
      Canvas: TCanvas; LineIndex, Add: Integer; Convert: Boolean): Integer;
    function GetItems(Index: Integer): TfrxHTMLTags;
    function GetPrevTag: TfrxHTMLTag;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Clear;
    procedure SetDefaults(DefColor: TColor; DefSize: Integer;
      DefStyle: TFontStyles);
    procedure ExpandHTMLTags(var s: WideString);
    function Count: Integer;
    property AllowTags: Boolean read FAllowTags write FAllowTags;
    property Items[Index: Integer]: TfrxHTMLTags read GetItems; default;
    property Position: Integer read FPosition write FPosition;
  end;

  TfrxDrawText = class(TObject)
  private
// internals
    FBMP: TBitmap;
    FLocked: Boolean;
    FCanvas: TCanvas;
    FDefPPI: Integer;
    FScrPPI: Integer;
    FTempArray: PIntArray;

// data passed by SetXXX calls
    FFontSize: Integer;
    FHTMLTags: TfrxHTMLTagsList;
    FCharSpacing: Extended;
    FLineSpacing: Extended;
    FOptions: Integer;
    FOriginalRect: TRect;
    FParagraphGap: Extended;
    FPlainText: WideString;
    FPrintScale: Extended;
    FRotation: Integer;
    FRTLReading: Boolean;
    FScaledRect: TRect;
    FScaleX: Extended;
    FScaleY: Extended;
    FText: TWideStrings;
    FWordBreak: Boolean;
    FWordWrap: Boolean;
    FWysiwyg: Boolean;

    function GetWrappedText: WideString;
    function IsPrinter(C: TCanvas): Boolean;
    procedure DrawTextLine(C: TCanvas; const s: WideString;
      X, Y, DX, LineIndex: Integer; Align: TfrxHAlign; var fh, oldfh: HFont);
    procedure WrapTextLine(s: WideString; Width, FirstLineWidth,
      CharSpacing: Integer);
  public
    constructor Create;
    destructor Destroy; override;

// Call these methods in the same order
    procedure SetFont(Font: TFont);
    procedure SetOptions(WordWrap, HTMLTags, RTLReading, WordBreak,
      Clipped, Wysiwyg: Boolean; Rotation: Integer);
    procedure SetGaps(ParagraphGap, CharSpacing, LineSpacing: Extended);
    procedure SetDimensions(ScaleX, ScaleY, PrintScale: Extended;
      OriginalRect, ScaledRect: TRect);
    procedure SetText(Text: TWideStrings);
    procedure SetParaBreaks(FirstParaBreak, LastParaBreak: Boolean);
    function DeleteTags(const Txt: WideString): WideString;

// call these methods only after methods listed above
    procedure DrawText(C: TCanvas; HAlign: TfrxHAlign; VAlign: TfrxVAlign);
    function CalcHeight: Extended;
    function CalcWidth: Extended;
    function LineHeight: Extended;
    function TextHeight: Extended;
// returns the text that don't fit in the bounds
    function GetInBoundsText: WideString;
    function GetOutBoundsText(var ParaBreak: Boolean): WideString;
    function UnusedSpace: Extended;

// call these methods before and after doing something
    procedure Lock;
    procedure Unlock;

    property Canvas: TCanvas read FCanvas;
    property DefPPI: Integer read FDefPPI;
    property ScrPPI: Integer read FScrPPI;
    property WrappedText: WideString read GetWrappedText;
  end;


var
  frxDrawText: TfrxDrawText;

implementation

uses frxPrinter;

const
  glasn: String = '瑯ㄈ斡圯捱';
  soglasn: String = '諒媚魄墑頌拖醒以罩棕佘?';
  znaks: String = '苴';
  znaks1: String = '?';

function BreakRussianWord(const s: WideString): String;
var
  i, j: Integer;
  CanBreak: Boolean;

  function Check1and5(const s: WideString): Boolean;
  var
    i: Integer;
  begin
    Result := False;
    if Length(s) >= 2 then
      for i := 1 to Length(s) do
        if Pos(s[i], glasn) <> 0 then
        begin
          Result := True;
          break;
        end;
  end;

begin
  Result := '';
  if Length(s) < 4 then Exit;

  for i := 1 to Length(s) do
  begin
    CanBreak := False;
    if Pos(s[i], soglasn) <> 0 then
    begin
      CanBreak := True;
      { 2 }
      if (i < Length(s)) and (Pos(s[i + 1], glasn) <> 0) then
        CanBreak := False;
      { 3 }
      if (i < Length(s)) and (Pos(s[i + 1], znaks) <> 0) then
        CanBreak := False;
    end;
    if Pos(s[i], glasn) <> 0 then
    begin
      CanBreak := True;
      { 4 }
      if (i < Length(s)) and (Pos(s[i + 1], znaks1) <> 0) then
        CanBreak := False;
      { 6 }
      if (i < Length(s) - 2) and (Pos(s[i + 1], soglasn) <> 0) and
        (s[i + 1] = s[i + 2]) and (Pos(s[i + 3], glasn) <> 0) then
        CanBreak := False;
    end;
    if CanBreak then
      Result := Result + Chr(i);
  end;

  { 1, 5 }
  for i := 1 to Length(Result) do
  begin
    j := Ord(Result[i]);
    if not (Check1and5(Copy(s, 1, j)) and Check1and5(Copy(s, j + 1, 255))) then
      Result[i] := #255;
  end;
  while Pos(#255, Result) <> 0 do
    Delete(Result, Pos(#255, Result), 1);
end;

procedure IncArray(Ar: PIntArray; x1, x2, n, one: Integer);
var
  xm: Integer;
begin
  if n <= 0 then Exit;
  xm := (x2 - x1 + 1) div 2;
  if xm = 0 then
    xm := 1;
  if n = 1 then
    Inc(Ar[x1 + xm - 1], one)
  else
  begin
    IncArray(Ar, x1, x1 + xm - 1, n div 2, one);
    IncArray(Ar, x1 + xm, x2, n - n div 2, one);
  end;
end;

function CreateRotatedFont(Font: TFont; Rotation: Integer): HFont;
var
  F: TLogFont;
begin
  GetObject(Font.Handle, SizeOf(TLogFont), @F);
  F.lfEscapement := Rotation * 10;
  F.lfOrientation := Rotation * 10;
  Result := CreateFontIndirect(F);
end;


{ TfrxHTMLTag }

procedure TfrxHTMLTag.Assign(Tag: TfrxHTMLTag);
begin
  Position := Tag.Position;
  Size := Tag.Size;
  AddY := Tag.AddY;
  Style := Tag.Style;
  Color := Tag.Color;
  Default := Tag.Default;
  Small := Tag.Small;
end;


{ TfrxHTMLTags }

constructor TfrxHTMLTags.Create;
begin
  FItems := TList.Create;
end;

destructor TfrxHTMLTags.Destroy;
begin
  Clear;
  FItems.Free;
  inherited;
end;

procedure TfrxHTMLTags.Clear;
var
  i: Integer;
begin
  for i := 0 to FItems.Count - 1 do
    TfrxHTMLTag(FItems[i]).Free;
  FItems.Clear;
end;

function TfrxHTMLTags.GetItems(Index: Integer): TfrxHTMLTag;
begin
  Result := TfrxHTMLTag(FItems[Index]);
end;

function TfrxHTMLTags.Count: Integer;
begin
  Result := FItems.Count;
end;

procedure TfrxHTMLTags.Add(Tag: TfrxHTMLTag);
begin
  FItems.Add(Tag);
end;


{ TfrxHTMLTagsList }

constructor TfrxHTMLTagsList.Create;
begin
  FItems := TList.Create;
  FAllowTags := True;
  GetMem(FTempArray, SizeOf(Integer) * 32768);
end;

destructor TfrxHTMLTagsList.Destroy;
begin
  Clear;
  FItems.Free;
  FreeMem(FTempArray, SizeOf(Integer) * 32768);
  inherited;
end;

procedure TfrxHTMLTagsList.Clear;
var
  i: Integer;
begin
  for i := 0 to FItems.Count - 1 do
    TfrxHTMLTags(FItems[i]).Free;
  FItems.Clear;
end;

procedure TfrxHTMLTagsList.NewLine;
begin
  if Count <> 0 then
    FItems.Add(TfrxHTMLTags.Create);
end;

procedure TfrxHTMLTagsList.Wrap(TagsCount: Integer; AddBreak: Boolean);
var
  i: Integer;
  Line, OldLine: TfrxHTMLTags;
  NewTag: TfrxHTMLTag;
begin
  OldLine := Items[Count - 1];
  if OldLine.Count <= TagsCount then
    Exit;

  NewLine;
  Line := Items[Count - 1];
  for i := TagsCount to OldLine.Count - 1 do
    Line.Add(OldLine[i]);
  OldLine.FItems.Count := TagsCount;
  if AddBreak then
  begin
    NewTag := TfrxHTMLTag.Create;
    OldLine.FItems.Add(NewTag);
    NewTag.Assign(TfrxHTMLTag(OldLine.FItems[TagsCount - 1]))
  end
  else if Line[0].Default then
    Line[0].Assign(OldLine[TagsCount - 1]);
end;

function TfrxHTMLTagsList.Count: Integer;
begin
  Result := FItems.Count;
end;

function TfrxHTMLTagsList.GetItems(Index: Integer): TfrxHTMLTags;
begin
  Result := TfrxHTMLTags(FItems[Index]);
end;

function TfrxHTMLTagsList.Add: TfrxHTMLTag;
var
  i: Integer;
begin
  Result := TfrxHTMLTag.Create;
  i := Count - 1;
  if i = -1 then
  begin
    FItems.Add(TfrxHTMLTags.Create);
    i := 0;
  end;
  Items[i].Add(Result);
end;

function TfrxHTMLTagsList.GetPrevTag: TfrxHTMLTag;
var
  Tags: TfrxHTMLTags;
begin
  Result := nil;
  Tags := Items[Count - 1];
  if Tags.Count > 1 then
    Result := Tags[Tags.Count - 2]
  else if Count > 1 then
  begin
    Tags := Items[Count - 2];
    Result := Tags[Tags.Count - 1];
  end;
end;

procedure TfrxHTMLTagsList.SetDefaults(DefColor: TColor; DefSize: Integer;
  DefStyle: TFontStyles);
begin
  FDefColor := DefColor;
  FDefSize := DefSize;
  FDefStyle := DefStyle;
  FAddY := 0;
  FColor := FDefColor;
  FSize := FDefSize;
  FStyle := FDefStyle;
  FPosition := 1;
  Clear;
end;

procedure TfrxHTMLTagsList.ExpandHTMLTags(var s: WideString);
var
  i, j, j1: Integer;
  b: Boolean;
  cl: WideString;

  procedure AddTag;
  var
    Tag, PrevTag: TfrxHTMLTag;
  begin
    Tag := Add;
    Tag.Position := FPosition; // this will help us to get position in the original text
    Tag.Size := FSize;
    Tag.Style := FStyle;
    Tag.Color := FColor;
    Tag.AddY := FAddY;
// when "Default" changes, we need to set Font.Style, Size and Color
    if FAllowTags then
    begin
      PrevTag := GetPrevTag;
      if PrevTag <> nil then
        Tag.Default := (FStyle = PrevTag.Style) and
                       (FColor = PrevTag.Color) and
                       (FSize = PrevTag.Size)
      else
        Tag.Default := (FStyle = FDefStyle) and (FColor = FDefColor) and (FSize = FDefSize);
    end
    else
      Tag.Default := True;
    Tag.Small := FSize <> FDefSize;
  end;

begin
  i := 1;
  if Length(s) = 0 then Exit;

  while i <= Length(s) do
  begin
    b := True;

    if FAllowTags then
      if s[i] = '<' then
      begin

        // <b>, <u>, <i> tags
        if (i + 2 <= Length(s)) and (s[i + 2] = '>') then
        begin
          case s[i + 1] of
            'b','B': FStyle := FStyle + [fsBold];
            'i','I': FStyle := FStyle + [fsItalic];
            'u','U': FStyle := FStyle + [fsUnderline];
            else
              b := False;
          end;
          if b then
          begin
            System.Delete(s, i, 3);
            Inc(FPosition, 3);
            continue;
          end;
        end

        // <sub>, <sup> tags
        else if (i + 4 <= Length(s)) and (s[i + 4] = '>') then
        begin
          if Pos('SUB>', AnsiUpperCase(s)) = i + 1 then
          begin
            FSize := Round(FDefSize / 1.5);
            FAddY := 1;
            b := True;
          end
          else if Pos('SUP>', AnsiUpperCase(s)) = i + 1 then
          begin
            FSize := Round(FDefSize / 1.5);
            FAddY := 0;
            b := True;
          end;
          if b then
          begin
            System.Delete(s, i, 5);
            Inc(FPosition, 5);
            continue;
          end;
        end

        // <strike> tag
        else if (i + 1 <= Length(s)) and ((s[i + 1] = 's') or (s[i + 1] = 'S')) then
        begin
          if Pos('STRIKE>', AnsiUpperCase(s)) = i + 1 then
          begin
            FStyle := FStyle + [fsStrikeOut];
            System.Delete(s, i, 8);
            Inc(FPosition, 8);
            continue;
          end;
        end

        // </b>, </u>, </i>, </strike>, </font>, </sub>, </sup> tags
        else if (i + 1 <= Length(s)) and (s[i + 1] = '/') then
        begin
          if (i + 3 <= Length(s)) and (s[i + 3] = '>') then
          begin
            case s[i + 2] of
              'b','B': FStyle := FStyle - [fsBold];
              'i','I': FStyle := FStyle - [fsItalic];
              'u','U': FStyle := FStyle - [fsUnderline];
              else
                b := False;
            end;
            if b then
            begin
              System.Delete(s, i, 4);
              Inc(FPosition, 4);
              continue;
            end;
          end
          else if (Pos('STRIKE>', AnsiUpperCase(s)) = i + 2) then
          begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影免费观看高清完整版在| 国产精品情趣视频| 日韩欧美一级二级三级久久久| 久久久亚洲精华液精华液精华液| 一区二区三区精密机械公司| 国产综合色在线| 欧美这里有精品| 国产欧美日韩另类一区| 日韩福利视频网| 在线亚洲欧美专区二区| 欧美激情一区二区三区在线| 日韩极品在线观看| 欧美性感一区二区三区| 国产精品美女久久久久aⅴ| 久久66热re国产| 欧美三级视频在线| 亚洲欧美乱综合| 成人自拍视频在线| 久久综合久久鬼色中文字| 日韩av一区二区在线影视| 欧美三区在线观看| 亚洲一级二级在线| 欧洲精品视频在线观看| 自拍偷在线精品自拍偷无码专区| 懂色av一区二区三区蜜臀| 精品三级av在线| 美女诱惑一区二区| 欧美一区二区三区视频免费播放| 亚洲国产精品久久艾草纯爱| 在线观看区一区二| 亚洲另类色综合网站| 99国产精品久久久久久久久久 | 国产精品18久久久久久久网站| 欧美午夜不卡视频| 一区二区三区不卡在线观看| 色94色欧美sute亚洲线路一ni| 亚洲欧美在线另类| 91丨porny丨在线| 亚洲精品成a人| 欧美撒尿777hd撒尿| 亚洲成人手机在线| 在线播放日韩导航| 久久99日本精品| 2022国产精品视频| 成人性色生活片| 亚洲欧美精品午睡沙发| 欧美亚洲一区二区在线| 天天操天天色综合| 日韩欧美国产高清| 国产激情91久久精品导航| 国产精品天天摸av网| 91免费观看在线| 日日夜夜精品视频天天综合网| 欧美一区二区播放| 国产一区二区三区香蕉| 国产日韩欧美一区二区三区乱码 | 久久久久国产精品人| 成人午夜激情在线| 夜夜亚洲天天久久| 日韩情涩欧美日韩视频| 国产精品1区2区3区| 亚洲免费色视频| 欧美欧美欧美欧美首页| 狠狠久久亚洲欧美| 一区二区三区四区乱视频| 在线成人av影院| 成人在线一区二区三区| 亚洲一区二区免费视频| 久久免费电影网| 色综合中文字幕国产| 日韩和欧美一区二区三区| 久久久久久久国产精品影院| 色综合天天综合狠狠| 久久国产人妖系列| 亚洲免费观看在线视频| 精品国产一区二区三区忘忧草 | 国产欧美视频在线观看| 色94色欧美sute亚洲线路二 | 亚洲综合av网| 久久无码av三级| 欧美色图在线观看| 成人网页在线观看| 蜜臀av性久久久久av蜜臀妖精| 国产精品久久久久aaaa| 日韩欧美国产麻豆| 欧美色综合网站| 成+人+亚洲+综合天堂| 奇米精品一区二区三区在线观看一 | 久久免费视频色| 欧美日韩国产一级片| 国产精品中文字幕一区二区三区| 一区二区三区精品在线观看| 中文字幕精品在线不卡| 日韩欧美亚洲国产精品字幕久久久| 色诱视频网站一区| 成人久久视频在线观看| 精品亚洲免费视频| 丝袜美腿亚洲色图| 亚洲综合在线五月| 亚洲少妇屁股交4| 免费久久精品视频| 一区二区三区四区不卡视频| 国产精品久久久一本精品| 久久综合色一综合色88| 日韩精品一区二区三区中文不卡 | 久草这里只有精品视频| 午夜电影久久久| 亚洲午夜久久久久久久久久久| 综合亚洲深深色噜噜狠狠网站| 欧美经典一区二区三区| 久久久久国产精品厨房| 2020国产成人综合网| 欧美xxxxx裸体时装秀| 日韩亚洲欧美一区二区三区| 欧美精品自拍偷拍动漫精品| 欧美蜜桃一区二区三区| 欧美日韩电影一区| 777亚洲妇女| 日韩一区二区三区电影在线观看 | 色婷婷香蕉在线一区二区| 99在线精品一区二区三区| 本田岬高潮一区二区三区| 成人精品小蝌蚪| 91一区二区在线观看| 色素色在线综合| 欧美日韩精品一区视频| 日韩免费高清视频| 久久综合色鬼综合色| 日本一区二区电影| 中文字幕中文字幕一区| 一级女性全黄久久生活片免费| 亚洲国产精品视频| 免费久久精品视频| 成人综合婷婷国产精品久久免费| 99久久久精品| 欧美日韩亚洲另类| 欧美sm极限捆绑bd| 中文字幕av一区二区三区免费看| 18涩涩午夜精品.www| 亚洲成人第一页| 久久 天天综合| av电影天堂一区二区在线观看| 91精品办公室少妇高潮对白| 欧美三级一区二区| 久久先锋影音av| 亚洲乱码中文字幕| 青青青爽久久午夜综合久久午夜| 国产精品一区二区在线播放| 色婷婷久久久久swag精品| 欧美一区二区视频在线观看2020| 欧美精品一区二区在线观看| 亚洲人成7777| 久久电影国产免费久久电影| 波多野洁衣一区| 日韩精品中文字幕在线一区| 国产蜜臀97一区二区三区| 亚洲电影第三页| 成人午夜在线视频| 欧美老女人在线| 国产精品美女视频| 奇米精品一区二区三区在线观看 | 欧美无乱码久久久免费午夜一区| 日韩你懂的在线播放| 亚洲免费成人av| 韩国三级在线一区| 欧洲精品在线观看| 国产精品美女一区二区在线观看| 日韩黄色一级片| 在线欧美日韩国产| 久久久久免费观看| 日本不卡中文字幕| 在线观看日韩电影| 中文成人综合网| 精品午夜一区二区三区在线观看| 在线观看亚洲一区| 国产精品日产欧美久久久久| 激情五月婷婷综合网| 欧美日韩极品在线观看一区| 国产精品视频看| 激情文学综合插| 日韩视频在线你懂得| 亚洲国产日韩精品| 91啪亚洲精品| 国产精品乱码一区二三区小蝌蚪| 国模无码大尺度一区二区三区| 欧美高清视频在线高清观看mv色露露十八| 国产精品久久久久一区二区三区 | 国产大陆精品国产| 日韩一区二区精品| 日韩在线观看一区二区| 欧美中文字幕一二三区视频| 亚洲精品欧美综合四区| 成人aaaa免费全部观看| 中文字幕精品一区| 国产sm精品调教视频网站| 久久久久国产成人精品亚洲午夜| 九九九精品视频| 精品精品国产高清a毛片牛牛 | 亚洲欧美一区二区三区极速播放 | 久久精品视频网|