author | zecke <zecke> | 2004-09-18 16:43:47 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-09-18 16:43:47 (UTC) |
commit | c81e90d0f6c0feec1443d711833ea382a1c10ec6 (patch) (side-by-side diff) | |
tree | 7390346761cfbceee0abccb51a80e30898f54f3b | |
parent | fa5c8471c3053dfc8d9742426faa569b3aa03d71 (diff) | |
download | opie-c81e90d0f6c0feec1443d711833ea382a1c10ec6.zip opie-c81e90d0f6c0feec1443d711833ea382a1c10ec6.tar.gz opie-c81e90d0f6c0feec1443d711833ea382a1c10ec6.tar.bz2 |
A proposal for making the memory copy functions build with g++3.4.2.
Please review the patch, specially the casts it makes, and also
the boundaries and sizes.
-Shouldn't we use unsigned char* instead of char*. For arm it is already unsigned?
-Check again the casts
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.cpp | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp index b55750a..15c611f 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp +++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp @@ -1,144 +1,172 @@ /* � � � � � � � � This file is part of the Opie Project Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> =. .=l. � � � � � �.>+-= �_;:, � � .> � �:=|. This program is free software; you can .> <`_, � > �. � <= redistribute it and/or modify it under :`=1 )Y*s>-.-- � : the terms of the GNU General Public .="- .-=="i, � � .._ License as published by the Free Software �- . � .-<_> � � .<> Foundation; either version 2 of the License, � � �._= =} � � � : or (at your option) any later version. � � .%`+i> � � � _;_. � � .i_,=:_. � � �-<s. This program is distributed in the hope that � � �+ �. �-:. � � � = it will be useful, but WITHOUT ANY WARRANTY; � � : .. � �.:, � � . . . without even the implied warranty of � � =_ � � � �+ � � =;=|` MERCHANTABILITY or FITNESS FOR A � _.=:. � � � : � �:=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= � � � = � � � ; Library General Public License for more ++= � -. � � .` � � .: details. �: � � = �...= . :.=- �-. � .:....=;==+<; You should have received a copy of the GNU � -_. . . � )=. �= Library General Public License along with � � -- � � � �:-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qimage.h> #include <qdirectpainter_qws.h> #include <qgfx_qws.h> #include <qsize.h> #include <qapplication.h> #include <qpe/resource.h> #include "xinevideowidget.h" // 0 deg rot: copy a line from src to dst (use libc memcpy) // 180 deg rot: copy a line from src to dst reversed -static inline void memcpy_rev ( void *dst, void *src, size_t len ) +/* + * This code relies the len be a multiply of 16bit + */ +static inline void memcpy_rev ( void *_dst, void *_src, size_t len ) { + /* + * move the source to the end + */ + char *src_c = static_cast<char*>(_src) + len; + + /* + * as we copy by 16bit and not 8bit + * devide the length by two + */ len >>= 1; - ((char *) src ) += ( len << 1 ); + short int* dst = static_cast<short int*>( _dst ); + short int* src = reinterpret_cast<short int*>( src_c ); + /* + * Increment dst after assigning + * Decrement src before assigning becase we move backwards + */ while ( len-- ) - *((short int *) dst )++ = *--((short int *) src ); + *dst++ = *--src; + } // 90 deg rot: copy a column from src to dst -static inline void memcpy_step ( void *dst, void *src, size_t len, size_t step ) +static inline void memcpy_step ( void *_dst, void *_src, size_t len, size_t step ) { + short int *dst = static_cast<short int*>( _dst ); + short int *src = static_cast<short int*>( _src ); + len >>= 1; + + /* + * Copy 16bit from src to dst and move to the next address + */ while ( len-- ) { - *((short int *) dst )++ = *((short int *) src ); - ((char *) src ) += step; + *dst++ = *src; + src = reinterpret_cast<short int*>(reinterpret_cast<char*>(src)+step); } } // 270 deg rot: copy a column from src to dst reversed -static inline void memcpy_step_rev ( void *dst, void *src, size_t len, size_t step ) +static inline void memcpy_step_rev ( void *_dst, void *_src, size_t len, size_t step ) { len >>= 1; - ((char *) src ) += ( len * step ); + char *src_c = static_cast<char*>( _src ) + (len*step); + short int* dst = static_cast<short int*>( _dst ); + short int* src = reinterpret_cast<short int*>( src_c ); while ( len-- ) { - ((char *) src ) -= step; - *((short int *) dst )++ = *((short int *) src ); + src_c -= step; + src = reinterpret_cast<short int*>( src_c ); + *dst++ = *src; } } XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name ) : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase ) { setBackgroundMode ( NoBackground ); m_logo = 0; m_buff = 0; m_bytes_per_line_fb = qt_screen-> linestep ( ); m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8; m_rotation = 0; } XineVideoWidget::~XineVideoWidget ( ) { delete m_logo; } void XineVideoWidget::clear ( ) { m_buff = 0; repaint ( false ); } QSize XineVideoWidget::videoSize() const { QSize s = size(); bool fs = ( s == qApp->desktop()->size() ); // if we are in fullscreen mode, do not rotate the video // (!! the paint routine uses m_rotation + qt_screen-> transformOrientation() !!) m_rotation = fs ? - qt_screen->transformOrientation() : 0; if ( fs && qt_screen->isTransformed() ) s = qt_screen->mapToDevice( s ); return s; } void XineVideoWidget::paintEvent ( QPaintEvent * ) { if ( m_buff == 0 ) { QPainter p ( this ); p. fillRect ( rect ( ), black ); if ( m_logo ) p. drawImage ( 0, 0, *m_logo ); } else { // Qt needs to be notified which areas were really updated .. strange QArray <QRect> qt_bug_workaround_clip_rects; { QDirectPainter dp ( this ); int rot = dp. transformOrientation ( ) + m_rotation; // device rotation + custom rotation uchar *fb = dp. frameBuffer ( ); uchar *frame = m_buff; // where is the video frame in fb coordinates |