source: tags/1.0.0/UMetaCanvas.pas

Last change on this file was 44, checked in by chronos, 6 years ago
  • Fixed: Removed compilation warnings.
  • Modified: Preparation for 1.0.0 version release.
File size: 13.4 KB
Line 
1unit UMetaCanvas;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, Graphics, Contnrs, Types;
9
10type
11 TArrayOfPoint = array of TPoint;
12
13 { TCanvasObject }
14
15 TCanvasObject = class
16 procedure Paint(Canvas: TCanvas); virtual;
17 procedure Zoom(Factor: Double); virtual;
18 procedure Move(Delta: TPoint); virtual;
19 end;
20
21 { TCanvasText }
22
23 TCanvasText = class(TCanvasObject)
24 Brush: TBrush;
25 Font: TFont;
26 Position: TPoint;
27 Text: string;
28 procedure Paint(Canvas: TCanvas); override;
29 procedure Zoom(Factor: Double); override;
30 procedure Move(Delta: TPoint); override;
31 constructor Create;
32 destructor Destroy; override;
33 end;
34
35 { TCanvasRectangle }
36
37 TCanvasRectangle = class(TCanvasObject)
38 Pen: TPen;
39 Brush: TBrush;
40 BoundingRect: TRect;
41 procedure Paint(Canvas: TCanvas); override;
42 procedure Zoom(Factor: Double); override;
43 procedure Move(Delta: TPoint); override;
44 constructor Create;
45 destructor Destroy; override;
46 end;
47
48 { TCanvasLine }
49
50 TCanvasLine = class(TCanvasObject)
51 Pen: TPen;
52 P1, P2: TPoint;
53 procedure Paint(Canvas: TCanvas); override;
54 procedure Zoom(Factor: Double); override;
55 procedure Move(Delta: TPoint); override;
56 constructor Create;
57 destructor Destroy; override;
58 end;
59
60 { TCanvasPolygon }
61
62 TCanvasPolygon = class(TCanvasObject)
63 Pen: TPen;
64 Brush: TBrush;
65 Points: array of TPoint;
66 procedure Paint(Canvas: TCanvas); override;
67 procedure Zoom(Factor: Double); override;
68 procedure Move(Delta: TPoint); override;
69 constructor Create;
70 destructor Destroy; override;
71 end;
72
73 { TCanvasEllipse }
74
75 TCanvasEllipse = class(TCanvasObject)
76 Pen: TPen;
77 Brush: TBrush;
78 BoundingRect: TRect;
79 procedure Paint(Canvas: TCanvas); override;
80 procedure Zoom(Factor: Double); override;
81 procedure Move(Delta: TPoint); override;
82 constructor Create;
83 destructor Destroy; override;
84 end;
85
86 { TCanvasPie }
87
88 TCanvasPie = class(TCanvasObject)
89 Pen: TPen;
90 Brush: TBrush;
91 BoundingRect: TRect;
92 StartPoint: TPoint;
93 EndPoint: TPoint;
94 procedure Paint(Canvas: TCanvas); override;
95 procedure Zoom(Factor: Double); override;
96 procedure Move(Delta: TPoint); override;
97 constructor Create;
98 destructor Destroy; override;
99 end;
100
101 { TCanvasStretchDraw }
102
103 TCanvasStretchDraw = class(TCanvasObject)
104 SrcGraphic: TGraphic;
105 DestRect: TRect;
106 procedure Paint(Canvas: TCanvas); override;
107 procedure Zoom(Factor: Double); override;
108 procedure Move(Delta: TPoint); override;
109 constructor Create;
110 destructor Destroy; override;
111 end;
112
113 { TMetaCanvas }
114
115 TMetaCanvas = class(TCanvas)
116 private
117 FSize: TPoint;
118 FPenPos: TPoint;
119 protected
120 procedure SetHeight(AValue: Integer); override;
121 function GetHeight: Integer; override;
122 procedure SetWidth(AValue: Integer); override;
123 function GetWidth: Integer; override;
124 procedure DoLine (x1,y1,x2,y2:integer); override;
125 procedure DoTextOut(X, Y: Integer; Text: string); override;
126 procedure DoRectangle(const Bounds: TRect); override;
127 procedure DoRectangleFill(const Bounds: TRect); override;
128 procedure DoPolygon(const Points: array of TPoint); override;
129 procedure CreateHandle; override;
130 procedure DoEllipse(const Bounds: TRect); override;
131 procedure DoMoveTo(X, Y: Integer); override;
132 procedure DoLineTo(X, Y: Integer); override;
133 public
134 Objects: TObjectList;
135 procedure TextOut(X,Y: Integer; const Text: String); override;
136 procedure Polygon(Points: PPoint; NumPts: Integer; Winding: boolean = False); override;
137 procedure Ellipse(x1, y1, x2, y2: Integer); override;
138 procedure StretchDraw(const DestRect: TRect; SrcGraphic: TGraphic); override;
139 function TextExtent(const Text: string): TSize; override;
140 procedure Pie(EllipseX1, EllipseY1, EllipseX2, EllipseY2,
141 StartX, StartY, EndX, EndY: Integer); override;
142 procedure SetSize(Size: TPoint);
143 procedure Reset;
144 procedure DrawTo(Canvas: TCanvas);
145 procedure Zoom(Factor: Double);
146 procedure Move(Delta: TPoint);
147 constructor Create;
148 destructor Destroy; override;
149 end;
150
151implementation
152
153uses
154 UGeometric;
155
156{ TCanvasPie }
157
158procedure TCanvasPie.Paint(Canvas: TCanvas);
159begin
160 Canvas.Brush.Assign(Brush);
161 Canvas.Pen.Assign(Pen);
162 Canvas.Pie(BoundingRect.Left, BoundingRect.Top,
163 BoundingRect.Right, BoundingRect.Bottom, StartPoint.X, StartPoint.Y,
164 EndPoint.X, EndPoint.Y);
165end;
166
167procedure TCanvasPie.Zoom(Factor: Double);
168begin
169 BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
170 Trunc(BoundingRect.Top * Factor),
171 Trunc(BoundingRect.Right * Factor),
172 Trunc(BoundingRect.Bottom * Factor));
173 Pen.Width := Trunc(Pen.Width * Factor);
174 StartPoint := Point(Trunc(StartPoint.X * Factor), Trunc(StartPoint.Y * Factor));
175 EndPoint := Point(Trunc(EndPoint.X * Factor), Trunc(EndPoint.Y * Factor));
176end;
177
178procedure TCanvasPie.Move(Delta: TPoint);
179begin
180 BoundingRect := ShiftRect(BoundingRect, Delta);
181 StartPoint := AddPoint(StartPoint, Delta);
182 EndPoint := AddPoint(EndPoint, Delta);
183end;
184
185constructor TCanvasPie.Create;
186begin
187 Pen := TPen.Create;
188 Brush := TBrush.Create;
189end;
190
191destructor TCanvasPie.Destroy;
192begin
193 Pen.Free;
194 Brush.Free;
195 inherited Destroy;
196end;
197
198{ TCanvasStretchDraw }
199
200procedure TCanvasStretchDraw.Paint(Canvas: TCanvas);
201begin
202 Canvas.StretchDraw(DestRect, SrcGraphic);
203end;
204
205procedure TCanvasStretchDraw.Zoom(Factor: Double);
206begin
207 DestRect := Rect(Trunc(DestRect.Left * Factor),
208 Trunc(DestRect.Top * Factor),
209 Trunc(DestRect.Right * Factor),
210 Trunc(DestRect.Bottom * Factor));
211end;
212
213procedure TCanvasStretchDraw.Move(Delta: TPoint);
214begin
215 DestRect := ShiftRect(DestRect, Delta);
216end;
217
218constructor TCanvasStretchDraw.Create;
219begin
220 SrcGraphic := nil;
221end;
222
223destructor TCanvasStretchDraw.Destroy;
224begin
225 inherited Destroy;
226end;
227
228{ TCanvasEllipse }
229
230procedure TCanvasEllipse.Paint(Canvas: TCanvas);
231begin
232 Canvas.Pen.Assign(Pen);
233 Canvas.Brush.Assign(Brush);
234 Canvas.Ellipse(BoundingRect);
235end;
236
237procedure TCanvasEllipse.Zoom(Factor: Double);
238begin
239 BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
240 Trunc(BoundingRect.Top * Factor),
241 Trunc(BoundingRect.Right * Factor),
242 Trunc(BoundingRect.Bottom * Factor));
243 Pen.Width := Trunc(Pen.Width * Factor);
244end;
245
246procedure TCanvasEllipse.Move(Delta: TPoint);
247begin
248 BoundingRect := ShiftRect(BoundingRect, Delta);
249end;
250
251constructor TCanvasEllipse.Create;
252begin
253 Pen := TPen.Create;
254 Brush := TBrush.Create;
255end;
256
257destructor TCanvasEllipse.Destroy;
258begin
259 Pen.Free;
260 Brush.Free;
261 inherited Destroy;
262end;
263
264{ TCanvasPolygon }
265
266procedure TCanvasPolygon.Paint(Canvas: TCanvas);
267begin
268 Canvas.Pen.Assign(Pen);
269 Canvas.Brush.Assign(Brush);
270 Canvas.Polygon(Points);
271end;
272
273procedure TCanvasPolygon.Zoom(Factor: Double);
274var
275 I: Integer;
276begin
277 for I := 0 to High(Points) do
278 Points[I] := Point(Trunc(Points[I].X * Factor),
279 Trunc(Points[I].Y * Factor));
280 Pen.Width := Trunc(Pen.Width * Factor);
281end;
282
283procedure TCanvasPolygon.Move(Delta: TPoint);
284var
285 I: Integer;
286begin
287 for I := 0 to High(Points) do
288 Points[I] := AddPoint(Points[I], Delta);
289end;
290
291constructor TCanvasPolygon.Create;
292begin
293 Pen := TPen.Create;
294 Brush := TBrush.Create;
295end;
296
297destructor TCanvasPolygon.Destroy;
298begin
299 Brush.Free;
300 Pen.Free;
301 inherited Destroy;
302end;
303
304{ TCanvasLine }
305
306procedure TCanvasLine.Paint(Canvas: TCanvas);
307begin
308 Canvas.Pen.Assign(Pen);
309 Canvas.Line(P1, P2);
310end;
311
312procedure TCanvasLine.Zoom(Factor: Double);
313begin
314 P1 := Point(Trunc(P1.X * Factor), Trunc(P1.Y * Factor));
315 P2 := Point(Trunc(P2.X * Factor), Trunc(P2.Y * Factor));
316 Pen.Width := Trunc(Pen.Width * Factor);
317end;
318
319procedure TCanvasLine.Move(Delta: TPoint);
320begin
321 P1 := AddPoint(P1, Delta);
322 P2 := AddPoint(P2, Delta);
323end;
324
325constructor TCanvasLine.Create;
326begin
327 Pen := TPen.Create;
328end;
329
330destructor TCanvasLine.Destroy;
331begin
332 Pen.Free;
333 inherited Destroy;
334end;
335
336{ TCanvasRectangle }
337
338procedure TCanvasRectangle.Paint(Canvas: TCanvas);
339begin
340 Canvas.Pen.Assign(Pen);
341 Canvas.Brush.Assign(Brush);
342 Canvas.Rectangle(BoundingRect);
343end;
344
345procedure TCanvasRectangle.Zoom(Factor: Double);
346begin
347 BoundingRect := Rect(Trunc(BoundingRect.Left * Factor),
348 Trunc(BoundingRect.Top * Factor),
349 Trunc(BoundingRect.Right * Factor),
350 Trunc(BoundingRect.Bottom * Factor));
351 Pen.Width := Trunc(Pen.Width * Factor);
352end;
353
354procedure TCanvasRectangle.Move(Delta: TPoint);
355begin
356 ShiftRect(BoundingRect, Delta);
357end;
358
359constructor TCanvasRectangle.Create;
360begin
361 Pen := TPen.Create;
362 Brush := TBrush.Create;
363end;
364
365destructor TCanvasRectangle.Destroy;
366begin
367 Pen.Free;
368 Brush.Free;
369 inherited Destroy;
370end;
371
372{ TCanvasText }
373
374procedure TCanvasText.Paint(Canvas: TCanvas);
375begin
376 Canvas.Brush.Assign(Brush);
377 Canvas.Font.Assign(Font);
378 Canvas.TextOut(Position.X, Position.Y, Text);
379end;
380
381procedure TCanvasText.Zoom(Factor: Double);
382begin
383 Position := Point(Trunc(Position.X * Factor), Trunc(Position.Y * Factor));
384 Font.Size := Trunc(Font.Size * Factor);
385end;
386
387procedure TCanvasText.Move(Delta: TPoint);
388begin
389 Position := AddPoint(Position, Delta);
390end;
391
392constructor TCanvasText.Create;
393begin
394 Font := TFont.Create;
395 Brush := TBrush.Create;
396end;
397
398destructor TCanvasText.Destroy;
399begin
400 Brush.Free;
401 Font.Free;
402 inherited Destroy;
403end;
404
405{ TCanvasObject }
406
407procedure TCanvasObject.Paint(Canvas: TCanvas);
408begin
409
410end;
411
412procedure TCanvasObject.Zoom(Factor: Double);
413begin
414
415end;
416
417procedure TCanvasObject.Move(Delta: TPoint);
418begin
419end;
420
421{ TMetaCanvas }
422
423procedure TMetaCanvas.SetHeight(AValue: Integer);
424begin
425 FSize.Y := AValue;
426end;
427
428function TMetaCanvas.GetHeight: Integer;
429begin
430 Result := FSize.Y;
431end;
432
433procedure TMetaCanvas.SetWidth(AValue: Integer);
434begin
435 FSize.X := AValue;
436end;
437
438function TMetaCanvas.GetWidth: Integer;
439begin
440 Result := FSize.X;
441end;
442
443procedure TMetaCanvas.DoLine(x1, y1, x2, y2: integer);
444var
445 NewObj: TCanvasLine;
446begin
447 NewObj := TCanvasLine.Create;
448 NewObj.Pen.Assign(Pen);
449 NewObj.P1 := Point(X1, Y1);
450 NewObj.P2 := Point(X2, Y2);
451 Objects.Add(NewObj);
452end;
453
454procedure TMetaCanvas.DoTextOut(X, Y: Integer; Text: string);
455var
456 NewObj: TCanvasText;
457begin
458 NewObj := TCanvasText.Create;
459 NewObj.Font.Assign(Font);
460 NewObj.Brush.Assign(Brush);
461 NewObj.Position := Point(X, Y);
462 NewObj.Text := Text;
463 Objects.Add(NewObj);
464end;
465
466procedure TMetaCanvas.TextOut(X, Y: Integer; const Text: String);
467begin
468 DoTextOut(X, Y, Text);
469end;
470
471procedure TMetaCanvas.DoRectangle(const Bounds: TRect);
472var
473 NewObj: TCanvasRectangle;
474begin
475 NewObj := TCanvasRectangle.Create;
476 NewObj.Pen.Assign(Pen);
477 NewObj.BoundingRect := Bounds;
478 Objects.Add(NewObj);
479end;
480
481procedure TMetaCanvas.DoRectangleFill(const Bounds: TRect);
482var
483 NewObj: TCanvasRectangle;
484begin
485 NewObj := TCanvasRectangle.Create;
486 NewObj.Brush.Assign(Brush);
487 NewObj.Pen.Assign(Pen);
488 NewObj.BoundingRect := Bounds;
489 Objects.Add(NewObj);
490end;
491
492procedure TMetaCanvas.Polygon(Points: PPoint; NumPts: Integer; Winding: boolean
493 );
494var
495 APoints: array of TPoint;
496 I: Integer;
497begin
498 SetLength(APoints, NumPts);
499 for I := 0 to High(APoints) do
500 APoints[I] := Points[I];
501 DoPolygon(APoints);
502end;
503
504procedure TMetaCanvas.DoPolygon(const Points: array of TPoint);
505var
506 NewObj: TCanvasPolygon;
507 I: Integer;
508begin
509 NewObj := TCanvasPolygon.Create;
510 NewObj.Brush.Assign(Brush);
511 NewObj.Pen.Assign(Pen);
512 SetLength(NewObj.Points, Length(Points));
513 for I := 0 to High(Points) do
514 NewObj.Points[I] := Points[I];
515 Objects.Add(NewObj);
516end;
517
518procedure TMetaCanvas.CreateHandle;
519begin
520end;
521
522procedure TMetaCanvas.Ellipse(x1, y1, x2, y2: Integer);
523begin
524 DoEllipse(Rect(X1, Y1, X2, Y2));
525end;
526
527procedure TMetaCanvas.DoEllipse(const Bounds: TRect);
528var
529 NewObj: TCanvasEllipse;
530begin
531 NewObj := TCanvasEllipse.Create;
532 NewObj.Brush.Assign(Brush);
533 NewObj.Pen.Assign(Pen);
534 NewObj.BoundingRect := Bounds;
535 Objects.Add(NewObj);
536end;
537
538procedure TMetaCanvas.StretchDraw(const DestRect: TRect; SrcGraphic: TGraphic);
539var
540 NewObj: TCanvasStretchDraw;
541begin
542 NewObj := TCanvasStretchDraw.Create;
543 NewObj.SrcGraphic := SrcGraphic;
544 NewObj.DestRect := DestRect;
545 Objects.Add(NewObj);
546end;
547
548function TMetaCanvas.TextExtent(const Text: string): TSize;
549begin
550 Result := Size(0, 0);
551end;
552
553procedure TMetaCanvas.DoMoveTo(X, Y: Integer);
554begin
555 FPenPos := Point(X, Y);
556end;
557
558procedure TMetaCanvas.DoLineTo(X, Y: Integer);
559begin
560 DoLine(FPenPos.X, FPenPos.Y, X, Y);
561 DoMoveTo(X, Y);
562end;
563
564procedure TMetaCanvas.Pie(EllipseX1, EllipseY1, EllipseX2, EllipseY2, StartX,
565 StartY, EndX, EndY: Integer);
566var
567 NewObj: TCanvasPie;
568begin
569 NewObj := TCanvasPie.Create;
570 NewObj.Brush.Assign(Brush);
571 NewObj.Pen.Assign(Pen);
572 NewObj.BoundingRect := Rect(EllipseX1, EllipseY1, EllipseX2, EllipseY2);
573 NewObj.StartPoint := Point(StartX, StartY);
574 NewObj.EndPoint := Point(EndX, EndY);
575 Objects.Add(NewObj);
576end;
577
578procedure TMetaCanvas.SetSize(Size: TPoint);
579begin
580 FSize := Size;
581end;
582
583procedure TMetaCanvas.Reset;
584begin
585 Objects.Count := 0;
586end;
587
588procedure TMetaCanvas.DrawTo(Canvas: TCanvas);
589var
590 I: Integer;
591begin
592 for I := 0 to Objects.Count - 1 do
593 TCanvasObject(Objects[I]).Paint(Canvas);
594end;
595
596procedure TMetaCanvas.Zoom(Factor: Double);
597var
598 I: Integer;
599begin
600 for I := 0 to Objects.Count - 1 do
601 TCanvasObject(Objects[I]).Zoom(Factor);
602end;
603
604procedure TMetaCanvas.Move(Delta: TPoint);
605var
606 I: Integer;
607begin
608 for I := 0 to Objects.Count - 1 do
609 TCanvasObject(Objects[I]).Move(Delta);
610end;
611
612constructor TMetaCanvas.Create;
613begin
614 inherited;
615 FPenPos := Point(0, 0);
616 Objects := TObjectList.Create;
617end;
618
619destructor TMetaCanvas.Destroy;
620begin
621 Objects.Free;
622 inherited Destroy;
623end;
624
625end.
626
Note: See TracBrowser for help on using the repository browser.