fphandler.inc 6.5 KB

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