static gint gnome_print_fax_construct (GnomePrintContext *ctx) { GnomePrintFAX *fax; ArtDRect rect; gdouble dpix, dpiy; gboolean result; const GnomePrintUnit *unit; fax = GNOME_PRINT_FAX (ctx); fax->priv = g_new (GnomePrintFAXPrivate, 1); fax->priv->fax_encode_buffer_pivot = 7; fax->priv->first_code_of_doc = TRUE ; rect.x0 = 0.0; rect.y0 = 0.0; rect.x1 = 21.0 * 72.0 / 2.54; rect.y1 = 29.7 * 72.0 / 2.54; dpix = 198.0; dpiy = 198.0; if (gnome_print_config_get_length (ctx->config, GNOME_PRINT_KEY_PAPER_WIDTH, &rect.x1, &unit)) { gnome_print_convert_distance (&rect.x1, unit, GNOME_PRINT_PS_UNIT); } if (gnome_print_config_get_length (ctx->config, GNOME_PRINT_KEY_PAPER_HEIGHT, &rect.y1, &unit)) { gnome_print_convert_distance (&rect.x1, unit, GNOME_PRINT_PS_UNIT); } gnome_print_config_get_double (ctx->config, GNOME_PRINT_KEY_RESOLUTION_DPI_X, &dpix); gnome_print_config_get_double (ctx->config, GNOME_PRINT_KEY_RESOLUTION_DPI_Y, &dpiy); /* fixme: should rgbp_construct take settings as argument? */ /* telemaco : the fax driver need width=1728 pixels , the heigth is arbitrary .. usually heigth=2100 pixels . And the resolution we take it from gpa . */ if (!gnome_print_rgbp_construct (GNOME_PRINT_RGBP (fax), &rect, dpix, dpiy, 256)) return GNOME_PRINT_ERROR_UNKNOWN; result = gnome_print_context_create_transport (ctx); g_return_val_if_fail (result == GNOME_PRINT_OK, GNOME_PRINT_ERROR_UNKNOWN); result = gnome_print_transport_open (ctx->transport); g_return_val_if_fail (result == GNOME_PRINT_OK, GNOME_PRINT_ERROR_UNKNOWN); return GNOME_PRINT_OK; }
static GnomePrintJob *create_job(GnomePrintConfig *gpc) { GnomeFontFace *font_face; PangoFontDescription *font_desc; GtkTextIter start, end; gchar *text, *p; /* Get contents of TextBuffer */ GtkTextBuffer *buffer = pub->mw->buffer; gtk_text_buffer_get_bounds(buffer, &start, &end); text = g_strchomp(gtk_text_buffer_get_text(buffer, &start, &end, FALSE)); /* Initialize job */ job = gnome_print_job_new(gpc); gnome_print_job_get_page_size_from_config(gpc, &page_width, &page_height); gnome_print_config_get_length(gpc, (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_LEFT, &margin_left, NULL); gnome_print_config_get_length(gpc, (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT, &margin_right, NULL); gnome_print_config_get_length(gpc, (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_TOP, &margin_top, NULL); gnome_print_config_get_length(gpc, (guchar *)GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM, &margin_bottom, NULL); /* g_print("margin_left = %f\n", margin_left); g_print("margin_right = %f\n", margin_right); g_print("margin_top = %f\n", margin_top); g_print("margin_bottom = %f\n", margin_bottom); margin_top = margin_left; margin_bottom = margin_left; */ /* Initialize font */ font_desc = gtk_widget_get_style(pub->mw->view)->font_desc; font_face = gnome_font_face_find_closest_from_pango_description(font_desc); font = gnome_font_face_get_font_default(font_face, FONT_SIZE); // pango_font_description_get_size(font_desc) / PANGO_SCALE); // g_print("PANGO_SCALE = %d\n", PANGO_SCALE); // g_print("font_size = %d\n", pango_font_description_get_size(font_desc)); line_height = gnome_font_get_size(font); tab_width = gnome_font_face_get_glyph_width(font_face, gnome_font_face_lookup_default(font_face, g_utf8_get_char(" "))) / 1000 * FONT_SIZE * get_current_tab_width(); DV( g_print("tab_width = %f\n", tab_width)); /* Draw texts to canvas */ gpx = gnome_print_job_get_context(job); gnome_print_beginpage(gpx, NULL); gnome_print_setfont(gpx, font); page_x = margin_left; // TODO RTL page_y = page_height - margin_top - line_height; gnome_print_moveto(gpx, page_x, page_y); gl = gnome_glyphlist_from_text_dumb(font, 0x000000ff, 0, 0, (guchar *)""); gl_width = 0; p = text; while (*p != '\0') { gunichar ch = g_utf8_get_char(p); gint glyph = gnome_font_lookup_default(font, ch); if (!glyph) { if (ch == '\n') { print_glyph_list(page_x + gl_width > page_width - margin_right); move_pen_to_newline(); DV( g_print("LF\n")); } else if (ch == '\t') { print_glyph_list(page_x + gl_width > page_width - margin_right); /* page_x = page_x + tab_width - ((page_x - margin_left) % tab_width); */ gdouble tmp_x = margin_left; do { tmp_x += tab_width; } while (tmp_x < page_x + 0.000001); // FIXME DV( g_print("HT ")); DV( g_print("%f -> %f\n", page_x, tmp_x)); page_x = tmp_x; gnome_print_moveto(gpx, page_x, page_y); /* } else if (ch == '\f') { DV( g_print("FF\n")); print_glyph_list(page_x + gl_width > page_width - margin_right); move_pen_to_nextpage(); */ } else { GnomeFont *tmp_font = find_proper_font(ch); GnomeFontFace *tmp_face = gnome_font_get_face(tmp_font); gdouble g_width; glyph = gnome_font_lookup_default(tmp_font, ch); g_width = gnome_font_face_get_glyph_width(tmp_face, glyph) / 1000 * FONT_SIZE; if (page_x + gl_width + g_width > page_width - margin_right) { if (g_unichar_iswide(ch)) { print_glyph_list(FALSE); move_pen_to_newline(); } else print_glyph_list(TRUE); } gnome_glyphlist_font(gl, tmp_font); gnome_glyphlist_glyph(gl, glyph); gnome_glyphlist_font(gl, font); gl_width += g_width; DV( g_print("** ")); } } else { // if (ch == ' ') { if (g_unichar_isspace(ch)) { DV( g_print("SP ")); DV( g_print("\n")); print_glyph_list(page_x + gl_width > page_width - margin_right); page_x += gnome_font_face_get_glyph_width(font_face, glyph) / 1000 * FONT_SIZE; gnome_print_moveto(gpx, page_x, page_y); } else { gdouble g_width = gnome_font_face_get_glyph_width(font_face, glyph) / 1000 * FONT_SIZE; if (page_x + gl_width + g_width > page_width - margin_right) { if (g_unichar_iswide(ch)) { print_glyph_list(FALSE); move_pen_to_newline(); } else print_glyph_list(TRUE); } gnome_glyphlist_glyph(gl, glyph); gl_width += g_width; DV( g_print("%02X ", glyph)); DV( g_print("%f (%f)\n", gl_width, gnome_font_get_glyph_width(font, glyph))); } } p = g_utf8_next_char(p); } print_glyph_list(page_x + gl_width > page_width - margin_right); DV( g_print("\n[EOT]\n")); gnome_print_showpage(gpx); gnome_print_context_close(gpx); g_object_unref(gpx); gnome_glyphlist_unref(gl); gnome_font_unref(font); gnome_font_face_unref(font_face); gnome_print_job_close(job); return job; }