-rw-r--r-- | libopie2/opiemm/oimagescrollview.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/libopie2/opiemm/oimagescrollview.cpp b/libopie2/opiemm/oimagescrollview.cpp index 0e86bd0..68b06af 100644 --- a/libopie2/opiemm/oimagescrollview.cpp +++ b/libopie2/opiemm/oimagescrollview.cpp | |||
@@ -1,585 +1,585 @@ | |||
1 | #include "oimagescrollview.h" | 1 | #include "oimagescrollview.h" |
2 | 2 | ||
3 | #include <opie2/oimagezoomer.h> | 3 | #include <opie2/oimagezoomer.h> |
4 | #include <opie2/odebug.h> | 4 | #include <opie2/odebug.h> |
5 | #include <opie2/oapplication.h> | 5 | #include <opie2/oapplication.h> |
6 | #include <opie2/owait.h> | 6 | #include <opie2/owait.h> |
7 | 7 | ||
8 | #include <qimage.h> | 8 | #include <qimage.h> |
9 | #include <qlayout.h> | 9 | #include <qlayout.h> |
10 | #include <qpe/qcopenvelope_qws.h> | 10 | #include <qpe/qcopenvelope_qws.h> |
11 | 11 | ||
12 | /* for usage with the bitset */ | 12 | /* for usage with the bitset */ |
13 | #define AUTO_SCALE 0 | 13 | #define AUTO_SCALE 0 |
14 | #define AUTO_ROTATE 1 | 14 | #define AUTO_ROTATE 1 |
15 | #define SHOW_ZOOMER 2 | 15 | #define SHOW_ZOOMER 2 |
16 | #define FIRST_RESIZE_DONE 3 | 16 | #define FIRST_RESIZE_DONE 3 |
17 | #define IMAGE_IS_JPEG 4 | 17 | #define IMAGE_IS_JPEG 4 |
18 | #define IMAGE_SCALED_LOADED 5 | 18 | #define IMAGE_SCALED_LOADED 5 |
19 | 19 | ||
20 | #define SCROLLVIEW_BITSET_SIZE 6 | 20 | #define SCROLLVIEW_BITSET_SIZE 6 |
21 | 21 | ||
22 | namespace Opie { | 22 | namespace Opie { |
23 | namespace MM { | 23 | namespace MM { |
24 | OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f ) | 24 | OImageScrollView::OImageScrollView( QWidget* parent, const char* name, WFlags f ) |
25 | :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(), | 25 | :QScrollView(parent,name,f|Qt::WRepaintNoErase ),_image_data(),_original_data(), |
26 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") | 26 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") |
27 | { | 27 | { |
28 | _zoomer = 0; | 28 | _zoomer = 0; |
29 | m_states[AUTO_SCALE]=true; | 29 | m_states[AUTO_SCALE]=true; |
30 | m_states[AUTO_ROTATE]=true; | 30 | m_states[AUTO_ROTATE]=true; |
31 | m_states[FIRST_RESIZE_DONE]=false; | 31 | m_states[FIRST_RESIZE_DONE]=false; |
32 | m_states[IMAGE_IS_JPEG]=false; | 32 | m_states[IMAGE_IS_JPEG]=false; |
33 | m_states[IMAGE_SCALED_LOADED]=false; | 33 | m_states[IMAGE_SCALED_LOADED]=false; |
34 | m_states[SHOW_ZOOMER]=true; | 34 | m_states[SHOW_ZOOMER]=true; |
35 | init(); | 35 | init(); |
36 | } | 36 | } |
37 | 37 | ||
38 | OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) | 38 | OImageScrollView::OImageScrollView (const QImage&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) |
39 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), | 39 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(img), |
40 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") | 40 | m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") |
41 | { | 41 | { |
42 | _zoomer = 0; | 42 | _zoomer = 0; |
43 | m_states[AUTO_SCALE]=always_scale; | 43 | m_states[AUTO_SCALE]=always_scale; |
44 | m_states[AUTO_ROTATE]=rfit; | 44 | m_states[AUTO_ROTATE]=rfit; |
45 | m_states[FIRST_RESIZE_DONE]=false; | 45 | m_states[FIRST_RESIZE_DONE]=false; |
46 | m_states[IMAGE_IS_JPEG]=false; | 46 | m_states[IMAGE_IS_JPEG]=false; |
47 | m_states[IMAGE_SCALED_LOADED]=false; | 47 | m_states[IMAGE_SCALED_LOADED]=false; |
48 | m_states[SHOW_ZOOMER]=true; | 48 | m_states[SHOW_ZOOMER]=true; |
49 | _original_data.convertDepth(QPixmap::defaultDepth()); | 49 | _original_data.convertDepth(QPixmap::defaultDepth()); |
50 | _original_data.setAlphaBuffer(false); | 50 | _original_data.setAlphaBuffer(false); |
51 | init(); | 51 | init(); |
52 | } | 52 | } |
53 | 53 | ||
54 | OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) | 54 | OImageScrollView::OImageScrollView (const QString&img, QWidget * parent, const char * name, WFlags f,bool always_scale,bool rfit) |
55 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") | 55 | :QScrollView(parent,name,f|Qt::WRepaintNoErase),_image_data(),_original_data(),m_states(SCROLLVIEW_BITSET_SIZE),m_lastName("") |
56 | { | 56 | { |
57 | _zoomer = 0; | 57 | _zoomer = 0; |
58 | m_states.resize(SCROLLVIEW_BITSET_SIZE); | 58 | m_states.resize(SCROLLVIEW_BITSET_SIZE); |
59 | m_states[AUTO_SCALE]=always_scale; | 59 | m_states[AUTO_SCALE]=always_scale; |
60 | m_states[AUTO_ROTATE]=rfit; | 60 | m_states[AUTO_ROTATE]=rfit; |
61 | m_states[FIRST_RESIZE_DONE]=false; | 61 | m_states[FIRST_RESIZE_DONE]=false; |
62 | m_states[IMAGE_IS_JPEG]=false; | 62 | m_states[IMAGE_IS_JPEG]=false; |
63 | m_states[IMAGE_SCALED_LOADED]=false; | 63 | m_states[IMAGE_SCALED_LOADED]=false; |
64 | m_states[SHOW_ZOOMER]=true; | 64 | m_states[SHOW_ZOOMER]=true; |
65 | init(); | 65 | init(); |
66 | setImage(img); | 66 | setImage(img); |
67 | } | 67 | } |
68 | 68 | ||
69 | void OImageScrollView::setImage(const QImage&img) | 69 | void OImageScrollView::setImage(const QImage&img) |
70 | { | 70 | { |
71 | _image_data = QImage(); | 71 | _image_data = QImage(); |
72 | _original_data=img; | 72 | _original_data=img; |
73 | _original_data.convertDepth(QPixmap::defaultDepth()); | 73 | _original_data.convertDepth(QPixmap::defaultDepth()); |
74 | _original_data.setAlphaBuffer(false); | 74 | _original_data.setAlphaBuffer(false); |
75 | m_lastName = ""; | 75 | m_lastName = ""; |
76 | setImageIsJpeg(false); | 76 | setImageIsJpeg(false); |
77 | setImageScaledLoaded(false); | 77 | setImageScaledLoaded(false); |
78 | if (FirstResizeDone()) { | 78 | if (FirstResizeDone()) { |
79 | generateImage(); | 79 | generateImage(); |
80 | } | 80 | } |
81 | } | 81 | } |
82 | 82 | ||
83 | void OImageScrollView::loadJpeg(bool interncall) | 83 | void OImageScrollView::loadJpeg(bool interncall) |
84 | { | 84 | { |
85 | if (m_lastName.isEmpty()) return; | 85 | if (m_lastName.isEmpty()) return; |
86 | QImageIO iio( m_lastName, 0l ); | 86 | QImageIO iio( m_lastName, 0l ); |
87 | QString param; | 87 | QString param; |
88 | bool real_load = false; | 88 | bool real_load = false; |
89 | if (AutoScale()) { | 89 | if (AutoScale()) { |
90 | if (!interncall) { | 90 | if (!interncall) { |
91 | int wid, hei; | 91 | int wid, hei; |
92 | wid = QApplication::desktop()->width(); | 92 | wid = QApplication::desktop()->width(); |
93 | hei = QApplication::desktop()->height(); | 93 | hei = QApplication::desktop()->height(); |
94 | if (hei>wid) { | 94 | if (hei>wid) { |
95 | wid = hei; | 95 | wid = hei; |
96 | } else { | 96 | } else { |
97 | hei = wid; | 97 | hei = wid; |
98 | } | 98 | } |
99 | param = QString( "Fast Shrink( 7 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei ); | 99 | param = QString( "Fast Shrink( 3 ) Scale( %1, %2, ScaleFree)" ).arg( wid ).arg( hei ); |
100 | odebug << "Load jpeg scaled \"" << param << "\"" << oendl; | 100 | odebug << "Load jpeg scaled \"" << param << "\"" << oendl; |
101 | iio.setParameters(param.latin1()); | 101 | iio.setParameters(param.latin1()); |
102 | setImageScaledLoaded(true); | 102 | setImageScaledLoaded(true); |
103 | real_load = true; | 103 | real_load = true; |
104 | } | 104 | } |
105 | } else { | 105 | } else { |
106 | if (ImageScaledLoaded()||!interncall) { | 106 | if (ImageScaledLoaded()||!interncall) { |
107 | odebug << "Load jpeg unscaled" << oendl; | 107 | odebug << "Load jpeg unscaled" << oendl; |
108 | real_load = true; | 108 | real_load = true; |
109 | } | 109 | } |
110 | setImageScaledLoaded(false); | 110 | setImageScaledLoaded(false); |
111 | } | 111 | } |
112 | if (real_load) { | 112 | if (real_load) { |
113 | { | 113 | { |
114 | QCopEnvelope( "QPE/System", "busy()" ); | 114 | QCopEnvelope( "QPE/System", "busy()" ); |
115 | } | 115 | } |
116 | _original_data = iio.read() ? iio.image() : QImage(); | 116 | _original_data = iio.read() ? iio.image() : QImage(); |
117 | { | 117 | { |
118 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); | 118 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); |
119 | env << "Image loaded"; | 119 | env << "Image loaded"; |
120 | } | 120 | } |
121 | } | 121 | } |
122 | } | 122 | } |
123 | 123 | ||
124 | void OImageScrollView::setImage( const QString& path ) { | 124 | void OImageScrollView::setImage( const QString& path ) { |
125 | odebug << "load new image " << oendl; | 125 | odebug << "load new image " << oendl; |
126 | if (m_lastName == path) return; | 126 | if (m_lastName == path) return; |
127 | m_lastName = path; | 127 | m_lastName = path; |
128 | QString itype = QImage::imageFormat(m_lastName); | 128 | QString itype = QImage::imageFormat(m_lastName); |
129 | odebug << "Image type = " << itype << oendl; | 129 | odebug << "Image type = " << itype << oendl; |
130 | if (itype == "JPEG") { | 130 | if (itype == "JPEG") { |
131 | setImageIsJpeg(true); | 131 | setImageIsJpeg(true); |
132 | loadJpeg(); | 132 | loadJpeg(); |
133 | } else { | 133 | } else { |
134 | { | 134 | { |
135 | QCopEnvelope( "QPE/System", "busy()" ); | 135 | QCopEnvelope( "QPE/System", "busy()" ); |
136 | } | 136 | } |
137 | setImageIsJpeg(false); | 137 | setImageIsJpeg(false); |
138 | _original_data.load(path); | 138 | _original_data.load(path); |
139 | _original_data.convertDepth(QPixmap::defaultDepth()); | 139 | _original_data.convertDepth(QPixmap::defaultDepth()); |
140 | _original_data.setAlphaBuffer(false); | 140 | _original_data.setAlphaBuffer(false); |
141 | { | 141 | { |
142 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); | 142 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); |
143 | env << "Image loaded"; | 143 | env << "Image loaded"; |
144 | } | 144 | } |
145 | } | 145 | } |
146 | _image_data = QImage(); | 146 | _image_data = QImage(); |
147 | if (FirstResizeDone()) { | 147 | if (FirstResizeDone()) { |
148 | generateImage(); | 148 | generateImage(); |
149 | } | 149 | } |
150 | } | 150 | } |
151 | 151 | ||
152 | /* should be called every time the QImage changed it content */ | 152 | /* should be called every time the QImage changed it content */ |
153 | void OImageScrollView::init() | 153 | void OImageScrollView::init() |
154 | { | 154 | { |
155 | odebug << "init " << oendl; | 155 | odebug << "init " << oendl; |
156 | 156 | ||
157 | /* | 157 | /* |
158 | * create the zoomer | 158 | * create the zoomer |
159 | * and connect ther various signals | 159 | * and connect ther various signals |
160 | */ | 160 | */ |
161 | _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" ); | 161 | _zoomer = new Opie::MM::OImageZoomer( this, "The Zoomer" ); |
162 | connect(_zoomer, SIGNAL( zoomAreaRel(int,int)), | 162 | connect(_zoomer, SIGNAL( zoomAreaRel(int,int)), |
163 | this, SLOT(scrollBy(int,int)) ); | 163 | this, SLOT(scrollBy(int,int)) ); |
164 | connect(_zoomer, SIGNAL( zoomArea(int,int)), | 164 | connect(_zoomer, SIGNAL( zoomArea(int,int)), |
165 | this, SLOT(center(int,int)) ); | 165 | this, SLOT(center(int,int)) ); |
166 | connect(this,SIGNAL(contentsMoving(int,int)), | 166 | connect(this,SIGNAL(contentsMoving(int,int)), |
167 | _zoomer, (SLOT(setVisiblePoint(int,int))) ); | 167 | _zoomer, (SLOT(setVisiblePoint(int,int))) ); |
168 | connect(this,SIGNAL(imageSizeChanged(const QSize&)), | 168 | connect(this,SIGNAL(imageSizeChanged(const QSize&)), |
169 | _zoomer, SLOT(setImageSize(const QSize&)) ); | 169 | _zoomer, SLOT(setImageSize(const QSize&)) ); |
170 | connect(this,SIGNAL(viewportSizeChanged(const QSize&)), | 170 | connect(this,SIGNAL(viewportSizeChanged(const QSize&)), |
171 | _zoomer, SLOT(setViewPortSize(const QSize&)) ); | 171 | _zoomer, SLOT(setViewPortSize(const QSize&)) ); |
172 | 172 | ||
173 | viewport()->setBackgroundColor(white); | 173 | viewport()->setBackgroundColor(white); |
174 | setFocusPolicy(QWidget::StrongFocus); | 174 | setFocusPolicy(QWidget::StrongFocus); |
175 | setImageScaledLoaded(false); | 175 | setImageScaledLoaded(false); |
176 | setImageIsJpeg(false); | 176 | setImageIsJpeg(false); |
177 | if (FirstResizeDone()) { | 177 | if (FirstResizeDone()) { |
178 | m_last_rot = Rotate0; | 178 | m_last_rot = Rotate0; |
179 | generateImage(); | 179 | generateImage(); |
180 | } else if (_original_data.size().isValid()) { | 180 | } else if (_original_data.size().isValid()) { |
181 | if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide(); | 181 | if (image_fit_into(_original_data.size()) || !ShowZoomer()) _zoomer->hide(); |
182 | resizeContents(_original_data.width(),_original_data.height()); | 182 | resizeContents(_original_data.width(),_original_data.height()); |
183 | } | 183 | } |
184 | } | 184 | } |
185 | 185 | ||
186 | void OImageScrollView::setAutoRotate(bool how) | 186 | void OImageScrollView::setAutoRotate(bool how) |
187 | { | 187 | { |
188 | /* to avoid double repaints */ | 188 | /* to avoid double repaints */ |
189 | if (AutoRotate() != how) { | 189 | if (AutoRotate() != how) { |
190 | m_states.setBit(AUTO_ROTATE,how); | 190 | m_states.setBit(AUTO_ROTATE,how); |
191 | _image_data = QImage(); | 191 | _image_data = QImage(); |
192 | generateImage(); | 192 | generateImage(); |
193 | } | 193 | } |
194 | } | 194 | } |
195 | 195 | ||
196 | bool OImageScrollView::AutoRotate()const | 196 | bool OImageScrollView::AutoRotate()const |
197 | { | 197 | { |
198 | return m_states.testBit(AUTO_ROTATE); | 198 | return m_states.testBit(AUTO_ROTATE); |
199 | } | 199 | } |
200 | 200 | ||
201 | void OImageScrollView::setAutoScale(bool how) | 201 | void OImageScrollView::setAutoScale(bool how) |
202 | { | 202 | { |
203 | m_states.setBit(AUTO_SCALE,how); | 203 | m_states.setBit(AUTO_SCALE,how); |
204 | if (!how) { | 204 | if (!how) { |
205 | setAutoRotate(false); | 205 | setAutoRotate(false); |
206 | } | 206 | } |
207 | _image_data = QImage(); | 207 | _image_data = QImage(); |
208 | if (ImageIsJpeg() && how == false && ImageScaledLoaded()==true) { | 208 | if (ImageIsJpeg() && how == false && ImageScaledLoaded()==true) { |
209 | loadJpeg(true); | 209 | loadJpeg(true); |
210 | } | 210 | } |
211 | generateImage(); | 211 | generateImage(); |
212 | } | 212 | } |
213 | 213 | ||
214 | bool OImageScrollView::AutoScale()const | 214 | bool OImageScrollView::AutoScale()const |
215 | { | 215 | { |
216 | return m_states.testBit(AUTO_SCALE); | 216 | return m_states.testBit(AUTO_SCALE); |
217 | } | 217 | } |
218 | 218 | ||
219 | OImageScrollView::~OImageScrollView() | 219 | OImageScrollView::~OImageScrollView() |
220 | { | 220 | { |
221 | } | 221 | } |
222 | 222 | ||
223 | void OImageScrollView::rescaleImage(int w, int h) | 223 | void OImageScrollView::rescaleImage(int w, int h) |
224 | { | 224 | { |
225 | if (_image_data.width()==w && _image_data.height()==h) { | 225 | if (_image_data.width()==w && _image_data.height()==h) { |
226 | return; | 226 | return; |
227 | } | 227 | } |
228 | double hs = (double)h / (double)_image_data.height() ; | 228 | double hs = (double)h / (double)_image_data.height() ; |
229 | double ws = (double)w / (double)_image_data.width() ; | 229 | double ws = (double)w / (double)_image_data.width() ; |
230 | double scaleFactor = (hs > ws) ? ws : hs; | 230 | double scaleFactor = (hs > ws) ? ws : hs; |
231 | int smoothW = (int)(scaleFactor * _image_data.width()); | 231 | int smoothW = (int)(scaleFactor * _image_data.width()); |
232 | int smoothH = (int)(scaleFactor * _image_data.height()); | 232 | int smoothH = (int)(scaleFactor * _image_data.height()); |
233 | _image_data = _image_data.smoothScale(smoothW,smoothH); | 233 | _image_data = _image_data.smoothScale(smoothW,smoothH); |
234 | } | 234 | } |
235 | 235 | ||
236 | void OImageScrollView::rotate_into_data(Rotation r) | 236 | void OImageScrollView::rotate_into_data(Rotation r) |
237 | { | 237 | { |
238 | /* realy - we must do this that way, 'cause when acting direct on _image_data the app will | 238 | /* realy - we must do this that way, 'cause when acting direct on _image_data the app will |
239 | segfault :( */ | 239 | segfault :( */ |
240 | QImage dest; | 240 | QImage dest; |
241 | int x, y; | 241 | int x, y; |
242 | if ( _original_data.depth() > 8 ) | 242 | if ( _original_data.depth() > 8 ) |
243 | { | 243 | { |
244 | unsigned int *srcData, *destData; | 244 | unsigned int *srcData, *destData; |
245 | switch ( r ) | 245 | switch ( r ) |
246 | { | 246 | { |
247 | case Rotate90: | 247 | case Rotate90: |
248 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); | 248 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); |
249 | for ( y=0; y < _original_data.height(); ++y ) | 249 | for ( y=0; y < _original_data.height(); ++y ) |
250 | { | 250 | { |
251 | srcData = (unsigned int *)_original_data.scanLine(y); | 251 | srcData = (unsigned int *)_original_data.scanLine(y); |
252 | for ( x=0; x < _original_data.width(); ++x ) | 252 | for ( x=0; x < _original_data.width(); ++x ) |
253 | { | 253 | { |
254 | destData = (unsigned int *)dest.scanLine(x); | 254 | destData = (unsigned int *)dest.scanLine(x); |
255 | destData[_original_data.height()-y-1] = srcData[x]; | 255 | destData[_original_data.height()-y-1] = srcData[x]; |
256 | } | 256 | } |
257 | } | 257 | } |
258 | break; | 258 | break; |
259 | case Rotate180: | 259 | case Rotate180: |
260 | dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); | 260 | dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); |
261 | for ( y=0; y < _original_data.height(); ++y ) | 261 | for ( y=0; y < _original_data.height(); ++y ) |
262 | { | 262 | { |
263 | srcData = (unsigned int *)_original_data.scanLine(y); | 263 | srcData = (unsigned int *)_original_data.scanLine(y); |
264 | destData = (unsigned int *)dest.scanLine(_original_data.height()-y-1); | 264 | destData = (unsigned int *)dest.scanLine(_original_data.height()-y-1); |
265 | for ( x=0; x < _original_data.width(); ++x ) | 265 | for ( x=0; x < _original_data.width(); ++x ) |
266 | destData[_original_data.width()-x-1] = srcData[x]; | 266 | destData[_original_data.width()-x-1] = srcData[x]; |
267 | } | 267 | } |
268 | break; | 268 | break; |
269 | case Rotate270: | 269 | case Rotate270: |
270 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); | 270 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); |
271 | for ( y=0; y < _original_data.height(); ++y ) | 271 | for ( y=0; y < _original_data.height(); ++y ) |
272 | { | 272 | { |
273 | srcData = (unsigned int *)_original_data.scanLine(y); | 273 | srcData = (unsigned int *)_original_data.scanLine(y); |
274 | for ( x=0; x < _original_data.width(); ++x ) | 274 | for ( x=0; x < _original_data.width(); ++x ) |
275 | { | 275 | { |
276 | destData = (unsigned int *)dest.scanLine(_original_data.width()-x-1); | 276 | destData = (unsigned int *)dest.scanLine(_original_data.width()-x-1); |
277 | destData[y] = srcData[x]; | 277 | destData[y] = srcData[x]; |
278 | } | 278 | } |
279 | } | 279 | } |
280 | break; | 280 | break; |
281 | default: | 281 | default: |
282 | dest = _original_data; | 282 | dest = _original_data; |
283 | break; | 283 | break; |
284 | } | 284 | } |
285 | } | 285 | } |
286 | else | 286 | else |
287 | { | 287 | { |
288 | unsigned char *srcData, *destData; | 288 | unsigned char *srcData, *destData; |
289 | unsigned int *srcTable, *destTable; | 289 | unsigned int *srcTable, *destTable; |
290 | switch ( r ) | 290 | switch ( r ) |
291 | { | 291 | { |
292 | case Rotate90: | 292 | case Rotate90: |
293 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); | 293 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); |
294 | dest.setNumColors(_original_data.numColors()); | 294 | dest.setNumColors(_original_data.numColors()); |
295 | srcTable = (unsigned int *)_original_data.colorTable(); | 295 | srcTable = (unsigned int *)_original_data.colorTable(); |
296 | destTable = (unsigned int *)dest.colorTable(); | 296 | destTable = (unsigned int *)dest.colorTable(); |
297 | for ( x=0; x < _original_data.numColors(); ++x ) | 297 | for ( x=0; x < _original_data.numColors(); ++x ) |
298 | destTable[x] = srcTable[x]; | 298 | destTable[x] = srcTable[x]; |
299 | for ( y=0; y < _original_data.height(); ++y ) | 299 | for ( y=0; y < _original_data.height(); ++y ) |
300 | { | 300 | { |
301 | srcData = (unsigned char *)_original_data.scanLine(y); | 301 | srcData = (unsigned char *)_original_data.scanLine(y); |
302 | for ( x=0; x < _original_data.width(); ++x ) | 302 | for ( x=0; x < _original_data.width(); ++x ) |
303 | { | 303 | { |
304 | destData = (unsigned char *)dest.scanLine(x); | 304 | destData = (unsigned char *)dest.scanLine(x); |
305 | destData[_original_data.height()-y-1] = srcData[x]; | 305 | destData[_original_data.height()-y-1] = srcData[x]; |
306 | } | 306 | } |
307 | } | 307 | } |
308 | break; | 308 | break; |
309 | case Rotate180: | 309 | case Rotate180: |
310 | dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); | 310 | dest.create(_original_data.width(), _original_data.height(), _original_data.depth()); |
311 | dest.setNumColors(_original_data.numColors()); | 311 | dest.setNumColors(_original_data.numColors()); |
312 | srcTable = (unsigned int *)_original_data.colorTable(); | 312 | srcTable = (unsigned int *)_original_data.colorTable(); |
313 | destTable = (unsigned int *)dest.colorTable(); | 313 | destTable = (unsigned int *)dest.colorTable(); |
314 | for ( x=0; x < _original_data.numColors(); ++x ) | 314 | for ( x=0; x < _original_data.numColors(); ++x ) |
315 | destTable[x] = srcTable[x]; | 315 | destTable[x] = srcTable[x]; |
316 | for ( y=0; y < _original_data.height(); ++y ) | 316 | for ( y=0; y < _original_data.height(); ++y ) |
317 | { | 317 | { |
318 | srcData = (unsigned char *)_original_data.scanLine(y); | 318 | srcData = (unsigned char *)_original_data.scanLine(y); |
319 | destData = (unsigned char *)dest.scanLine(_original_data.height()-y-1); | 319 | destData = (unsigned char *)dest.scanLine(_original_data.height()-y-1); |
320 | for ( x=0; x < _original_data.width(); ++x ) | 320 | for ( x=0; x < _original_data.width(); ++x ) |
321 | destData[_original_data.width()-x-1] = srcData[x]; | 321 | destData[_original_data.width()-x-1] = srcData[x]; |
322 | } | 322 | } |
323 | break; | 323 | break; |
324 | case Rotate270: | 324 | case Rotate270: |
325 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); | 325 | dest.create(_original_data.height(), _original_data.width(), _original_data.depth()); |
326 | dest.setNumColors(_original_data.numColors()); | 326 | dest.setNumColors(_original_data.numColors()); |
327 | srcTable = (unsigned int *)_original_data.colorTable(); | 327 | srcTable = (unsigned int *)_original_data.colorTable(); |
328 | destTable = (unsigned int *)dest.colorTable(); | 328 | destTable = (unsigned int *)dest.colorTable(); |
329 | for ( x=0; x < _original_data.numColors(); ++x ) | 329 | for ( x=0; x < _original_data.numColors(); ++x ) |
330 | destTable[x] = srcTable[x]; | 330 | destTable[x] = srcTable[x]; |
331 | for ( y=0; y < _original_data.height(); ++y ) | 331 | for ( y=0; y < _original_data.height(); ++y ) |
332 | { | 332 | { |
333 | srcData = (unsigned char *)_original_data.scanLine(y); | 333 | srcData = (unsigned char *)_original_data.scanLine(y); |
334 | for ( x=0; x < _original_data.width(); ++x ) | 334 | for ( x=0; x < _original_data.width(); ++x ) |
335 | { | 335 | { |
336 | destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1); | 336 | destData = (unsigned char *)dest.scanLine(_original_data.width()-x-1); |
337 | destData[y] = srcData[x]; | 337 | destData[y] = srcData[x]; |
338 | } | 338 | } |
339 | } | 339 | } |
340 | break; | 340 | break; |
341 | default: | 341 | default: |
342 | dest = _original_data; | 342 | dest = _original_data; |
343 | break; | 343 | break; |
344 | } | 344 | } |
345 | 345 | ||
346 | } | 346 | } |
347 | _image_data = dest; | 347 | _image_data = dest; |
348 | } | 348 | } |
349 | 349 | ||
350 | void OImageScrollView::generateImage() | 350 | void OImageScrollView::generateImage() |
351 | { | 351 | { |
352 | Rotation r = Rotate0; | 352 | Rotation r = Rotate0; |
353 | if (_original_data.isNull()) return; | 353 | if (_original_data.isNull()) return; |
354 | { | 354 | { |
355 | QCopEnvelope( "QPE/System", "busy()" ); | 355 | QCopEnvelope( "QPE/System", "busy()" ); |
356 | } | 356 | } |
357 | if (width()>height()&&_original_data.width()<_original_data.height() || | 357 | if (width()>height()&&_original_data.width()<_original_data.height() || |
358 | width()<height()&&_original_data.width()>_original_data.height()) { | 358 | width()<height()&&_original_data.width()>_original_data.height()) { |
359 | if (AutoRotate()) r = Rotate90; | 359 | if (AutoRotate()) r = Rotate90; |
360 | } | 360 | } |
361 | 361 | ||
362 | odebug << " r = " << r << oendl; | 362 | odebug << " r = " << r << oendl; |
363 | if (AutoScale()) { | 363 | if (AutoScale()) { |
364 | if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) { | 364 | if (!_image_data.size().isValid()||width()>_image_data.width()||height()>_image_data.height()) { |
365 | odebug << "Rescaling data" << oendl; | 365 | odebug << "Rescaling data" << oendl; |
366 | if (r==Rotate0) { | 366 | if (r==Rotate0) { |
367 | _image_data = _original_data; | 367 | _image_data = _original_data; |
368 | } else { | 368 | } else { |
369 | rotate_into_data(r); | 369 | rotate_into_data(r); |
370 | } | 370 | } |
371 | } | 371 | } |
372 | rescaleImage(width(),height()); | 372 | rescaleImage(width(),height()); |
373 | resizeContents(_image_data.width(),_image_data.height()); | 373 | resizeContents(_image_data.width(),_image_data.height()); |
374 | } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) { | 374 | } else if (!FirstResizeDone()||r!=m_last_rot||_image_data.width()==0) { |
375 | if (r==Rotate0) { | 375 | if (r==Rotate0) { |
376 | _image_data = _original_data; | 376 | _image_data = _original_data; |
377 | } else { | 377 | } else { |
378 | rotate_into_data(r); | 378 | rotate_into_data(r); |
379 | } | 379 | } |
380 | m_last_rot = r; | 380 | m_last_rot = r; |
381 | resizeContents(_image_data.width(),_image_data.height()); | 381 | resizeContents(_image_data.width(),_image_data.height()); |
382 | } | 382 | } |
383 | _pdata.convertFromImage(_image_data); | 383 | _pdata.convertFromImage(_image_data); |
384 | 384 | ||
385 | 385 | ||
386 | /* | 386 | /* |
387 | * update the zoomer | 387 | * update the zoomer |
388 | */ | 388 | */ |
389 | check_zoomer(); | 389 | check_zoomer(); |
390 | emit imageSizeChanged( _image_data.size() ); | 390 | emit imageSizeChanged( _image_data.size() ); |
391 | rescaleImage( 128, 128 ); | 391 | rescaleImage( 128, 128 ); |
392 | /* | 392 | /* |
393 | * move scrollbar | 393 | * move scrollbar |
394 | */ | 394 | */ |
395 | if (_zoomer) { | 395 | if (_zoomer) { |
396 | _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2, | 396 | _zoomer->setGeometry( viewport()->width()-_image_data.width()/2, viewport()->height()-_image_data.height()/2, |
397 | _image_data.width()/2, _image_data.height()/2 ); | 397 | _image_data.width()/2, _image_data.height()/2 ); |
398 | _zoomer->setImage( _image_data ); | 398 | _zoomer->setImage( _image_data ); |
399 | } | 399 | } |
400 | /* | 400 | /* |
401 | * invalidate | 401 | * invalidate |
402 | */ | 402 | */ |
403 | _image_data=QImage(); | 403 | _image_data=QImage(); |
404 | { | 404 | { |
405 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); | 405 | QCopEnvelope env( "QPE/System", "notBusy(QString)" ); |
406 | env << "Image generated"; | 406 | env << "Image generated"; |
407 | } | 407 | } |
408 | } | 408 | } |
409 | 409 | ||
410 | void OImageScrollView::resizeEvent(QResizeEvent * e) | 410 | void OImageScrollView::resizeEvent(QResizeEvent * e) |
411 | { | 411 | { |
412 | odebug << "OImageScrollView resizeEvent" << oendl; | 412 | odebug << "OImageScrollView resizeEvent" << oendl; |
413 | QScrollView::resizeEvent(e); | 413 | QScrollView::resizeEvent(e); |
414 | generateImage(); | 414 | generateImage(); |
415 | setFirstResizeDone(true); | 415 | setFirstResizeDone(true); |
416 | emit viewportSizeChanged( viewport()->size() ); | 416 | emit viewportSizeChanged( viewport()->size() ); |
417 | 417 | ||
418 | } | 418 | } |
419 | 419 | ||
420 | void OImageScrollView::keyPressEvent(QKeyEvent * e) | 420 | void OImageScrollView::keyPressEvent(QKeyEvent * e) |
421 | { | 421 | { |
422 | if (!e) return; | 422 | if (!e) return; |
423 | int dx = horizontalScrollBar()->lineStep(); | 423 | int dx = horizontalScrollBar()->lineStep(); |
424 | int dy = verticalScrollBar()->lineStep(); | 424 | int dy = verticalScrollBar()->lineStep(); |
425 | if (e->key()==Qt::Key_Right) { | 425 | if (e->key()==Qt::Key_Right) { |
426 | scrollBy(dx,0); | 426 | scrollBy(dx,0); |
427 | e->accept(); | 427 | e->accept(); |
428 | } else if (e->key()==Qt::Key_Left) { | 428 | } else if (e->key()==Qt::Key_Left) { |
429 | scrollBy(0-dx,0); | 429 | scrollBy(0-dx,0); |
430 | e->accept(); | 430 | e->accept(); |
431 | } else if (e->key()==Qt::Key_Up) { | 431 | } else if (e->key()==Qt::Key_Up) { |
432 | scrollBy(0,0-dy); | 432 | scrollBy(0,0-dy); |
433 | e->accept(); | 433 | e->accept(); |
434 | } else if (e->key()==Qt::Key_Down) { | 434 | } else if (e->key()==Qt::Key_Down) { |
435 | scrollBy(0,dy); | 435 | scrollBy(0,dy); |
436 | e->accept(); | 436 | e->accept(); |
437 | } else { | 437 | } else { |
438 | e->ignore(); | 438 | e->ignore(); |
439 | } | 439 | } |
440 | QScrollView::keyPressEvent(e); | 440 | QScrollView::keyPressEvent(e); |
441 | } | 441 | } |
442 | 442 | ||
443 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) | 443 | void OImageScrollView::drawContents(QPainter * p, int clipx, int clipy, int clipw, int cliph) |
444 | { | 444 | { |
445 | int w = clipw; | 445 | int w = clipw; |
446 | int h = cliph; | 446 | int h = cliph; |
447 | int x = clipx; | 447 | int x = clipx; |
448 | int y = clipy; | 448 | int y = clipy; |
449 | bool erase = false; | 449 | bool erase = false; |
450 | 450 | ||
451 | if (!_pdata.size().isValid()) { | 451 | if (!_pdata.size().isValid()) { |
452 | p->fillRect(clipx,clipy,clipw,cliph,white); | 452 | p->fillRect(clipx,clipy,clipw,cliph,white); |
453 | return; | 453 | return; |
454 | } | 454 | } |
455 | if (w>_pdata.width()) { | 455 | if (w>_pdata.width()) { |
456 | w=_pdata.width(); | 456 | w=_pdata.width(); |
457 | x = 0; | 457 | x = 0; |
458 | erase = true; | 458 | erase = true; |
459 | } else if (x+w>_pdata.width()){ | 459 | } else if (x+w>_pdata.width()){ |
460 | x = _pdata.width()-w; | 460 | x = _pdata.width()-w; |
461 | } | 461 | } |
462 | if (h>_pdata.height()) { | 462 | if (h>_pdata.height()) { |
463 | h=_pdata.height(); | 463 | h=_pdata.height(); |
464 | y = 0; | 464 | y = 0; |
465 | erase = true; | 465 | erase = true; |
466 | } else if (y+h>_pdata.height()){ | 466 | } else if (y+h>_pdata.height()){ |
467 | y = _pdata.height()-h; | 467 | y = _pdata.height()-h; |
468 | } | 468 | } |
469 | if (erase||_original_data.hasAlphaBuffer()) { | 469 | if (erase||_original_data.hasAlphaBuffer()) { |
470 | p->fillRect(clipx,clipy,clipw,cliph,white); | 470 | p->fillRect(clipx,clipy,clipw,cliph,white); |
471 | } | 471 | } |
472 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); | 472 | p->drawPixmap(clipx,clipy,_pdata,x,y,w,h); |
473 | } | 473 | } |
474 | 474 | ||
475 | /* using the real geometry points and not the translated points is wanted! */ | 475 | /* using the real geometry points and not the translated points is wanted! */ |
476 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) | 476 | void OImageScrollView::viewportMouseMoveEvent(QMouseEvent* e) |
477 | { | 477 | { |
478 | odebug << "Move X and Y " << e->x() << " " << e->y() << oendl; | 478 | odebug << "Move X and Y " << e->x() << " " << e->y() << oendl; |
479 | int mx, my; | 479 | int mx, my; |
480 | mx = e->x(); | 480 | mx = e->x(); |
481 | my = e->y(); | 481 | my = e->y(); |
482 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { | 482 | if (_mouseStartPosX!=-1 && _mouseStartPosY!=-1) { |
483 | int diffx = _mouseStartPosX-mx; | 483 | int diffx = _mouseStartPosX-mx; |
484 | int diffy = _mouseStartPosY-my; | 484 | int diffy = _mouseStartPosY-my; |
485 | #if 0 | 485 | #if 0 |
486 | QScrollBar*xbar = horizontalScrollBar(); | 486 | QScrollBar*xbar = horizontalScrollBar(); |
487 | QScrollBar*ybar = verticalScrollBar(); | 487 | QScrollBar*ybar = verticalScrollBar(); |
488 | if (xbar->value()+diffx>xbar->maxValue()) { | 488 | if (xbar->value()+diffx>xbar->maxValue()) { |
489 | diffx = xbar->maxValue()-xbar->value(); | 489 | diffx = xbar->maxValue()-xbar->value(); |
490 | } else if (xbar->value()+diffx<0) { | 490 | } else if (xbar->value()+diffx<0) { |
491 | diffx=0-xbar->value(); | 491 | diffx=0-xbar->value(); |
492 | } | 492 | } |
493 | if (ybar->value()+diffy>ybar->maxValue()) { | 493 | if (ybar->value()+diffy>ybar->maxValue()) { |
494 | diffy = ybar->maxValue()-ybar->value(); | 494 | diffy = ybar->maxValue()-ybar->value(); |
495 | } else if (ybar->value()+diffy<0) { | 495 | } else if (ybar->value()+diffy<0) { |
496 | diffy=0-ybar->value(); | 496 | diffy=0-ybar->value(); |
497 | } | 497 | } |
498 | #endif | 498 | #endif |
499 | scrollBy(diffx,diffy); | 499 | scrollBy(diffx,diffy); |
500 | } | 500 | } |
501 | _mouseStartPosX=mx; | 501 | _mouseStartPosX=mx; |
502 | _mouseStartPosY=my; | 502 | _mouseStartPosY=my; |
503 | } | 503 | } |
504 | 504 | ||
505 | void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) | 505 | void OImageScrollView::contentsMousePressEvent ( QMouseEvent * e) |
506 | { | 506 | { |
507 | odebug << " X and Y " << e->x() << " " << e->y() << oendl; | 507 | odebug << " X and Y " << e->x() << " " << e->y() << oendl; |
508 | /* this marks the beginning of a possible mouse move. Due internal reasons of QT | 508 | /* this marks the beginning of a possible mouse move. Due internal reasons of QT |
509 | the geometry values here may real differ from that set in MoveEvent (I don't know | 509 | the geometry values here may real differ from that set in MoveEvent (I don't know |
510 | why). For getting them in real context, we use the first move-event to set the start | 510 | why). For getting them in real context, we use the first move-event to set the start |
511 | position ;) | 511 | position ;) |
512 | */ | 512 | */ |
513 | _mouseStartPosX = -1; | 513 | _mouseStartPosX = -1; |
514 | _mouseStartPosY = -1; | 514 | _mouseStartPosY = -1; |
515 | } | 515 | } |
516 | 516 | ||
517 | void OImageScrollView::setDestructiveClose() { | 517 | void OImageScrollView::setDestructiveClose() { |
518 | WFlags fl = getWFlags(); | 518 | WFlags fl = getWFlags(); |
519 | /* clear it just in case */ | 519 | /* clear it just in case */ |
520 | fl &= ~WDestructiveClose; | 520 | fl &= ~WDestructiveClose; |
521 | fl |= WDestructiveClose; | 521 | fl |= WDestructiveClose; |
522 | setWFlags( fl ); | 522 | setWFlags( fl ); |
523 | } | 523 | } |
524 | 524 | ||
525 | bool OImageScrollView::image_fit_into(const QSize&s ) | 525 | bool OImageScrollView::image_fit_into(const QSize&s ) |
526 | { | 526 | { |
527 | if (s.width()>width()||s.height()>height()) { | 527 | if (s.width()>width()||s.height()>height()) { |
528 | return false; | 528 | return false; |
529 | } | 529 | } |
530 | return true; | 530 | return true; |
531 | } | 531 | } |
532 | 532 | ||
533 | void OImageScrollView::setShowZoomer(bool how) | 533 | void OImageScrollView::setShowZoomer(bool how) |
534 | { | 534 | { |
535 | m_states.setBit(SHOW_ZOOMER,how); | 535 | m_states.setBit(SHOW_ZOOMER,how); |
536 | check_zoomer(); | 536 | check_zoomer(); |
537 | } | 537 | } |
538 | 538 | ||
539 | bool OImageScrollView::ShowZoomer()const | 539 | bool OImageScrollView::ShowZoomer()const |
540 | { | 540 | { |
541 | return m_states.testBit(SHOW_ZOOMER); | 541 | return m_states.testBit(SHOW_ZOOMER); |
542 | } | 542 | } |
543 | 543 | ||
544 | void OImageScrollView::check_zoomer() | 544 | void OImageScrollView::check_zoomer() |
545 | { | 545 | { |
546 | if (!_zoomer) return; | 546 | if (!_zoomer) return; |
547 | if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { | 547 | if ( (!ShowZoomer()||image_fit_into(_pdata.size()) ) && _zoomer->isVisible()) { |
548 | _zoomer->hide(); | 548 | _zoomer->hide(); |
549 | } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ | 549 | } else if ( ShowZoomer() && !image_fit_into(_pdata.size()) && _zoomer->isHidden()){ |
550 | _zoomer->show(); | 550 | _zoomer->show(); |
551 | } | 551 | } |
552 | } | 552 | } |
553 | 553 | ||
554 | bool OImageScrollView::FirstResizeDone()const | 554 | bool OImageScrollView::FirstResizeDone()const |
555 | { | 555 | { |
556 | return m_states.testBit(FIRST_RESIZE_DONE); | 556 | return m_states.testBit(FIRST_RESIZE_DONE); |
557 | } | 557 | } |
558 | 558 | ||
559 | void OImageScrollView::setFirstResizeDone(bool how) | 559 | void OImageScrollView::setFirstResizeDone(bool how) |
560 | { | 560 | { |
561 | m_states.setBit(FIRST_RESIZE_DONE,how); | 561 | m_states.setBit(FIRST_RESIZE_DONE,how); |
562 | } | 562 | } |
563 | 563 | ||
564 | bool OImageScrollView::ImageIsJpeg()const | 564 | bool OImageScrollView::ImageIsJpeg()const |
565 | { | 565 | { |
566 | return m_states.testBit(IMAGE_IS_JPEG); | 566 | return m_states.testBit(IMAGE_IS_JPEG); |
567 | } | 567 | } |
568 | 568 | ||
569 | void OImageScrollView::setImageIsJpeg(bool how) | 569 | void OImageScrollView::setImageIsJpeg(bool how) |
570 | { | 570 | { |
571 | m_states.setBit(IMAGE_IS_JPEG,how); | 571 | m_states.setBit(IMAGE_IS_JPEG,how); |
572 | } | 572 | } |
573 | 573 | ||
574 | bool OImageScrollView::ImageScaledLoaded()const | 574 | bool OImageScrollView::ImageScaledLoaded()const |
575 | { | 575 | { |
576 | return m_states.testBit(IMAGE_SCALED_LOADED); | 576 | return m_states.testBit(IMAGE_SCALED_LOADED); |
577 | } | 577 | } |
578 | 578 | ||
579 | void OImageScrollView::setImageScaledLoaded(bool how) | 579 | void OImageScrollView::setImageScaledLoaded(bool how) |
580 | { | 580 | { |
581 | m_states.setBit(IMAGE_SCALED_LOADED,how); | 581 | m_states.setBit(IMAGE_SCALED_LOADED,how); |
582 | } | 582 | } |
583 | 583 | ||
584 | } // namespace MM | 584 | } // namespace MM |
585 | } // namespace Opie | 585 | } // namespace Opie |