summaryrefslogtreecommitdiff
path: root/app/wlib/gtklib/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib/gtklib/print.c')
-rw-r--r--app/wlib/gtklib/print.c65
1 files changed, 40 insertions, 25 deletions
diff --git a/app/wlib/gtklib/print.c b/app/wlib/gtklib/print.c
index c0993f4..cad7e57 100644
--- a/app/wlib/gtklib/print.c
+++ b/app/wlib/gtklib/print.c
@@ -86,6 +86,8 @@ static double rBorder; /**< right margin */
static double lBorder; /**< left margin */
static double bBorder; /**< bottom margin */
+static double scale_adjust = 1.0;
+
static long printFormat = PRINT_LANDSCAPE;
/*****************************************************************************
@@ -118,7 +120,7 @@ WlibApplySettings(GtkPrintOperation *op)
dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- err->message);
+ "%s",err->message);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
} else {
@@ -144,7 +146,7 @@ WlibApplySettings(GtkPrintOperation *op)
dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- err->message);
+ "%s",err->message);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
} else {
@@ -193,7 +195,7 @@ WlibSaveSettings(GtkPrintOperation *op)
dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- err->message);
+ "%s",err->message);
g_error_free(err);
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -216,7 +218,7 @@ WlibSaveSettings(GtkPrintOperation *op)
dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- err->message);
+ "%s",err->message);
g_error_free(err);
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -279,21 +281,23 @@ static void setLineType(
wDrawOpts opts)
{
cairo_t *cr = psPrint_d.printContext;
- double dashLength = DASH_LENGTH;
+
+ double dashes[] = { DASH_LENGTH, 3 }; //Reduce gap in between dashes
+ static int len_dashes = sizeof(dashes) / sizeof(dashes[0]);
if (lineWidth < 0.0) {
- lineWidth = P2I(-lineWidth)*2.0;
+ lineWidth = P2I(-lineWidth)*2.0/scale_adjust;
}
// make sure that there is a minimum line width used
- if (lineWidth == 0.0) {
- lineWidth = 0.1;
+ if (lineWidth <= 0.09) {
+ lineWidth = 0.1/scale_adjust;
}
cairo_set_line_width(cr, lineWidth);
if (lineType == wDrawLineDash) {
- cairo_set_dash(cr, &dashLength, 1, 0.0);
+ cairo_set_dash(cr, dashes, len_dashes, 0.0);
} else {
cairo_set_dash(cr, NULL, 0, 0.0);
}
@@ -537,7 +541,7 @@ void psPrintFillCircle(
/**
* Print a string at the given position using specified font and text size.
- * The orientatoion of the y-axis in XTrackCAD is wrong for cairo. So for
+ * The orientation of the y-axis in XTrackCAD is wrong for cairo. So for
* all other print primitives a flip operation is done. As this would
* also affect the string orientation, printing a string has to be
* treated differently. The starting point is transformed, then the
@@ -568,7 +572,8 @@ void psPrintString(
{
char * cp;
double x0 = (double)x, y0 = (double)y;
- double text_height;
+ int text_height, text_width;
+ double ascent;
cairo_t *cr;
cairo_matrix_t matrix;
@@ -586,10 +591,13 @@ void psPrintString(
// get the current transformation matrix and transform the starting
// point of the string
+
+ cairo_save(cr);
+
cairo_get_matrix(cr, &matrix);
+
cairo_matrix_transform_point(&matrix, &x0, &y0);
- cairo_save(cr);
layout = pango_cairo_create_layout(cr);
@@ -597,26 +605,27 @@ void psPrintString(
/** \todo use a getter function instead of double conversion */
desc = pango_font_description_from_string(wlibFontTranslate(fp));
- //don't know why the size has to be reduced to 75% :-(
- pango_font_description_set_size(desc, fs * PANGO_SCALE *0.75);
+ pango_font_description_set_size(desc, fs * PANGO_SCALE );
// render the string to a Pango layout
pango_layout_set_font_description(layout, desc);
pango_layout_set_text(layout, s, -1);
pango_layout_set_width(layout, -1);
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+ pango_layout_get_pixel_size(layout, &text_width, &text_height);
// get the height of the string
pcontext = pango_cairo_create_context(cr);
metrics = pango_context_get_metrics(pcontext, desc,
pango_context_get_language(pcontext));
- text_height = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
- // transform the string to the correct position
+ ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE * scale_adjust ;
+
cairo_identity_matrix(cr);
- cairo_translate(cr, x0 + text_height * sin(-a * M_PI / 180.0) ,
- y0 - text_height * cos(a * M_PI / 180.0));
+ cairo_translate(cr, x0 + ((ascent + (bBorder*scale_adjust)) * sin(-a * M_PI / 180.0))+((lBorder*scale_adjust)* cos(a * M_PI / 180.0)),
+ y0 - ((ascent + (bBorder*scale_adjust)) * cos( a * M_PI / 180.0))+((lBorder*scale_adjust)* sin(a * M_PI / 180.0)));
+
cairo_rotate(cr, -a * M_PI / 180.0);
// set the color
@@ -633,7 +642,7 @@ void psPrintString(
}
/**
- * Create clipping retangle.
+ * Create clipping rectangle.
*
* \param x, y IN starting position
* \param w, h IN width and height of rectangle
@@ -800,6 +809,7 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
cairo_surface_type_t surface_type;
cairo_matrix_t matrix;
+
printDialog = gtk_print_unix_dialog_new(title, GTK_WINDOW(gtkMainW->gtkwin));
// load the settings
@@ -848,7 +858,10 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
if (surface_type == CAIRO_SURFACE_TYPE_PDF ||
surface_type == CAIRO_SURFACE_TYPE_PS ||
surface_type == CAIRO_SURFACE_TYPE_SVG) {
- psPrint_d.dpi = 72;
+ double p_def=600;
+ cairo_surface_set_fallback_resolution (psPrint_d.curPrintSurface, p_def, p_def);
+ psPrint_d.dpi = p_def;
+ scale_adjust = 72/p_def;
} else {
psPrint_d.dpi = (double)gtk_print_settings_get_resolution(settings);
}
@@ -856,11 +869,13 @@ wBool_t wPrintDocStart(const char * title, int fTotalPageCount, int * copiesP)
// in XTrackCAD 0,0 is top left, in cairo bottom left. This is
// corrected via the following transformations.
// also the translate makes sure that the drawing is rendered
- // within the paper margins
+ // within the paper margin
+
+ cairo_translate(psPrint_d.printContext, lBorder*72, (paperHeight-bBorder)*72 );
+
+ cairo_scale(psPrint_d.printContext, 1.0 * scale_adjust, -1.0 * scale_adjust);
- cairo_scale(psPrint_d.printContext, 1.0, -1.0);
- cairo_translate(psPrint_d.printContext, lBorder * psPrint_d.dpi,
- -(paperHeight-bBorder) *psPrint_d.dpi);
+ //cairo_translate(psPrint_d.printContext, 0, -paperHeight* psPrint_d.dpi);
WlibSaveSettings(NULL);
}
@@ -900,7 +915,7 @@ doPrintJobFinished(GtkPrintJob *job, void *data, GError *err)
dialog = gtk_message_dialog_new(GTK_WINDOW(gtkMainW->gtkwin),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
- err->message);
+ "%s",err->message);
}
}