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 main(int argc, char **argv) { int w, h, tw, th; Imlib_Image im_bg = NULL; XEvent ev; KeySym keysym; static char kbuf[20]; Imlib_Font font; Imlib_Color_Range range; const char *display_name = getenv("DISPLAY"); /** * First tests to determine which rendering task to perform */ if (display_name == NULL) display_name = ":0"; disp = XOpenDisplay(display_name); if (disp == NULL) { fprintf(stderr, "Can't open display %s\n", display_name); return 1; } vis = DefaultVisual(disp, DefaultScreen(disp)); depth = DefaultDepth(disp, DefaultScreen(disp)); cm = DefaultColormap(disp, DefaultScreen(disp)); win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0, 0, 100, 100, 0, 0, 0); XSelectInput(disp, win, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | PointerMotionMask | ExposureMask | KeyPressMask); XMapWindow(disp, win); /** * Start rendering */ imlib_set_font_cache_size(512 * 1024); imlib_add_path_to_font_path(PACKAGE_DATA_DIR"/data/fonts"); imlib_context_set_display(disp); imlib_context_set_visual(vis); imlib_context_set_colormap(cm); imlib_context_set_drawable(win); imlib_context_set_blend(0); imlib_context_set_color_modifier(NULL); imlib_context_set_blend(0); im_bg = imlib_create_image(600, 400); imlib_context_set_image(im_bg); w = imlib_image_get_width(); h = imlib_image_get_height(); imlib_context_set_color(128, 128, 255, 255); imlib_image_fill_rectangle(0, 0, w, h); XResizeWindow(disp, win, w, h); XSync(disp, False); while (1) { do { XNextEvent(disp, &ev); switch (ev.type) { case ButtonRelease: exit(0); break; case KeyPress: XLookupString(&ev.xkey, (char *)kbuf, sizeof(kbuf), &keysym, NULL); switch (*kbuf) { case 'q': exit(0); default: break; } break; default: break; } } while (XPending(disp)); imlib_context_set_image(im_bg); imlib_context_set_color(128, 128, 255, 255); imlib_image_fill_rectangle(0, 0, w, h); imlib_context_set_color(0, 0, 0, 255); imlib_image_draw_rectangle(20, 20, 560, 140); imlib_image_draw_rectangle(20, 220, 560, 140); font = imlib_load_font("notepad/15"); if (font) { char text[4096]; imlib_context_set_font(font); imlib_context_set_color(0, 0, 0, 255); sprintf(text, "RGBA range, 2 points, from red to magenta"); imlib_get_text_size(text, &tw, &th); imlib_text_draw(300 - tw / 2, 180 - th / 2, text); sprintf(text, "HSVA range, 2 points, from red to magenta"); imlib_get_text_size(text, &tw, &th); imlib_text_draw(300 - tw / 2, 380 - th / 2, text); imlib_free_font(); } /* Draw rectangle w/ RGBA gradient */ range = imlib_create_color_range(); imlib_context_set_color_range(range); imlib_context_set_color(255, 0, 0, 255); imlib_add_color_to_color_range(0); imlib_context_set_color(255, 0, 255, 255); imlib_add_color_to_color_range(20); imlib_image_fill_color_range_rectangle(21, 21, 558, 138, -90.0); imlib_free_color_range(); /* Draw rectangle w/ HSVA gradient */ range = imlib_create_color_range(); imlib_context_set_color_range(range); imlib_context_set_color_hsva(0, 1, 1, 255); imlib_add_color_to_color_range(0); imlib_context_set_color_hsva(300, 1, 1, 255); imlib_add_color_to_color_range(20); imlib_image_fill_hsva_color_range_rectangle(21, 221, 558, 138, -90.0); imlib_free_color_range(); imlib_render_image_on_drawable(0, 0); } return 0; }
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; }
void menu_draw_string_imlib2(Rwindow_t *window) { int textw, texth; unsigned int winw, winh; unsigned int dummyui; int dummyi; size_t len; char *str; Window dummywin; Imlib_Image textimg; char blend; if (window->im2title) { XGetGeometry(window->app->display, window->id, &dummywin, &dummyi, &dummyi, &winw, &winh, &dummyui, &dummyui); imlib_context_set_image(window->im2title); imlib_context_set_drawable(window->id); blend = imlib_context_get_blend(); imlib_context_set_blend(1); imlib_render_image_on_drawable(window->menu->lefttextoffset, (winh - window->im2titleh) / 2); if (window->menuitem) { textimg = NULL; if (window->menuitem->type == MENUITEM_TOGGLE) { if (!window->menuitem->im2true) { imlib_context_set_font(window->im2font); imlib_get_text_size(window->menuitem->truetext, &textw, &texth); textimg = imlib_create_image(textw, texth); if (textimg) { imlib_context_set_image(textimg); imlib_image_set_has_alpha(1); imlib_image_clear(); imlib_context_set_color(204, 181, 59, 255); imlib_text_draw(0, 0, window->menuitem->truetext); window->menuitem->im2true = textimg; window->menuitem->im2truew = textw; window->menuitem->im2trueh = texth; } } if (!window->menuitem->im2false) { imlib_context_set_font(window->im2font); imlib_get_text_size(window->menuitem->falsetext, &textw, &texth); textimg = imlib_create_image(textw, texth); if (textimg) { imlib_context_set_image(textimg); imlib_image_set_has_alpha(1); imlib_image_clear(); imlib_context_set_color(204, 181, 59, 255); imlib_text_draw(0, 0, window->menuitem->falsetext); window->menuitem->im2false = textimg; window->menuitem->im2falsew = textw; window->menuitem->im2falseh = texth; } } if (*((unsigned long *)window->menuitem->option.valueptr) & window->menuitem->option.flag) { str = window->menuitem->truetext; textimg = window->menuitem->im2true; textw = window->menuitem->im2truew; texth = window->menuitem->im2trueh; } else { str = window->menuitem->falsetext; textimg = window->menuitem->im2false; textw = window->menuitem->im2falsew; texth = window->menuitem->im2falseh; } } else if (window->menuitem->righttext) { if (!window->menuitem->im2right) { imlib_context_set_font(window->im2font); imlib_get_text_size(window->menuitem->righttext, &textw, &texth); textimg = imlib_create_image(textw, texth); if (textimg) { imlib_context_set_image(textimg); imlib_image_set_has_alpha(1); imlib_image_clear(); imlib_context_set_color(204, 181, 59, 255); imlib_text_draw(0, 0, window->menuitem->righttext); window->menuitem->im2right = textimg; window->menuitem->im2rightw = textw; window->menuitem->im2righth = texth; } } str = window->menuitem->righttext; textimg = window->menuitem->im2right; textw = window->menuitem->im2rightw; texth = window->menuitem->im2righth; } if (textimg) { imlib_context_set_image(textimg); imlib_context_set_drawable(window->id); imlib_render_image_on_drawable(winw - window->menu->righttextoffset - textw, (winh - texth) / 2); } else { #if 0 len = strlen(str); if (len) { XDrawString(window->app->display, window->id, window->gc, winw - window->menu->righttextoffset - len * FONT_WIDTH(window->fontinfo), (winh + FONT_HEIGHT(window->fontinfo)) / 2, str, len); } #endif } } imlib_context_set_blend(blend); } else { menu_draw_string(window); } return; }
void gib_imlib_free_font(Imlib_Font fn) { imlib_context_set_font(fn); imlib_free_font(); }
static void Efont_free(EFont * f) { imlib_context_set_font(f); imlib_free_font(); }