mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 10:52:53 +00:00
115 lines
2.4 KiB
C++
115 lines
2.4 KiB
C++
/* This file is part of the KDE project
|
|
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include "qtframebuffer.h"
|
|
#include "moc_qtframebuffer.cpp"
|
|
|
|
#include <QTimer>
|
|
#include <QRegion>
|
|
#include <QPixmap>
|
|
#include <QBitmap>
|
|
|
|
|
|
const int UPDATE_TIME = 500;
|
|
|
|
QtFrameBuffer::QtFrameBuffer(WId id, QObject *parent)
|
|
: FrameBuffer(id, parent)
|
|
{
|
|
fbImage = QPixmap::grabWindow(win).toImage();
|
|
fb = new char[fbImage.byteCount()];
|
|
t = new QTimer(this);
|
|
connect(t, SIGNAL(timeout()), SLOT(updateFrameBuffer()));
|
|
}
|
|
|
|
|
|
QtFrameBuffer::~QtFrameBuffer()
|
|
{
|
|
delete [] fb;
|
|
fb = 0;
|
|
}
|
|
|
|
int QtFrameBuffer::depth()
|
|
{
|
|
return fbImage.depth();
|
|
}
|
|
|
|
int QtFrameBuffer::height()
|
|
{
|
|
return fbImage.height();
|
|
}
|
|
|
|
int QtFrameBuffer::width()
|
|
{
|
|
return fbImage.width();
|
|
}
|
|
|
|
void QtFrameBuffer::getServerFormat(rfbPixelFormat &format)
|
|
{
|
|
format.bitsPerPixel = 32;
|
|
format.depth = 32;
|
|
format.trueColour = true;
|
|
|
|
format.bigEndian = false;
|
|
format.redShift = 16;
|
|
format.greenShift = 8;
|
|
format.blueShift = 0;
|
|
format.redMax = 0xff;
|
|
format.greenMax = 0xff;
|
|
format.blueMax = 0xff;
|
|
}
|
|
|
|
void QtFrameBuffer::updateFrameBuffer()
|
|
{
|
|
QImage img = QPixmap::grabWindow(win).toImage();
|
|
|
|
|
|
// verify what part of the image need to be marked as changed
|
|
// fbImage is the previous version of the image,
|
|
// img is the current one
|
|
|
|
#if 0 // This is actually slower than updating the whole desktop...
|
|
QSize imgSize = img.size();
|
|
QImage map(imgSize, QImage::Format_Mono);
|
|
map.fill(0);
|
|
|
|
for (int x = 0; x < imgSize.width(); x++) {
|
|
for (int y = 0; y < imgSize.height(); y++) {
|
|
if (img.pixel(x, y) != fbImage.pixel(x, y)) {
|
|
map.setPixel(x, y, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
QRegion r(QBitmap::fromImage(map));
|
|
tiles = tiles + r.rects();
|
|
|
|
#else
|
|
tiles.append(img.rect());
|
|
#endif
|
|
|
|
memcpy(fb, (const char *)img.bits(), img.byteCount());
|
|
fbImage = img;
|
|
|
|
}
|
|
|
|
int QtFrameBuffer::paddedWidth()
|
|
{
|
|
return fbImage.width() * 4;
|
|
}
|
|
|
|
void QtFrameBuffer::startMonitor()
|
|
{
|
|
t->start(UPDATE_TIME);
|
|
}
|
|
|
|
void QtFrameBuffer::stopMonitor()
|
|
{
|
|
t->stop();
|
|
}
|
|
|