Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

400 wiersze
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, 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(const aHandle: TltsContextHandle; const aType: TltsRendererType; const 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(const aHandle: TltsContextHandle; const aFormat: TtsFormat; const aData: PltsRendererCustomData): 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 Assigned(aData) then begin
  224. SetLastError(ltsErrInvalidValue, Format('prameter ''aData'' is not assigned', [aFormat]));
  225. exit;
  226. end;
  227. if not ValidateFormat(aFormat) then begin
  228. SetLastError(ltsErrInvalidEnum, Format('%d is not a valid format', [aFormat]));
  229. exit;
  230. end;
  231. r := TltsRendererCustom.Create(c, aFormat, aData^);
  232. AddReference(ltsObjTypeRenderer, r);
  233. result := r;
  234. except
  235. on ex: Exception do begin
  236. SetLastError(ex);
  237. result := nil;
  238. end;
  239. end;
  240. end;
  241. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  242. function ltsRendererBeginBlock(const aHandle: TltsRendererHandle; const aTop, aLeft, aWidth, aHeight: Integer; const aFlags: TtsBlockFlags): TltsTextBlockHandle; stdcall;
  243. var
  244. r: TtsRenderer;
  245. b: TtsTextBlock;
  246. begin
  247. try
  248. result := nil;
  249. if CheckRendererHandle(aHandle, r) then begin
  250. b := r.BeginBlock(aTop, aLeft, aWidth, aHeight, aFlags);
  251. AddReference(ltsObjTypeTextBlock, b);
  252. result := b;
  253. end;
  254. except
  255. on ex: Exception do begin
  256. SetLastError(ex);
  257. result := nil;
  258. end;
  259. end;
  260. end;
  261. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262. function ltsRendererEndBlock(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.EndBlock(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 ltsRendererAbortBlock(const aHandle: TltsRendererHandle; const aBlock: TltsTextBlockHandle): TltsErrorCode; stdcall;
  283. var
  284. r: TtsRenderer;
  285. b: TtsTextBlock;
  286. begin
  287. try
  288. result := ltsErrNone;
  289. if CheckRendererHandle(aHandle, r) and CheckTextBlockHandle(aBlock, b) then begin
  290. DelReference(ltsObjTypeTextBlock, b);
  291. r.AbortBlock(b);
  292. end else
  293. result := LastErrorCode;
  294. except
  295. on ex: Exception do begin
  296. SetLastError(ex);
  297. result := LastErrorCode;
  298. end;
  299. end;
  300. end;
  301. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  302. function ltsRendererGetTextWidthA(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PAnsiChar): Integer; stdcall;
  303. var
  304. r: TtsRenderer;
  305. f: TtsFont;
  306. begin
  307. try
  308. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  309. then result := r.GetTextWidthA(f, aText)
  310. else result := -1;
  311. except
  312. on ex: Exception do begin
  313. SetLastError(ex);
  314. result := -1;
  315. end;
  316. end;
  317. end;
  318. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  319. function ltsRendererGetTextWidthW(const aHandle: TltsRendererHandle; const aFont: TltsFontHandle; const aText: PWideChar): Integer; stdcall;
  320. var
  321. r: TtsRenderer;
  322. f: TtsFont;
  323. begin
  324. try
  325. if CheckRendererHandle(aHandle, r) and CheckFontHandle(aFont, f)
  326. then result := r.GetTextWidthW(f, aText)
  327. else result := -1;
  328. except
  329. on ex: Exception do begin
  330. SetLastError(ex);
  331. result := -1;
  332. end;
  333. end;
  334. end;
  335. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336. function ltsRendererDestroy(const aHandle: TltsRendererHandle): TltsErrorCode; stdcall;
  337. var
  338. r: TtsRenderer;
  339. begin
  340. try
  341. result := ltsErrNone;
  342. if CheckRendererHandle(aHandle, r) then begin
  343. DelReference(ltsObjTypeRenderer, r);
  344. FreeAndNil(r);
  345. end else
  346. result := LastErrorCode;
  347. except
  348. on ex: Exception do begin
  349. SetLastError(ex);
  350. result := LastErrorCode;
  351. end;
  352. end;
  353. end;
  354. end.