Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

155 rader
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.