00001 #include "krfbdecoder.h"
00002 #include "krfbbuffer.h"
00003 #include "krfbconnection.h"
00004 #include "krfbserverinfo.h"
00005
00006
00007 #include <opie2/odebug.h>
00008 using namespace Opie::Core;
00009
00010
00011 #include <qimage.h>
00012 #include <qpainter.h>
00013 #include <qapplication.h>
00014
00015
00016 #include <assert.h>
00017
00018
00019
00020
00021
00022 const int endianTest = 1;
00023
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
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
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