efl/legacy/evas/src/modules/engines/software_qtopia/evas_qt_main.cpp

110 lines
2.4 KiB
C++

#include "evas_common.h"
#include "evas_engine.h"
#include <qwidget.h>
#include <qnamespace.h>
#include <qbrush.h>
#include <qpainter.h>
#include <qdirectpainter_qws.h>
//#define QVFB_BUG
extern "C" {
QT_Direct *
evas_qt_main_direct_start(void *target)
{
QT_Direct *d;
QDirectPainter *dp;
QWidget *widget;
int i;
widget = (QWidget *)target;
dp = new QDirectPainter(widget);
if (!dp) return NULL;
d = (QT_Direct *)calloc(1, sizeof(QT_Direct));
if (!d) return NULL;
d->target = target;
d->direct = (void *)dp;
d->fb.data = dp->frameBuffer();
d->fb.bpp = dp->depth();
d->fb.width = dp->lineStep() / (d->fb.bpp / 8);
if (dp->depth() == 16)
{
d->fb.mask.r = 0xf800;
d->fb.mask.g = 0x07e0;
d->fb.mask.b = 0x001f;
}
else if (dp->depth() == 32)
{
d->fb.mask.r = 0x00ff0000;
d->fb.mask.g = 0x0000ff00;
d->fb.mask.b = 0x000000ff;
}
else
{
delete dp;
free(d);
return NULL;
}
d->fb.rotation = dp->transformOrientation() * 90;
d->rects.count = dp->numRects();
if (d->rects.count > 0)
{
d->rects.r = (QT_Direct_Rect *)calloc(d->rects.count, sizeof(QT_Direct_Rect));
if (d->rects.r)
{
for (i = 0; i < d->rects.count; i++)
{
QRect r;
r = dp->rect(i);
if (d->fb.rotation == 0)
{
d->rects.r[i].x = r.x();
d->rects.r[i].y = r.y();
d->rects.r[i].w = r.width();
d->rects.r[i].h = r.height();
}
else if (d->fb.rotation == 270)
{
d->rects.r[i].x = r.y();
d->rects.r[i].y = d->fb.width - r.x() - r.width();
d->rects.r[i].w = r.height();
d->rects.r[i].h = r.width();
}
else if (d->fb.rotation == 90)
{
// FIXME: do
}
}
}
else
d->rects.count = 0;
}
d->location.x = dp->xOffset();
d->location.y = dp->yOffset();
d->location.w = dp->width();
d->location.h = dp->height();
return d;
}
void
evas_qt_main_direct_stop(QT_Direct *d)
{
QDirectPainter *dp;
#ifdef QVFB_BUG
{
QWidget *target = (QWidget *)d->target;
QRect rect(d->updated.x, d->updated.y,
d->updated.w, d->updated.h);
QPainter p(target);
p.fillRect(rect, QBrush::NoBrush);
}
#endif
dp = (QDirectPainter *)d->direct;
delete dp;
if (d->rects.r) free(d->rects.r);
free(d);
}
}