Ignore:
Timestamp:
Sep 25, 2017, 2:48:08 PM (7 years ago)
Author:
chronos
Message:
  • Added: Drawing relative to Canvas. In case of Window drawing relative to Window.
  • Modified: Use custom TPoint and TRectangle if possible.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/Kernel/UScreen.pas

    r8 r13  
    66
    77uses
    8   Classes, SysUtils, Math;
     8  SysUtils, Math, UGraphics;
    99
    1010type
    11   TColorFormat = (cfRGBA8, cfGray8);
    12   TColor = Integer;
     11  TScreen = class;
     12
     13  TScreenCanvas = class(TCanvas)
     14    Screen: TScreen;
     15    procedure DrawText(Pos: TPoint; Text: string; Color: TColor); override;
     16    procedure DrawLine(P1, P2: TPoint; Color: TColor); override;
     17    procedure DrawRect(Rect: TRectangle; Color: TColor); override;
     18    procedure SetPixel(P: TPoint; Color: TColor); override;
     19  end;
    1320
    1421  { TScreen }
     
    2229    BytesPerLine: Integer;
    2330    VideoMemory: PByte;
    24     procedure DrawText(Pos: TPoint; Text: string; Color: TColor);
    25     procedure DrawLine(P1, P2: TPoint; Color: TColor);
    26     procedure DrawRect(Rect: TRect; Color: TColor);
    27     procedure SetPixel(P: TPoint; Color: TColor);
     31    Canvas: TCanvas;
    2832    procedure VideoMemoryUpdated;
    2933  end;
     
    3438  UDevice;
    3539
    36 { TScreen }
     40{ TScreenCanvas }
    3741
    38 procedure TScreen.DrawText(Pos: TPoint; Text: string; Color: TColor);
     42procedure TScreenCanvas.DrawText(Pos: TPoint; Text: string; Color: TColor);
    3943begin
    4044
    4145end;
    4246
    43 procedure TScreen.DrawLine(P1, P2: TPoint; Color: TColor);
     47procedure TScreenCanvas.DrawLine(P1, P2: TPoint; Color: TColor);
    4448var
    4549  I: Integer;
     
    4751  if Abs(P2.X - P1.X) > Abs(P2.Y - P1.Y) then begin
    4852    for I := 0 to Abs(P2.X - P1.X) - 1 do
    49       SetPixel(Point(Trunc(P1.X + I * Sign(P2.X - P1.X)),
     53      SetPixel(TPoint.Create(Trunc(P1.X + I * Sign(P2.X - P1.X)),
    5054        Trunc(P1.Y + (P2.Y - P1.Y) / Abs(P2.X - P1.X) * I)), Color);
    5155  end else begin
    5256    for I := 0 to Abs(P2.Y - P1.Y) - 1 do
    53       SetPixel(Point(Trunc(P1.X + (P2.X - P1.X) / Abs(P2.Y - P1.Y) * I),
     57      SetPixel(TPoint.Create(Trunc(P1.X + (P2.X - P1.X) / Abs(P2.Y - P1.Y) * I),
    5458        Trunc(P1.Y + I * Sign(P2.Y - P1.Y))), Color);
    5559  end;
    56   VideoMemoryUpdated;
     60  Screen.VideoMemoryUpdated;
    5761end;
    5862
    59 procedure TScreen.DrawRect(Rect: TRect; Color: TColor);
     63procedure TScreenCanvas.DrawRect(Rect: TRectangle; Color: TColor);
    6064var
    6165  X, Y: Integer;
     
    6367  for Y := Rect.Top to Rect.Bottom do
    6468  for X := Rect.Left to Rect.Right do
    65     SetPixel(Point(X, Y), Color);
     69    SetPixel(TPoint.Create(X, Y), Color);
    6670end;
    6771
    68 procedure TScreen.SetPixel(P: TPoint; Color: TColor);
     72procedure TScreenCanvas.SetPixel(P: TPoint; Color: TColor);
    6973begin
    70   if Assigned(VideoMemory) then
    71     PInteger(VideoMemory + P.X * BytesPerPixel + P.Y * BytesPerLine)^ := Color;
     74  if Assigned(Screen.VideoMemory) and
     75    TRectangle.Create(TPoint.Create(0, 0), Screen.Size).PointInside(P) then
     76    PInteger(Screen.VideoMemory + P.X * Screen.BytesPerPixel + P.Y * Screen.BytesPerLine)^ := Color;
    7277end;
     78
     79
     80{ TScreen }
    7381
    7482procedure TScreen.VideoMemoryUpdated;
Note: See TracChangeset for help on using the changeset viewer.