/* This file is part of the KDE project Copyright (C) 2007 Alessandro Praduroux 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 "qtframebuffer.moc" #include #include #include #include const int UPDATE_TIME = 500; QtFrameBuffer::QtFrameBuffer(WId id, QObject *parent) : FrameBuffer(id, parent) { fbImage = QPixmap::grabWindow(win).toImage(); fb = new char[fbImage.numBytes()]; t = new QTimer(this); connect(t, SIGNAL(timeout()), SLOT(updateFrameBuffer())); } QtFrameBuffer::~QtFrameBuffer() { delete [] fb; } 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(); QSize imgSize = img.size(); // 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... 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.numBytes()); fbImage = img; } int QtFrameBuffer::paddedWidth() { return fbImage.width() * 4; } void QtFrameBuffer::startMonitor() { t->start(UPDATE_TIME); } void QtFrameBuffer::stopMonitor() { t->stop(); }