Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

krfbbuffer.cpp

Go to the documentation of this file.
00001 #include "krfbdecoder.h"
00002 #include "krfbbuffer.h"
00003 #include "krfbconnection.h"
00004 #include "krfbserverinfo.h"
00005 
00006 /* OPIE */
00007 #include <opie2/odebug.h>
00008 using namespace Opie::Core;
00009 
00010 /* QT */
00011 #include <qimage.h>
00012 #include <qpainter.h>
00013 #include <qapplication.h>
00014 
00015 /* STD */
00016 #include <assert.h>
00017 
00018 //
00019 // Endian stuff
00020 //
00021 // #ifndef OPIE_NO_DEBUG
00022 const int endianTest = 1;
00023 // #endif
00024 
00025 #define Swap16IfLE(s) \
00026     (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s))
00027 
00028 #define Swap32IfLE(l) \
00029     (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \
00030                              (((l) & 0x00ff0000) >> 8)  | \
00031                              (((l) & 0x0000ff00) << 8)  | \
00032                              (((l) & 0x000000ff) << 24))  : (l))
00033 
00034 KRFBBuffer::KRFBBuffer( KRFBDecoder *decoder,
00035                         QObject *parent, const char *name )
00036   : QObject( parent, name )
00037 {
00038   assert( decoder );
00039   this->decoder = decoder;
00040   pix = new QPixmap();
00041 }
00042 
00043 KRFBBuffer::~KRFBBuffer()
00044 {
00045   delete pix;
00046 }
00047 
00048 void KRFBBuffer::resize( int w, int h )
00049 {
00050   owarn << "Resizing buffer" << oendl; 
00051 
00052   pix->resize( w, h );
00053   
00054   QPalette pal = qApp->palette();
00055   pix->fill( pal.active().base() );
00056 
00057   emit sizeChanged( w, h );
00058 }
00059 
00060 void KRFBBuffer::soundBell()
00061 {
00062   emit bell();
00063 }
00064 
00065 void KRFBBuffer::mouseEvent( QMouseEvent *e )
00066 {
00067   decoder->sendMouseEvent( e );
00068 }
00069 
00070 void KRFBBuffer::keyPressEvent( QKeyEvent *e )
00071 {
00072     owarn << "Buffer got a key" << oendl; 
00073 
00074   decoder->sendKeyPressEvent( e );
00075 }
00076 
00077 void KRFBBuffer::keyReleaseEvent( QKeyEvent *e )
00078 {
00079   decoder->sendKeyReleaseEvent( e );
00080 }
00081 
00082 void KRFBBuffer::copyRect( int srcX, int srcY,
00083                            int destX, int destY, int w, int h )
00084 {
00085 //  owarn << "Got copy rect" << oendl; 
00086   bitBlt( pix, destX, destY, pix, srcX, srcY, w, h, CopyROP );
00087 
00088   emit updated( destX, destY, w, h );
00089 }
00090 
00091 void KRFBBuffer::drawRawRectChunk( void *data,
00092                                    int x, int y, int w, int h )
00093 {
00094   QImage img( w, h, 32 );
00095 
00096         int scaleFactor=decoder->con->options()->scaleFactor;
00097   int redMax = Swap16IfLE( decoder->format->redMax );
00098   int greenMax = Swap16IfLE( decoder->format->greenMax );
00099   int blueMax = Swap16IfLE( decoder->format->blueMax );
00100 
00101   QPainter p( pix );
00102 
00103   if ( decoder->format->bpp == 8 ) {
00104     uchar *d = (unsigned char *) data;
00105 
00106     uint r,g,b;
00107 
00108                 
00109     for ( int j = 0; j < h; j++) {
00110       for ( int i = 0; i < w ; i++ ) {
00111         r = d[ j * w + i ];
00112         r = r >> decoder->format->redShift;
00113         r = r & redMax;
00114 
00115         g = d[ j * w + i ];
00116         g = g >> decoder->format->greenShift;
00117         g = g & greenMax;
00118 
00119         b = d[ j * w + i ];
00120         b = b >> decoder->format->blueShift;
00121         b = b & blueMax;
00122 
00123         r = ( r * 255 ) / redMax;
00124         g = ( g * 255 ) / greenMax;
00125         b = ( b * 255 ) / blueMax;
00126 
00127         uint *p = ( uint * ) img.scanLine( j ) + i;
00128         *p = qRgb( r,g,b );
00129       }
00130     }
00131   }
00132   else if ( decoder->format->bpp == 32 ) {
00133     ulong *d = (ulong *) data;
00134 
00135     ulong r,g,b;
00136 
00137     for ( int j = 0; j < h; j++ ) {
00138       for ( int i = 0; i < w ; i++ ) {
00139         ulong pixel = d[ j * w + i ];
00140         pixel = Swap32IfLE( pixel );
00141 
00142         r = pixel;
00143         r = r >> decoder->format->redShift;
00144         r = r & redMax;
00145 
00146         g = pixel;
00147         g = g >> decoder->format->greenShift;
00148         g = g & greenMax;
00149 
00150         b = pixel;
00151         b = b >> decoder->format->blueShift;
00152         b = b & blueMax;
00153 
00154         r = ( r * 255 ) / redMax;
00155         g = ( g * 255 ) / greenMax;
00156         b = ( b * 255 ) / blueMax;
00157 
00158         uint *p = ( uint * ) img.scanLine( j ) + i;
00159         *p = qRgb( r,g,b );
00160       }
00161     }
00162   } else if (decoder->format->bpp == 16 ) {
00163 
00164                                 CARD16 *d = (CARD16 *) data;
00165 
00166                                 uint r,g,b;
00167 
00168                                 for ( int j = 0; j < h; j++ ) {
00169                                                 for ( int i = 0; i < w ; i++ ) {
00170                                                                 CARD16 pixel = d[ j * w + i ];
00171                                                                 pixel = Swap16IfLE( pixel );
00172 
00173                                                                 r = pixel;
00174                                                                 r = r >> decoder->format->redShift;
00175                                                                 r = r & redMax;
00176 
00177                                                                 g = pixel;
00178                                                                 g = g >> decoder->format->greenShift;
00179                                                                 g = g & greenMax;
00180 
00181                                                                 b = pixel;
00182                                                                 b = b >> decoder->format->blueShift;
00183                                                                 b = b & blueMax;
00184 
00185                                                                 r = ( r * 255 ) / redMax;
00186                                                                 g = ( g * 255 ) / greenMax;
00187                                                                 b = ( b * 255 ) / blueMax;
00188 
00189                                                                 ulong *p = ( ulong * ) img.scanLine( j ) + i;
00190                                                                 *p = qRgb( r,g,b );
00191                                                 }
00192                                 }
00193                 }
00194   else {
00195     p.setBrush( QBrush( Qt::black ) );
00196     p.drawRect( x, y, w, h );
00197   }
00198 
00199         if (scaleFactor > 1) {
00200                  /* FIXME: proper zero width/height handling */
00201                  if (w/scaleFactor != 0)
00202                         p.drawImage( x/scaleFactor, y/scaleFactor, img.smoothScale(w/scaleFactor,h/scaleFactor) );
00203                  emit updated( x/scaleFactor, y/scaleFactor, w/scaleFactor, h/scaleFactor );
00204         } 
00205         else {
00206                  p.drawImage( x, y, img);
00207                  emit updated( x, y, w, h );
00208         }
00209 }
00210 

Generated on Sat Nov 5 16:17:16 2005 for OPIE by  doxygen 1.4.2