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.

152 lines
4.4 KiB

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