File indexing completed on 2024-12-08 12:19:27
0001 /* 0002 Progressive image displaying library. 0003 0004 Copyright (C) 2004,2005 Maks Orlovich (maksim@kde.org) 0005 0006 Permission is hereby granted, free of charge, to any person obtaining a copy 0007 of this software and associated documentation files (the "Software"), to deal 0008 in the Software without restriction, including without limitation the rights 0009 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0010 copies of the Software, and to permit persons to whom the Software is 0011 furnished to do so, subject to the following conditions: 0012 0013 The above copyright notice and this permission notice shall be included in 0014 all copies or substantial portions of the Software. 0015 0016 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0017 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0018 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0019 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 0020 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 0021 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 0022 0023 */ 0024 0025 #ifndef IMAGE_LOADER_H 0026 #define IMAGE_LOADER_H 0027 0028 #include "imageformat.h" 0029 #include "image.h" 0030 0031 namespace khtmlImLoad 0032 { 0033 0034 class Image; 0035 0036 /** 0037 A base class for decoders. The decoders should inherit off this, and use the protected functions to 0038 feed their images data 0039 */ 0040 class ImageLoader 0041 { 0042 protected: 0043 Image *image; 0044 0045 ImageLoader() 0046 { 0047 image = nullptr; 0048 } 0049 0050 /** 0051 Call to declare canvas geometry and format. May only be called once 0052 */ 0053 void notifyImageInfo(int width, int height) 0054 { 0055 image->notifyImageInfo(width, height); 0056 } 0057 0058 /** 0059 Call to declare frame geometry, should be called for each frame. 0060 */ 0061 void notifyAppendFrame(int fwidth, int fheight, const ImageFormat &format) 0062 { 0063 image->notifyAppendFrame(fwidth, fheight, format); 0064 } 0065 0066 /** 0067 wrapper for the above method for single-frame images 0068 */ 0069 void notifySingleFrameImage(int width, int height, const ImageFormat &format) 0070 { 0071 notifyImageInfo(width, height); 0072 notifyAppendFrame(width, height, format); 0073 } 0074 0075 /** 0076 Call to provide a scanline, for active frame, and given "version". 0077 The decoder must feed multiple versions of the image inside here, top-to-bottom, 0078 and incrementing versions. When it's done, it should either feed the last 0079 version with FinalVersionID, or call notifyFinished() separately. 0080 */ 0081 void notifyScanline(unsigned char version, unsigned char *line) 0082 { 0083 image->notifyScanline(version, line); 0084 } 0085 0086 void notifyQImage(unsigned char version, const QImage *qimage) 0087 { 0088 image->notifyQImage(version, qimage); 0089 } 0090 0091 /** 0092 Call this to exract the current state of a scanline to the provided bufer 0093 */ 0094 void requestScanline(unsigned int lineNum, unsigned char *lineBuf) 0095 { 0096 image->requestScanline(lineNum, lineBuf); 0097 } 0098 0099 /** 0100 Call this to get the first frame 0101 */ 0102 PixmapPlane *requestFrame0() 0103 { 0104 return image->getSize(image->size()); 0105 } 0106 0107 public: 0108 //Some constants. Not consts since some compilers are broken 0109 enum { 0110 DefaultFrame = 0, 0111 FinalVersionID = 0xff 0112 }; 0113 0114 void setImage(Image *_image) 0115 { 0116 image = _image; 0117 } 0118 0119 virtual ~ImageLoader() 0120 {} 0121 0122 enum Status { 0123 Done = -2, 0124 Error = -1 0125 }; 0126 0127 /** 0128 Decodes a portion of the image, and returns the appropriate 0129 status, or the number of bytes read 0130 */ 0131 virtual int processData(uchar *data, int length) = 0; 0132 0133 /** 0134 This method is called to notify the decoder that the input is done, if the decoder 0135 has not already indicated some sort of completion on the stream; this is intended 0136 mostly for non-incremental decoders. It should return Done if all is OK. Note that 0137 the "if" above should mean that the non-incremental decoders should just return 0138 the bytes read in processData 0139 */ 0140 virtual int processEOF() 0141 { 0142 return Done; //### Probably should be Error if notifyImageInfo has not been called 0143 } 0144 }; 0145 0146 } 0147 0148 #endif