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.
 
 
 
 
 

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