URI: 
       image_imlib.c - ltk - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/ltk.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       image_imlib.c (3419B)
       ---
            1 /*
            2  * Copyright (c) 2023-2024 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 <stddef.h>
           18 
           19 #include <Imlib2.h>
           20 
           21 #include "image.h"
           22 #include "memory.h"
           23 #include "graphics.h"
           24 #include "graphics_xlib.h"
           25 
           26 struct ltk_image {
           27         Imlib_Image img;
           28 };
           29 
           30 void
           31 ltk_image_init(ltk_renderdata *data, size_t cache_bytes) {
           32         /* FIXME: overflow */
           33         imlib_set_cache_size((int)cache_bytes);
           34         imlib_set_color_usage(128);
           35         imlib_context_set_blend(0);
           36         imlib_context_set_dither(1);
           37         imlib_context_set_display(data->dpy);
           38         imlib_context_set_visual(data->vis);
           39         imlib_context_set_colormap(data->cm);
           40 }
           41 
           42 ltk_image *
           43 ltk_image_create_from_mem(const char *path, const char *data, size_t sz) {
           44         Imlib_Image img = imlib_load_image_mem(path, data, sz);
           45         if (!img)
           46                 return NULL;
           47         ltk_image *image = ltk_malloc(sizeof(ltk_image));
           48         image->img = img;
           49         return image;
           50 }
           51 
           52 ltk_image *
           53 ltk_image_create_from_path(const char *path) {
           54         Imlib_Image img = imlib_load_image_immediately(path);
           55         if (!img)
           56                 return NULL;
           57         ltk_image *image = ltk_malloc(sizeof(ltk_image));
           58         image->img = img;
           59         return image;
           60 }
           61 
           62 ltk_image *
           63 ltk_image_create_cropped_scaled(
           64     ltk_image *image, int src_x, int src_y,
           65     int src_w, int src_h, int dst_w, int dst_h) {
           66         imlib_context_set_image(image->img);
           67         /* FIXME: check since when supported */
           68         Imlib_Image img = imlib_create_cropped_scaled_image(
           69             src_x, src_y, src_w, src_h, dst_w, dst_h
           70         );
           71         if (!img)
           72                 return NULL;
           73         ltk_image *new_image = ltk_malloc(sizeof(ltk_image));
           74         new_image->img = img;
           75         return new_image;
           76 }
           77 
           78 void
           79 ltk_image_draw(ltk_image *image, ltk_surface *draw_surf, int x, int y) {
           80         imlib_context_set_image(image->img);
           81         imlib_context_set_drawable(draw_surf->d);
           82         imlib_render_image_on_drawable(x, y);
           83 }
           84 
           85 void
           86 ltk_image_draw_scaled(
           87     ltk_image *image, ltk_surface *draw_surf,
           88     int x, int y, int w, int h) {
           89         imlib_context_set_image(image->img);
           90         imlib_context_set_drawable(draw_surf->d);
           91         imlib_render_image_on_drawable_at_size(x, y, w, h);
           92 }
           93 
           94 void
           95 ltk_image_draw_cropped_scaled(
           96     ltk_image *image, ltk_surface *draw_surf,
           97     int src_x, int src_y, int src_w, int src_h,
           98     int dst_x, int dst_y, int dst_w, int dst_h) {
           99         imlib_context_set_image(image->img);
          100         imlib_context_set_drawable(draw_surf->d);
          101         imlib_render_image_part_on_drawable_at_size(
          102             src_x, src_y, src_w, src_h, dst_x, dst_y, dst_w, dst_h
          103         );
          104 }
          105 
          106 int
          107 ltk_image_get_width(ltk_image *image) {
          108         imlib_context_set_image(image->img);
          109         return imlib_image_get_width();
          110 }
          111 
          112 int
          113 ltk_image_get_height(ltk_image *image) {
          114         imlib_context_set_image(image->img);
          115         return imlib_image_get_height();
          116 }
          117 
          118 void
          119 ltk_image_destroy(ltk_image *image) {
          120         imlib_context_set_image(image->img);
          121         imlib_free_image();
          122         ltk_free(image);
          123 }