Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 

287 righe
11 KiB

  1. unit ultsPostProcessor;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. ultsTypes, utsTextSuite;
  7. type
  8. TltsPostProcessorExecuteFunc = procedure(const aCharHandle: TltsCharHandle; const aImageHandle: TltsImageHandle; aArgs: Pointer); stdcall;
  9. PltsPostProcessorCustomData = ^TltsPostProcessorCustomData;
  10. TltsPostProcessorCustomData = packed record
  11. args: Pointer;
  12. execute: TltsPostProcessorExecuteFunc;
  13. end;
  14. TltsPostProcessorCustom = class(TtsPostProcessor)
  15. private
  16. fData: TltsPostProcessorCustomData;
  17. public
  18. function Execute(const aChar: TtsChar; const aImage: TtsImage): Boolean; override;
  19. constructor Create(const aContext: TtsContext; const aData: TltsPostProcessorCustomData);
  20. end;
  21. function ltsPostProcessorAddRange (const aHandle: TltsPostProcessorHandle; const aUsage: TtsCharRangeUsage; const aStart, aStop: WideChar): TltsErrorCode; stdcall;
  22. function ltsPostProcessorAddChars (const aHandle: TltsPostProcessorHandle; const aUsage: TtsCharRangeUsage; const aChars: PWideChar): TltsErrorCode; stdcall;
  23. function ltsPostProcessorClearRanges (const aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  24. function ltsPostProcessorExecute (const aHandle: TltsPostProcessorHandle; const aChar: TltsCharHandle; const aImage: TltsImageHandle): TltsErrorCode; stdcall;
  25. function ltsPostProcessorFillColorCreate (const aContext: TltsContextHandle; const aColor: TtsColor4f;
  26. const aModes: TtsImageModes; const aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  27. function ltsPostProcessorFillPatterCreate (const aContext: TltsContextHandle; const aPattern: TltsImageHandle; const aOwnsPatter: Boolean;
  28. const aPosition: TtsPosition; const aModes: TtsImageModes; const aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  29. function ltsPostProcessorBorderCreate (const aContext: TltsContextHandle; const aWidth, aStrength: Single;
  30. const aColor: TtsColor4f; const aKeepSize: Boolean): TltsPostProcessorHandle; stdcall;
  31. function ltsPostProcessorShadowCreate (const aContext: TltsContextHandle; const aRadius, aStrength: Single;
  32. const aOffset: TtsPosition; const aColor: TtsColor4f): TltsPostProcessorHandle; stdcall;
  33. function ltsPostProcessorCustomCreate (const aContext: TltsContextHandle; const aData: PltsPostProcessorCustomData): TltsPostProcessorHandle; stdcall;
  34. function ltsPostProcessorDestroy (const aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  35. implementation
  36. uses
  37. ultsUtils;
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. //ltsPostProcessor//////////////////////////////////////////////////////////////////////////////////////////////////////
  40. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. function ltsPostProcessorAddRange(const aHandle: TltsPostProcessorHandle; const aUsage: TtsCharRangeUsage; const aStart, aStop: WideChar): TltsErrorCode; stdcall;
  42. var
  43. pp: TtsPostProcessor;
  44. begin
  45. try
  46. result := ltsErrNone;
  47. if ValidateCharRangeUsage(aUsage) and CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp)
  48. then pp.AddRange(aUsage, aStart, aStop)
  49. else result := LastErrorCode;
  50. except
  51. on ex: Exception do begin
  52. SetLastError(ex);
  53. result := LastErrorCode;
  54. end;
  55. end;
  56. end;
  57. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. function ltsPostProcessorAddChars(const aHandle: TltsPostProcessorHandle; const aUsage: TtsCharRangeUsage; const aChars: PWideChar): TltsErrorCode; stdcall;
  59. var
  60. pp: TtsPostProcessor;
  61. begin
  62. try
  63. result := ltsErrNone;
  64. if ValidateCharRangeUsage(aUsage) and CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp)
  65. then pp.AddChars(aUsage, aChars)
  66. else result := LastErrorCode;
  67. except
  68. on ex: Exception do begin
  69. SetLastError(ex);
  70. result := LastErrorCode;
  71. end;
  72. end;
  73. end;
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. function ltsPostProcessorClearRanges(const aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  76. var
  77. pp: TtsPostProcessor;
  78. begin
  79. try
  80. result := ltsErrNone;
  81. if CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp)
  82. then pp.ClearRanges
  83. else result := LastErrorCode;
  84. except
  85. on ex: Exception do begin
  86. SetLastError(ex);
  87. result := LastErrorCode;
  88. end;
  89. end;
  90. end;
  91. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. function ltsPostProcessorExecute(const aHandle: TltsPostProcessorHandle; const aChar: TltsCharHandle; const aImage: TltsImageHandle): TltsErrorCode; stdcall;
  93. var
  94. pp: TtsPostProcessor;
  95. c: TtsChar;
  96. i: TtsImage;
  97. begin
  98. try
  99. result := ltsErrNone;
  100. if CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp) and
  101. CheckCharHandle(aChar, c) and
  102. CheckImageHandle(aImage, i)
  103. then pp.Execute(c, i)
  104. else result := LastErrorCode;
  105. except
  106. on ex: Exception do begin
  107. SetLastError(ex);
  108. result := LastErrorCode;
  109. end;
  110. end;
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. function ltsPostProcessorFillColorCreate(const aContext: TltsContextHandle; const aColor: TtsColor4f; const aModes: TtsImageModes; const aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  114. var
  115. c: TtsContext;
  116. pp: TtsPostProcessor;
  117. begin
  118. try
  119. result := nil;
  120. if CheckContextHandle(aContext, c) then begin
  121. pp := TtsPostProcessorFillColor.Create(c, aColor, aModes, aChannels);
  122. AddReference(ltsObjTypePostProcessor, pp);
  123. result := pp;
  124. end;
  125. except
  126. on ex: Exception do begin
  127. SetLastError(ex);
  128. result := nil;
  129. end;
  130. end;
  131. end;
  132. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. function ltsPostProcessorFillPatterCreate(const aContext: TltsContextHandle; const aPattern: TltsImageHandle; const aOwnsPatter: Boolean; const aPosition: TtsPosition; const aModes: TtsImageModes; const aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  134. var
  135. c: TtsContext;
  136. img: TtsImage;
  137. pp: TtsPostProcessor;
  138. begin
  139. try
  140. result := nil;
  141. img := nil;
  142. if CheckContextHandle(aContext, c) and CheckImageHandle(aPattern, img) then begin
  143. pp := TtsPostProcessorFillPattern.Create(c, img, aOwnsPatter, aPosition, aModes, aChannels);
  144. AddReference(ltsObjTypePostProcessor, pp);
  145. result := pp;
  146. end;
  147. except
  148. on ex: Exception do begin
  149. SetLastError(ex);
  150. result := nil;
  151. end;
  152. end;
  153. end;
  154. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  155. function ltsPostProcessorBorderCreate(const aContext: TltsContextHandle; const aWidth, aStrength: Single; const aColor: TtsColor4f; const aKeepSize: Boolean): TltsPostProcessorHandle; stdcall;
  156. var
  157. c: TtsContext;
  158. pp: TtsPostProcessor;
  159. begin
  160. try
  161. result := nil;
  162. if CheckContextHandle(aContext, c) then begin
  163. pp := TtsPostProcessorBorder.Create(c, aWidth, aStrength, aColor, aKeepSize);
  164. AddReference(ltsObjTypePostProcessor, pp);
  165. result := pp;
  166. end;
  167. except
  168. on ex: Exception do begin
  169. SetLastError(ex);
  170. result := nil;
  171. end;
  172. end;
  173. end;
  174. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. function ltsPostProcessorShadowCreate(const aContext: TltsContextHandle; const aRadius, aStrength: Single; const aOffset: TtsPosition; const aColor: TtsColor4f): TltsPostProcessorHandle; stdcall;
  176. var
  177. c: TtsContext;
  178. pp: TtsPostProcessor;
  179. begin
  180. try
  181. result := nil;
  182. if CheckContextHandle(aContext, c) then begin
  183. pp := TtsPostProcessorShadow.Create(c, aRadius, aStrength, aOffset, aColor);
  184. AddReference(ltsObjTypePostProcessor, pp);
  185. result := pp;
  186. end;
  187. except
  188. on ex: Exception do begin
  189. SetLastError(ex);
  190. result := nil;
  191. end;
  192. end;
  193. end;
  194. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  195. function ltsPostProcessorCustomCreate(const aContext: TltsContextHandle; const aData: PltsPostProcessorCustomData): TltsPostProcessorHandle; stdcall;
  196. var
  197. c: TtsContext;
  198. pp: TtsPostProcessor;
  199. begin
  200. try
  201. result := nil;
  202. if not Assigned(aData) then begin
  203. SetLastError(ltsErrInvalidValue, 'parameter ''aData'' is not assigned');
  204. end else if CheckContextHandle(aContext, c) then begin
  205. pp := TltsPostProcessorCustom.Create(c, aData^);
  206. AddReference(ltsObjTypePostProcessor, pp);
  207. result := pp;
  208. end;
  209. except
  210. on ex: Exception do begin
  211. SetLastError(ex);
  212. result := nil;
  213. end;
  214. end;
  215. end;
  216. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  217. function ltsPostProcessorDestroy(const aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  218. var
  219. pp: TtsPostProcessor;
  220. begin
  221. try
  222. result := ltsErrNone;
  223. if CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp) then begin
  224. if (pp is TtsPostProcessorFillPattern) then with (pp as TtsPostProcessorFillPattern) do begin
  225. if OwnsPattern then
  226. DelReference(ltsObjTypeImage, Pattern);
  227. end;
  228. DelReference(ltsObjTypePostProcessor, pp);
  229. FreeAndNil(pp);
  230. end else
  231. result := LastErrorCode;
  232. except
  233. on ex: Exception do begin
  234. SetLastError(ex);
  235. result := LastErrorCode;
  236. end;
  237. end;
  238. end;
  239. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. //TltsPostProcessorCustom///////////////////////////////////////////////////////////////////////////////////////////////
  241. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  242. function TltsPostProcessorCustom.Execute(const aChar: TtsChar; const aImage: TtsImage): Boolean;
  243. begin
  244. result := inherited Execute(aChar, aImage);
  245. if result then begin
  246. AddReference(ltsObjTypeChar, aChar);
  247. AddReference(ltsObjTypeImage, aImage);
  248. try
  249. fData.execute(aChar, aImage, fData.args);
  250. finally
  251. DelReference(ltsObjTypeChar, aChar);
  252. DelReference(ltsObjTypeImage, aImage);
  253. end;
  254. end;
  255. end;
  256. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  257. constructor TltsPostProcessorCustom.Create(const aContext: TtsContext; const aData: TltsPostProcessorCustomData);
  258. begin
  259. inherited Create(aContext);
  260. fData := aData;
  261. end;
  262. end.