No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 

378 líneas
16 KiB

  1. unit ultsRenderer;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. ultsTypes,
  7. utsTextSuite, utsUtils, utsRenderer, utsTypes;
  8. type
  9. TltsRendererCustomBeginRender = procedure(aArgs: Pointer); stdcall;
  10. TltsRendererCustomEndRender = procedure(aArgs: Pointer); stdcall;
  11. TltsRendererCustomGetDrawPos = function (aArgs: Pointer): TtsPosition; stdcall;
  12. TltsRendererCustomSetDrawPos = procedure(const aValue: TtsPosition; aArgs: Pointer); stdcall;
  13. TltsRendererCustomMoveDrawPos = procedure(const aOffset: TtsPosition; aArgs: Pointer); stdcall;
  14. TltsRendererCustomSetColor = procedure(const aValue: TtsColor4f; aArgs: Pointer); stdcall;
  15. TltsRendererCustomRender = procedure(const aRef: Pointer; const aForcedWidth: Integer; aArgs: Pointer); stdcall;
  16. TltsRendererCustomCreateRef = function (const aChar: TltsCharHandle; const aImage: TltsImageHandle; aArgs: Pointer): Pointer; stdcall;
  17. TltsRendererCustomFreeRef = procedure(const aRef: Pointer; aArgs: Pointer); stdcall;
  18. PltsRendererCustomData = ^TltsRendererCustomData;
  19. TltsRendererCustomData = packed record
  20. args: Pointer;
  21. BeginRender: TltsRendererCustomBeginRender;
  22. EndRender: TltsRendererCustomEndRender;
  23. GetDrawPos: TltsRendererCustomGetDrawPos;
  24. SetDrawPos: TltsRendererCustomSetDrawPos;
  25. MoveDrawPos: TltsRendererCustomMoveDrawPos;
  26. SetColor: TltsRendererCustomSetColor;
  27. Render: TltsRendererCustomRender;
  28. CreatRef: TltsRendererCustomCreateRef;
  29. FreeRef: TltsRendererCustomFreeRef;
  30. end;
  31. function ltsRendererCreate (const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
  32. function ltsRendererCustomCreate (const aHandle: TltsContextHandle; const aFormat: TtsFormat; const aData: PltsRendererCustomData): TltsRendererHandle; stdcall;
  33. function ltsRendererBeginBlock (const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
  34. function ltsRendererEndBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  35. function ltsRendererAbortBlock (const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  36. function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
  37. function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
  38. function ltsRendererDestroy (const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
  39. implementation
  40. uses
  41. ultsUtils;
  42. type
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. TltsRendererOpenGL = class(TtsRendererOpenGL)
  45. public
  46. procedure DelSlave(const aSlave: TtsRefManager); override;
  47. end;
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. TltsRendererOpenGLES = class(TtsRendererOpenGLES)
  50. public
  51. procedure DelSlave(const aSlave: TtsRefManager); override;
  52. end;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. TltsRendererCustom = class(TtsRenderer)
  55. { TtsBlockRenderer }
  56. protected
  57. procedure BeginRender; override;
  58. procedure EndRender; override;
  59. function GetDrawPos: TtsPosition; override;
  60. procedure SetDrawPos(const aValue: TtsPosition); override;
  61. procedure MoveDrawPos(const aOffset: TtsPosition); override;
  62. procedure SetColor(const aValue: TtsColor4f); override;
  63. procedure Render(const aRenderRef: TtsRenderRef; const aForcedWidth: Integer); override;
  64. { TtsRenderRefGenerator }
  65. public
  66. function CreateRenderRef(const aChar: TtsChar; const aImage: TtsImage): TtsRenderRef; override;
  67. procedure FreeRenderRef(const aRenderRef: TtsRenderRef); override;
  68. { TltsRendererCustom }
  69. private
  70. fData: TltsRendererCustomData;
  71. public
  72. constructor Create(const aContext: TtsContext; const aFormat: TtsFormat; const aData: TltsRendererCustomData);
  73. end;
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. //TltsRendererOpenGL////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. procedure TltsRendererOpenGL.DelSlave(const aSlave: TtsRefManager);
  78. begin
  79. DelReference(aSlave);
  80. inherited DelSlave(aSlave);
  81. end;
  82. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. //TltsRendererOpenGLES//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. procedure TltsRendererOpenGLES.DelSlave(const aSlave: TtsRefManager);
  86. begin
  87. DelReference(aSlave);
  88. inherited DelSlave(aSlave);
  89. end;
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. //TltsRendererCustom////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. function TltsRendererCustom.CreateRenderRef(const aChar: TtsChar; const aImage: TtsImage): TtsRenderRef;
  94. begin
  95. AddReference(ltsObjTypeChar, aChar);
  96. AddReference(ltsObjTypeImage, aImage);
  97. try
  98. if Assigned(fData.CreatRef)
  99. then result := fData.CreatRef(aChar, aImage, fData.args)
  100. else result := nil;
  101. finally
  102. DelReference(ltsObjTypeChar, aChar);
  103. DelReference(ltsObjTypeImage, aImage);
  104. end;
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. procedure TltsRendererCustom.FreeRenderRef(const aRenderRef: TtsRenderRef);
  108. begin
  109. if Assigned(fData.FreeRef) then
  110. fData.FreeRef(aRenderRef, fData.args);
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. procedure TltsRendererCustom.BeginRender;
  114. begin
  115. if Assigned(fData.BeginRender) then
  116. fData.BeginRender(fData.args);
  117. end;
  118. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. procedure TltsRendererCustom.EndRender;
  120. begin
  121. if Assigned(fData.BeginRender) then
  122. fData.BeginRender(fData.args);
  123. end;
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. function TltsRendererCustom.GetDrawPos: TtsPosition;
  126. begin
  127. if Assigned(fData.BeginRender)
  128. then result := fData.GetDrawPos(fData.args)
  129. else result := tsPosition(0, 0);
  130. end;
  131. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. procedure TltsRendererCustom.SetDrawPos(const aValue: TtsPosition);
  133. begin
  134. if Assigned(fData.BeginRender) then
  135. fData.SetDrawPos(aValue, fData.args);
  136. end;
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. procedure TltsRendererCustom.MoveDrawPos(const aOffset: TtsPosition);
  139. begin
  140. if Assigned(fData.BeginRender) then
  141. fData.MoveDrawPos(aOffset, fData.args);
  142. end;
  143. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  144. procedure TltsRendererCustom.SetColor(const aValue: TtsColor4f);
  145. begin
  146. if Assigned(fData.BeginRender) then
  147. fData.SetColor(aValue, fData.args);
  148. end;
  149. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  150. procedure TltsRendererCustom.Render(const aRenderRef: TtsRenderRef; const aForcedWidth: Integer);
  151. begin
  152. if Assigned(fData.BeginRender) then
  153. fData.Render(aRenderRef, aForcedWidth, fData.args);
  154. end;
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. constructor TltsRendererCustom.Create(const aContext: TtsContext; const aFormat: TtsFormat; const aData: TltsRendererCustomData);
  157. begin
  158. inherited Create(aContext, aFormat);
  159. fData := aData;
  160. end;
  161. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. //Renderer//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  164. function ltsRendererCreate(const aHandle: TltsContextHandle; const aType: TltsRendererType; const aFormat: TtsFormat): TltsRendererHandle; stdcall;
  165. var
  166. c: TtsContext;
  167. r: TtsRenderer;
  168. begin
  169. try
  170. result := nil;
  171. if not CheckContextHandle(aHandle, c) then
  172. exit;
  173. if not ValidateFormat(aFormat) then begin
  174. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid format', [aFormat]));
  175. exit;
  176. end;
  177. case aType of
  178. ltsRendererOpenGL: r := TltsRendererOpenGL.Create(c, aFormat);
  179. ltsRendererOpenGLES: r := TltsRendererOpenGLES.Create(c, aFormat);
  180. else
  181. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid renderer type', [aType]));
  182. exit;
  183. end;
  184. AddReference(ltsObjTypeRenderer, r);
  185. result := r;
  186. except
  187. on ex: Exception do begin
  188. SetLastError(ex);
  189. result := nil;
  190. end;
  191. end;
  192. end;
  193. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  194. function ltsRendererCustomCreate(const aHandle: TltsContextHandle; const aFormat: TtsFormat; const aData: PltsRendererCustomData): TltsRendererHandle; stdcall;
  195. var
  196. c: TtsContext;
  197. r: TtsRenderer;
  198. begin
  199. try
  200. result := nil;
  201. if not CheckContextHandle(aHandle, c) then
  202. exit;
  203. if not Assigned(aData) then begin
  204. SetLastError(ltsErrInvalidValue, Format('prameter ''aData'' is not assigned', [aFormat]));
  205. exit;
  206. end;
  207. if not ValidateFormat(aFormat) then begin
  208. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid format', [aFormat]));
  209. exit;
  210. end;
  211. r := TltsRendererCustom.Create(c, aFormat, aData^);
  212. AddReference(ltsObjTypeRenderer, r);
  213. result := r;
  214. except
  215. on ex: Exception do begin
  216. SetLastError(ex);
  217. result := nil;
  218. end;
  219. end;
  220. end;
  221. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  222. function ltsRendererBeginBlock(const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
  223. var
  224. r: TtsRenderer;
  225. b: TtsTextBlock;
  226. begin
  227. try
  228. result := nil;
  229. if CheckRendererHandle(aHandle, r) then begin
  230. b := r.BeginBlock(aTop, aLeft, aWidth, aHeight, aFlags);
  231. AddReference(ltsObjTypeTextBlock, b);
  232. result := b;
  233. end;
  234. except
  235. on ex: Exception do begin
  236. SetLastError(ex);
  237. result := nil;
  238. end;
  239. end;
  240. end;
  241. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  242. function ltsRendererEndBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  243. var
  244. r: TtsRenderer;
  245. b: TtsTextBlock;
  246. begin
  247. try
  248. result := ltsErrNone;
  249. if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
  250. DelReference(ltsObjTypeTextBlock, b);
  251. r.EndBlock(b);
  252. end else
  253. result := LastErrorCode;
  254. except
  255. on ex: Exception do begin
  256. SetLastError(ex);
  257. result := LastErrorCode;
  258. end;
  259. end;
  260. end;
  261. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262. function ltsRendererAbortBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  263. var
  264. r: TtsRenderer;
  265. b: TtsTextBlock;
  266. begin
  267. try
  268. result := ltsErrNone;
  269. if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
  270. DelReference(ltsObjTypeTextBlock, b);
  271. r.AbortBlock(b);
  272. end else
  273. result := LastErrorCode;
  274. except
  275. on ex: Exception do begin
  276. SetLastError(ex);
  277. result := LastErrorCode;
  278. end;
  279. end;
  280. end;
  281. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  282. function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
  283. var
  284. r: TtsRenderer;
  285. f: TtsFont;
  286. begin
  287. try
  288. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  289. then result := r.GetTextWidthA(f, aText)
  290. else result := -1;
  291. except
  292. on ex: Exception do begin
  293. SetLastError(ex);
  294. result := -1;
  295. end;
  296. end;
  297. end;
  298. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  299. function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
  300. var
  301. r: TtsRenderer;
  302. f: TtsFont;
  303. begin
  304. try
  305. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  306. then result := r.GetTextWidthW(f, aText)
  307. else result := -1;
  308. except
  309. on ex: Exception do begin
  310. SetLastError(ex);
  311. result := -1;
  312. end;
  313. end;
  314. end;
  315. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  316. function ltsRendererDestroy(const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
  317. var
  318. r: TtsRenderer;
  319. begin
  320. try
  321. result := ltsErrNone;
  322. if CheckRendererHandle(aHandle, r) then begin
  323. DelReference(ltsObjTypeRenderer, r);
  324. FreeAndNil(r);
  325. end else
  326. result := LastErrorCode;
  327. except
  328. on ex: Exception do begin
  329. SetLastError(ex);
  330. result := LastErrorCode;
  331. end;
  332. end;
  333. end;
  334. end.