You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.0 KiB

  1. unit uMainForm;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  5. uglcContext,
  6. utsTextSuite, utsRendererOpenGL, utsFontCreatorGDI, utsTypes, utsPostProcess;
  7. type
  8. TMainForm = class(TForm)
  9. procedure FormCreate(Sender: TObject);
  10. procedure FormDestroy(Sender: TObject);
  11. procedure FormPaint(Sender: TObject);
  12. private
  13. fContext: TglcContext;
  14. ftsContext: TtsContext;
  15. ftsRenderer: TtsRendererOpenGL;
  16. ftsCreator1: TtsFontGeneratorGDI;
  17. ftsCreator2: TtsFontGeneratorGDI;
  18. ftsFont1: TtsFont;
  19. ftsFont2: TtsFont;
  20. procedure Render;
  21. public
  22. { Public declarations }
  23. end;
  24. var
  25. MainForm: TMainForm;
  26. implementation
  27. {$R *.dfm}
  28. uses
  29. dglOpenGL;
  30. const
  31. 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.';
  32. procedure TMainForm.FormCreate(Sender: TObject);
  33. var
  34. pf: TglcContextPixelFormatSettings;
  35. pp: TtsPostProcessStep;
  36. img: TtsImage;
  37. const
  38. PATTER_DATA: array[0..15] of Byte = (
  39. $FF, $BF, $7F, $BF,
  40. $BF, $FF, $BF, $7F,
  41. $7F, $BF, $FF, $BF,
  42. $BF, $7F, $BF, $FF);
  43. begin
  44. pf := TglcContext.MakePF();
  45. fContext := TglcContext.GetPlatformClass.Create(self, pf);
  46. fContext.BuildContext;
  47. ftsContext := TtsContext.Create;
  48. ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatRGBA8);
  49. ftsCreator1 := TtsFontGeneratorGDI.Create(ftsContext);
  50. ftsFont1 := ftsCreator1.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [], tsAANormal);
  51. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  52. pp.AddUsageChars(tsUsageExclude, 'Lorem');
  53. ftsCreator1.AddPostProcessStep(pp);
  54. pp := TtsPostProcessFillColor.Create(tsColor4f(1.0, 0.0, 0.0, 1.0), TS_MODES_MODULATE_ALL, TS_CHANNELS_RGB);
  55. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  56. ftsCreator1.AddPostProcessStep(pp);
  57. img := TtsImage.Create;
  58. img.CreateEmpty(tsFormatAlpha8, 4, 4);
  59. Move(PATTER_DATA[0], img.Data^, 16);
  60. pp := TtsPostProcessFillPattern.Create(img, true, 0, 0, TS_MODES_MODULATE_ALL, TS_CHANNELS_RGBA);
  61. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  62. ftsCreator1.AddPostProcessStep(pp);
  63. ftsCreator2 := TtsFontGeneratorGDI.Create(ftsContext);
  64. ftsFont2 := ftsCreator2.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [tsStyleStrikeout], tsAANormal);
  65. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0.5, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  66. pp.AddUsageChars(tsUsageExclude, 'e');
  67. ftsCreator2.AddPostProcessStep(pp);
  68. pp := TtsPostProcessBorder.Create(3.0, 0.5, tsColor4f(0.0, 0.5, 0.0, 1.0), true);
  69. pp.AddUsageChars(tsUsageInclude, 'e');
  70. ftsCreator2.AddPostProcessStep(pp);
  71. end;
  72. procedure TMainForm.FormDestroy(Sender: TObject);
  73. begin
  74. FreeAndNil(ftsFont2);
  75. FreeAndNil(ftsCreator2);
  76. FreeAndNil(ftsFont1);
  77. FreeAndNil(ftsCreator1);
  78. FreeAndNil(ftsRenderer);
  79. FreeAndNil(ftsContext);
  80. FreeAndNil(fContext);
  81. end;
  82. procedure TMainForm.FormPaint(Sender: TObject);
  83. begin
  84. if Assigned(fContext) then begin
  85. Render;
  86. fContext.SwapBuffers;
  87. end;
  88. end;
  89. procedure TMainForm.Render;
  90. var
  91. block: TtsTextBlock;
  92. begin
  93. glClearColor(1, 1, 1, 1);
  94. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  95. glViewport(0, 0, ClientWidth, ClientHeight);
  96. glMatrixMode(GL_PROJECTION);
  97. glLoadIdentity;
  98. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  99. glMatrixMode(GL_MODELVIEW);
  100. glLoadIdentity;
  101. glEnable(GL_BLEND);
  102. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  103. block := ftsRenderer.BeginBlock(10, 10, ClientWidth-20, ClientHeight-20, [tsBlockFlagWordWrap]);
  104. try
  105. block.HorzAlign := tsHorzAlignJustify;
  106. block.ChangeFont(ftsFont1);
  107. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  108. block.TextOutW(TEST_TEXT + sLineBreak);
  109. block.ChangeFont(ftsFont2);
  110. block.TextOutW(TEST_TEXT);
  111. finally
  112. ftsRenderer.EndBlock(block);
  113. end;
  114. end;
  115. end.