/** * gnome_print_pango_glyph_string: * @gpc: a #GnomePrintContext * @font: the #PangoFont that the glyphs in @glyphs are from * @glyphs: a #PangoGlyphString * * Draws the glyphs in @glyphs into the specified #GnomePrintContext. * Positioning information in @glyphs is transformed by the current * transformation matrix, the glyphs are drawn in the current color, * and the glyphs are positioned so that the left edge of the baseline * is at the current point. **/ void gnome_print_pango_glyph_string (GnomePrintContext *gpc, PangoFont *font, PangoGlyphString *glyphs) { GnomeGlyphList *glyph_list; GnomeFont *gnome_font; gint x_off = 0; gint i; g_return_if_fail (GNOME_IS_PRINT_CONTEXT (gpc)); g_return_if_fail (PANGO_IS_FONT (font)); g_return_if_fail (glyphs != NULL); gnome_font = font_from_pango_font (font); if (!gnome_font) return; glyph_list = gnome_glyphlist_new (); gnome_glyphlist_font (glyph_list, gnome_font); g_object_unref (gnome_font); gnome_glyphlist_color (glyph_list, gp_gc_get_rgba (gpc->gc)); for (i = 0; i < glyphs->num_glyphs; i++) { PangoGlyphInfo *gi = &glyphs->glyphs[i]; if (gi->glyph != PANGO_GLYPH_EMPTY) { int x = x_off + gi->geometry.x_offset; int y = gi->geometry.y_offset; gnome_glyphlist_moveto (glyph_list, (gdouble) x / PANGO_SCALE, (gdouble) -y / PANGO_SCALE); gnome_glyphlist_glyph (glyph_list, gi->glyph); } x_off += glyphs->glyphs[i].geometry.width; } gnome_print_glyphlist (gpc, glyph_list); gnome_glyphlist_unref (glyph_list); }
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; }