25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

150 satır
4.0 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, TextSuite, uglcTypes,
  7. utsTextSuite, utsTypes, utsFontCreatorGDI, utsRendererOpenGL;
  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. ftsFont: TtsFont;
  28. {$ENDIF}
  29. procedure Render;
  30. public
  31. { public declarations }
  32. end;
  33. var
  34. MainForm: TMainForm;
  35. implementation
  36. {$R *.lfm}
  37. uses
  38. dglOpenGL;
  39. const
  40. 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.';
  41. procedure TMainForm.FormCreate(Sender: TObject);
  42. var
  43. pf: TglcContextPixelFormatSettings;
  44. begin
  45. pf := TglcContext.MakePF();
  46. fContext := TglcContext.GetPlatformClass.Create(self, pf);
  47. fContext.BuildContext;
  48. {$IFDEF USE_OLD_TS}
  49. tsInit(TS_INIT_TEXTSUITE or TS_INIT_OPENGL or TS_INIT_GDI);
  50. tsContextCreate(@ftsContext);
  51. tsSetParameteri(TS_RENDERER, TS_RENDERER_OPENGL);
  52. tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI_FACENAME);
  53. tsContextBind(ftsContext);
  54. tsFontCreateCreatorA('Calibri', 25, 0, TS_ANTIALIASING_NORMAL, TS_DEFAULT, @ftsFont);
  55. tsFontBind(ftsFont);
  56. {$ELSE}
  57. ftsContext := TtsContext.Create;
  58. ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatRGBA8);
  59. ftsGenerator := TtsFontGeneratorGDI.Create;
  60. ftsFont := ftsGenerator.GetFontByName('Calibri', ftsRenderer, 25, [], tsAANormal);
  61. ftsFont.LineSpacing := 0;
  62. {$ENDIF}
  63. end;
  64. procedure TMainForm.FormDestroy(Sender: TObject);
  65. begin
  66. {$IFDEF USE_OLD_TS}
  67. tsFontDestroy(ftsFont);
  68. tsContextDestroy(ftsContext);
  69. {$ELSE}
  70. FreeAndNil(ftsFont);
  71. FreeAndNil(ftsGenerator);
  72. FreeAndNil(ftsRenderer);
  73. FreeAndNil(ftsContext);
  74. {$ENDIF}
  75. end;
  76. procedure TMainForm.FormPaint(Sender: TObject);
  77. begin
  78. Render;
  79. end;
  80. procedure TMainForm.Render;
  81. var
  82. block: TtsTextBlock;
  83. t: QWord;
  84. dif: Integer;
  85. begin
  86. t := GetTickCount64;
  87. if (fFrameTime <> 0) then begin
  88. dif := t - fFrameTime;
  89. inc(fFrameCount, 1);
  90. inc(fSecTime, dif);
  91. if (fSecTime > 1000) then begin
  92. Caption := IntToStr(fFrameCount) + ' FPS';
  93. fFrameCount := 0;
  94. dec(fSecTime, 1000);
  95. end;
  96. end;
  97. fFrameTime := t;
  98. glViewport(0, 0, ClientWidth, ClientHeight);
  99. glClearColor(0, 0, 0, 0);
  100. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  101. glMatrixMode(GL_PROJECTION);
  102. glLoadIdentity;
  103. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  104. glMatrixMode(GL_MODELVIEW);
  105. glLoadIdentity;
  106. glEnable(GL_BLEND);
  107. glcBlendFunc(TglcBlendMode.bmAdditiveAlphaBlend);
  108. {$IFDEF USE_OLD_TS}
  109. tsTextBeginBlock(0, 0, ClientWidth, ClientHeight, TS_ALIGN_BLOCK);
  110. tsTextOutA(TEST_STRING);
  111. tsTextEndBlock;
  112. {$ELSE}
  113. block := ftsRenderer.BeginBlock(0, 0, ClientWidth, ClientHeight, [tsBlockFlagWordWrap]);
  114. try
  115. block.ChangeFont(ftsFont);
  116. block.TextOutW(TEST_STRING);
  117. finally
  118. ftsRenderer.EndBlock(block);
  119. end;
  120. {$ENDIF}
  121. fContext.SwapBuffers;
  122. end;
  123. procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
  124. begin
  125. Render;
  126. Done := false;
  127. end;
  128. end.