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.

180 lignes
5.2 KiB

  1. unit uMainForm;
  2. {$mode objfpc}{$H+}
  3. {.$DEFINE USE_OLD_TS}
  4. interface
  5. uses
  6. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, uglcContext, uglcTypes,
  7. utsTextSuite, utsTypes, utsFontCreatorGDI, utsRendererOpenGL, utsPostProcess, utsFontCreatorFreeType;
  8. type
  9. TMainForm = class(TForm)
  10. ApplicationProperties: TApplicationProperties;
  11. procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
  12. procedure FormCreate(Sender: TObject);
  13. procedure FormDestroy(Sender: TObject);
  14. procedure FormPaint(Sender: TObject);
  15. private
  16. fFrameTime: QWord;
  17. fFrameCount: Integer;
  18. fSecTime: QWord;
  19. fContext: TglcContext;
  20. {$IFDEF USE_OLD_TS}
  21. ftsContext: tsContextID;
  22. ftsFont: tsFontID;
  23. {$ELSE}
  24. ftsContext: TtsContext;
  25. ftsRenderer: TtsRendererOpenGL;
  26. ftsGenerator: TtsFontGeneratorGDI;
  27. ftsFreeType: TtsFontGeneratorFreeType;
  28. ftsFont1: TtsFont;
  29. ftsFont2: TtsFont;
  30. ftsFont3: TtsFont;
  31. {$ENDIF}
  32. procedure Render;
  33. public
  34. { public declarations }
  35. end;
  36. var
  37. MainForm: TMainForm;
  38. implementation
  39. {$R *.lfm}
  40. uses
  41. dglOpenGL;
  42. const
  43. TEST_STRING = '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. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 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. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.';
  44. procedure TMainForm.FormCreate(Sender: TObject);
  45. var
  46. pf: TglcContextPixelFormatSettings;
  47. pp: TtsPostProcessStep;
  48. begin
  49. pf := TglcContext.MakePF();
  50. fContext := TglcContext.GetPlatformClass.Create(self, pf);
  51. fContext.BuildContext;
  52. {$IFDEF USE_OLD_TS}
  53. tsInit(TS_INIT_TEXTSUITE or TS_INIT_OPENGL or TS_INIT_GDI);
  54. tsContextCreate(@ftsContext);
  55. tsSetParameteri(TS_RENDERER, TS_RENDERER_OPENGL);
  56. tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI_FACENAME);
  57. tsContextBind(ftsContext);
  58. tsFontCreateCreatorA('Calibri', 25, 0, TS_ANTIALIASING_NORMAL, TS_DEFAULT, @ftsFont);
  59. tsFontBind(ftsFont);
  60. {$ELSE}
  61. ftsContext := TtsContext.Create;
  62. ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatRGBA8);
  63. ftsGenerator := TtsFontGeneratorGDI.Create(ftsContext);
  64. ftsFreeType := TtsFontGeneratorFreeType.Create(ftsContext);
  65. {
  66. pp := TtsPostProcessFillColor.Create(tsColor4f(0.0, 0.0, 0.0, 1.0), TS_MODES_MODULATE_ALPHA, TS_CHANNELS_RGBA);
  67. pp.AddUsageRange(tsUsageInclude, #$0000, #$FFFF);
  68. ftsGenerator.AddPostProcessStep(pp);
  69. pp := TtsPostProcessShadow.Create(3, 0, 2, 2, tsColor4f(1.0, 0.0, 1.0, 0.05));
  70. pp.AddUsageRange(tsUsageInclude, #$0000, #$FFFF);
  71. ftsGenerator.AddPostProcessStep(pp);
  72. }
  73. try
  74. ftsFont1 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 35, [tsStyleUnderline, tsStyleStrikeout], tsAANormal);
  75. ftsFont2 := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 20, [], tsAANormal);
  76. ftsFont3 := ftsFreeType.GetFontByFile('calibri.ttf', ftsRenderer, 35, [tsStyleUnderline, tsStyleStrikeout], tsAANormal);
  77. except
  78. on e: EtsException do
  79. MessageDlg('Error', e.Message, mtError, [mbOK], 0);
  80. end;
  81. {$ENDIF}
  82. end;
  83. procedure TMainForm.FormDestroy(Sender: TObject);
  84. begin
  85. {$IFDEF USE_OLD_TS}
  86. tsFontDestroy(ftsFont);
  87. tsContextDestroy(ftsContext);
  88. {$ELSE}
  89. FreeAndNil(ftsFont1);
  90. FreeAndNil(ftsFont2);
  91. FreeAndNil(ftsGenerator);
  92. FreeAndNil(ftsFreeType);
  93. FreeAndNil(ftsRenderer);
  94. FreeAndNil(ftsContext);
  95. {$ENDIF}
  96. end;
  97. procedure TMainForm.FormPaint(Sender: TObject);
  98. begin
  99. Render;
  100. end;
  101. procedure TMainForm.Render;
  102. var
  103. block: TtsTextBlock;
  104. t: QWord;
  105. dif: Integer;
  106. begin
  107. t := GetTickCount64;
  108. if (fFrameTime <> 0) then begin
  109. dif := t - fFrameTime;
  110. inc(fFrameCount, 1);
  111. inc(fSecTime, dif);
  112. if (fSecTime > 1000) then begin
  113. Caption := IntToStr(fFrameCount) + ' FPS';
  114. fFrameCount := 0;
  115. dec(fSecTime, 1000);
  116. end;
  117. end;
  118. fFrameTime := t;
  119. glViewport(0, 0, ClientWidth, ClientHeight);
  120. glClearColor(0, 0, 0, 0);
  121. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  122. glMatrixMode(GL_PROJECTION);
  123. glLoadIdentity;
  124. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  125. glMatrixMode(GL_MODELVIEW);
  126. glLoadIdentity;
  127. glEnable(GL_BLEND);
  128. glcBlendFunc(TglcBlendMode.bmAlphaBlend);
  129. {$IFDEF USE_OLD_TS}
  130. tsTextBeginBlock(0, 0, ClientWidth, ClientHeight, TS_ALIGN_BLOCK);
  131. tsTextOutA(TEST_STRING);
  132. tsTextEndBlock;
  133. {$ELSE}
  134. block := ftsRenderer.BeginBlock(0, 0, ClientWidth, ClientHeight, [tsBlockFlagWordWrap]);
  135. try
  136. //block.HorzAlign := tsHorzAlignJustify;
  137. block.ChangeFont(ftsFont1);
  138. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  139. block.TextOutA(TEST_STRING + sLineBreak + sLineBreak);
  140. block.ChangeFont(ftsFont3);
  141. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  142. block.TextOutA(TEST_STRING);
  143. finally
  144. ftsRenderer.EndBlock(block);
  145. end;
  146. {$ENDIF}
  147. fContext.SwapBuffers;
  148. end;
  149. procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
  150. begin
  151. Render;
  152. Done := false;
  153. end;
  154. end.