1 | unit FrameBuffer;
|
---|
2 |
|
---|
3 | interface
|
---|
4 |
|
---|
5 | uses
|
---|
6 | Classes, SysUtils, Device, Channel, IntMemory, Int;
|
---|
7 |
|
---|
8 | type
|
---|
9 | TScreenMode = (smText, smGraphic);
|
---|
10 |
|
---|
11 | { TFrameBuffer }
|
---|
12 |
|
---|
13 | TFrameBuffer = class(TDevice)
|
---|
14 | private
|
---|
15 | FOnChange: TNotifyEvent;
|
---|
16 | procedure DoChange;
|
---|
17 | function ReadData(Size: TIntSize): TInt;
|
---|
18 | function ReadPosition(Size: TIntSize): TInt;
|
---|
19 | function ReadWidth(Size: TIntSize): TInt;
|
---|
20 | function ReadHeight(Size: TIntSize): TInt;
|
---|
21 | function ReadMode(Size: TIntSize): TInt;
|
---|
22 | procedure WriteData(Size: TIntSize; Value: TInt);
|
---|
23 | procedure WritePosition(Size: TIntSize; Value: TInt);
|
---|
24 | procedure WriteWidth(Size: TIntSize; Value: TInt);
|
---|
25 | procedure WriteHeight(Size: TIntSize; Value: TInt);
|
---|
26 | procedure WriteMode(Size: TIntSize; Value: TInt);
|
---|
27 | public
|
---|
28 | Memory: TMemory;
|
---|
29 | Position: Integer;
|
---|
30 | Width: Integer;
|
---|
31 | Height: Integer;
|
---|
32 | Mode: TScreenMode;
|
---|
33 | procedure UpdateMode;
|
---|
34 | function GetHandlers: THandlers; override;
|
---|
35 | constructor Create;
|
---|
36 | destructor Destroy; override;
|
---|
37 | property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
---|
38 | end;
|
---|
39 |
|
---|
40 |
|
---|
41 | implementation
|
---|
42 |
|
---|
43 | { TFrameBuffer }
|
---|
44 |
|
---|
45 | procedure TFrameBuffer.DoChange;
|
---|
46 | begin
|
---|
47 | if Assigned(FOnChange) then FOnChange(Self);
|
---|
48 | end;
|
---|
49 |
|
---|
50 | function TFrameBuffer.ReadData(Size: TIntSize): TInt;
|
---|
51 | begin
|
---|
52 | Result := Memory.Read(Position, Size);
|
---|
53 | Inc(Position, Size);
|
---|
54 | end;
|
---|
55 |
|
---|
56 | function TFrameBuffer.ReadPosition(Size: TIntSize): TInt;
|
---|
57 | begin
|
---|
58 | Result := Position;
|
---|
59 | end;
|
---|
60 |
|
---|
61 | function TFrameBuffer.ReadWidth(Size: TIntSize): TInt;
|
---|
62 | begin
|
---|
63 | Result := Width;
|
---|
64 | end;
|
---|
65 |
|
---|
66 | function TFrameBuffer.ReadHeight(Size: TIntSize): TInt;
|
---|
67 | begin
|
---|
68 | Result := Height;
|
---|
69 | end;
|
---|
70 |
|
---|
71 | function TFrameBuffer.ReadMode(Size: TIntSize): TInt;
|
---|
72 | begin
|
---|
73 | Result := Byte(Mode);
|
---|
74 | end;
|
---|
75 |
|
---|
76 | procedure TFrameBuffer.WriteData(Size: TIntSize; Value: TInt);
|
---|
77 | begin
|
---|
78 | Memory.Write(Position, Size, Value);
|
---|
79 | Inc(Position, Size);
|
---|
80 | end;
|
---|
81 |
|
---|
82 | procedure TFrameBuffer.WritePosition(Size: TIntSize; Value: TInt);
|
---|
83 | begin
|
---|
84 | Position := Value;
|
---|
85 | end;
|
---|
86 |
|
---|
87 | procedure TFrameBuffer.WriteWidth(Size: TIntSize; Value: TInt);
|
---|
88 | begin
|
---|
89 | Width := Value;
|
---|
90 | UpdateMode;
|
---|
91 | end;
|
---|
92 |
|
---|
93 | procedure TFrameBuffer.WriteHeight(Size: TIntSize; Value: TInt);
|
---|
94 | begin
|
---|
95 | Height := Value;
|
---|
96 | UpdateMode;
|
---|
97 | end;
|
---|
98 |
|
---|
99 | procedure TFrameBuffer.WriteMode(Size: TIntSize; Value: TInt);
|
---|
100 | begin
|
---|
101 | Mode := TScreenMode(Integer(Value));
|
---|
102 | UpdateMode;
|
---|
103 | end;
|
---|
104 |
|
---|
105 | procedure TFrameBuffer.UpdateMode;
|
---|
106 | begin
|
---|
107 | Memory.Size := Width * Height;
|
---|
108 | Memory.FillZero;
|
---|
109 | end;
|
---|
110 |
|
---|
111 | function TFrameBuffer.GetHandlers: THandlers;
|
---|
112 | begin
|
---|
113 | Result := THandlers.Create;
|
---|
114 | Result.ReadHandlers.Add(ReadData);
|
---|
115 | Result.ReadHandlers.Add(ReadPosition);
|
---|
116 | Result.ReadHandlers.Add(ReadWidth);
|
---|
117 | Result.ReadHandlers.Add(ReadHeight);
|
---|
118 | Result.ReadHandlers.Add(ReadMode);
|
---|
119 | Result.WriteHandlers.Add(WriteData);
|
---|
120 | Result.WriteHandlers.Add(WritePosition);
|
---|
121 | Result.WriteHandlers.Add(WriteWidth);
|
---|
122 | Result.WriteHandlers.Add(WriteHeight);
|
---|
123 | Result.WriteHandlers.Add(WriteMode);
|
---|
124 | end;
|
---|
125 |
|
---|
126 | constructor TFrameBuffer.Create;
|
---|
127 | begin
|
---|
128 | Memory := TMemory.Create;
|
---|
129 | Position := 0;
|
---|
130 | Width := 40;
|
---|
131 | Height := 25;
|
---|
132 | Mode := smText;
|
---|
133 | UpdateMode;
|
---|
134 | end;
|
---|
135 |
|
---|
136 | destructor TFrameBuffer.Destroy;
|
---|
137 | begin
|
---|
138 | FreeAndNil(Memory);
|
---|
139 | inherited;
|
---|
140 | end;
|
---|
141 |
|
---|
142 | end.
|
---|
143 |
|
---|