fpcanvasalphadraw.pp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. {
  2. Sample program by Ondrey Pokorny to demonstrate drawing modes of the TFPCustomCanvas:
  3. - opaque
  4. - alphablend
  5. - custom blending, using a callback (not-used in this case)
  6. }
  7. program FPCanvasAlphaDraw;
  8. uses FPImage, FPImgCanv, FPCanvas, FPReadPNG, FPWritePNG, Classes, SysUtils, freetype, ftFont;
  9. const
  10. cImageName: array[TFPDrawingMode] of string = ('opaque', 'alphablend', 'not-used');
  11. var
  12. xNew, xImage: TFPMemoryImage;
  13. xCanvas: TFPImageCanvas;
  14. xDrawingMode: TFPDrawingMode;
  15. xRect: TRect;
  16. begin
  17. ftFont.InitEngine;
  18. xNew := nil;
  19. xCanvas := nil;
  20. xImage := nil;
  21. try
  22. xImage := TFPMemoryImage.Create(0, 0);
  23. xImage.LoadFromFile('edit-clear.png');
  24. for xDrawingMode := dmOpaque to dmAlphaBlend do
  25. begin
  26. xNew := TFPMemoryImage.Create(200, 200);
  27. xCanvas := TFPImageCanvas.Create(xNew);
  28. xCanvas.DrawingMode := xDrawingMode;
  29. xCanvas.Pen.Style := psClear;
  30. xCanvas.Brush.FPColor := colRed;
  31. xCanvas.FillRect(0, 0, xNew.Width, xNew.Height);
  32. // draw semi-transparent objects
  33. xCanvas.Brush.FPColor := FPColor($FFFF, $FFFF, $FFFF, $8000);
  34. xRect := Rect(0, 0, 50, 50);
  35. xCanvas.Ellipse(xRect);
  36. xRect.Offset(50, 0);
  37. xCanvas.Rectangle(xRect);
  38. xRect := Rect(0, 50, 50, 100);
  39. xCanvas.Pen.Style := psSolid;
  40. xCanvas.Pen.FPColor := FPColor($FFFF, $FFFF, $FFFF, $8000);
  41. xCanvas.Pen.Width := 4;
  42. xCanvas.Brush.Style := bsClear;
  43. xCanvas.Ellipse(xRect);
  44. xRect.Offset(50, 0);
  45. xCanvas.Rectangle(xRect);
  46. xRect.Offset(50, 0);
  47. xCanvas.Polyline([
  48. Point(xRect.CenterPoint.X, xRect.Top),
  49. Point(xRect.Right, xRect.CenterPoint.Y),
  50. Point(xRect.CenterPoint.X, xRect.Bottom),
  51. Point(xRect.Left, xRect.CenterPoint.Y),
  52. Point(xRect.CenterPoint.X, xRect.Top)]);
  53. xRect.Offset(50, 0);
  54. xCanvas.MoveTo(xRect.TopLeft);
  55. xCanvas.LineTo(xRect.Right, xRect.Top);
  56. xRect := Rect(0, 100, 50, 150);
  57. xCanvas.Draw(xRect.Left, xRect.Top, xImage);
  58. xRect.Offset(50, 0);
  59. xCanvas.StretchDraw(xRect.Left, xRect.Top, xRect.Width, xRect.Height, xImage);
  60. xRect := Rect(0, 150, 50, 200);
  61. xCanvas.Font:=TFreeTypeFont.Create;
  62. xCanvas.Font.FPColor := FPColor($FFFF, $FFFF, $FFFF, $8000);
  63. xCanvas.Font.Name := 'DejaVuLGCSans.ttf';
  64. xCanvas.Font.Size := 15;
  65. (xCanvas.Font as TFreeTypeFont).AntiAliased := True;
  66. xCanvas.TextOut(xRect.Left, xRect.CenterPoint.Y, 'Hello');
  67. xRect.Offset(100, 0);
  68. (xCanvas.Font as TFreeTypeFont).AntiAliased := False;
  69. xCanvas.TextOut(xRect.Left, xRect.CenterPoint.Y, 'Hello');
  70. xNew.SaveToFile(cImageName[xDrawingMode]+'.png');
  71. xCanvas.Font.Free;
  72. xCanvas.Font := nil;
  73. FreeAndNil(xNew);
  74. FreeAndNil(xCanvas);
  75. end;
  76. finally
  77. xCanvas.Free;
  78. xNew.Free;
  79. xImage.Free;
  80. end;
  81. end.