summaryrefslogtreecommitdiff
authoralwin <alwin>2005-04-13 12:55:44 (UTC)
committer alwin <alwin>2005-04-13 12:55:44 (UTC)
commitcb10570b4118161a066b741c2674d8d522670623 (patch) (unidiff)
tree149a5c77bc252443efe658e61717e47cee786f59
parentbe565a8eb0c602e5173b71cf71ba510a7a7f4520 (diff)
downloadopie-cb10570b4118161a066b741c2674d8d522670623.zip
opie-cb10570b4118161a066b741c2674d8d522670623.tar.gz
opie-cb10570b4118161a066b741c2674d8d522670623.tar.bz2
sometimes the display must painted black - we'll just use memset
'cause working on fb itself so we'll not interfer with qpaint from main thread
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.cpp24
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.h3
2 files changed, 25 insertions, 2 deletions
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
index b27b8e1..7c98ce5 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
@@ -87,218 +87,238 @@ static inline void memcpy_step ( void *_dst, void *_src, size_t len, size_t step
87 short int *src = static_cast<short int*>( _src ); 87 short int *src = static_cast<short int*>( _src );
88 88
89 len >>= 1; 89 len >>= 1;
90 90
91 /* 91 /*
92 * Copy 16bit from src to dst and move to the next address 92 * Copy 16bit from src to dst and move to the next address
93 */ 93 */
94 while ( len-- ) { 94 while ( len-- ) {
95 *dst++ = *src; 95 *dst++ = *src;
96 src = reinterpret_cast<short int*>(reinterpret_cast<char*>(src)+step); 96 src = reinterpret_cast<short int*>(reinterpret_cast<char*>(src)+step);
97 } 97 }
98} 98}
99 99
100// 270 deg rot: copy a column from src to dst reversed 100// 270 deg rot: copy a column from src to dst reversed
101 101
102static inline void memcpy_step_rev ( void *_dst, void *_src, size_t len, size_t step ) 102static inline void memcpy_step_rev ( void *_dst, void *_src, size_t len, size_t step )
103{ 103{
104 len >>= 1; 104 len >>= 1;
105 105
106 char *src_c = static_cast<char*>( _src ) + (len*step); 106 char *src_c = static_cast<char*>( _src ) + (len*step);
107 short int* dst = static_cast<short int*>( _dst ); 107 short int* dst = static_cast<short int*>( _dst );
108 short int* src = reinterpret_cast<short int*>( src_c ); 108 short int* src = reinterpret_cast<short int*>( src_c );
109 109
110 while ( len-- ) { 110 while ( len-- ) {
111 src_c -= step; 111 src_c -= step;
112 src = reinterpret_cast<short int*>( src_c ); 112 src = reinterpret_cast<short int*>( src_c );
113 *dst++ = *src; 113 *dst++ = *src;
114 } 114 }
115} 115}
116 116
117 117
118XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) 118XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name )
119 : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase ) 119 : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase ),old_framerect(0,0,0,0),old_size(0,0)
120{ 120{
121 setBackgroundMode ( NoBackground ); 121 setBackgroundMode ( NoBackground );
122 122
123 m_logo = 0; 123 m_logo = 0;
124 m_buff = 0; 124 m_buff = 0;
125 m_bytes_per_line_fb = qt_screen-> linestep ( ); 125 m_bytes_per_line_fb = qt_screen-> linestep ( );
126 m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; 126 m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8;
127 m_rotation = 0; 127 m_rotation = 0;
128 m_lastsize = 0; 128 m_lastsize = 0;
129} 129}
130 130
131 131
132XineVideoWidget::~XineVideoWidget ( ) 132XineVideoWidget::~XineVideoWidget ( )
133{ 133{
134 ThreadUtil::AutoLock a(m_bufmutex); 134#if 0
135 if (m_buff) { 135 if (m_buff) {
136 delete[]m_buff; 136 delete[]m_buff;
137 m_lastsize=0; 137 m_lastsize=0;
138 m_buff = 0; 138 m_buff = 0;
139 } 139 }
140#endif
140 if (m_logo) { 141 if (m_logo) {
141 delete m_logo; 142 delete m_logo;
142 } 143 }
143} 144}
144 145
145void XineVideoWidget::clear ( ) 146void XineVideoWidget::clear ( )
146{ 147{
148#if 0
147 ThreadUtil::AutoLock a(m_bufmutex); 149 ThreadUtil::AutoLock a(m_bufmutex);
148 if (m_buff) { 150 if (m_buff) {
149 delete[]m_buff; 151 delete[]m_buff;
150 m_lastsize=0; 152 m_lastsize=0;
151 m_buff = 0; 153 m_buff = 0;
152 } 154 }
155#endif
153 repaint ( false ); 156 repaint ( false );
154} 157}
155 158
156QSize XineVideoWidget::videoSize() const 159QSize XineVideoWidget::videoSize() const
157{ 160{
158 QSize s = size(); 161 QSize s = size();
159 bool fs = ( s == qApp->desktop()->size() ); 162 bool fs = ( s == qApp->desktop()->size() );
160 163
161 // if we are in fullscreen mode, do not rotate the video 164 // if we are in fullscreen mode, do not rotate the video
162 // (!! the paint routine uses m_rotation + qt_screen-> transformOrientation() !!) 165 // (!! the paint routine uses m_rotation + qt_screen-> transformOrientation() !!)
163 m_rotation = fs ? - qt_screen->transformOrientation() : 0; 166 m_rotation = fs ? - qt_screen->transformOrientation() : 0;
164 167
165 if ( fs && qt_screen->isTransformed() ) 168 if ( fs && qt_screen->isTransformed() )
166 s = qt_screen->mapToDevice( s ); 169 s = qt_screen->mapToDevice( s );
167 170
168 return s; 171 return s;
169} 172}
170 173
171void XineVideoWidget::paintEvent ( QPaintEvent * ) 174void XineVideoWidget::paintEvent ( QPaintEvent * )
172{ 175{
173 QPainter p ( this ); 176 QPainter p ( this );
174 p. fillRect ( rect (), black ); 177 p. fillRect ( rect (), black );
175 if (m_logo) 178 if (m_logo)
176 p. drawImage ( 0, 0, *m_logo ); 179 p. drawImage ( 0, 0, *m_logo );
177} 180}
178 181
179void XineVideoWidget::paintEvent2 ( QPaintEvent * ) 182void XineVideoWidget::paintEvent2 ( QPaintEvent * )
180{ 183{
181 if ( m_buff == 0 ) { 184 if ( m_buff == 0 ) {
182 return; 185 return;
183 } else if (m_lastsize){ 186 } else if (m_lastsize){
184 { 187 {
185 QDirectPainter dp ( this ); 188 QDirectPainter dp ( this );
186 int rot = dp. transformOrientation ( ) + m_rotation; // device rotation + custom rotation 189 int rot = dp. transformOrientation ( ) + m_rotation; // device rotation + custom rotation
187 bool rot90 = (( -m_rotation ) & 1 ); 190 bool rot90 = (( -m_rotation ) & 1 );
188 int _vw,_vh; 191 int _vw,_vh;
189 switch (rot90) { 192 switch (rot90) {
190 case true: 193 case true:
191 _vh = m_framesize.width(); 194 _vh = m_framesize.width();
192 _vw = m_framesize.height(); 195 _vw = m_framesize.height();
193 break; 196 break;
194 default: 197 default:
195 _vw = m_framesize.width(); 198 _vw = m_framesize.width();
196 _vh = m_framesize.height(); 199 _vh = m_framesize.height();
197 break; 200 break;
198 break; 201 break;
199 } 202 }
200 int middle_w = _vw/2; 203 int middle_w = _vw/2;
201 int middle_h = _vh/2; 204 int middle_h = _vh/2;
202 m_thisframe.setRect(width()/2-middle_w,height()/2-middle_h,_vw,_vh); 205 m_thisframe.setRect(width()/2-middle_w,height()/2-middle_h,_vw,_vh);
203 uchar *fb = dp. frameBuffer ( ); 206 uchar *fb = dp. frameBuffer ( );
204 uchar *frame = m_buff; 207 uchar *frame = m_buff;
205 208
206 // where is the video frame in fb coordinates 209 // where is the video frame in fb coordinates
207 QRect framerect = qt_screen-> mapToDevice ( QRect ( mapToGlobal ( m_thisframe. topLeft ( )), m_thisframe. size ( )), QSize ( qt_screen-> width ( ), 210 QRect framerect = qt_screen-> mapToDevice ( QRect ( mapToGlobal ( m_thisframe. topLeft ( )), m_thisframe. size ( )), QSize ( qt_screen-> width ( ),
208 qt_screen-> height ( ))); 211 qt_screen-> height ( )));
209 212
210 uchar * src = frame; 213 uchar * src = frame;
211 uchar * dst = fb+framerect.y()*m_bytes_per_line_fb+framerect.x()*m_bytes_per_pixel; 214 uchar * dst = fb+framerect.y()*m_bytes_per_line_fb+framerect.x()*m_bytes_per_pixel;
212 215
216 /* clean up the fb screen when shrinking the image only! */
217 if (old_framerect.isValid() && old_size.width()==width()&&old_size.height()==height() &&
218 (old_framerect.width()>framerect.width() || old_framerect.height()>framerect.height())) {
219 uchar*_dst = fb+old_framerect.y()*m_bytes_per_line_fb+old_framerect.x()*m_bytes_per_pixel;
220 for (int z=0;z<old_framerect.height();++z) {
221 memset(_dst,0,m_bytes_per_line_fb);
222 _dst+=m_bytes_per_line_fb;
223 }
224 }
225 old_framerect=framerect;
226 old_size = size();
227
213 if (framerect.height()!=m_framesize.height()) { 228 if (framerect.height()!=m_framesize.height()) {
214 odebug << "Hoehm: " << framerect.height() << " <-> " << m_framesize.height() << oendl; 229 odebug << "Hoehm: " << framerect.height() << " <-> " << m_framesize.height() << oendl;
215 } 230 }
216 for (int y = 0;y<framerect.height();++y) { 231 for (int y = 0;y<framerect.height();++y) {
217 switch (rot) { 232 switch (rot) {
218 case 0: 233 case 0:
219 memcpy(dst,src,m_bytes_per_line_frame); 234 memcpy(dst,src,m_bytes_per_line_frame);
220 src+=m_bytes_per_line_frame; 235 src+=m_bytes_per_line_frame;
221 break; 236 break;
222 case 1: 237 case 1:
223 memcpy_step ( dst, src, m_thisframe.size().width(), m_bytes_per_line_frame ); 238 memcpy_step ( dst, src, m_thisframe.size().width(), m_bytes_per_line_frame );
224 src -= m_bytes_per_pixel; 239 src -= m_bytes_per_pixel;
225 break; 240 break;
226 case 2: 241 case 2:
227 memcpy_rev ( dst, src, m_thisframe.size().width()); 242 memcpy_rev ( dst, src, m_thisframe.size().width());
228 src-=m_bytes_per_line_frame; 243 src-=m_bytes_per_line_frame;
229 break; 244 break;
230 case 3: 245 case 3:
231 memcpy_step_rev ( dst, src, m_thisframe.size().width(), m_bytes_per_line_frame ); 246 memcpy_step_rev ( dst, src, m_thisframe.size().width(), m_bytes_per_line_frame );
232 src += m_bytes_per_pixel; 247 src += m_bytes_per_pixel;
233 break; 248 break;
234 default: 249 default:
235 break; 250 break;
236 } 251 }
237 dst += m_bytes_per_line_fb; 252 dst += m_bytes_per_line_fb;
238 } 253 }
239 } 254 }
240 } 255 }
241} 256}
242 257
243QImage *XineVideoWidget::logo ( ) const 258QImage *XineVideoWidget::logo ( ) const
244{ 259{
245 return m_logo; 260 return m_logo;
246} 261}
247 262
248 263
249void XineVideoWidget::setLogo ( QImage* logo ) 264void XineVideoWidget::setLogo ( QImage* logo )
250{ 265{
251 delete m_logo; 266 delete m_logo;
252 m_logo = logo; 267 m_logo = logo;
253} 268}
254 269
255void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl ) 270void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl )
256{ 271{
257 // mutex area for AutoLock 272 // mutex area for AutoLock
258 { 273 {
259#if 0 274#if 0
260 ThreadUtil::AutoLock a(m_bufmutex); 275 ThreadUtil::AutoLock a(m_bufmutex);
261#endif 276#endif
262 if (!isVisible()||w>width()||h>height()/*||m_bufmutex.isLocked()*/) { 277 if (!isVisible()||w>width()||h>height()/*||m_bufmutex.isLocked()*/) {
263 //drop frame 278 //drop frame
264 return; 279 return;
265 } 280 }
266 bool rot90 = (( -m_rotation ) & 1 ); 281 bool rot90 = (( -m_rotation ) & 1 );
267 int l = h*bpl; 282 int l = h*bpl;
283#if 0
268 if (l!=m_lastsize) { 284 if (l!=m_lastsize) {
269 if (m_buff) { 285 if (m_buff) {
270 delete[]m_buff; 286 delete[]m_buff;
271 } 287 }
272 if (l>0) { 288 if (l>0) {
273 m_buff = new uchar[l]; 289 m_buff = new uchar[l];
274 odebug << "Point to: " << (unsigned long)m_buff << oendl; 290 odebug << "Point to: " << (unsigned long)m_buff << oendl;
275 m_lastsize=l; 291 m_lastsize=l;
276 } else { 292 } else {
277 m_buff = 0; 293 m_buff = 0;
278 } 294 }
279 } 295 }
296#endif
280 m_lastsize = l; 297 m_lastsize = l;
281 m_framesize = QSize(w,h); 298 m_framesize = QSize(w,h);
299#if 0
282 if (m_buff && m_lastsize) { 300 if (m_buff && m_lastsize) {
283 memcpy(m_buff,img,m_lastsize); 301 memcpy(m_buff,img,m_lastsize);
284 } 302 }
303#endif
304 m_buff = img;
285 m_bytes_per_line_frame = bpl; 305 m_bytes_per_line_frame = bpl;
286 if (m_buff) paintEvent2(0); 306 if (m_buff) paintEvent2(0);
287 } // Release Mutex 307 } // Release Mutex
288} 308}
289 309
290void XineVideoWidget::resizeEvent ( QResizeEvent * ) 310void XineVideoWidget::resizeEvent ( QResizeEvent * )
291{ 311{
292#if 0 312#if 0
293 ThreadUtil::AutoLock a(m_bufmutex); 313 ThreadUtil::AutoLock a(m_bufmutex);
294#endif 314#endif
295 emit videoResized( videoSize() ); 315 emit videoResized( videoSize() );
296 odebug << "All resize done" << oendl; 316 odebug << "All resize done" << oendl;
297} 317}
298 318
299 319
300void XineVideoWidget::mouseReleaseEvent ( QMouseEvent * /*me*/ ) 320void XineVideoWidget::mouseReleaseEvent ( QMouseEvent * /*me*/ )
301{ 321{
302 emit clicked(); 322 emit clicked();
303} 323}
304 324
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h
index a0ec5bc..f240b1c 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.h
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.h
@@ -5,77 +5,80 @@
5 Copyright (c) 2002 Max Reiss <harlekin@handhelds.org> 5 Copyright (c) 2002 Max Reiss <harlekin@handhelds.org>
6 Copyright (c) 2002 L. Potter <ljp@llornkcor.com> 6 Copyright (c) 2002 L. Potter <ljp@llornkcor.com>
7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> 7 Copyright (c) 2002 Holger Freyther <zecke@handhelds.org>
8 =. 8 =.
9 .=l. 9 .=l.
10 .>+-= 10 .>+-=
11 _;:, .> :=|. This program is free software; you can 11 _;:, .> :=|. This program is free software; you can
12.> <`_, > . <= redistribute it and/or modify it under 12.> <`_, > . <= redistribute it and/or modify it under
13:`=1 )Y*s>-.-- : the terms of the GNU General Public 13:`=1 )Y*s>-.-- : the terms of the GNU General Public
14.="- .-=="i, .._ License as published by the Free Software 14.="- .-=="i, .._ License as published by the Free Software
15 - . .-<_> .<> Foundation; either version 2 of the License, 15 - . .-<_> .<> Foundation; either version 2 of the License,
16 ._= =} : or (at your option) any later version. 16 ._= =} : or (at your option) any later version.
17 .%`+i> _;_. 17 .%`+i> _;_.
18 .i_,=:_. -<s. This program is distributed in the hope that 18 .i_,=:_. -<s. This program is distributed in the hope that
19 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 19 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
20 : .. .:, . . . without even the implied warranty of 20 : .. .:, . . . without even the implied warranty of
21 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 21 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
22 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 22 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
23..}^=.= = ; Library General Public License for more 23..}^=.= = ; Library General Public License for more
24++= -. .` .: details. 24++= -. .` .: details.
25 : = ...= . :.=- 25 : = ...= . :.=-
26 -. .:....=;==+<; You should have received a copy of the GNU 26 -. .:....=;==+<; You should have received a copy of the GNU
27 -_. . . )=. = Library General Public License along with 27 -_. . . )=. = Library General Public License along with
28 -- :-=` this library; see the file COPYING.LIB. 28 -- :-=` this library; see the file COPYING.LIB.
29 If not, write to the Free Software Foundation, 29 If not, write to the Free Software Foundation,
30 Inc., 59 Temple Place - Suite 330, 30 Inc., 59 Temple Place - Suite 330,
31 Boston, MA 02111-1307, USA. 31 Boston, MA 02111-1307, USA.
32 32
33*/ 33*/
34 34
35 35
36#include <qwidget.h> 36#include <qwidget.h>
37#include <qrect.h>
37 38
38#include "lib.h" 39#include "lib.h"
39 40
40class QImage; 41class QImage;
41 42
42 43
43class XineVideoWidget : public QWidget { 44class XineVideoWidget : public QWidget {
44 Q_OBJECT 45 Q_OBJECT
45 46
46public: 47public:
47 XineVideoWidget ( QWidget* parent, const char* name ); 48 XineVideoWidget ( QWidget* parent, const char* name );
48 ~XineVideoWidget ( ); 49 ~XineVideoWidget ( );
49 QImage *logo ( ) const; 50 QImage *logo ( ) const;
50 void setLogo ( QImage *image ); 51 void setLogo ( QImage *image );
51 void setVideoFrame ( uchar *image, int width, int height, int linestep ); 52 void setVideoFrame ( uchar *image, int width, int height, int linestep );
52 void clear ( ); 53 void clear ( );
53 54
54 QSize videoSize() const; 55 QSize videoSize() const;
55 56
56protected: 57protected:
57 void paintEvent2( QPaintEvent *p ); 58 void paintEvent2( QPaintEvent *p );
58 virtual void paintEvent(QPaintEvent*); 59 virtual void paintEvent(QPaintEvent*);
59 virtual void resizeEvent ( QResizeEvent *r ); 60 virtual void resizeEvent ( QResizeEvent *r );
61 QRect old_framerect;
62 QSize old_size;
60 63
61 void mouseReleaseEvent ( QMouseEvent *e ); 64 void mouseReleaseEvent ( QMouseEvent *e );
62 65
63signals: 66signals:
64 void clicked ( ); 67 void clicked ( );
65 void videoResized ( const QSize &s ); 68 void videoResized ( const QSize &s );
66 69
67private: 70private:
68 QRect m_lastframe; 71 QRect m_lastframe;
69 QRect m_thisframe; 72 QRect m_thisframe;
70 73
71 uchar *m_buff; 74 uchar *m_buff;
72 int m_bytes_per_line_fb; 75 int m_bytes_per_line_fb;
73 int m_bytes_per_line_frame; 76 int m_bytes_per_line_frame;
74 int m_bytes_per_pixel; 77 int m_bytes_per_pixel;
75 int m_lastsize; 78 int m_lastsize;
76 QSize m_framesize; 79 QSize m_framesize;
77 QImage *m_logo; 80 QImage *m_logo;
78 mutable int m_rotation; 81 mutable int m_rotation;
79 ThreadUtil::Mutex m_bufmutex; 82 ThreadUtil::Mutex m_bufmutex;
80}; 83};
81 84