Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

285 строки
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 (aHandle: TltsPostProcessorHandle; aUsage: TtsCharRangeUsage; aStart, aStop: WideChar): TltsErrorCode; stdcall;
  22. function ltsPostProcessorAddChars (aHandle: TltsPostProcessorHandle; aUsage: TtsCharRangeUsage; aChars: PWideChar): TltsErrorCode; stdcall;
  23. function ltsPostProcessorClearRanges (aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  24. function ltsPostProcessorExecute (aHandle: TltsPostProcessorHandle; aChar: TltsCharHandle; aImage: TltsImageHandle): TltsErrorCode; stdcall;
  25. function ltsPostProcessorFillColorCreate (aContext: TltsContextHandle; aColor: TtsColor4f;
  26. aModes: TtsImageModes; aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  27. function ltsPostProcessorFillPatterCreate (aContext: TltsContextHandle; aPattern: TltsImageHandle; aOwnsPatter: Boolean;
  28. aPosition: TtsPosition; aModes: TtsImageModes; aChannels: TtsColorChannels): TltsPostProcessorHandle; stdcall;
  29. function ltsPostProcessorBorderCreate (aContext: TltsContextHandle; aWidth, aStrength: Single;
  30. aColor: TtsColor4f; aKeepSize: Boolean): TltsPostProcessorHandle; stdcall;
  31. function ltsPostProcessorShadowCreate (aContext: TltsContextHandle; aRadius, aStrength: Single;
  32. aOffset: TtsPosition; aColor: TtsColor4f): TltsPostProcessorHandle; stdcall;
  33. function ltsPostProcessorCustomCreate (aContext: TltsContextHandle; constref aData: TltsPostProcessorCustomData): TltsPostProcessorHandle; stdcall;
  34. function ltsPostProcessorDestroy (aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  35. implementation
  36. uses
  37. ultsUtils;
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. //ltsPostProcessor//////////////////////////////////////////////////////////////////////////////////////////////////////
  40. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. function ltsPostProcessorAddRange(aHandle: TltsPostProcessorHandle; aUsage: TtsCharRangeUsage; 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(aHandle: TltsPostProcessorHandle; aUsage: TtsCharRangeUsage; 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(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(aHandle: TltsPostProcessorHandle; aChar: TltsCharHandle; 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(aContext: TltsContextHandle; aColor: TtsColor4f; aModes: TtsImageModes; 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(aContext: TltsContextHandle; aPattern: TltsImageHandle; aOwnsPatter: Boolean; aPosition: TtsPosition; aModes: TtsImageModes; 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(aContext: TltsContextHandle; aWidth, aStrength: Single; aColor: TtsColor4f; 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(aContext: TltsContextHandle; aRadius, aStrength: Single; aOffset: TtsPosition; 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(aContext: TltsContextHandle; constref aData: TltsPostProcessorCustomData): TltsPostProcessorHandle; stdcall;
  196. var
  197. c: TtsContext;
  198. pp: TtsPostProcessor;
  199. begin
  200. try
  201. result := nil;
  202. if CheckContextHandle(aContext, c) then begin
  203. pp := TltsPostProcessorCustom.Create(c, aData);
  204. AddReference(ltsObjTypePostProcessor, pp);
  205. result := pp;
  206. end;
  207. except
  208. on ex: Exception do begin
  209. SetLastError(ex);
  210. result := nil;
  211. end;
  212. end;
  213. end;
  214. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  215. function ltsPostProcessorDestroy(aHandle: TltsPostProcessorHandle): TltsErrorCode; stdcall;
  216. var
  217. pp: TtsPostProcessor;
  218. begin
  219. try
  220. result := ltsErrNone;
  221. if CheckPostProcessorHandle(aHandle, TtsPostProcessor, pp) then begin
  222. if (pp is TtsPostProcessorFillPattern) then with (pp as TtsPostProcessorFillPattern) do begin
  223. if OwnsPattern then
  224. DelReference(ltsObjTypeImage, Pattern);
  225. end;
  226. DelReference(ltsObjTypePostProcessor, pp);
  227. FreeAndNil(pp);
  228. end else
  229. result := LastErrorCode;
  230. except
  231. on ex: Exception do begin
  232. SetLastError(ex);
  233. result := LastErrorCode;
  234. end;
  235. end;
  236. end;
  237. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  238. //TltsPostProcessorCustom///////////////////////////////////////////////////////////////////////////////////////////////
  239. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. function TltsPostProcessorCustom.Execute(const aChar: TtsChar; const aImage: TtsImage): Boolean;
  241. begin
  242. result := inherited Execute(aChar, aImage);
  243. if result then begin
  244. AddReference(ltsObjTypeChar, aChar);
  245. AddReference(ltsObjTypeImage, aImage);
  246. try
  247. fData.execute(aChar, aImage, fData.args);
  248. finally
  249. DelReference(ltsObjTypeChar, aChar);
  250. DelReference(ltsObjTypeImage, aImage);
  251. end;
  252. end;
  253. end;
  254. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. constructor TltsPostProcessorCustom.Create(const aContext: TtsContext; const aData: TltsPostProcessorCustomData);
  256. begin
  257. inherited Create(aContext);
  258. fData := aData;
  259. end;
  260. end.