author | alwin <alwin> | 2005-04-13 12:55:44 (UTC) |
---|---|---|
committer | alwin <alwin> | 2005-04-13 12:55:44 (UTC) |
commit | cb10570b4118161a066b741c2674d8d522670623 (patch) (unidiff) | |
tree | 149a5c77bc252443efe658e61717e47cee786f59 | |
parent | be565a8eb0c602e5173b71cf71ba510a7a7f4520 (diff) | |
download | opie-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
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.cpp | 24 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.h | 3 |
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 | |||
@@ -95,82 +95,85 @@ static inline void memcpy_step ( void *_dst, void *_src, size_t len, size_t step | |||
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 | ||
102 | static inline void memcpy_step_rev ( void *_dst, void *_src, size_t len, size_t step ) | 102 | static 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 | ||
118 | XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) | 118 | XineVideoWidget::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 | ||
132 | XineVideoWidget::~XineVideoWidget ( ) | 132 | XineVideoWidget::~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 | ||
145 | void XineVideoWidget::clear ( ) | 146 | void 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 | ||
156 | QSize XineVideoWidget::videoSize() const | 159 | QSize 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 | ||
171 | void XineVideoWidget::paintEvent ( QPaintEvent * ) | 174 | void 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 ); |
@@ -189,48 +192,60 @@ void XineVideoWidget::paintEvent2 ( QPaintEvent * ) | |||
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 | } |
@@ -244,61 +259,66 @@ QImage *XineVideoWidget::logo ( ) const | |||
244 | { | 259 | { |
245 | return m_logo; | 260 | return m_logo; |
246 | } | 261 | } |
247 | 262 | ||
248 | 263 | ||
249 | void XineVideoWidget::setLogo ( QImage* logo ) | 264 | void 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 | ||
255 | void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl ) | 270 | void 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 | ||
290 | void XineVideoWidget::resizeEvent ( QResizeEvent * ) | 310 | void 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 | ||
300 | void XineVideoWidget::mouseReleaseEvent ( QMouseEvent * /*me*/ ) | 320 | void 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 | |||
@@ -13,69 +13,72 @@ | |||
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 | ||
40 | class QImage; | 41 | class QImage; |
41 | 42 | ||
42 | 43 | ||
43 | class XineVideoWidget : public QWidget { | 44 | class XineVideoWidget : public QWidget { |
44 | Q_OBJECT | 45 | Q_OBJECT |
45 | 46 | ||
46 | public: | 47 | public: |
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 | ||
56 | protected: | 57 | protected: |
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 | ||
63 | signals: | 66 | signals: |
64 | void clicked ( ); | 67 | void clicked ( ); |
65 | void videoResized ( const QSize &s ); | 68 | void videoResized ( const QSize &s ); |
66 | 69 | ||
67 | private: | 70 | private: |
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 | ||