File indexing completed on 2024-12-01 12:33:50
0001 /* 0002 Large image displaying library. 0003 0004 Copyright (C) 2004 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_H 0026 #define IMAGE_H 0027 0028 #include <QByteArray> 0029 #include <QSize> 0030 #include <QTimer> 0031 #include <QPair> 0032 #include <QMap> 0033 0034 #include <khtml_settings.h> 0035 0036 #include "imageformat.h" 0037 0038 class QPainter; 0039 0040 namespace khtmlImLoad 0041 { 0042 0043 class ImageOwner; 0044 class ImageLoader; 0045 class PixmapPlane; 0046 0047 /** 0048 An image represents a static picture or an animation, that 0049 may be incrementally loaded. 0050 */ 0051 class Image 0052 { 0053 public: 0054 /** 0055 Creates an image with a given owner; the owner will be notified about the repaint event, the image geometry, 0056 and so on; and also if the image can not be decoded. The image must be fed data through the processData() 0057 call; and it will take care of the rest automatically. 0058 */ 0059 Image(ImageOwner *owner); 0060 0061 /** 0062 Provides new data for decoding. The method will return false if there is no longer any use to feeding it more data 0063 (i.e. if the image is complete, or broken, etc.); however, it is safe to do so. 0064 */ 0065 bool processData(uchar *data, int length); 0066 0067 /** 0068 Notifies the image that the data source is exhausted, in case it cares. This should be called at the 0069 end of the data stream in order for non-incremental decoders to work 0070 */ 0071 void processEOF(); 0072 0073 /** 0074 Cleans up 0075 */ 0076 ~Image(); 0077 0078 /** 0079 Returns the image's size 0080 */ 0081 QSize size() const; 0082 0083 /** 0084 Returns true if the image has been fully loaded 0085 */ 0086 bool complete() const; 0087 0088 /** 0089 Returns true if the image may have an alpha channel 0090 */ 0091 bool hasAlpha() const; 0092 0093 /** 0094 Returns the image of basic content. Should be treated as READ ONLY. 0095 (but see CanvasImage) 0096 */ 0097 QImage *qimage() const; 0098 0099 /** 0100 Enables or disables animations 0101 */ 0102 void setShowAnimations(KHTMLSettings::KAnimationAdvice); 0103 private: 0104 //Interface to the loader. 0105 friend class ImageLoader; 0106 0107 /** 0108 Called from the loader to notify of canvas geometry. 0109 The loader must also call notifyAppendFrame to 0110 create 1 or more frames 0111 */ 0112 void notifyImageInfo(int width, int height); 0113 0114 /** 0115 Called to notify of format of a frame 0116 */ 0117 void notifyAppendFrame(int fwidth, int fheight, const ImageFormat &format); 0118 0119 /** 0120 Called from the loader to feed a new scanline (in consecutive order in each frame), through 0121 various progressive versions 0122 */ 0123 void notifyScanline(unsigned char version, unsigned char *data); 0124 0125 /** 0126 Called from the loader to feed a new image, through 0127 various progressive versions 0128 */ 0129 void notifyQImage(unsigned char version, const QImage *image); 0130 0131 /** 0132 Called from loader to request the current contents of the line in the basic plane 0133 */ 0134 void requestScanline(unsigned int lineNum, unsigned char *lineBuf); 0135 0136 //### FIXME: restore the animprovider interface 0137 0138 private: //Interface to the painter. 0139 friend class ImagePainter; 0140 bool mayPaint() 0141 { 0142 return original; 0143 } 0144 void derefSize(QSize size); 0145 void refSize(QSize size); 0146 PixmapPlane *getSize(QSize size); 0147 0148 protected: 0149 ImageOwner *owner; 0150 0151 //Update reporting to owner 0152 friend class Updater; 0153 friend class AnimProvider; 0154 bool updatesPending; 0155 int updatesStartLine; 0156 int updatesEndLine; 0157 0158 //Incorporate the scanline into update range 0159 void requestUpdate(int line); 0160 0161 //Sets the state as not having updates 0162 void noUpdates(); 0163 0164 /** 0165 Called by the updater when the image should tell its owners about new changes 0166 */ 0167 void notifyPerformUpdate(); 0168 0169 /** 0170 Called when animation frame changes, requesting the owner to repaint 0171 */ 0172 void notifyFrameChange(); 0173 0174 //Loader stuff. 0175 QByteArray bufferPreDetect; 0176 ImageLoader *loader; 0177 PixmapPlane *loaderPlane; 0178 unsigned int loaderScanline; 0179 0180 bool fullyDecoded; 0181 bool inError; 0182 0183 //A little helper to set the error condition. 0184 void loadError(); 0185 0186 //Image state 0187 unsigned int width, height; 0188 PixmapPlane *original; 0189 QMap<QPair<int, int>, PixmapPlane *> scaled; 0190 KHTMLSettings::KAnimationAdvice animationAdvice; 0191 0192 }; 0193 0194 } 0195 0196 #endif