From 9e7ce74391a89d3016bd653727376f351d27f906 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 12 Sep 2000 00:08:25 +0000 Subject: [PATCH] simple commented demo SVN revision: 3393 --- test/Makefile.am | 6 +- test/imlib2_test.c | 259 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 test/imlib2_test.c diff --git a/test/Makefile.am b/test/Makefile.am index 2a1fa1c..dcac1e6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -11,7 +11,7 @@ INCLUDES = -I/usr/X11R6/include -I$(top_srcdir)/libltdl \ -I. -I$(top_srcdir) -I$(top_srcdir)/src \ -I$(top_srcdir)/loaders -bin_PROGRAMS = imlib2 bumpmaptest +bin_PROGRAMS = imlib2 bumpmaptest imlib2_test imlib2_SOURCES = main.c imlib2_LDADD = @DLLDFLAGS@ $(top_builddir)/libltdl/libltdlc.la \ -lX11 -lXext -lttf -lImlib2 @@ -19,3 +19,7 @@ imlib2_LDADD = @DLLDFLAGS@ $(top_builddir)/libltdl/libltdlc.la \ bumpmaptest_SOURCES = bmtest.c bumpmaptest_LDADD = @DLLDFLAGS@ $(top_builddir)/libltdl/libltdlc.la \ -lX11 -lXext -lttf -lImlib2 + +imlib2_test_SOURCES = imlib2_test.c +imlib2_test_LDADD = @DLLDFLAGS@ $(top_builddir)/libltdl/libltdlc.la \ + -lX11 -lXext -lttf -lImlib2 diff --git a/test/imlib2_test.c b/test/imlib2_test.c new file mode 100644 index 0000000..7daf10d --- /dev/null +++ b/test/imlib2_test.c @@ -0,0 +1,259 @@ +/* include X11 stuff */ +#include +/* include Imlib2 stuff */ +#include +/* sprintf include */ +#include + +/* some globals for our window & X display */ +Display *disp; +Window win; +Visual *vis; +Colormap cm; +int depth; + +/* the program... */ +int main(int argc, char **argv) +{ + /* events we get from X */ + XEvent ev; + /* areas to update */ + Imlib_Updates updates, current_update; + /* our virtual framebuffer image we draw into */ + Imlib_Image buffer; + /* a font */ + Imlib_Font font; + /* our color range */ + Imlib_Color_Range range; + /* our mouse x, y coordinates */ + int mouse_x = 0, mouse_y = 0; + + /* connect to X */ + disp = XOpenDisplay(NULL); + /* get default visual , colormap etc. you could ask imlib2 for what it */ + /* thinks is the best, but this example is intended to be simple */ + vis = DefaultVisual(disp, DefaultScreen(disp)); + depth = DefaultDepth(disp, DefaultScreen(disp)); + cm = DefaultColormap(disp, DefaultScreen(disp)); + /* create a window 640x480 */ + win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), + 0, 0, 640, 480, 0, 0, 0); + /* tell X what events we are interested in */ + XSelectInput(disp, win, ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | ExposureMask); + /* show the window */ + XMapWindow(disp, win); + /* set our cache to 2 Mb so it doesnt have to go hit the disk as long as */ + /* the images we use use less than 2Mb of RAM (that is uncompressed) */ + imlib_set_cache_size(2048 * 1024); + /* set the font cache to 512Kb - again to avoid re-loading */ + imlib_set_font_cache_size(512 * 1024); + /* add the ./ttfonts dir to our font path - you'll want a notepad.ttf */ + /* in that dir for the text to display */ + imlib_add_path_to_font_path("./ttfonts"); + /* set the maximum number of colors to allocate for 8bpp and less to 128 */ + imlib_set_color_usage(128); + /* dither for depths < 24bpp */ + imlib_context_set_dither(1); + /* set the display , visual, colormap and drawable we are using */ + imlib_context_set_display(disp); + imlib_context_set_visual(vis); + imlib_context_set_colormap(cm); + imlib_context_set_drawable(win); + /* infinite event loop */ + for (;;) + { + /* image variable */ + Imlib_Image image; + /* width and height values */ + int w, h, text_w, text_h; + + /* init our updates to empty */ + updates = imlib_updates_init(); + /* while there are events form X - handle them */ + do + { + XNextEvent(disp, &ev); + switch (ev.type) + { + case Expose: + /* window rectangle was exposed - add it to the list of */ + /* rectangles we need to re-render */ + updates = imlib_update_append_rect(updates, + ev.xexpose.x, ev.xexpose.y, + ev.xexpose.width, ev.xexpose.height); + break; + case ButtonPress: + /* if we click anywhere in the window, exit */ + exit(0); + break; + case MotionNotify: + /* if the mouse moves - note it */ + /* add a rectangle update for the new mouse position */ + image = imlib_load_image("./test_images/mush.png"); + imlib_context_set_image(image); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + imlib_context_set_image(image); + imlib_free_image(); + /* the old position - so we wipe over where it used to be */ + updates = imlib_update_append_rect(updates, + mouse_x - (w / 2), mouse_y - (h / 2), + w, h); + font = imlib_load_font("notepad/30"); + if (font) + { + char text[4096]; + + imlib_context_set_font(font); + sprintf(text, "Mouse is at %i, %i", mouse_x, mouse_y); + imlib_get_text_size(text, &text_w, &text_h); + imlib_free_font(); + updates = imlib_update_append_rect(updates, + 320 - (text_w / 2), 240 - (text_h / 2), + text_w, text_h); + } + + mouse_x = ev.xmotion.x; + mouse_y = ev.xmotion.y; + /* the new one */ + updates = imlib_update_append_rect(updates, + mouse_x - (w / 2), mouse_y - (h / 2), + w, h); + font = imlib_load_font("notepad/30"); + if (font) + { + char text[4096]; + + imlib_context_set_font(font); + sprintf(text, "Mouse is at %i, %i", mouse_x, mouse_y); + imlib_get_text_size(text, &text_w, &text_h); + imlib_free_font(); + updates = imlib_update_append_rect(updates, + 320 - (text_w / 2), 240 - (text_h / 2), + text_w, text_h); + } + default: + /* any other events - do nothing */ + break; + } + } + while (XPending(disp)); + + /* no more events for now ? ok - idle time so lets draw stuff */ + + /* take all the little rectangles to redraw and merge them into */ + /* something sane for rendering */ + updates = imlib_updates_merge_for_rendering(updates, 640, 480); + for (current_update = updates; + current_update; + current_update = imlib_updates_get_next(current_update)) + { + int up_x, up_y, up_w, up_h; + + /* find out where the first update is */ + imlib_updates_get_coordinates(current_update, + &up_x, &up_y, &up_w, &up_h); + + /* create our buffer image for renderign this update */ + buffer = imlib_create_image(up_w, up_h); + + /* we can blend stuff now */ + imlib_context_set_blend(1); + + /* fill the window background */ + /* load the background image - you'll need to have some images */ + /* in ./test_images lying around for this to actually work */ + image = imlib_load_image("./test_images/bg.png"); + /* we're working with this image now */ + imlib_context_set_image(image); + /* get its size */ + w = imlib_image_get_width(); + h = imlib_image_get_height(); + /* now we want to work with the buffer */ + imlib_context_set_image(buffer); + /* if the iimage loaded */ + if (image) + { + /* blend image onto the buffer and scale it to 640x480 */ + imlib_blend_image_onto_image(image, 0, + 0, 0, w, h, + - up_x, - up_y, 640, 480); + /* working with the loaded image */ + imlib_context_set_image(image); + /* free it */ + imlib_free_image(); + } + + /* draw an icon centered around the mouse position */ + image = imlib_load_image("./test_images/mush.png"); + imlib_context_set_image(image); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + imlib_context_set_image(buffer); + if (image) + { + imlib_blend_image_onto_image(image, 0, + 0, 0, w, h, + mouse_x - (w / 2) - up_x, mouse_y - (h / 2) - up_y, w, h); + imlib_context_set_image(image); + imlib_free_image(); + } + + /* draw a gradient on top of things at the top left of the window */ + /* create a range */ + range = imlib_create_color_range(); + imlib_context_set_color_range(range); + /* add white opaque as the first color */ + imlib_context_set_color(255, 255, 255, 255); + imlib_add_color_to_color_range(0); + /* add an orange color, semi-transparent 10 units from the first */ + imlib_context_set_color(255, 200, 10, 100); + imlib_add_color_to_color_range(10); + /* add black, fully transparent at the end 20 units away */ + imlib_context_set_color(0, 0, 0, 0); + imlib_add_color_to_color_range(20); + /* draw the range */ + imlib_context_set_image(buffer); + imlib_image_fill_color_range_rectangle(- up_x, - up_y, 128, 128, -45.0); + /* free it */ + imlib_free_color_range(); + + /* draw text - centered with the current mouse x, y */ + font = imlib_load_font("notepad/30"); + if (font) + { + char text[4096]; + + /* set the current font */ + imlib_context_set_font(font); + /* set the image */ + imlib_context_set_image(buffer); + /* set the color (black) */ + imlib_context_set_color(0, 0, 0, 255); + /* print text to display in the buffer */ + sprintf(text, "Mouse is at %i, %i", mouse_x, mouse_y); + /* query the size it will be */ + imlib_get_text_size(text, &text_w, &text_h); + /* draw it */ + imlib_text_draw(320 - (text_w / 2) - up_x, 240 - (text_h / 2) - up_y, text); + /* free the font */ + imlib_free_font(); + } + + /* dont blend the image onto the drawable - slower */ + imlib_context_set_blend(0); + /* set the buffer image as our current image */ + imlib_context_set_image(buffer); + /* render the image at 0, 0 */ + imlib_render_image_on_drawable(up_x, up_y); + /* don't need that temproary buffer image anymore */ + imlib_free_image(); + } + /* if we had updates - free them */ + if (updates) + imlib_updates_free(updates); + /* loop again waiting for events */ + } + return 0; +}