Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

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