ltk

Socket-based GUI for X11 (WIP)
git clone git://lumidify.org/ltk.git (fast, but not encrypted)
git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

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 }