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

152 行
4.4 KiB

  1. unit uMainForm;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  5. uglcContext,
  6. utsTextSuite, utsTypes, utsUtils, utsConstants, utsPostProcessor;
  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. ftsCreator: TtsFontCreatorGDI;
  17. ftsPostProcessList1: TtsPostProcessorList;
  18. ftsPostProcessList2: TtsPostProcessorList;
  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 *.dfm}
  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: TtsPostProcessor;
  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. // Post processors
  51. ftsPostProcessList1 := TtsPostProcessorList.Create(ftsContext, true);
  52. ftsPostProcessList2 := TtsPostProcessorList.Create(ftsContext, true);
  53. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(0, 0, 0, 1), TS_IMAGE_MODES_REPLACE_ALL, TS_COLOR_CHANNELS_RGB);
  54. pp.AddChars(tsUsageExclude, 'Lorem');
  55. ftsPostProcessList1.Add(pp);
  56. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(1.0, 0.0, 0.0, 1.0), TS_IMAGE_MODES_MODULATE_ALL, TS_COLOR_CHANNELS_RGB);
  57. pp.AddChars(tsUsageInclude, 'Lorem');
  58. ftsPostProcessList1.Add(pp);
  59. img := TtsImage.Create;
  60. img.CreateEmpty(tsFormatAlpha8, 4, 4);
  61. Move(PATTER_DATA[0], img.Data^, 16);
  62. pp := TtsPostProcessorFillPattern.Create(ftsContext, img, true, tsPosition(0, 0), TS_IMAGE_MODES_MODULATE_ALL, TS_COLOR_CHANNELS_RGBA);
  63. pp.AddChars(tsUsageInclude, 'Lorem');
  64. ftsPostProcessList2.Add(pp);
  65. pp := TtsPostProcessorFillColor.Create(ftsContext, tsColor4f(0, 0, 0.5, 1), TS_IMAGE_MODES_REPLACE_ALL, TS_COLOR_CHANNELS_RGB);
  66. pp.AddChars(tsUsageExclude, 'e');
  67. ftsPostProcessList2.Add(pp);
  68. pp := TtsPostProcessorBorder.Create(ftsContext, 3.0, 0.5, tsColor4f(0.0, 0.5, 0.0, 1.0), true);
  69. pp.AddChars(tsUsageInclude, 'e');
  70. ftsPostProcessList2.Add(pp);
  71. // font creator and fonts
  72. ftsCreator := TtsFontCreatorGDI.Create(ftsContext);
  73. ftsFont1 := ftsCreator.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', 40, [], tsAANormal);
  74. ftsFont1.PostProcessor := ftsPostProcessList1;
  75. ftsFont2 := ftsCreator.GetFontByFile(ExtractFilePath(Application.ExeName) + '../Prototype.ttf', 40, [tsStyleStrikeout], tsAANormal);
  76. ftsFont2.PostProcessor := ftsPostProcessList2;
  77. end;
  78. procedure TMainForm.FormDestroy(Sender: TObject);
  79. begin
  80. FreeAndNil(ftsFont2);
  81. FreeAndNil(ftsFont1);
  82. FreeAndNil(ftsCreator);
  83. FreeAndNil(ftsPostProcessList2);
  84. FreeAndNil(ftsPostProcessList1);
  85. FreeAndNil(ftsRenderer);
  86. FreeAndNil(ftsContext);
  87. FreeAndNil(fContext);
  88. end;
  89. procedure TMainForm.FormPaint(Sender: TObject);
  90. begin
  91. if Assigned(fContext) then begin
  92. Render;
  93. fContext.SwapBuffers;
  94. end;
  95. end;
  96. procedure TMainForm.Render;
  97. var
  98. block: TtsTextBlock;
  99. begin
  100. glClearColor(1, 1, 1, 1);
  101. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  102. glViewport(0, 0, ClientWidth, ClientHeight);
  103. glMatrixMode(GL_PROJECTION);
  104. glLoadIdentity;
  105. glOrtho(0, ClientWidth, ClientHeight, 0, -10, 10);
  106. glMatrixMode(GL_MODELVIEW);
  107. glLoadIdentity;
  108. glEnable(GL_BLEND);
  109. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  110. block := ftsRenderer.BeginBlock(10, 10, ClientWidth-20, ClientHeight-20, [tsBlockFlagWordWrap]);
  111. try
  112. block.HorzAlign := tsHorzAlignJustify;
  113. block.ChangeFont(ftsFont1);
  114. block.ChangeColor(tsColor4f(1.0, 1.0, 1.0, 1.0));
  115. block.TextOutW(TEST_TEXT + sLineBreak);
  116. block.ChangeFont(ftsFont2);
  117. block.TextOutW(TEST_TEXT);
  118. finally
  119. ftsRenderer.EndBlock(block);
  120. end;
  121. end;
  122. end.