|
|
|
@ -100,7 +100,7 @@ void TQt3CairoPaintDevice::resetIntermediateSurface() {
|
|
|
|
|
|
|
|
|
|
void TQt3CairoPaintDevice::transferIntermediateSurface() {
|
|
|
|
|
cairo_surface_flush(m_intermediateSurface);
|
|
|
|
|
if (m_clipRegion.isNull()) {
|
|
|
|
|
if (!m_clipRegionEnabled) {
|
|
|
|
|
// Clipping disabled
|
|
|
|
|
cairo_set_source_surface(m_devicePainter, m_intermediateSurface, 0, 0);
|
|
|
|
|
cairo_set_operator(m_devicePainter, CAIRO_OPERATOR_SOURCE);
|
|
|
|
@ -686,7 +686,7 @@ void TQt3CairoPaintDevice::pangoSetupTextPath(PangoLayout *layout, const char* t
|
|
|
|
|
pango_font_description_free(desc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TQt3CairoPaintDevice::drawText(TQPainter *p, int x, int y, const TQString &str, int pos, int len, TQPainter::TextDirection dir, bool baseline) {
|
|
|
|
|
void TQt3CairoPaintDevice::drawText(TQPainter *p, int x, int y, const TQString &str) {
|
|
|
|
|
if ((!m_painter) || (!p)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -699,7 +699,7 @@ void TQt3CairoPaintDevice::drawText(TQPainter *p, int x, int y, const TQString &
|
|
|
|
|
|
|
|
|
|
int baseline_y = pango_layout_get_baseline(layout)/PANGO_SCALE;
|
|
|
|
|
cairo_new_path(m_painter);
|
|
|
|
|
cairo_move_to(m_painter, x, (baseline)?y-baseline_y:y);
|
|
|
|
|
cairo_move_to(m_painter, x, y-baseline_y);
|
|
|
|
|
updatePen(FALSE);
|
|
|
|
|
|
|
|
|
|
pango_cairo_update_layout(m_painter, layout);
|
|
|
|
@ -717,6 +717,101 @@ void TQt3CairoPaintDevice::drawText(TQPainter *p, int x, int y, const TQString &
|
|
|
|
|
transferIntermediateSurface();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TQt3CairoPaintDevice::drawTextInRect(TQPainter *p, TQRect rect, int textFlags, const TQString &str) {
|
|
|
|
|
if ((!m_painter) || (!p)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PangoLayout *layout;
|
|
|
|
|
layout = pango_cairo_create_layout(m_painter);
|
|
|
|
|
|
|
|
|
|
TQFont::StyleStrategy qt3fontstrategy = m_font.styleStrategy();
|
|
|
|
|
pangoSetupTextPath(layout, str.utf8());
|
|
|
|
|
|
|
|
|
|
pango_layout_set_width(layout, rect.width()*PANGO_SCALE);
|
|
|
|
|
|
|
|
|
|
int fudgedOffsetY = 0;
|
|
|
|
|
|
|
|
|
|
// Layout flags
|
|
|
|
|
if (textFlags & TQt::SingleLine) {
|
|
|
|
|
// Pango special case to force rendering of only one line of text
|
|
|
|
|
pango_layout_set_height(layout, 0);
|
|
|
|
|
}
|
|
|
|
|
if (!(textFlags & TQt::DontClip)) {
|
|
|
|
|
cairo_rectangle(m_painter, rect.x()+CAIRO_PIXEL_OFFSET, rect.y()+CAIRO_PIXEL_OFFSET, rect.width(), rect.height());
|
|
|
|
|
cairo_clip(m_painter);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::ExpandTabs) {
|
|
|
|
|
// FIXME
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::ShowPrefix) {
|
|
|
|
|
// FIXME
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::WordBreak) {
|
|
|
|
|
pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::BreakAnywhere) {
|
|
|
|
|
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::NoAccel) {
|
|
|
|
|
// FIXME
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PangoRectangle inkRect;
|
|
|
|
|
PangoRectangle logicalRect;
|
|
|
|
|
pango_layout_get_pixel_extents(layout, &inkRect, &logicalRect);
|
|
|
|
|
|
|
|
|
|
int stockWidth = logicalRect.x + logicalRect.width;
|
|
|
|
|
int stockHeight = logicalRect.y + logicalRect.height;
|
|
|
|
|
|
|
|
|
|
pango_layout_set_height(layout, rect.height()*PANGO_SCALE);
|
|
|
|
|
|
|
|
|
|
// Position flags
|
|
|
|
|
if (textFlags & TQt::AlignAuto) {
|
|
|
|
|
// FIXME
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignLeft) {
|
|
|
|
|
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignRight) {
|
|
|
|
|
pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignHCenter) {
|
|
|
|
|
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignJustify) {
|
|
|
|
|
// FIXME
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignTop) {
|
|
|
|
|
fudgedOffsetY = 0;
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignBottom) {
|
|
|
|
|
fudgedOffsetY = (rect.height()-stockHeight);
|
|
|
|
|
}
|
|
|
|
|
if (textFlags & TQt::AlignVCenter) {
|
|
|
|
|
fudgedOffsetY = ((rect.height()-stockHeight)/2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cairo_new_path(m_painter);
|
|
|
|
|
cairo_move_to(m_painter, rect.x(), rect.y() + fudgedOffsetY);
|
|
|
|
|
updatePen(FALSE);
|
|
|
|
|
|
|
|
|
|
pango_cairo_update_layout(m_painter, layout);
|
|
|
|
|
pango_cairo_layout_path(m_painter, layout);
|
|
|
|
|
|
|
|
|
|
if ((qt3fontstrategy & TQFont::PreferOutline) || (qt3fontstrategy & TQFont::ForceOutline)) {
|
|
|
|
|
cairo_stroke_preserve(m_painter);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
cairo_fill(m_painter);
|
|
|
|
|
}
|
|
|
|
|
cairo_reset_clip(m_painter);
|
|
|
|
|
|
|
|
|
|
g_object_unref(layout);
|
|
|
|
|
|
|
|
|
|
transferIntermediateSurface();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TQt3CairoPaintDevice::setCairoTransformations() {
|
|
|
|
|
cairo_matrix_t combinedMatrix;
|
|
|
|
|
cairo_matrix_t tempMatrix;
|
|
|
|
@ -994,33 +1089,43 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
|
if (p) {
|
|
|
|
|
TQString string = *p[1].str;
|
|
|
|
|
drawText(pt, p[0].rect->x()+CAIRO_PIXEL_OFFSET, p[0].rect->y()+CAIRO_PIXEL_OFFSET, string, 0, -1, TQPainter::Auto, TRUE);
|
|
|
|
|
drawText(pt, p[0].rect->x()+CAIRO_PIXEL_OFFSET, p[0].rect->y()+CAIRO_PIXEL_OFFSET, string);
|
|
|
|
|
}
|
|
|
|
|
cairo_restore(m_painter);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#if 0
|
|
|
|
|
case PdcDrawTextFormatted:
|
|
|
|
|
// NOTE
|
|
|
|
|
// Unlike PdcDrawText and PdcDrawText2, PdcDrawTextFormatted and PdcDrawText2Formatted do NOT use the baseline as the Y position coordinate!
|
|
|
|
|
m_qt4painter->drawText( qt4rect, qt4formattedtextflags, qt4string );
|
|
|
|
|
if (m_painter) {
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
|
if (p) {
|
|
|
|
|
TQRect rect = *p[0].rect;
|
|
|
|
|
TQString string = *p[2].str;
|
|
|
|
|
drawTextInRect(pt, rect, p[1].ival, string);
|
|
|
|
|
}
|
|
|
|
|
cairo_restore(m_painter);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case PdcDrawText2:
|
|
|
|
|
if (m_painter) {
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
|
if (p) {
|
|
|
|
|
TQString string = *p[1].str;
|
|
|
|
|
drawText(pt, p[0].rect->x()+CAIRO_PIXEL_OFFSET, p[0].rect->y()+CAIRO_PIXEL_OFFSET, string, 0, -1, TQPainter::Auto, TRUE);
|
|
|
|
|
drawText(pt, p[0].rect->x()+CAIRO_PIXEL_OFFSET, p[0].rect->y()+CAIRO_PIXEL_OFFSET, string);
|
|
|
|
|
}
|
|
|
|
|
cairo_restore(m_painter);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#if 0
|
|
|
|
|
case PdcDrawText2Formatted:
|
|
|
|
|
m_qt4painter->drawText( qt4rect, qt4formattedtextflags, qt4string );
|
|
|
|
|
if (m_painter) {
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
|
if (p) {
|
|
|
|
|
TQRect rect = *p[0].rect;
|
|
|
|
|
TQString string = *p[2].str;
|
|
|
|
|
drawTextInRect(pt, rect, p[1].ival, string);
|
|
|
|
|
}
|
|
|
|
|
cairo_restore(m_painter);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case PdcDrawPixmap:
|
|
|
|
|
if (m_painter) {
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
@ -1036,19 +1141,22 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
transferIntermediateSurface();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#if 0
|
|
|
|
|
case PdcDrawImage: {
|
|
|
|
|
TQImage image;
|
|
|
|
|
if ( d->formatMajor < 4 ) {
|
|
|
|
|
s >> p >> image;
|
|
|
|
|
painter->drawImage( p, image );
|
|
|
|
|
} else {
|
|
|
|
|
s >> r >> image;
|
|
|
|
|
painter->drawImage( r, image );
|
|
|
|
|
}
|
|
|
|
|
case PdcDrawImage:
|
|
|
|
|
if (m_painter) {
|
|
|
|
|
cairo_save(m_painter);
|
|
|
|
|
if (p) {
|
|
|
|
|
TQRect rect = *p[0].rect;
|
|
|
|
|
TQImage image = *p[1].image;
|
|
|
|
|
cairo_surface_t* sourceSurface = TQImageToCairoSurface(image);
|
|
|
|
|
cairo_rectangle(m_painter, rect.x(), rect.y(), rect.width(), rect.height());
|
|
|
|
|
cairo_set_source_surface(m_painter, sourceSurface, rect.x(), rect.y());
|
|
|
|
|
cairo_fill(m_painter);
|
|
|
|
|
cairo_surface_destroy(sourceSurface);
|
|
|
|
|
}
|
|
|
|
|
cairo_restore(m_painter);
|
|
|
|
|
transferIntermediateSurface();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case PdcBegin:
|
|
|
|
|
if (!m_painter) {
|
|
|
|
|
m_bgColor = TQColor(0,0,0);
|
|
|
|
@ -1065,6 +1173,7 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
cairo_matrix_init_identity(&m_viewportMatrix);
|
|
|
|
|
setCairoTransformations();
|
|
|
|
|
m_clipRegion = TQImage();
|
|
|
|
|
m_clipRegionEnabled = false;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case PdcEnd:
|
|
|
|
@ -1278,7 +1387,6 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#if 0
|
|
|
|
|
#if 0
|
|
|
|
|
#ifndef QT_NO_TRANSFORMATIONS
|
|
|
|
|
case PdcSaveWMatrix:
|
|
|
|
|
painter->saveWorldMatrix();
|
|
|
|
@ -1289,9 +1397,10 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
case PdcSetClip:
|
|
|
|
|
m_qt4painter->setClipping( p[0].ival );
|
|
|
|
|
if ((p) && (m_painter)) {
|
|
|
|
|
m_clipRegionEnabled = p[0].ival;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
case PdcSetClipRegion:
|
|
|
|
|
if ((p) && (m_painter)) {
|
|
|
|
|
// SLOW
|
|
|
|
@ -1306,9 +1415,11 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
|
|
|
|
|
m_clipRegion.setPixel(x, y, (p[0].rgn->contains(point))?0xffffffff:0x00000000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_clipRegionEnabled = true;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
m_clipRegion = TQImage();
|
|
|
|
|
m_clipRegionEnabled = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|