summaryrefslogtreecommitdiffstats
path: root/tdegtk
diff options
context:
space:
mode:
authorTimothy Pearson <[email protected]>2012-09-17 15:07:23 -0500
committerTimothy Pearson <[email protected]>2012-09-17 15:07:23 -0500
commite9fa6f1ca5a2fcb793d1a0f0d50c87be200b6f9a (patch)
treefe5734f46ccb3e39aeed63ac824521394d64e69f /tdegtk
parentb646ed4c554e54e5354edc3dfdfc76edbb7656f0 (diff)
downloadgtk3-tqt-engine-e9fa6f1ca5a2fcb793d1a0f0d50c87be200b6f9a.tar.gz
gtk3-tqt-engine-e9fa6f1ca5a2fcb793d1a0f0d50c87be200b6f9a.zip
Add preliminary font layout support
Add image painting support
Diffstat (limited to 'tdegtk')
-rw-r--r--tdegtk/tqtcairopainter.cpp165
-rw-r--r--tdegtk/tqtcairopainter.h4
2 files changed, 141 insertions, 28 deletions
diff --git a/tdegtk/tqtcairopainter.cpp b/tdegtk/tqtcairopainter.cpp
index a552ee9..75d1b99 100644
--- a/tdegtk/tqtcairopainter.cpp
+++ b/tdegtk/tqtcairopainter.cpp
@@ -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;
diff --git a/tdegtk/tqtcairopainter.h b/tdegtk/tqtcairopainter.h
index ef3dbac..9332128 100644
--- a/tdegtk/tqtcairopainter.h
+++ b/tdegtk/tqtcairopainter.h
@@ -62,7 +62,8 @@ class Q_EXPORT TQt3CairoPaintDevice : public TQPaintDevice // picture class
void drawChord(int x, int y, int w, int h, int a, int alen);
void pangoSetupTextPath(PangoLayout *layout, const char* text);
- void drawText(TQPainter *p, int x, int y, const TQString &str, int pos, int len, TQPainter::TextDirection dir, bool baseline=TRUE);
+ void drawText(TQPainter *p, int x, int y, const TQString &str);
+ void drawTextInRect(TQPainter *p, TQRect rect, int textFlags, const TQString &str);
void setCairoTransformations();
@@ -83,6 +84,7 @@ class Q_EXPORT TQt3CairoPaintDevice : public TQPaintDevice // picture class
TQPoint m_brushOrigin;
TQFont m_font;
TQImage m_clipRegion;
+ bool m_clipRegionEnabled;
};
#endif // TDEQT4PAINTER_H