fphandler.inc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 2003 by the Free Pascal development team
  5. TImageHandlers implementations
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. { TImageHandlersManager }
  13. constructor TImageHandlersManager.Create;
  14. begin
  15. inherited create;
  16. FData := Tlist.Create;
  17. end;
  18. destructor TImageHandlersManager.Destroy;
  19. var r : integer;
  20. begin
  21. for r := FData.count-1 downto 0 do
  22. TIHData(FData[r]).Free;
  23. FData.Free;
  24. inherited Destroy;
  25. end;
  26. function CalcDefExt (TheExtentions:string) : string;
  27. var p : integer;
  28. begin
  29. p := pos (';',TheExtentions);
  30. if p = 0 then
  31. result := TheExtentions
  32. else
  33. result := copy(TheExtentions, 1, p-1);
  34. end;
  35. procedure TImageHandlersManager.RegisterImageHandlers (const ATypeName,TheExtentions:string;
  36. AReader:TFPCustomImageReaderClass; AWriter:TFPCustomImageWriterClass);
  37. var ih : TIHData;
  38. begin
  39. ih := GetData (ATypeName);
  40. if assigned (ih) then
  41. FPImgError (StrTypeAlreadyExist,[ATypeName]);
  42. ih := TIHData.Create;
  43. with ih do
  44. begin
  45. FTypeName := ATypeName;
  46. FExtention := TheExtentions;
  47. FDefaultExt := CalcDefExt (TheExtentions);
  48. FReader := AReader;
  49. FWriter := AWriter;
  50. end;
  51. FData.Add (ih);
  52. end;
  53. procedure TImageHandlersManager.RegisterImageReader (const ATypeName,TheExtentions:string;
  54. AReader:TFPCustomImageReaderClass);
  55. var ih : TIHData;
  56. begin
  57. ih := GetData (ATypeName);
  58. if assigned (ih) then
  59. begin
  60. if assigned (ih.FReader) then
  61. FPImgError (StrTypeReaderAlreadyExist,[ATypeName])
  62. else
  63. ih.FReader := AReader;
  64. end
  65. else
  66. begin
  67. ih := TIHData.Create;
  68. with ih do
  69. begin
  70. FTypeName := ATypeName;
  71. FExtention := TheExtentions;
  72. FDefaultExt := CalcDefExt (TheExtentions);
  73. FReader := AReader;
  74. FWriter := nil;
  75. end;
  76. FData.Add (ih);
  77. end;
  78. end;
  79. procedure TImageHandlersManager.RegisterImageWriter (const ATypeName,TheExtentions:string;
  80. AWriter:TFPCustomImageWriterClass);
  81. var ih : TIHData;
  82. begin
  83. ih := GetData (ATypeName);
  84. if assigned (ih) then
  85. begin
  86. if assigned (ih.FWriter) then
  87. FPImgError (StrTypeWriterAlreadyExist,[ATypeName])
  88. else
  89. ih.FWriter := AWriter;
  90. end
  91. else
  92. begin
  93. ih := TIHData.Create;
  94. with ih do
  95. begin
  96. FTypeName := ATypeName;
  97. FExtention := TheExtentions;
  98. FDefaultExt := CalcDefExt (TheExtentions);
  99. FReader := nil;
  100. FWriter := AWriter;
  101. end;
  102. FData.Add (ih);
  103. end;
  104. end;
  105. function TImageHandlersManager.GetCount : integer;
  106. begin
  107. result := FData.Count;
  108. end;
  109. function TImageHandlersManager.GetData (const ATypeName:string) : TIHData;
  110. var r : integer;
  111. begin
  112. r := FData.count;
  113. repeat
  114. dec (r);
  115. until (r < 0) or (compareText (TIHData(FData[r]).FTypeName, ATypeName) = 0);
  116. if r >= 0 then
  117. result := TIHData(FData[r])
  118. else
  119. result := nil;
  120. end;
  121. function TImageHandlersManager.GetTypeName (index:integer) : string;
  122. var ih : TIHData;
  123. begin
  124. ih := TIHData (FData[index]);
  125. result := ih.FTypeName;
  126. end;
  127. function TImageHandlersManager.GetReader (const TypeName:string) : TFPCustomImageReaderClass;
  128. var ih : TIHData;
  129. begin
  130. ih := GetData (TypeName);
  131. if assigned(ih) then
  132. result := ih.FReader
  133. else
  134. result := nil;
  135. end;
  136. function TImageHandlersManager.GetWriter (const TypeName:string) : TFPCustomImageWriterClass;
  137. var ih : TIHData;
  138. begin
  139. ih := GetData (TypeName);
  140. if assigned(ih) then
  141. result := ih.FWriter
  142. else
  143. result := nil;
  144. end;
  145. function TImageHandlersManager.GetExt (const TypeName:string) : string;
  146. var ih : TIHData;
  147. begin
  148. ih := GetData (TypeName);
  149. if assigned(ih) then
  150. result := ih.FExtention
  151. else
  152. result := '';
  153. end;
  154. function TImageHandlersManager.GetDefExt (const TypeName:string) : string;
  155. var ih : TIHData;
  156. begin
  157. ih := GetData (TypeName);
  158. if assigned(ih) then
  159. result := ih.FDefaultExt
  160. else
  161. result := '';
  162. end;
  163. { TFPCustomImageHandler }
  164. constructor TFPCustomImageHandler.create;
  165. begin
  166. inherited create;
  167. end;
  168. procedure TFPCustomImageHandler.Progress(Stage: TProgressStage;
  169. PercentDone: Byte; RedrawNow: Boolean; const R: TRect;
  170. const Msg: AnsiString; var Continue: Boolean);
  171. begin
  172. If Assigned(FOnProgress) then
  173. FOnProgress(Self,Stage,PercentDone,RedrawNow,R,Msg,Continue)
  174. else If Assigned(FImage) then
  175. // It is debatable whether we should pass ourselves or the image ?
  176. FImage.Progress(Self,Stage,PercentDone,RedrawNow,R,Msg,Continue);
  177. end;
  178. { TFPCustomImageReader }
  179. constructor TFPCustomImageReader.Create;
  180. begin
  181. inherited create;
  182. FDefImageClass := TFPMemoryImage;
  183. end;
  184. function TFPCustomImageReader.ImageRead (Str:TStream; Img:TFPCustomImage) : TFPCustomImage;
  185. begin
  186. try
  187. if not assigned(Str) then
  188. raise FPImageException.Create(ErrorText[StrNoStream]);
  189. FStream := Str;
  190. if not assigned(img) then
  191. result := FDefImageClass.Create(0,0)
  192. else
  193. result := Img;
  194. FImage := result;
  195. writeln ('Checking contents');
  196. if CheckContents (Str) then
  197. begin
  198. writeln ('Correct header(s), reading image');
  199. InternalRead (Str, result)
  200. end
  201. else
  202. raise FPImageException.Create ('Wrong image format');
  203. finally
  204. writeln ('ImageRead finally');
  205. FStream := nil;
  206. FImage := nil;
  207. end;
  208. writeln ('ImageRead end.');
  209. end;
  210. function TFPCustomImageReader.CheckContents (Str:TStream) : boolean;
  211. var InRead : boolean;
  212. begin
  213. InRead := assigned(FStream);
  214. if not assigned(Str) then
  215. raise FPImageException.Create(ErrorText[StrNoStream]);
  216. try
  217. FSTream := Str;
  218. result := InternalCheck (Str);
  219. finally
  220. if not InRead then
  221. FStream := nil;
  222. end;
  223. end;
  224. { TFPCustomImageWriter }
  225. procedure TFPCustomImageWriter.ImageWrite (Str:TStream; Img:TFPCustomImage);
  226. begin
  227. if not assigned(img) then
  228. raise FPImageException.Create(ErrorText[StrNoImageToWrite]);
  229. if not assigned(Str) then
  230. raise FPImageException.Create(ErrorText[StrNoStream]);
  231. try
  232. FStream := str;
  233. FImage := img;
  234. Str.position := 0;
  235. Str.Size := 0;
  236. InternalWrite(Str, Img);
  237. finally
  238. FStream := nil;
  239. FImage := nil;
  240. end;
  241. end;