Keep both the device and intermediate painter states in sync

pull/1/head
Timothy Pearson 12 years ago
parent 38b854c89c
commit 0762fd31c7

@ -332,12 +332,22 @@ void TQt3CairoPaintDevice::transferIntermediateSurface() {
if (!m_clipRegionEnabled) { if (!m_clipRegionEnabled) {
// Clipping disabled // Clipping disabled
cairo_save(m_devicePainter);
cairo_reset_clip(m_devicePainter);
cairo_set_matrix(m_devicePainter, &m_deviceMatrix);
cairo_set_source_surface(m_devicePainter, m_intermediateSurface, m_offsetX, m_offsetY); cairo_set_source_surface(m_devicePainter, m_intermediateSurface, m_offsetX, m_offsetY);
cairo_set_operator(m_devicePainter, overlayMerge?CAIRO_OPERATOR_OVER:CAIRO_OPERATOR_SOURCE); cairo_set_operator(m_devicePainter, overlayMerge?CAIRO_OPERATOR_OVER:CAIRO_OPERATOR_SOURCE);
cairo_paint(m_devicePainter); cairo_paint(m_devicePainter);
cairo_restore(m_devicePainter);
} }
else { else {
// Clipping enabled // Clipping enabled
cairo_save(m_devicePainter);
cairo_reset_clip(m_devicePainter);
cairo_set_matrix(m_devicePainter, &m_deviceMatrix);
cairo_surface_t* maskSurface = TQImageToCairoSurface(m_clipRegion); cairo_surface_t* maskSurface = TQImageToCairoSurface(m_clipRegion);
cairo_set_source_surface(m_devicePainter, m_intermediateSurface, m_offsetX, m_offsetY); cairo_set_source_surface(m_devicePainter, m_intermediateSurface, m_offsetX, m_offsetY);
cairo_set_operator(m_devicePainter, overlayMerge?CAIRO_OPERATOR_OVER:CAIRO_OPERATOR_SOURCE); cairo_set_operator(m_devicePainter, overlayMerge?CAIRO_OPERATOR_OVER:CAIRO_OPERATOR_SOURCE);
@ -378,6 +388,8 @@ void TQt3CairoPaintDevice::transferIntermediateSurface() {
cairo_mask_surface(m_devicePainter, maskSurface, m_offsetX, m_offsetY); cairo_mask_surface(m_devicePainter, maskSurface, m_offsetX, m_offsetY);
} }
cairo_surface_destroy(maskSurface); cairo_surface_destroy(maskSurface);
cairo_restore(m_devicePainter);
} }
// Clear intermediate surface // Clear intermediate surface
@ -520,13 +532,21 @@ void TQt3CairoPaintDevice::updatePen(bool backgroundStroke) {
} }
TQRgb color = (backgroundStroke)?m_bgColor.rgb():m_pen.color().rgb();
cairo_set_dash(m_painter, dashes, dash_len, dash_offset); cairo_set_dash(m_painter, dashes, dash_len, dash_offset);
cairo_set_line_cap(m_painter, cp); cairo_set_line_cap(m_painter, cp);
cairo_set_line_join(m_painter, jn); cairo_set_line_join(m_painter, jn);
cairo_set_line_width(m_painter, ((!allow_zero_lw) && (m_pen.width() == 0)) ? 1 : m_pen.width()); cairo_set_line_width(m_painter, ((!allow_zero_lw) && (m_pen.width() == 0)) ? 1 : m_pen.width());
TQRgb color = (backgroundStroke)?m_bgColor.rgb():m_pen.color().rgb();
cairo_set_source_rgba(m_painter, tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0); cairo_set_source_rgba(m_painter, tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0);
// BEGIN DUPLICATE
cairo_set_dash(m_devicePainter, dashes, dash_len, dash_offset);
cairo_set_line_cap(m_devicePainter, cp);
cairo_set_line_join(m_devicePainter, jn);
cairo_set_line_width(m_devicePainter, ((!allow_zero_lw) && (m_pen.width() == 0)) ? 1 : m_pen.width());
cairo_set_source_rgba(m_devicePainter, tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0);
// END DUPLICATE
} }
void TQt3CairoPaintDevice::updateBrush(bool backgroundStroke, cairo_fill_rule_t fillMethod) { void TQt3CairoPaintDevice::updateBrush(bool backgroundStroke, cairo_fill_rule_t fillMethod) {
@ -538,7 +558,9 @@ void TQt3CairoPaintDevice::updateBrush(bool backgroundStroke, cairo_fill_rule_t
TQRgb color = m_bgColor.rgb(); TQRgb color = m_bgColor.rgb();
cairo_pattern_t* pattern = cairo_pattern_create_rgba(tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0); cairo_pattern_t* pattern = cairo_pattern_create_rgba(tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0);
cairo_set_source(m_painter, pattern); cairo_set_source(m_painter, pattern);
cairo_set_source(m_devicePainter, pattern);
cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT); cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT);
cairo_pattern_set_extend(cairo_get_source(m_devicePainter), CAIRO_EXTEND_REPEAT);
cairo_pattern_destroy(pattern); cairo_pattern_destroy(pattern);
} }
else { else {
@ -636,7 +658,9 @@ void TQt3CairoPaintDevice::updateBrush(bool backgroundStroke, cairo_fill_rule_t
cairo_matrix_init_translate(&brush_translation_matrix, m_brushOrigin.x()+1, m_brushOrigin.y()); cairo_matrix_init_translate(&brush_translation_matrix, m_brushOrigin.x()+1, m_brushOrigin.y());
cairo_pattern_set_matrix(pattern, &brush_translation_matrix); cairo_pattern_set_matrix(pattern, &brush_translation_matrix);
cairo_set_source(m_painter, pattern); cairo_set_source(m_painter, pattern);
cairo_set_source(m_devicePainter, pattern);
cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT); cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT);
cairo_pattern_set_extend(cairo_get_source(m_devicePainter), CAIRO_EXTEND_REPEAT);
cairo_pattern_destroy(pattern); cairo_pattern_destroy(pattern);
cairo_surface_destroy(brushSurface); cairo_surface_destroy(brushSurface);
} }
@ -644,11 +668,14 @@ void TQt3CairoPaintDevice::updateBrush(bool backgroundStroke, cairo_fill_rule_t
TQRgb color = m_brush.color().rgb(); TQRgb color = m_brush.color().rgb();
cairo_pattern_t* pattern = cairo_pattern_create_rgba(tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0); cairo_pattern_t* pattern = cairo_pattern_create_rgba(tqRed(color)/255.0, tqGreen(color)/255.0, tqBlue(color)/255.0, tqAlpha(color)/255.0);
cairo_set_source(m_painter, pattern); cairo_set_source(m_painter, pattern);
cairo_set_source(m_devicePainter, pattern);
cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT); cairo_pattern_set_extend(cairo_get_source(m_painter), CAIRO_EXTEND_REPEAT);
cairo_pattern_set_extend(cairo_get_source(m_devicePainter), CAIRO_EXTEND_REPEAT);
cairo_pattern_destroy(pattern); cairo_pattern_destroy(pattern);
} }
} }
cairo_set_fill_rule(m_painter, fillMethod); cairo_set_fill_rule(m_painter, fillMethod);
cairo_set_fill_rule(m_devicePainter, fillMethod);
} }
static inline void fix_neg_rect( int *x, int *y, int *w, int *h ) { static inline void fix_neg_rect( int *x, int *y, int *w, int *h ) {
@ -1528,6 +1555,7 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
else { else {
m_devicePainter = cairo_create(m_surface); m_devicePainter = cairo_create(m_surface);
} }
cairo_get_matrix(m_devicePainter, &m_deviceMatrix);
cairo_set_antialias(m_devicePainter, CAIRO_ANTIALIAS_NONE); cairo_set_antialias(m_devicePainter, CAIRO_ANTIALIAS_NONE);
m_pen = TQPen(); m_pen = TQPen();
m_brush = TQBrush(); m_brush = TQBrush();
@ -1562,9 +1590,11 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
break; break;
case PdcSave: case PdcSave:
cairo_save(m_painter); cairo_save(m_painter);
cairo_save(m_devicePainter);
break; break;
case PdcRestore: case PdcRestore:
cairo_restore(m_painter); cairo_restore(m_painter);
cairo_restore(m_devicePainter);
break; break;
case PdcSetBkColor: case PdcSetBkColor:
if (p) { if (p) {
@ -1659,6 +1689,7 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
if ((p) && (m_painter)) { if ((p) && (m_painter)) {
m_viewportMatrixEnabled = p[0].ival; m_viewportMatrixEnabled = p[0].ival;
setCairoTransformations(m_painter); setCairoTransformations(m_painter);
setCairoTransformations(m_devicePainter);
} }
break; break;
case PdcSetWindow: case PdcSetWindow:
@ -1676,6 +1707,7 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
double scaleH = (double)vh/(double)wh; double scaleH = (double)vh/(double)wh;
cairo_matrix_init(&m_viewportMatrix, scaleW, 0, 0, scaleH, vx - wx*scaleW, vy - wy*scaleH); cairo_matrix_init(&m_viewportMatrix, scaleW, 0, 0, scaleH, vx - wx*scaleW, vy - wy*scaleH);
setCairoTransformations(m_painter); setCairoTransformations(m_painter);
setCairoTransformations(m_devicePainter);
} }
break; break;
case PdcSetViewport: case PdcSetViewport:
@ -1693,12 +1725,14 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
double scaleH = (double)vh/(double)wh; double scaleH = (double)vh/(double)wh;
cairo_matrix_init(&m_viewportMatrix, scaleW, 0, 0, scaleH, vx - wx*scaleW, vy - wy*scaleH); cairo_matrix_init(&m_viewportMatrix, scaleW, 0, 0, scaleH, vx - wx*scaleW, vy - wy*scaleH);
setCairoTransformations(m_painter); setCairoTransformations(m_painter);
setCairoTransformations(m_devicePainter);
} }
break; break;
case PdcSetWXform: case PdcSetWXform:
if ((p) && (m_painter)) { if ((p) && (m_painter)) {
m_worldMatrixEnabled = p[0].ival; m_worldMatrixEnabled = p[0].ival;
setCairoTransformations(m_painter); setCairoTransformations(m_painter);
setCairoTransformations(m_devicePainter);
} }
break; break;
case PdcSetWMatrix: case PdcSetWMatrix:
@ -1717,6 +1751,7 @@ bool TQt3CairoPaintDevice::cmd( int c, TQPainter *pt, TQPDevCmdParam *p )
cairo_matrix_init(&m_worldMatrix, tqt3matrix->m11(), tqt3matrix->m12(), tqt3matrix->m21(), tqt3matrix->m22(), tqt3matrix->dx(), tqt3matrix->dy()); cairo_matrix_init(&m_worldMatrix, tqt3matrix->m11(), tqt3matrix->m12(), tqt3matrix->m21(), tqt3matrix->m22(), tqt3matrix->dx(), tqt3matrix->dy());
} }
setCairoTransformations(m_painter); setCairoTransformations(m_painter);
setCairoTransformations(m_devicePainter);
} }
} }
break; break;

@ -83,6 +83,7 @@ class Q_EXPORT TQt3CairoPaintDevice : public TQPaintDevice // picture class
cairo_t *m_painter; cairo_t *m_painter;
cairo_t *m_devicePainter; cairo_t *m_devicePainter;
cairo_t *m_overridePainter; cairo_t *m_overridePainter;
cairo_matrix_t m_deviceMatrix;
cairo_matrix_t m_worldMatrix; cairo_matrix_t m_worldMatrix;
cairo_matrix_t m_viewportMatrix; cairo_matrix_t m_viewportMatrix;
bool m_worldMatrixEnabled; bool m_worldMatrixEnabled;

Loading…
Cancel
Save