163 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id: fb_imlib2.c,v 1.5 2002/07/18 15:14:21 ukai Exp $ */
 | 
						|
/**************************************************************************
 | 
						|
                fb_imlib2.c 0.2 Copyright (C) 2002, hito
 | 
						|
 **************************************************************************/
 | 
						|
 | 
						|
#include "fb.h"
 | 
						|
#include "fb_img.h"
 | 
						|
 | 
						|
static void set_prm(IMAGE * img);
 | 
						|
 | 
						|
IMAGE *
 | 
						|
fb_load_image(char *filename, int w, int h)
 | 
						|
{
 | 
						|
    Imlib_Image image;
 | 
						|
    IMAGE *img;
 | 
						|
 | 
						|
    if (filename == NULL)
 | 
						|
	return NULL;
 | 
						|
 | 
						|
    img = malloc(sizeof(*img));
 | 
						|
    if (img == NULL)
 | 
						|
	return NULL;
 | 
						|
 | 
						|
    image = imlib_load_image(filename);
 | 
						|
    if (image == NULL) {
 | 
						|
	free(img);
 | 
						|
	return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    imlib_context_set_image(image);
 | 
						|
 | 
						|
    img->image = image;
 | 
						|
    set_prm(img);
 | 
						|
 | 
						|
    fb_resize_image(img, w, h);
 | 
						|
 | 
						|
    return img;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
fb_draw_image(IMAGE * img, int x, int y, int sx, int sy, int width, int height)
 | 
						|
{
 | 
						|
    int i, j, r, g, b, a = 0, offset;
 | 
						|
 | 
						|
    if (img == NULL)
 | 
						|
	return 1;
 | 
						|
 | 
						|
    for (j = sy; j < sy + height && j < img->height; j++) {
 | 
						|
	offset = j * img->width;
 | 
						|
	for (i = sx; i < sx + width && i < img->width; i++) {
 | 
						|
	    a = (img->data[offset + i] >> 24) & 0x000000ff;
 | 
						|
	    r = (img->data[offset + i] >> 16) & 0x000000ff;
 | 
						|
	    g = (img->data[offset + i] >> 8) & 0x000000ff;
 | 
						|
	    b = (img->data[offset + i]) & 0x000000ff;
 | 
						|
 | 
						|
	    if (a == 0)
 | 
						|
		fb_pset(i + x - sx, j + y - sy, bg_r, bg_g, bg_b);
 | 
						|
	    else
 | 
						|
		fb_pset(i + x - sx, j + y - sy, r, g, b);
 | 
						|
	}
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
fb_resize_image(IMAGE * img, int width, int height)
 | 
						|
{
 | 
						|
    Imlib_Image image;
 | 
						|
 | 
						|
    if (width < 1 || height < 1 || img == NULL)
 | 
						|
	return 1;
 | 
						|
 | 
						|
    if (width == img->width && height == img->height)
 | 
						|
	return 0;
 | 
						|
 | 
						|
    image =
 | 
						|
	imlib_create_cropped_scaled_image(0, 0, img->width, img->height, width,
 | 
						|
					  height);
 | 
						|
    if (image == NULL)
 | 
						|
	return 1;
 | 
						|
 | 
						|
    imlib_context_set_image(img->image);
 | 
						|
    imlib_free_image();
 | 
						|
 | 
						|
    img->image = image;
 | 
						|
    set_prm(img);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
fb_free_image(IMAGE * img)
 | 
						|
{
 | 
						|
    if (img == NULL)
 | 
						|
	return;
 | 
						|
 | 
						|
    imlib_context_set_image(img->image);
 | 
						|
    imlib_free_image();
 | 
						|
    free(img);
 | 
						|
}
 | 
						|
 | 
						|
IMAGE *
 | 
						|
fb_dup_image(IMAGE * img)
 | 
						|
{
 | 
						|
    Imlib_Image image;
 | 
						|
    IMAGE *new_img;
 | 
						|
 | 
						|
    if (img == NULL)
 | 
						|
	return NULL;
 | 
						|
 | 
						|
    new_img = malloc(sizeof(*img));
 | 
						|
    if (new_img == NULL)
 | 
						|
	return NULL;
 | 
						|
 | 
						|
    imlib_context_set_image(img->image);
 | 
						|
    image = imlib_clone_image();
 | 
						|
 | 
						|
    if (image == NULL) {
 | 
						|
	free(new_img);
 | 
						|
	return NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    new_img->image = image;
 | 
						|
    set_prm(new_img);
 | 
						|
    return new_img;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
fb_rotate_image(IMAGE * img, int angle)
 | 
						|
{
 | 
						|
    int orientation;
 | 
						|
 | 
						|
    if (img == NULL)
 | 
						|
	return 1;
 | 
						|
 | 
						|
    imlib_context_set_image(img->image);
 | 
						|
 | 
						|
    if (angle == 90) {
 | 
						|
	orientation = 1;
 | 
						|
    }
 | 
						|
    else if (angle == -90) {
 | 
						|
	orientation = 3;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	return 1;
 | 
						|
    }
 | 
						|
 | 
						|
    imlib_image_orientate(orientation);
 | 
						|
    set_prm(img);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
set_prm(IMAGE * img)
 | 
						|
{
 | 
						|
    if (img == NULL)
 | 
						|
	return;
 | 
						|
 | 
						|
    imlib_context_set_image(img->image);
 | 
						|
    img->data = imlib_image_get_data_for_reading_only();
 | 
						|
    img->width = imlib_image_get_width();
 | 
						|
    img->height = imlib_image_get_height();
 | 
						|
}
 |