亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? qvfbview.cpp

?? linux下 minigui用的 qvfb 1.1插件
?? CPP
字號:
/******************************************************************************** Qt/Embedded virtual framebuffer**** Created : 20000605**** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.**** This file is part of the Qt GUI Toolkit.**** Licensees holding valid Qt Professional Edition licenses may use this** file in accordance with the Qt Professional Edition License Agreement** provided with the Qt Professional Edition.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for** information about the Professional Edition licensing.*******************************************************************************/#include "qvfbview.h"#include "qvfbhdr.h"#define QTE_PIPE "QtEmbedded-%1"#include <qapplication.h>#include <qimage.h>#include <qbitmap.h>#include <qtimer.h>#include <qwmatrix.h>#include <qpainter.h>#include "qanimationwriter.h"#include <stdlib.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/types.h>#include <sys/shm.h>#include <sys/stat.h>#include <sys/sem.h>#include <fcntl.h>#include <errno.h>#include <math.h>QVFbView::QVFbView( int display_id, int w, int h, int d, QWidget *parent,		    const char *name, uint flags )    : QScrollView( parent, name, flags ), lockId(-1){    displayid = display_id;    viewport()->setMouseTracking( TRUE );    viewport()->setFocusPolicy( StrongFocus );    zm = 1;    animation = 0;    int actualdepth=d;    switch ( d ) {	case 12:	    actualdepth=16;	    break;	case 1:	case 4:	case 8:	case 16:	case 32:	    break;		default:	    qFatal( "Unsupported bit depth %d\n", d );    }    mousePipe = QString(QT_VFB_MOUSE_PIPE).arg(display_id);    keyboardPipe = QString(QT_VFB_KEYBOARD_PIPE).arg(display_id);    unlink( mousePipe.latin1() );    mkfifo( mousePipe.latin1(), 0666 );         mouseFd = open( mousePipe.latin1(), O_RDWR | O_NDELAY );    if ( mouseFd == -1 ) {	qFatal( "Cannot open mouse pipe" );    }    unlink( keyboardPipe );    mkfifo( keyboardPipe, 0666 );    keyboardFd = open( keyboardPipe, O_RDWR | O_NDELAY );    if ( keyboardFd == -1 ) {	qFatal( "Cannot open keyboard pipe" );    }    key_t key = ftok( mousePipe.latin1(), 'b' );    int bpl;    if ( d == 1 )	bpl = (w*d+7)/8;    else	bpl = ((w*actualdepth+31)/32)*4;        int dataSize = bpl * h + 2048;    shmId = shmget( key, dataSize, IPC_CREAT|0666);    if ( shmId != -1 )	data = (unsigned char *)shmat( shmId, 0, 0 );    else {	struct shmid_ds shm;	shmctl( shmId, IPC_RMID, &shm );	shmId = shmget( key, dataSize, IPC_CREAT|0666);	data = (unsigned char *)shmat( shmId, 0, 0 );    }    if ( (int)data == -1 )	qFatal( "Cannot attach to shared memory" );    hdr = (QVFbHeader *)data;    hdr->width = w;    hdr->height = h;    viewdepth = d;    hdr->depth = actualdepth;    hdr->linestep = bpl;    hdr->numcols = 0;    hdr->dataoffset = 2048;    hdr->update = QRect();    resizeContents( w, h );    timer = new QTimer( this );    connect( timer, SIGNAL(timeout()), this, SLOT(timeout()) );    gammatable=0;    setGamma(1.0,1.0,1.0);    setRate( 30 );}QVFbView::~QVFbView(){    stopAnimation();    sendKeyboardData( 0, 0, 0, TRUE, FALSE ); // magic die key    struct shmid_ds shm;    shmdt( (char*)data );    shmctl( shmId, IPC_RMID, &shm );    ::close( mouseFd );    ::close( keyboardFd );    unlink( mousePipe );    unlink( keyboardPipe );}void QVFbView::setGamma(double gr, double gg, double gb){    if ( viewdepth < 12 )	return; // not implemented    gred=gr; ggreen=gg; gblue=gb;    switch ( viewdepth ) {      case 12:	rsh = 12;	gsh = 7;	bsh = 1;	rmax = 15;	gmax = 15;	bmax = 15;	break;      case 16:	rsh = 11;	gsh = 5;	bsh = 0;	rmax = 31;	gmax = 63;	bmax = 31;	break;      case 32:	rsh = 16;	gsh = 8;	bsh = 0;	rmax = 255;	gmax = 255;	bmax = 255;    }    int mm = QMAX(rmax,QMAX(gmax,bmax))+1;    if ( gammatable )	delete [] gammatable;    gammatable = new QRgb[mm];    for (int i=0; i<mm; i++) {	int r = int(pow(i,gr)*255/rmax);	int g = int(pow(i,gg)*255/gmax);	int b = int(pow(i,gb)*255/bmax);	if ( r > 255 ) r = 255;	if ( g > 255 ) g = 255;	if ( b > 255 ) b = 255;	gammatable[i] = qRgb(r,g,b);//qDebug("%d: %d,%d,%d",i,r,g,b);    }    setDirty(rect());}void QVFbView::getGamma(int i, QRgb& rgb){    if ( i > 255 ) i = 255;    if ( i < 0 ) i = 0;    rgb = qRgb(qRed(gammatable[i*rmax/255]),               qGreen(gammatable[i*rmax/255]),               qBlue(gammatable[i*rmax/255]));}int QVFbView::displayId() const{    return displayid;}int QVFbView::displayWidth() const{    return hdr->width;}int QVFbView::displayHeight() const{    return hdr->height;}int QVFbView::displayDepth() const{    return viewdepth;}void QVFbView::setZoom( double z ){    if ( zm != z ) {	zm = z;	setDirty(QRect(0,0,hdr->width,hdr->height));	resizeContents( int(hdr->width*z), int(hdr->height*z) );	updateGeometry();	qApp->sendPostedEvents();	topLevelWidget()->adjustSize();	drawScreen();    }}void QVFbView::setRate( int r ){    refreshRate = r;    timer->start( 1000/r );}void QVFbView::initLock(){    QString username = "unknown";    const char *logname = getenv("LOGNAME");    if ( logname )	username = logname;    QString dataDir = "/tmp/qtembedded-" + username;    QString pipe = dataDir + "/" + QString( QTE_PIPE ).arg( displayid );    int semkey = ftok( pipe.latin1(), 'd' );    lockId = semget( semkey, 0, 0 );}void QVFbView::lock(){    if ( lockId == -1 )	initLock();    sembuf sops;    sops.sem_num = 0;    sops.sem_flg = SEM_UNDO;    sops.sem_op = -1;    int rv;    do {	rv = semop(lockId,&sops,1);    } while ( rv == -1 && errno == EINTR );    if ( rv == -1 )	lockId = -1;}void QVFbView::unlock(){    if ( lockId >= 0 ) {	sembuf sops;	sops.sem_num = 0;	sops.sem_op = 1;	sops.sem_flg = SEM_UNDO;	int rv;	do {	    rv = semop(lockId,&sops,1);	} while ( rv == -1 && errno == EINTR );    }}void QVFbView::sendMouseData( const QPoint &pos, int buttons ){    write( mouseFd, &pos, sizeof( QPoint ) );    write( mouseFd, &buttons, sizeof( int ) );}void QVFbView::sendKeyboardData( int unicode, int keycode, int modifiers,				 bool press, bool repeat ){    QVFbKeyData kd;    kd.unicode = unicode | (keycode << 16);    kd.modifiers = modifiers;    kd.press = press;    kd.repeat = repeat;    write( keyboardFd, &kd, sizeof( QVFbKeyData ) );}void QVFbView::timeout(){    lock();    if ( animation ) {	    QRect r( hdr->update );	    r = r.intersect( QRect(0, 0, hdr->width, hdr->height ) );	    if ( r.isEmpty() ) {		animation->appendBlankFrame();	    } else {		int l;		QImage img = getBuffer( r, l );		animation->appendFrame(img,QPoint(r.x(),r.y()));	    }    }    if ( hdr->dirty ) {	drawScreen();    }    unlock();}QImage QVFbView::getBuffer( const QRect &r, int &leading ) const{    switch ( viewdepth ) {      case 12:      case 16: {	static unsigned char *imgData = 0;	if ( !imgData ) {	    int bpl = ((hdr->width*32+31)/32)*4;	    imgData = new unsigned char [ bpl * hdr->height ];	}	QImage img( imgData, r.width(), r.height(), 32, 0, 0, QImage::IgnoreEndian );	const int rsh = viewdepth == 12 ? 12 : 11;	const int gsh = viewdepth == 12 ? 7 : 5;	const int bsh = viewdepth == 12 ? 1 : 0;	const int rmax = viewdepth == 12 ? 15 : 31;	const int gmax = viewdepth == 12 ? 15 : 63;	const int bmax = viewdepth == 12 ? 15 : 31;	for ( int row = 0; row < r.height(); row++ ) {	    QRgb *dptr = (QRgb*)img.scanLine( row );	    ushort *sptr = (ushort*)(data + hdr->dataoffset + (r.y()+row)*hdr->linestep);	    sptr += r.x();	    for ( int col=0; col < r.width(); col++ ) {		ushort s = *sptr++;		*dptr++ = qRgb(qRed(gammatable[(s>>rsh)&rmax]),qGreen(gammatable[(s>>gsh)&gmax]),qBlue(gammatable[(s>>bsh)&bmax]));		//*dptr++ = qRgb(((s>>rsh)&rmax)*255/rmax,((s>>gsh)&gmax)*255/gmax,((s>>bsh)&bmax)*255/bmax);	    }	}	leading = 0;	return img;      }      case 4: {	static unsigned char *imgData = 0;	if ( !imgData ) {	    int bpl = ((hdr->width*8+31)/32)*4;	    imgData = new unsigned char [ bpl * hdr->height ];	}	QImage img( imgData, r.width(), r.height(), 8, hdr->clut, 16,		    QImage::IgnoreEndian );	for ( int row = 0; row < r.height(); row++ ) {	    unsigned char *dptr = img.scanLine( row );	    unsigned char *sptr = data + hdr->dataoffset + (r.y()+row)*hdr->linestep;	    sptr += r.x()/2;	    int col = 0;	    if ( r.x() & 1 ) {		*dptr++ = *sptr++ >> 4;		col++;	    }	    for ( ; col < r.width()-1; col+=2 ) {		unsigned char s = *sptr++;		*dptr++ = s & 0x0f;		*dptr++ = s >> 4;	    }	    if ( !(r.right() & 1) )		*dptr = *sptr & 0x0f;	}	leading = 0;	return img;      }      case 32: {	leading = r.x();	return QImage( data + hdr->dataoffset + r.y() * hdr->linestep,		    hdr->width, r.height(), hdr->depth, 0,		    0, QImage::LittleEndian );      }      case 8: {	leading = r.x();	return QImage( data + hdr->dataoffset + r.y() * hdr->linestep,		    hdr->width, r.height(), hdr->depth, hdr->clut,		    256, QImage::LittleEndian );      }      case 1: {	leading = r.x();	return QImage( data + hdr->dataoffset + r.y() * hdr->linestep,		    hdr->width, r.height(), hdr->depth, hdr->clut,		    0, QImage::LittleEndian );      }    }    return QImage();}void QVFbView::drawScreen(){    QPainter p( viewport() );    p.translate( -contentsX(), -contentsY() );    lock();    QRect r( hdr->update );    hdr->dirty = FALSE;    hdr->update = QRect();    // qDebug( "update %d, %d, %dx%d", r.y(), r.x(), r.width(), r.height() );    r = r.intersect( QRect(0, 0, hdr->width, hdr->height ) );    if ( !r.isEmpty() )  {	if ( int(zm) != zm ) {	    r.rLeft() = int(int(r.left()*zm)/zm);	    r.rTop() = int(int(r.top()*zm)/zm);	    r.rRight() = int(int(r.right()*zm+zm+0.0000001)/zm+1.9999);	    r.rBottom() = int(int(r.bottom()*zm+zm+0.0000001)/zm+1.9999);	    r.rRight() = QMIN(r.right(),hdr->width-1);	    r.rBottom() = QMIN(r.bottom(),hdr->height-1);	}	int leading;	QImage img( getBuffer( r, leading ) );	QPixmap pm;	if ( zm == 1 ) {	    pm.convertFromImage( img );	} else if ( int(zm) == zm ) {	    QWMatrix m;	    m.scale(zm,zm);	    pm.convertFromImage( img );	    pm = pm.xForm(m);	} else {	    pm.convertFromImage( img.smoothScale(int(img.width()*zm),int(img.height()*zm)) );	}	unlock();	p.setPen( black );	p.setBrush( white );	p.drawPixmap( int(r.x()*zm), int(r.y()*zm), pm,			int(leading*zm), 0, pm.width(), pm.height() );    } else {	unlock();    }}bool QVFbView::eventFilter( QObject *obj, QEvent *e ){    if ( obj == viewport() &&	 (e->type() == QEvent::FocusIn || e->type() == QEvent::FocusOut) )	return TRUE;    return QScrollView::eventFilter( obj, e );}void QVFbView::viewportPaintEvent( QPaintEvent *pe ){    QRect r( pe->rect() );    r.moveBy( contentsX(), contentsY() );    r = QRect(int(r.x()/zm),int(r.y()/zm),	    int(r.width()/zm)+1,int(r.height()/zm)+1);    setDirty(r);    drawScreen();}void QVFbView::setDirty( const QRect& r ){    lock();    hdr->update |= r;    hdr->dirty = TRUE;    unlock();}void QVFbView::contentsMousePressEvent( QMouseEvent *e ){    sendMouseData( e->pos()/zm, e->stateAfter() );}void QVFbView::contentsMouseDoubleClickEvent( QMouseEvent *e ){    sendMouseData( e->pos()/zm, e->stateAfter() );}void QVFbView::contentsMouseReleaseEvent( QMouseEvent *e ){    sendMouseData( e->pos()/zm, e->stateAfter() );}void QVFbView::contentsMouseMoveEvent( QMouseEvent *e ){    sendMouseData( e->pos()/zm, e->state() );}void QVFbView::keyPressEvent( QKeyEvent *e ){    sendKeyboardData(e->text()[0].unicode(), e->key(), 		     e->state()&(ShiftButton|ControlButton|AltButton),		     TRUE, e->isAutoRepeat());}void QVFbView::keyReleaseEvent( QKeyEvent *e ){    sendKeyboardData(e->ascii(), e->key(), 		     e->state()&(ShiftButton|ControlButton|AltButton),		     FALSE, e->isAutoRepeat());}QImage QVFbView::image() const{    ((QVFbView*)this)->lock();    int l;    QImage r = getBuffer( QRect(0, 0, hdr->width, hdr->height), l ).copy();    ((QVFbView*)this)->unlock();    return r;}void QVFbView::startAnimation( const QString& filename ){    delete animation;    animation = new QAnimationWriter(filename,"MNG");    animation->setFrameRate(refreshRate);    animation->appendFrame(QImage(data + hdr->dataoffset,                hdr->width, hdr->height, hdr->depth, hdr->clut,                256, QImage::LittleEndian));}void QVFbView::stopAnimation(){    delete animation;    animation = 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本一区二区| 亚洲国产美女搞黄色| 在线观看免费亚洲| 精品一区二区av| 亚洲午夜视频在线| 国产精品天天看| 精品日韩欧美一区二区| 欧美在线色视频| 99久久久无码国产精品| 九色|91porny| 日本中文在线一区| 亚洲一区二区三区视频在线播放| 久久久精品综合| 日韩一区二区三区四区五区六区| 91成人免费在线视频| 国产91在线观看| 国产精品一区二区视频| 日韩av成人高清| 亚洲电影第三页| 亚洲日本韩国一区| 中文字幕日韩av资源站| 欧美精品一区二| 在线综合亚洲欧美在线视频| 色呦呦国产精品| 99在线热播精品免费| 国产成人啪午夜精品网站男同| 青青草97国产精品免费观看无弹窗版 | 亚洲一区二区在线视频| 欧美激情艳妇裸体舞| 日韩欧美在线影院| 91麻豆精品国产91久久久资源速度 | 91精品在线免费| 欧美这里有精品| 欧美色爱综合网| 色噜噜狠狠色综合欧洲selulu| 成人动漫av在线| 成人免费不卡视频| av不卡在线播放| 9色porny自拍视频一区二区| 成人午夜激情在线| voyeur盗摄精品| 成人av电影在线网| 99久久久国产精品免费蜜臀| 99精品国产91久久久久久| 成人sese在线| 色偷偷久久一区二区三区| 99精品视频中文字幕| 91丨porny丨最新| 色婷婷综合视频在线观看| 色香蕉久久蜜桃| 欧美日韩第一区日日骚| 91精品国产欧美一区二区成人| 日韩欧美亚洲另类制服综合在线| 欧美一区二区三区视频免费 | 午夜久久电影网| 美女在线观看视频一区二区| 欧美bbbbb| 国产jizzjizz一区二区| av电影在线观看完整版一区二区| 色老汉一区二区三区| 欧美乱熟臀69xxxxxx| 日韩免费在线观看| 欧美激情在线一区二区三区| 国产精品久久久久久久久免费丝袜 | 欧美日韩精品一区二区| 日韩三级在线免费观看| 久久影院视频免费| 一区二区中文字幕在线| 一区二区三区在线免费| 日韩中文字幕1| 国产精品99久久久久久久vr| 色综合色狠狠天天综合色| 欧美日韩高清一区二区三区| 精品免费日韩av| 亚洲人成精品久久久久| 午夜视频一区二区三区| 国产一区二区不卡在线| 色综合久久中文字幕综合网| 欧美电影一区二区三区| 国产精品少妇自拍| 爽好久久久欧美精品| 国产成人免费在线观看不卡| 欧美亚洲图片小说| 国产丝袜在线精品| 午夜av电影一区| 粉嫩在线一区二区三区视频| 欧美三级电影一区| 国产日本欧洲亚洲| 午夜电影一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 欧美日韩一区二区三区视频| wwwwww.欧美系列| 亚洲国产wwwccc36天堂| 国产伦精品一区二区三区免费迷 | 56国语精品自产拍在线观看| 久久久久久免费网| 日韩精品乱码免费| 91婷婷韩国欧美一区二区| 精品成人在线观看| 图片区小说区区亚洲影院| 成人免费视频视频在线观看免费| 91精品国产综合久久香蕉麻豆| 国产精品超碰97尤物18| 蜜桃精品视频在线观看| 91成人免费电影| 国产精品久久久久久久久图文区 | 视频在线观看国产精品| 91天堂素人约啪| 国产欧美视频一区二区| 视频一区欧美日韩| 欧美亚洲高清一区二区三区不卡| 日本一区二区视频在线| 精品一区二区免费在线观看| 欧美精品在线一区二区三区| 亚洲激情一二三区| 91色porny在线视频| 国产精品日日摸夜夜摸av| 精品在线播放免费| 欧美一区二区福利视频| 午夜av一区二区三区| 欧美调教femdomvk| 亚洲一区二区欧美日韩| 91影院在线观看| 国产精品网站导航| 成人精品视频一区二区三区尤物| 精品嫩草影院久久| 韩国一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲| 麻豆91小视频| 日韩欧美国产午夜精品| 日本不卡视频在线观看| 欧美精品自拍偷拍| 日本不卡免费在线视频| 日韩午夜激情av| 免费不卡在线观看| 精品国产乱码91久久久久久网站| 日本麻豆一区二区三区视频| 欧美一区二区在线观看| 乱中年女人伦av一区二区| 91精品国产综合久久精品图片| 日韩avvvv在线播放| 日韩情涩欧美日韩视频| 黄页网站大全一区二区| 久久夜色精品国产欧美乱极品| 国产精品系列在线播放| 国产精品久久久久久久久快鸭| 97精品超碰一区二区三区| 亚洲免费伊人电影| 欧美日本韩国一区| 久久av中文字幕片| 中文字幕av不卡| 色综合天天综合色综合av| 亚洲一区二区不卡免费| 欧美一区二区三区四区视频| 久久精品国产亚洲a| 久久色.com| 不卡的av在线| 午夜成人在线视频| 精品99一区二区三区| 成人免费三级在线| 亚洲一区二区三区四区在线 | 午夜私人影院久久久久| 日韩欧美色综合网站| 国产成人福利片| 亚洲黄色小说网站| 欧美一区二区三区男人的天堂| 国产一区二区视频在线| 国产精品美日韩| 欧美色网站导航| 国模无码大尺度一区二区三区| 国产精品伦一区二区三级视频| 91麻豆swag| 麻豆91精品91久久久的内涵| 国产精品免费视频观看| 欧美绝品在线观看成人午夜影视| 国产精品白丝jk黑袜喷水| 亚洲黄色小说网站| 2023国产精品| 欧美性色欧美a在线播放| 久草在线在线精品观看| 日韩一区中文字幕| 精品剧情在线观看| 91久久精品一区二区三| 久久成人免费网| 亚洲最大的成人av| 久久久电影一区二区三区| 欧洲一区在线观看| 丰满岳乱妇一区二区三区| 丝袜美腿高跟呻吟高潮一区| 国产精品美女www爽爽爽| 91精品中文字幕一区二区三区| 99国产精品99久久久久久| 久久国产精品99精品国产| 亚洲精品日韩专区silk| 久久久久97国产精华液好用吗| 欧美精品一二三四| 972aa.com艺术欧美| 国产一区二区三区免费播放| 无码av中文一区二区三区桃花岛| 综合自拍亚洲综合图不卡区|