您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

143 行
4.0 KiB

  1. unit uMainForm;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  5. uglcContext,
  6. utsTextSuite, utsRendererOpenGL, utsFontCreatorGDI, utsTypes, utsPostProcess;
  7. type
  8. TMainForm = class(TForm)
  9. procedure FormCreate(Sender: TObject);
  10. procedure FormDestroy(Sender: TObject);
  11. procedure FormPaint(Sender: TObject);
  12. private
  13. fContext: TglcContext;
  14. ftsContext: TtsContext;
  15. ftsRenderer: TtsRendererOpenGL;
  16. ftsCreator1: TtsFontGeneratorGDI;
  17. ftsCreator2: TtsFontGeneratorGDI;
  18. ftsFont1: TtsFont;
  19. ftsFont2: TtsFont;
  20. procedure Render;
  21. public
  22. { Public declarations }
  23. end;
  24. var
  25. MainForm: TMainForm;
  26. implementation
  27. {$R *.dfm}
  28. uses
  29. dglOpenGL;
  30. const
  31. 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.';
  32. procedure TMainForm.FormCreate(Sender: TObject);
  33. var
  34. pf: TglcContextPixelFormatSettings;
  35. pp: TtsPostProcessStep;
  36. img: TtsImage;
  37. const
  38. PATTER_DATA: array[0..15] of Byte = (
  39. $FF, $BF, $7F, $BF,
  40. $BF, $FF, $BF, $7F,
  41. $7F, $BF, $FF, $BF,
  42. $BF, $7F, $BF, $FF);
  43. begin
  44. pf := TglcContext.MakePF();
  45. fContext := TglcContext.GetPlatformClass.Create(self, pf);
  46. fContext.BuildContext;
  47. ftsContext := TtsContext.Create;
  48. ftsRenderer := TtsRendererOpenGL.Create(ftsContext, tsFormatRGBA8);
  49. ftsCreator1 := TtsFontGeneratorGDI.Create(ftsContext);
  50. ftsFont1 := ftsCreator1.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [], tsAANormal);
  51. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  52. pp.AddUsageChars(tsUsageExclude, 'Lorem');
  53. ftsCreator1.AddPostProcessStep(pp);
  54. pp := TtsPostProcessFillColor.Create(tsColor4f(1.0, 0.0, 0.0, 1.0), TS_MODES_MODULATE_ALL, TS_CHANNELS_RGB);
  55. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  56. ftsCreator1.AddPostProcessStep(pp);
  57. img := TtsImage.Create;
  58. img.CreateEmpty(tsFormatAlpha8, 4, 4);
  59. Move(PATTER_DATA[0], img.Data^, 16);
  60. pp := TtsPostProcessFillPattern.Create(img, true, 0, 0, TS_MODES_MODULATE_ALL, TS_CHANNELS_RGBA);
  61. pp.AddUsageChars(tsUsageInclude, 'Lorem');
  62. ftsCreator1.AddPostProcessStep(pp);
  63. ftsCreator2 := TtsFontGeneratorGDI.Create(ftsContext);
  64. ftsFont2 := ftsCreator2.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', ftsRenderer, 40, [tsStyleStrikeout], tsAANormal);
  65. pp := TtsPostProcessFillColor.Create(tsColor4f(0, 0, 0.5, 1), TS_MODES_REPLACE_ALL, TS_CHANNELS_RGB);
  66. pp.AddUsageChars(tsUsageExclude, 'e');
  67. ftsCreator2.AddPostProcessStep(pp);
  68. pp := TtsPostProcessBorder.Create(3.0, 0.5, tsColor4f(0.0, 0.5, 0.0, 1.0), true);
  69. pp.AddUsageChars(tsUsageInclude, 'e');
  70. ftsCreator2.AddPostProcessStep(pp);
  71. end;
  72. procedure TMainForm.FormDestroy(Sender: TObject);
  73. begin
  74. FreeAndNil(ftsFont2);
  75. FreeAndNil(ftsCreator2);
  76. FreeAndNil(ftsFont1);
  77. FreeAndNil(ftsCreator1);
  78. FreeAndNil(ftsRenderer);
  79. FreeAndNil(ftsContext);
  80. FreeAndNil(fContext);
  81. end;
  82. procedure TMainForm.FormPaint(Sender: TObject);
  83. begin
  84. if Assigned(fContext) then begin
  85. Render;
  86. fContext.SwapBuffers;
  87. end;
  88. end;
  89. procedure TMainForm.Render;
  90. var
  91. block: TtsTextBlock;
  92. begin
  93. glClearColor(1, 1, 1, 1);
  94. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  95. glViewport(0, 0, ClientWidth, ClientHeight);
  96. glMatrixMode(GL_PROJECTION);
  97. glLoadIdentity;
  98. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  99. glMatrixMode(GL_MODELVIEW);
  100. glLoadIdentity;
  101. glEnable(GL_BLEND);
  102. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  103. block := ftsRenderer.BeginBlock(10, 10, ClientWidth-20, ClientHeight-20, [tsBlockFlagWordWrap]);
  104. try
  105. block.HorzAlign := tsHorzAlignJustify;
  106. block.ChangeFont(ftsFont1);
  107. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  108. block.TextOutW(TEST_TEXT + sLineBreak);
  109. block.ChangeFont(ftsFont2);
  110. block.TextOutW(TEST_TEXT);
  111. finally
  112. ftsRenderer.EndBlock(block);
  113. end;
  114. end;
  115. end.