image.c (3249B)
1 /* 2 * Copyright (c) 2023 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <Imlib2.h> 18 19 #include "ltk.h" 20 #include "image.h" 21 #include "memory.h" 22 #include "graphics.h" 23 #include "xlib_shared.h" 24 25 struct ltk_image { 26 Imlib_Image img; 27 }; 28 29 void 30 ltk_image_init(ltk_renderdata *data, size_t cache_bytes) { 31 /* FIXME: overflow */ 32 imlib_set_cache_size((int)cache_bytes); 33 imlib_set_color_usage(128); 34 imlib_context_set_blend(0); 35 imlib_context_set_dither(1); 36 imlib_context_set_display(data->dpy); 37 imlib_context_set_visual(data->vis); 38 imlib_context_set_colormap(data->cm); 39 } 40 41 ltk_image * 42 ltk_image_create_from_mem(const char *path, const char *data, size_t sz) { 43 Imlib_Image img = imlib_load_image_mem(path, data, sz); 44 if (!img) 45 return NULL; 46 ltk_image *image = ltk_malloc(sizeof(ltk_image)); 47 image->img = img; 48 return image; 49 } 50 51 ltk_image * 52 ltk_image_create_cropped_scaled( 53 ltk_image *image, int src_x, int src_y, 54 int src_w, int src_h, int dst_w, int dst_h) { 55 imlib_context_set_image(image->img); 56 /* FIXME: check since when supported */ 57 Imlib_Image img = imlib_create_cropped_scaled_image( 58 src_x, src_y, src_w, src_h, dst_w, dst_h 59 ); 60 if (!img) 61 return NULL; 62 ltk_image *new_image = ltk_malloc(sizeof(ltk_image)); 63 new_image->img = img; 64 return new_image; 65 } 66 67 void 68 ltk_image_draw(ltk_image *image, ltk_surface *draw_surf, int x, int y) { 69 imlib_context_set_image(image->img); 70 imlib_context_set_drawable(ltk_surface_get_drawable(draw_surf)); 71 imlib_render_image_on_drawable(x, y); 72 } 73 74 void 75 ltk_image_draw_scaled( 76 ltk_image *image, ltk_surface *draw_surf, 77 int x, int y, int w, int h) { 78 imlib_context_set_image(image->img); 79 imlib_context_set_drawable(ltk_surface_get_drawable(draw_surf)); 80 imlib_render_image_on_drawable_at_size(x, y, w, h); 81 } 82 83 void 84 ltk_image_draw_cropped_scaled( 85 ltk_image *image, ltk_surface *draw_surf, 86 int src_x, int src_y, int src_w, int src_h, 87 int dst_x, int dst_y, int dst_w, int dst_h) { 88 imlib_context_set_image(image->img); 89 imlib_context_set_drawable(ltk_surface_get_drawable(draw_surf)); 90 imlib_render_image_part_on_drawable_at_size( 91 src_x, src_y, src_w, src_h, dst_x, dst_y, dst_w, dst_h 92 ); 93 } 94 95 int 96 ltk_image_get_width(ltk_image *image) { 97 imlib_context_set_image(image->img); 98 return imlib_image_get_width(); 99 } 100 101 int 102 ltk_image_get_height(ltk_image *image) { 103 imlib_context_set_image(image->img); 104 return imlib_image_get_height(); 105 } 106 107 void 108 ltk_image_destroy(ltk_image *image) { 109 imlib_context_set_image(image->img); 110 imlib_free_image(); 111 ltk_free(image); 112 }