void gib_imlib_text_draw(Imlib_Image im, Imlib_Font fn, gib_style * s, int x, int y, char *text, Imlib_Text_Direction dir, int r, int g, int b, int a) { imlib_context_set_image(im); imlib_context_set_font(fn); imlib_context_set_direction(dir); if (s) { int min_x = 0, min_y = 0; gib_style_bit *bb; gib_list *l; /* here we shift the draw to accomodate bits with negative offsets, * which would be drawn at negative coords otherwise */ l = s->bits; while (l) { bb = (gib_style_bit *) l->data; if (bb) { if (bb->x_offset < min_x) min_x = bb->x_offset; if (bb->y_offset < min_y) min_y = bb->y_offset; } l = l->next; } x -= min_x; y -= min_y; /* Now draw the bits */ l = s->bits; while (l) { bb = (gib_style_bit *) l->data; if (bb) { if ((bb->r + bb->g + bb->b + bb->a) == 0) imlib_context_set_color(r, g, b, a); else imlib_context_set_color(bb->r, bb->g, bb->b, bb->a); imlib_text_draw(x + bb->x_offset, y + bb->y_offset, text); } l = l->next; } } else { imlib_context_set_color(r, g, b, a); imlib_text_draw(x, y, text); } }
void gib_imlib_get_text_size(Imlib_Font fn, char *text, gib_style * s, int *w, int *h, Imlib_Text_Direction dir) { imlib_context_set_font(fn); imlib_context_set_direction(dir); imlib_get_text_size(text, w, h); if (s) { gib_style_bit *b; int max_x_off = 0, min_x_off = 0, max_y_off = 0, min_y_off = 0; gib_list *l; l = s->bits; while (l) { b = (gib_style_bit *) l->data; if (b) { if (b->x_offset > max_x_off) max_x_off = b->x_offset; else if (b->x_offset < min_x_off) min_x_off = b->x_offset; if (b->y_offset > max_y_off) max_y_off = b->y_offset; else if (b->y_offset < min_y_off) min_y_off = b->y_offset; } l = l->next; } if (h) { *h += max_y_off; *h -= min_y_off; } if (w) { *w += max_x_off; *w -= min_x_off; } } }
int Configure(void **ctxp, int argc, char *argv[]) { int c; ContextInfo *ci; char *font = "LucidaSansDemiBold/16"; char *fp = getenv("FONTPATH"); char *color = 0; FILE *f; *ctxp = av_mallocz(sizeof(ContextInfo)); ci = (ContextInfo *) *ctxp; optind = 0; if (fp) imlib_add_path_to_font_path(fp); while ((c = getopt(argc, argv, "c:f:F:t:x:y:")) > 0) { switch (c) { case 'c': color = optarg; break; case 'F': font = optarg; break; case 't': ci->text = av_strdup(optarg); break; case 'f': ci->file = av_strdup(optarg); break; case 'x': ci->x = atoi(optarg); break; case 'y': ci->y = atoi(optarg); break; case '?': fprintf(stderr, "Unrecognized argument '%s'\n", argv[optind]); return -1; } } ci->fn = imlib_load_font(font); if (!ci->fn) { fprintf(stderr, "Failed to load font '%s'\n", font); return -1; } imlib_context_set_font(ci->fn); imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT); if (color) { char buff[256]; int done = 0; f = fopen("/usr/lib/X11/rgb.txt", "r"); if (!f) { fprintf(stderr, "Failed to find rgb.txt\n"); return -1; } while (fgets(buff, sizeof(buff), f)) { int r, g, b; char colname[80]; if (sscanf(buff, "%d %d %d %64s", &r, &g, &b, colname) == 4 && strcasecmp(colname, color) == 0) { ci->r = r; ci->g = g; ci->b = b; /* fprintf(stderr, "%s -> %d,%d,%d\n", colname, r, g, b); */ done = 1; break; } } fclose(f); if (!done) { fprintf(stderr, "Unable to find color '%s' in rgb.txt\n", color); return -1; } } imlib_context_set_color(ci->r, ci->g, ci->b, 255); return 0; }