static void gtk_plot_cairo_draw_string (GtkPlotPC *pc, gint tx, gint ty, gint angle, const GdkColor *fg, const GdkColor *bg, gboolean transparent, gint border, gint border_space, gint border_width, gint shadow_width, const gchar *font_name, gint font_height, GtkJustification just, const gchar *text) { cairo_t *cairo = GTK_PLOT_CAIRO(pc)->cairo; GList *family = NULL; gint x0, y0; gint old_width, old_height; gboolean bold, italic; gint fontsize; gint ascent, descent; gint numf; gint width, height; gint x, y; gint i; PangoFontDescription *font = NULL, *latin_font = NULL; GtkPSFont *psfont, *base_psfont, *latin_psfont; gchar subs[2], insert_char; const gchar *aux = text; const gchar *lastchar = text; const gchar *wtext = text; const gchar *xaux = text; gchar *new_text; /* Support Tiny C compiler : Original : gchar new_text[strlen(text)+1];*/ gchar num[4]; PangoRectangle rect; PangoLayout *layout = NULL; gint real_x, real_y, real_width, real_height; GdkColor real_fg = *fg; GdkColor real_bg = *bg; gint sign_x = 1, sign_y = 0; gint old_tx = tx, old_ty = ty; if (!cairo) return; layout = GTK_PLOT_CAIRO(pc)->layout; cairo_save(cairo); gtk_plot_cairo_set_color(pc, fg); /* font_name = "sans"; desc = pango_font_description_from_string(font_name); // Since the name does not contain the size yet... Also there is some // factor that I have to figure out... pango_font_description_set_size (desc, font_height *0.9 * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_layout_set_text(layout, text, -1); cairo_save(cairo); cairo_translate(cairo, tx, ty); cairo_rotate(cairo, angle * G_PI / 180); gtk_plot_cairo_set_color(pc, fg); pango_cairo_update_layout(cairo, layout); PangoFontMetrics *metrics = NULL; metrics = pango_context_get_metrics(pango_layout_get_context(layout), desc, gtk_get_default_language()); pango_layout_get_size (layout, &width, &height); ascent = pango_font_metrics_get_ascent(metrics); descent = pango_font_metrics_get_descent(metrics); if (just == GTK_JUSTIFY_RIGHT) cairo_move_to(cairo, -PANGO_PIXELS(width), -PANGO_PIXELS(ascent) ); else if (just == GTK_JUSTIFY_CENTER) cairo_move_to(cairo, -PANGO_PIXELS(width)/2.0, -PANGO_PIXELS(ascent) ); else if (just == GTK_JUSTIFY_LEFT) cairo_move_to(cairo, 0, -PANGO_PIXELS(ascent) ); pango_cairo_show_layout(cairo, layout); cairo_restore(cairo); */ gtk_plot_text_get_size(text, angle, font_name, font_height, &width, &height, &ascent, &descent); if(height == 0 || width == 0) return; old_width = width; old_height = height; if(angle == 90 || angle == 270) { old_width = height; old_height = width; } switch(angle){ case 90: sign_x = 0; sign_y = -1; break; case 180: sign_x = -1; sign_y = 0; break; case 270: sign_x = 0; sign_y = 1; break; case 0: default: sign_x = 1; sign_y = 0; break; } switch(just){ case GTK_JUSTIFY_LEFT: switch(angle){ case 0: ty -= ascent; break; case 90: ty -= height; tx -= ascent; break; case 180: tx -= width; ty -= descent; break; case 270: tx -= descent; break; } old_tx = tx; old_ty = ty; break; case GTK_JUSTIFY_RIGHT: switch(angle){ case 0: tx -= width; ty -= ascent; old_tx -= width; old_ty -= ascent; break; case 90: tx -= ascent; ty += height; old_tx -= ascent; break; case 180: tx += width; ty -= descent; old_ty -= descent; break; case 270: tx -= descent; old_tx -= descent; old_ty -= height; break; } break; case GTK_JUSTIFY_CENTER: default: switch(angle){ case 0: tx -= width / 2.; ty -= ascent; old_tx -= width / 2.; old_ty -= ascent; break; case 90: tx -= ascent; ty += height / 2.; old_tx -= ascent; old_ty -= height / 2.; break; case 180: tx += width / 2.; ty -= descent; old_tx -= width / 2.; old_ty -= descent; break; case 270: tx -= descent; ty -= height / 2.; old_tx -= descent; old_ty -= height / 2.; break; } } real_x = tx; real_y = ty; real_width = width; real_height = height; if(!transparent){ gtk_plot_cairo_set_color(pc, &real_bg); gtk_plot_cairo_draw_rectangle(pc, TRUE, old_tx, old_ty, old_width, old_height); } gtk_psfont_get_families(&family, &numf); base_psfont = psfont = gtk_psfont_get_by_name(font_name); font = gtk_psfont_get_font_description(psfont, font_height); italic = psfont->italic; bold = psfont->bold; fontsize = font_height; x0 = x = 0; y0 = y = 0; if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } else { latin_psfont = NULL; latin_font = NULL; } gtk_plot_cairo_set_color(pc, &real_fg); aux = text; while(aux && *aux != '\0' && *aux != '\n'){ if(*aux == '\\'){ aux = g_utf8_next_char(aux); switch(*aux){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '9': psfont = gtk_psfont_get_by_family((gchar *)g_list_nth_data(family, *aux-'0'), italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); aux = g_utf8_next_char(aux); break; case '8': case 'g': psfont = gtk_psfont_get_by_family("Symbol", italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); aux = g_utf8_next_char(aux); break; case 'B': bold = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(latin_font){ latin_font = NULL; } if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'x': xaux = aux + 1; for (i=0; i<3; i++){ if (xaux[i] >= '0' && xaux[i] <= '9') num[i] = xaux[i]; else break; } if (i < 3){ aux = g_utf8_next_char(aux); break; } num[3] = '\0'; insert_char = (gchar)atoi(num); subs[0] = insert_char; subs[1] = '\0'; pango_layout_set_font_description(layout, font); pango_layout_set_text(layout, subs, 1); pango_layout_get_extents(layout, NULL, &rect); x += sign_x*PANGO_PIXELS(rect.width); y += sign_y*PANGO_PIXELS(rect.width); aux += 4; lastchar = aux - 1; break; case 'i': italic = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'S': case '^': fontsize = (int)((gdouble)fontsize * 0.6 + 0.5); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } if(angle == 180) y = y0 + fontsize; else if(angle == 270) x = x0 + sign_y*fontsize; aux = g_utf8_next_char(aux); break; case 's': case '_': fontsize = (int)((gdouble)fontsize * 0.6 + 0.5); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(angle == 0) y = y0 + fontsize; else if(angle == 90) x = x0 - sign_y*fontsize; if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case '+': fontsize += 3; y -= sign_x*3; x += sign_y*3; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case '-': fontsize -= 3; y += sign_x*3; x -= sign_y*3; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'N': psfont = base_psfont; fontsize = font_height; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(angle == 0 || angle == 180) y = y0; else x = x0; italic = psfont->italic; bold = psfont->bold; aux = g_utf8_next_char(aux); break; case 'b': if (lastchar) { const gchar *aux2 = lastchar; gint i = g_utf8_prev_char(lastchar) != --aux2 ? 2 : 1; pango_layout_set_text(layout, lastchar, i); pango_layout_get_extents(layout, NULL, &rect); x -= sign_x*PANGO_PIXELS(rect.width); y -= sign_y*PANGO_PIXELS(rect.width); if (lastchar == wtext) lastchar = NULL; else lastchar = g_utf8_prev_char(lastchar); } else { pango_layout_set_text(layout, "X", 1); pango_layout_get_extents(layout, NULL, &rect); x -= sign_x*PANGO_PIXELS(rect.width); y -= sign_y*PANGO_PIXELS(rect.width); } aux = g_utf8_next_char(aux); break; default: if(aux && *aux != '\0' && *aux !='\n'){ gint new_width = 0; new_width = drawstring(pc, angle, tx+x, ty+y, psfont, fontsize, aux); x += sign_x * new_width; y += sign_y * new_width; lastchar = aux; aux = g_utf8_next_char(aux); } break; } } else { gint new_len = 0; gint new_width = 0; lastchar = aux; while(aux && *aux != '\0' && *aux !='\n' && *aux != '\\'){ xaux = aux; new_len += g_utf8_next_char(aux) != ++xaux ? 2 : 1; aux = g_utf8_next_char(aux); } xaux = lastchar; new_text = (gchar *) g_new0(gchar , strlen(text)+1); /* Tiny C Compiler support */ for(i = 0; i < new_len; i++) new_text[i] = *xaux++; new_text[new_len] = '\0'; new_width = drawstring(pc, angle, tx+x, ty+y, psfont, fontsize, new_text); x += sign_x * new_width; y += sign_y * new_width; lastchar = aux; g_free (new_text); } } if(latin_font) pango_font_description_free(latin_font); /* border */ gtk_plot_cairo_set_color(pc, &real_fg); gtk_plot_pc_set_dash(pc, 0, NULL, 0); gtk_plot_pc_set_lineattr(pc, border_width, 0, 0, 0); switch(border){ case GTK_PLOT_BORDER_SHADOW: gtk_plot_pc_draw_rectangle(pc, TRUE, old_tx - border_space + shadow_width, old_ty + height + border_space, width + 2 * border_space, shadow_width); gtk_plot_pc_draw_rectangle(pc, TRUE, old_tx + width + border_space, old_ty - border_space + shadow_width, shadow_width, height + 2 * border_space); case GTK_PLOT_BORDER_LINE: gtk_plot_pc_draw_rectangle(pc, FALSE, old_tx - border_space, old_ty - border_space, width + 2*border_space, height + 2*border_space); case GTK_PLOT_BORDER_NONE: default: break; } cairo_restore(cairo); return; }
static void psdrawstring (GtkPlotPC *pc, gint x, gint y, gint angle, const GdkColor *fg, const GdkColor *bg, gboolean transparent, gint border, gint border_space, gint border_width, gint shadow_width, const gchar *font, gint font_height, GtkJustification justification, const gchar *text) { const gchar *c; GtkPSFont *psfont, *base_psfont, *latin_psfont = NULL; gint curcnt = 0, offset = 0; gint numf; gdouble scale; gboolean italic, bold; gboolean special = FALSE; GList *family; FILE *psout; gint twidth, theight, tdescent, tascent; gint tx, ty, width, height; gint i; const gchar *aux, *xaux, *wtext, *lastchar = NULL; gchar *curstr, bkspchar[3]; gchar num[4]; if (text == NULL || text[0] == '\0') return; psout = GTK_PLOT_PS(pc)->psfile; gtk_psfont_get_families(&family, &numf); base_psfont = psfont = gtk_psfont_get_by_name(font); italic = psfont->italic; bold = psfont->bold; if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); } gtk_plot_text_get_area(text, angle, justification, font, font_height, &tx, &ty, &width, &height); tx += x; ty += y; if(!transparent){ pssetcolor(pc, bg); gtk_plot_pc_draw_rectangle(pc, TRUE, tx - border_space, ty - border_space, width + 2*border_space, height + 2*border_space); } /* border */ pssetcolor(pc, fg); pssetdash(pc, 0, NULL, 0); pssetlineattr(pc, border_width, 0, 0, 0); switch(border){ case GTK_PLOT_BORDER_SHADOW: psdrawrectangle(pc, TRUE, tx - border_space + shadow_width, ty + height + border_space, width + 2 * border_space, shadow_width); psdrawrectangle(pc, TRUE, tx + width + border_space, ty - border_space + shadow_width, shadow_width, height + 2 * border_space); case GTK_PLOT_BORDER_LINE: psdrawrectangle(pc, FALSE, tx - border_space, ty - border_space, width + 2*border_space, height + 2*border_space); case GTK_PLOT_BORDER_NONE: default: break; } gtk_plot_text_get_size(text, angle, psfont->psname, font_height, &twidth, &theight, &tascent, &tdescent); if(angle == 90 || angle == 270) angle = 360 - angle; psgsave(pc); fprintf(psout, "%d %d translate\n", x, y); fprintf(psout, "%d rotate\n", angle); fprintf(psout, "0 0 m\n"); fprintf(psout, "1 -1 sc\n"); if (psfont->i18n_latinfamily) special = TRUE; c = text; while(c && *c != '\0' && *c != '\n') { if(*c == '\\'){ c = g_utf8_next_char(c); switch(*c){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '9': case '8': case'g': case 'B': case 'b': case 'x': case 'N': case 's': case 'S': case 'i': case '-': case '+': case '^': special = TRUE; break; default: break; } } else { c = g_utf8_next_char(c); } } if(special){ switch (justification) { case GTK_JUSTIFY_LEFT: break; case GTK_JUSTIFY_RIGHT: if(angle == 0 || angle == 180) fprintf(psout, "%d JR\n", twidth); else fprintf(psout, "%d JR\n", theight); break; case GTK_JUSTIFY_CENTER: default: if(angle == 0 || angle == 180) fprintf(psout, "%d JC\n", twidth); else fprintf(psout, "%d JC\n", theight); break; } } else { pssetfont(pc, psfont, font_height); switch (justification) { case GTK_JUSTIFY_LEFT: break; case GTK_JUSTIFY_RIGHT: fprintf(psout, "(%s) sw JR\n", text); break; case GTK_JUSTIFY_CENTER: default: fprintf(psout, "(%s) sw JC\n", text); break; } fprintf(psout, "(%s) show\n", text); psgrestore(pc); fprintf(psout, "n\n"); return; } i = g_utf8_strlen(text, -1) + 2; curstr = g_malloc0(sizeof(gchar) * i); aux = wtext = text; scale = font_height; curcnt = 0; while(aux && *aux != '\0' && *aux != '\n') { if(*aux == '\\'){ aux = g_utf8_next_char(aux); switch(*aux){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '9': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; psfont = gtk_psfont_get_by_family((gchar *)g_list_nth_data(family, *aux-'0'), italic, bold); aux = g_utf8_next_char(aux); break; case '8':case 'g': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; psfont = gtk_psfont_get_by_family("Symbol", italic, bold); aux = g_utf8_next_char(aux); break; case 'B': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; bold = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); if (psfont->i18n_latinfamily) latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); aux = g_utf8_next_char(aux); break; case 'x': xaux = aux + 1; for (i=0; i<3; i++){ if (xaux[i] >= '0' && xaux[i] <= '9') num[i] = xaux[i]; else break; } if (i < 3){ aux = g_utf8_next_char(aux); break; } num[3] = '\0'; i = atoi(num); g_snprintf(num, 4, "%o", i % (64 * 8)); curstr[curcnt++] = '\\'; i = 0; while (num[i]) { curstr[curcnt++] = num[i++]; } aux += 4; break; case 'i': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; italic = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); if (psfont->i18n_latinfamily) latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); aux = g_utf8_next_char(aux); break; case 's':case '_': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; scale = 0.6 * font_height; offset -= (gint)scale / 2; fprintf(psout, "0 %d rmoveto\n", -((gint)scale / 2)); aux = g_utf8_next_char(aux); break; case 'S':case '^': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; scale = 0.6 * font_height; offset += 0.5*font_height; fprintf(psout, "0 %d rmoveto\n", (gint)(0.5*font_height)); aux = g_utf8_next_char(aux); break; case 'N': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; psfont = base_psfont; italic = psfont->italic; bold = psfont->bold; if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); } scale = font_height; fprintf(psout, "0 %d rmoveto\n", -offset); offset = 0; aux = g_utf8_next_char(aux); break; case 'b': curstr[curcnt] = '\0'; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; if (lastchar) { const gchar *aux2 = lastchar; bkspchar[0] = *lastchar; lastchar = g_utf8_prev_char(lastchar); bkspchar[1] = 0; if(--aux2 != lastchar){ bkspchar[1] = *lastchar; lastchar = g_utf8_prev_char(lastchar); bkspchar[2] = 0; } } else { bkspchar[0] = 'X'; lastchar = NULL; } psoutputstring(pc, psfont, latin_psfont, (gint)scale, bkspchar, "stringwidth pop 0 exch neg exch rmoveto"); aux = g_utf8_next_char(aux); break; case '-': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; scale -= 3; if (scale < 6) { scale = 6; } aux = g_utf8_next_char(aux); break; case '+': curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); curcnt = 0; scale += 3; aux = g_utf8_next_char(aux); break; default: if(aux && *aux != '\0' && *aux != '\n'){ curstr[curcnt++] = *aux; aux = g_utf8_next_char(aux); } break; } } else { if(aux && *aux != '\0' && *aux != '\n'){ const gchar *aux2 = aux; if(g_utf8_next_char(aux) != ++aux2){ curstr[curcnt++] = *aux++; // aux = g_utf8_next_char(aux); curstr[curcnt++] = *aux++; } else { curstr[curcnt++] = *aux; lastchar = aux; aux = g_utf8_next_char(aux); } } } } curstr[curcnt] = 0; psoutputstring(pc, psfont, latin_psfont, (gint)scale, curstr, "show"); psgrestore(pc); fprintf(psout, "n\n"); g_free(curstr); }
static void gtk_plot_gdk_draw_string (GtkPlotPC *pc, gint tx, gint ty, gint angle, const GdkColor *fg, const GdkColor *bg, gboolean transparent, gint border, gint border_space, gint border_width, gint shadow_width, const gchar *font_name, gint font_height, GtkJustification just, const gchar *text) { GdkGC *gc; GList *family = NULL; gint x0, y0; gint old_width, old_height; gboolean bold, italic; gint fontsize; gint ascent, descent; gint numf; gint width, height; gint x, y; gint i; PangoFontDescription *font = NULL, *latin_font = NULL; GtkPSFont *psfont, *base_psfont, *latin_psfont; gchar subs[2], insert_char; const gchar *aux = text; const gchar *lastchar = text; const gchar *wtext = text; const gchar *xaux = text; gchar new_text[strlen(text)+1]; gchar num[4]; PangoRectangle rect; PangoFontMetrics *metrics = NULL; PangoLayout *layout = NULL; gint real_x, real_y, real_width, real_height; GdkColor real_fg = *fg; GdkColor real_bg = *bg; PangoMatrix matrix = PANGO_MATRIX_INIT; PangoContext *context = GTK_PLOT_GDK(pc)->context; GdkDrawable *drawable = GTK_PLOT_GDK(pc)->drawable; gint sign_x = 1, sign_y = 0; if(!GTK_PLOT_GDK(pc)->drawable) return; if(!GTK_PLOT_GDK(pc)->gc) return; if(!text || strlen(text) == 0) return; gc = GTK_PLOT_GDK(pc)->gc; layout = GTK_PLOT_GDK(pc)->layout; if(!gc) return; gtk_plot_text_get_size(text, angle, font_name, font_height, &width, &height, &ascent, &descent); if(height == 0 || width == 0) return; old_width = width; old_height = height; if(angle == 90 || angle == 270) { old_width = height; old_height = width; } switch(angle){ case 90: sign_x = 0; sign_y = -1; break; case 180: sign_x = -1; sign_y = 0; break; case 270: sign_x = 0; sign_y = 1; break; case 0: default: sign_x = 1; sign_y = 0; break; } switch(just){ case GTK_JUSTIFY_LEFT: switch(angle){ case 0: ty -= ascent; break; case 90: ty -= height; tx -= ascent; break; case 180: tx -= width; ty -= descent; break; case 270: tx -= descent; break; } break; case GTK_JUSTIFY_RIGHT: switch(angle){ case 0: tx -= width; ty -= ascent; break; case 90: tx -= ascent; ty += height; break; case 180: tx += width; ty -= descent; break; case 270: tx -= descent; break; } break; case GTK_JUSTIFY_CENTER: default: switch(angle){ case 0: tx -= width / 2.; ty -= ascent; break; case 90: tx -= ascent; ty += height / 2.; break; case 180: tx += width / 2.; ty -= descent; break; case 270: tx -= descent; ty -= height / 2.; break; } } real_x = tx; real_y = ty; real_width = width; real_height = height; pango_matrix_rotate (&matrix, angle); pango_context_set_matrix (context, &matrix); pango_layout_context_changed (layout); if(!transparent){ gdk_gc_set_foreground(gc, &real_bg); gdk_draw_rectangle(drawable, gc, TRUE, tx, ty, old_width, old_height); } /* TEST */ /* gdk_draw_rectangle(text_pixmap, gc, FALSE, 0, 0, old_width-1, old_height-1); */ gtk_psfont_get_families(&family, &numf); base_psfont = psfont = gtk_psfont_get_by_name(font_name); font = gtk_psfont_get_font_description(psfont, font_height); italic = psfont->italic; bold = psfont->bold; fontsize = font_height; x0 = x = 0; y0 = y = 0; if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } else { latin_psfont = NULL; latin_font = NULL; } gdk_gc_set_foreground(gc, &real_fg); aux = text; while(aux && *aux != '\0' && *aux != '\n'){ if(*aux == '\\'){ aux = g_utf8_next_char(aux); switch(*aux){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '9': psfont = gtk_psfont_get_by_family((gchar *)g_list_nth_data(family, *aux-'0'), italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); aux = g_utf8_next_char(aux); break; case '8': case 'g': psfont = gtk_psfont_get_by_family("Symbol", italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); aux = g_utf8_next_char(aux); break; case 'B': bold = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(latin_font){ latin_font = NULL; } if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'x': xaux = aux + 1; for (i=0; i<3; i++){ if (xaux[i] >= '0' && xaux[i] <= '9') num[i] = xaux[i]; else break; } if (i < 3){ aux = g_utf8_next_char(aux); break; } num[3] = '\0'; insert_char = (gchar)atoi(num); subs[0] = insert_char; subs[1] = '\0'; pango_layout_set_font_description(layout, font); pango_layout_set_text(layout, subs, 1); pango_layout_get_extents(layout, NULL, &rect); x += sign_x*PANGO_PIXELS(rect.width); y += sign_y*PANGO_PIXELS(rect.width); aux += 4; lastchar = aux - 1; break; case 'i': italic = TRUE; psfont = gtk_psfont_get_by_family(psfont->family, italic, bold); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_psfont = gtk_psfont_get_by_family(psfont->i18n_latinfamily, italic, bold); if(latin_font) pango_font_description_free(latin_font); latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'S': case '^': fontsize = (int)((gdouble)fontsize * 0.6 + 0.5); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(metrics) pango_font_metrics_unref(metrics); metrics = pango_context_get_metrics(pango_layout_get_context(layout), font, pango_context_get_language(pango_layout_get_context(layout))); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } if(angle == 180) y = y0 + fontsize; else if(angle == 270) x = x0 + sign_y*fontsize; aux = g_utf8_next_char(aux); break; case 's': case '_': fontsize = (int)((gdouble)fontsize * 0.6 + 0.5); pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(metrics) pango_font_metrics_unref(metrics); metrics = pango_context_get_metrics(pango_layout_get_context(layout), font, pango_context_get_language(pango_layout_get_context(layout))); if(angle == 0) y = y0 + fontsize; else if(angle == 90) x = x0 - sign_y*fontsize; if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case '+': fontsize += 3; y -= sign_x*3; x += sign_y*3; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case '-': fontsize -= 3; y += sign_x*3; x -= sign_y*3; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if (psfont->i18n_latinfamily) { latin_font = gtk_psfont_get_font_description(latin_psfont, fontsize); } aux = g_utf8_next_char(aux); break; case 'N': psfont = base_psfont; fontsize = font_height; pango_font_description_free(font); font = gtk_psfont_get_font_description(psfont, fontsize); if(angle == 0 || angle == 180) y = y0; else x = x0; italic = psfont->italic; bold = psfont->bold; aux = g_utf8_next_char(aux); break; case 'b': if (lastchar) { const gchar *aux2 = lastchar; gint i = g_utf8_prev_char(lastchar) != --aux2 ? 2 : 1; pango_layout_set_text(layout, lastchar, i); pango_layout_get_extents(layout, NULL, &rect); x -= sign_x*PANGO_PIXELS(rect.width); y -= sign_y*PANGO_PIXELS(rect.width); if (lastchar == wtext) lastchar = NULL; else lastchar = g_utf8_prev_char(lastchar); } else { pango_layout_set_text(layout, "X", 1); pango_layout_get_extents(layout, NULL, &rect); x -= sign_x*PANGO_PIXELS(rect.width); y -= sign_y*PANGO_PIXELS(rect.width); } aux = g_utf8_next_char(aux); break; default: if(aux && *aux != '\0' && *aux !='\n'){ gint new_width = 0; new_width = drawstring(pc, drawable, gc, angle, tx+x, ty+y, psfont, fontsize, aux); x += sign_x * new_width; y += sign_y * new_width; lastchar = aux; aux = g_utf8_next_char(aux); } break; } } else { gint new_len = 0; gint new_width = 0; lastchar = aux; while(aux && *aux != '\0' && *aux !='\n' && *aux != '\\'){ xaux = aux; new_len += g_utf8_next_char(aux) != ++xaux ? 2 : 1; aux = g_utf8_next_char(aux); } xaux = lastchar; for(i = 0; i < new_len; i++) new_text[i] = *xaux++; new_text[new_len] = '\0'; new_width = drawstring(pc, drawable, gc, angle, tx+x, ty+y, psfont, fontsize, new_text); x += sign_x * new_width; y += sign_y * new_width; lastchar = aux; } } pango_font_description_free(font); if(latin_font) pango_font_description_free(latin_font); if(metrics) pango_font_metrics_unref(metrics); /* border */ gdk_gc_set_foreground(gc, &real_fg); gtk_plot_pc_set_dash(pc, 0, NULL, 0); gtk_plot_pc_set_lineattr(pc, border_width, 0, 0, 0); switch(border){ case GTK_PLOT_BORDER_SHADOW: gtk_plot_pc_draw_rectangle(pc, TRUE, tx - border_space + shadow_width, ty + height + border_space, width + 2 * border_space, shadow_width); gtk_plot_pc_draw_rectangle(pc, TRUE, tx + width + border_space, ty - border_space + shadow_width, shadow_width, height + 2 * border_space); case GTK_PLOT_BORDER_LINE: gtk_plot_pc_draw_rectangle(pc, FALSE, tx - border_space, ty - border_space, width + 2*border_space, height + 2*border_space); case GTK_PLOT_BORDER_NONE: default: break; } return; }