Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

155 wiersze
4.5 KiB

  1. unit uMainForm;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  6. uglcContext,
  7. utsTextSuite, utsUtils, utsConstants;
  8. type
  9. TMainForm = class(TForm)
  10. procedure FormCreate(Sender: TObject);
  11. procedure FormDestroy(Sender: TObject);
  12. procedure FormPaint(Sender: TObject);
  13. private
  14. fContext: TglcContext;
  15. ftsContext: TtsContext;
  16. ftsRenderer: TtsRendererOpenGL;
  17. ftsCreator: TtsFontCreatorGDI;
  18. ftsPostProcessor1: TtsPostProcessorList;
  19. ftsPostProcessor2: TtsPostProcessorList;
  20. ftsFont1: TtsFont;
  21. ftsFont2: TtsFont;
  22. procedure Render;
  23. public
  24. { public declarations }
  25. end;
  26. var
  27. MainForm: TMainForm;
  28. implementation
  29. {$R *.lfm}
  30. uses
  31. dglOpenGL;
  32. const
  33. TEST_TEXT = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.';
  34. procedure TMainForm.FormCreate(Sender: TObject);
  35. var
  36. pf: TglcContextPixelFormatSettings;
  37. pp: TtsPostProcessor;
  38. img: TtsImage;
  39. const
  40. PATTER_DATA: array[0..15] of Byte = (
  41. $FF, $BF, $7F, $BF,
  42. $BF, $FF, $BF, $7F,
  43. $7F, $BF, $FF, $BF,
  44. $BF, $7F, $BF, $FF);
  45. begin
  46. pf := TglcContext.MakePF();
  47. fContext := TglcContext.GetPlatformClass.Create(self, pf);
  48. fContext.BuildContext;
  49. ftsContext := TtsContext.Create;
  50. ftsRenderer := TtsRendererOpenGL.Create(ftsContext, TtsFormat.tsFormatRGBA8);
  51. // post processors
  52. ftsPostProcessor1 := TtsPostProcessorList.Create(ftsContext, true);
  53. ftsPostProcessor2 := TtsPostProcessorList.Create(ftsContext, true);
  54. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(0, 0, 0, 1), TS_IMAGE_MODES_REPLACE_ALL, TS_COLOR_CHANNELS_RGB);
  55. pp.AddChars(TtsCharRangeUsage.tsUsageExclude, 'Lorem');
  56. ftsPostProcessor1.Add(pp);
  57. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(1.0, 0.0, 0.0, 1.0), TS_IMAGE_MODES_MODULATE_ALL, TS_COLOR_CHANNELS_RGB);
  58. pp.AddChars(TtsCharRangeUsage.tsUsageInclude, 'Lorem');
  59. ftsPostProcessor1.Add(pp);
  60. img := TtsImage.Create(ftsContext);
  61. img.CreateEmpty(TtsFormat.tsFormatAlpha8, 4, 4);
  62. Move(PATTER_DATA[0], img.Data^, 16);
  63. pp := TtsPostProcessorFillPattern.Create(ftsContext, img, true, tsPosition(0, 0), TS_IMAGE_MODES_MODULATE_ALL, TS_COLOR_CHANNELS_RGBA);
  64. pp.AddChars(TtsCharRangeUsage.tsUsageInclude, 'Lorem');
  65. ftsPostProcessor2.Add(pp);
  66. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(0, 0, 0.5, 1), TS_IMAGE_MODES_REPLACE_ALL, TS_COLOR_CHANNELS_RGB);
  67. pp.AddChars(TtsCharRangeUsage.tsUsageExclude, 'e');
  68. ftsPostProcessor2.Add(pp);
  69. pp := TtsPostProcessorBorder.Create(ftsContext, 3.0, 0.5, tsColor4f(0.0, 0.5, 0.0, 1.0), true);
  70. pp.AddChars(TtsCharRangeUsage.tsUsageInclude, 'e');
  71. ftsPostProcessor2.Add(pp);
  72. // font creator and fonts
  73. ftsCreator := TtsFontCreatorGDI.Create(ftsContext);
  74. ftsFont1 := ftsCreator.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', 40, [], TtsAntiAliasing.tsAANormal);
  75. ftsFont1.PostProcessor := ftsPostProcessor1;
  76. ftsFont2 := ftsCreator.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', 40, [TtsFontStyle.tsStyleStrikeout], TtsAntiAliasing.tsAANormal);
  77. ftsFont2.PostProcessor := ftsPostProcessor2;
  78. end;
  79. procedure TMainForm.FormDestroy(Sender: TObject);
  80. begin
  81. FreeAndNil(ftsFont2);
  82. FreeAndNil(ftsFont1);
  83. FreeAndNil(ftsCreator);
  84. FreeAndNil(ftsPostProcessor2);
  85. FreeAndNil(ftsPostProcessor1);
  86. FreeAndNil(ftsRenderer);
  87. FreeAndNil(ftsContext);
  88. FreeAndNil(fContext);
  89. end;
  90. procedure TMainForm.FormPaint(Sender: TObject);
  91. begin
  92. if Assigned(fContext) then begin
  93. Render;
  94. fContext.SwapBuffers;
  95. end;
  96. end;
  97. procedure TMainForm.Render;
  98. var
  99. block: TtsTextBlock;
  100. begin
  101. glClearColor(1, 1, 1, 1);
  102. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  103. glViewport(0, 0, ClientWidth, ClientHeight);
  104. glMatrixMode(GL_PROJECTION);
  105. glLoadIdentity;
  106. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  107. glMatrixMode(GL_MODELVIEW);
  108. glLoadIdentity;
  109. glEnable(GL_BLEND);
  110. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  111. block := ftsRenderer.BeginBlock(10, 10, ClientWidth-20, ClientHeight-20, [TtsBlockFlag.tsBlockFlagWordWrap]);
  112. try
  113. block.HorzAlign := TtsHorzAlignment.tsHorzAlignJustify;
  114. block.ChangeFont(ftsFont1);
  115. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  116. block.TextOutW(TEST_TEXT + sLineBreak);
  117. block.ChangeFont(ftsFont2);
  118. block.TextOutW(TEST_TEXT);
  119. finally
  120. ftsRenderer.EndBlock(block);
  121. end;
  122. end;
  123. end.