Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 

213 Zeilen
8.3 KiB

  1. unit ultsRenderer;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. ultsTypes,
  7. utsTextSuite, utsUtils;
  8. function ltsRendererCreate (const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
  9. function ltsRendererBeginBlock (const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
  10. function ltsRendererEndBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  11. function ltsRendererAbortBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  12. function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
  13. function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
  14. function ltsRendererDestroy (const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
  15. implementation
  16. uses
  17. ultsUtils;
  18. type
  19. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. TltsRendererOpenGL = class(TtsRendererOpenGL)
  21. public
  22. procedure DelSlave(const aSlave: TtsRefManager); override;
  23. end;
  24. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. TltsRendererOpenGLES = class(TtsRendererOpenGLES)
  26. public
  27. procedure DelSlave(const aSlave: TtsRefManager); override;
  28. end;
  29. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. //TltsRendererOpenGL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. procedure TltsRendererOpenGL.DelSlave(const aSlave: TtsRefManager);
  33. begin
  34. DelReference(aSlave);
  35. inherited DelSlave(aSlave);
  36. end;
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. //TltsRendererOpenGLES//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. procedure TltsRendererOpenGLES.DelSlave(const aSlave: TtsRefManager);
  41. begin
  42. DelReference(aSlave);
  43. inherited DelSlave(aSlave);
  44. end;
  45. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. //Renderer//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function ltsRendererCreate(const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
  49. var
  50. c: TtsContext;
  51. r: TtsRenderer;
  52. begin
  53. try
  54. result := nil;
  55. if not CheckContextHandle(aHandle, c) then
  56. exit;
  57. if not ValidateFormat(aFormat) then begin
  58. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid format', [aFormat]));
  59. exit;
  60. end;
  61. case aType of
  62. ltsRendererOpenGL: r := TltsRendererOpenGL.Create(c, aFormat);
  63. ltsRendererOpenGLES: r := TltsRendererOpenGLES.Create(c, aFormat);
  64. // TODO ltsRendererCustom: r := TltsRendererCustom.Create(c, aFormat);
  65. else
  66. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid renderer type', [aType]));
  67. exit;
  68. end;
  69. AddReference(ltsObjTypeRenderer, r);
  70. result := r;
  71. except
  72. on ex: Exception do begin
  73. SetLastError(ex);
  74. result := nil;
  75. end;
  76. end;
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. function ltsRendererBeginBlock(const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
  80. var
  81. r: TtsRenderer;
  82. b: TtsTextBlock;
  83. begin
  84. try
  85. result := nil;
  86. if CheckRendererHandle(aHandle, r) then begin
  87. b := r.BeginBlock(aTop, aLeft, aWidth, aHeight, aFlags);
  88. AddReference(ltsObjTypeTextBlock, b);
  89. result := b;
  90. end;
  91. except
  92. on ex: Exception do begin
  93. SetLastError(ex);
  94. result := nil;
  95. end;
  96. end;
  97. end;
  98. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. function ltsRendererEndBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  100. var
  101. r: TtsRenderer;
  102. b: TtsTextBlock;
  103. begin
  104. try
  105. result := ltsErrNone;
  106. if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
  107. DelReference(ltsObjTypeTextBlock, b);
  108. r.EndBlock(b);
  109. end else
  110. result := LastErrorCode;
  111. except
  112. on ex: Exception do begin
  113. SetLastError(ex);
  114. result := LastErrorCode;
  115. end;
  116. end;
  117. end;
  118. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. function ltsRendererAbortBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  120. var
  121. r: TtsRenderer;
  122. b: TtsTextBlock;
  123. begin
  124. try
  125. result := ltsErrNone;
  126. if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
  127. DelReference(ltsObjTypeTextBlock, b);
  128. r.AbortBlock(b);
  129. end else
  130. result := LastErrorCode;
  131. except
  132. on ex: Exception do begin
  133. SetLastError(ex);
  134. result := LastErrorCode;
  135. end;
  136. end;
  137. end;
  138. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139. function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
  140. var
  141. r: TtsRenderer;
  142. f: TtsFont;
  143. begin
  144. try
  145. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  146. then result := r.GetTextWidthA(f, aText)
  147. else result := -1;
  148. except
  149. on ex: Exception do begin
  150. SetLastError(ex);
  151. result := -1;
  152. end;
  153. end;
  154. end;
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
  157. var
  158. r: TtsRenderer;
  159. f: TtsFont;
  160. begin
  161. try
  162. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  163. then result := r.GetTextWidthW(f, aText)
  164. else result := -1;
  165. except
  166. on ex: Exception do begin
  167. SetLastError(ex);
  168. result := -1;
  169. end;
  170. end;
  171. end;
  172. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  173. function ltsRendererDestroy(const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
  174. var
  175. r: TtsRenderer;
  176. begin
  177. try
  178. result := ltsErrNone;
  179. if CheckRendererHandle(aHandle, r) then begin
  180. DelReference(ltsObjTypeRenderer, r);
  181. FreeAndNil(r);
  182. end else
  183. result := LastErrorCode;
  184. except
  185. on ex: Exception do begin
  186. SetLastError(ex);
  187. result := LastErrorCode;
  188. end;
  189. end;
  190. end;
  191. end.