Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

146 righe
4.0 KiB

  1. unit uMainForm;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  6. uglcContext,
  7. utsTextSuite, utsRendererOpenGL, utsFontCreatorGDI, utsTypes, utsPostProcess;
  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. ftsCreator1: TtsFontGeneratorGDI;
  18. ftsCreator2: TtsFontGeneratorGDI;
  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 *.lfm}
  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: TtsPostProcessStep;
  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. ftsCreator1 := TtsFontGeneratorGDI.Create(ftsContext);
  51. ftsFont1 := ftsCreator1.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [], tsAANormal);
  52. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  53. pp.AddUsageChars(tsUsageExclude, 'Lorem');
  54. ftsCreator1.AddPostProcessStep(pp);
  55. pp := TtsPostProcessFillColor.Create(tsColor4f(1.0, 0.0, 0.0, 1.0), TS_MODES_MODULATE_ALL, TS_CHANNELS_RGB);
  56. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  57. ftsCreator1.AddPostProcessStep(pp);
  58. img := TtsImage.Create;
  59. img.CreateEmpty(tsFormatAlpha8, 4, 4);
  60. Move(PATTER_DATA[0], img.Data^, 16);
  61. pp := TtsPostProcessFillPattern.Create(img, true, 0, 0, TS_MODES_MODULATE_ALL, TS_CHANNELS_RGBA);
  62. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  63. ftsCreator1.AddPostProcessStep(pp);
  64. ftsCreator2 := TtsFontGeneratorGDI.Create(ftsContext);
  65. ftsFont2 := ftsCreator2.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [tsStyleStrikeout], tsAANormal);
  66. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0.5, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  67. pp.AddUsageChars(tsUsageExclude, 'e');
  68. ftsCreator2.AddPostProcessStep(pp);
  69. pp := TtsPostProcessBorder.Create(3.0, 0.5, tsColor4f(0.0, 0.5, 0.0, 1.0), true);
  70. pp.AddUsageChars(tsUsageInclude, 'e');
  71. ftsCreator2.AddPostProcessStep(pp);
  72. end;
  73. procedure TMainForm.FormDestroy(Sender: TObject);
  74. begin
  75. FreeAndNil(ftsFont2);
  76. FreeAndNil(ftsCreator2);
  77. FreeAndNil(ftsFont1);
  78. FreeAndNil(ftsCreator1);
  79. FreeAndNil(ftsRenderer);
  80. FreeAndNil(ftsContext);
  81. FreeAndNil(fContext);
  82. end;
  83. procedure TMainForm.FormPaint(Sender: TObject);
  84. begin
  85. if Assigned(fContext) then begin
  86. Render;
  87. fContext.SwapBuffers;
  88. end;
  89. end;
  90. procedure TMainForm.Render;
  91. var
  92. block: TtsTextBlock;
  93. begin
  94. glClearColor(1, 1, 1, 1);
  95. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  96. glViewport(0, 0, ClientWidth, ClientHeight);
  97. glMatrixMode(GL_PROJECTION);
  98. glLoadIdentity;
  99. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  100. glMatrixMode(GL_MODELVIEW);
  101. glLoadIdentity;
  102. glEnable(GL_BLEND);
  103. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  104. block := ftsRenderer.BeginBlock(10, 10, ClientWidth-20, ClientHeight-20, [tsBlockFlagWordWrap]);
  105. try
  106. block.HorzAlign := tsHorzAlignJustify;
  107. block.ChangeFont(ftsFont1);
  108. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  109. block.TextOutW(TEST_TEXT + sLineBreak);
  110. block.ChangeFont(ftsFont2);
  111. block.TextOutW(TEST_TEXT);
  112. finally
  113. ftsRenderer.EndBlock(block);
  114. end;
  115. end;
  116. end.