Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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