Browse Source

slideshow support for jpg and introduced load_image function

master
Thomas Osterland 7 years ago
parent
commit
9c54730974
  1. 52
      i3lock.c

52
i3lock.c

@ -1062,6 +1062,36 @@ static void raise_loop(xcb_window_t window) {
} }
} }
/*
* Loads an image from the given path. Handles JPEG and PNG. Returns NULL in case of error.
*/
cairo_surface_t* load_image(char* image_path) {
cairo_surface_t *img = NULL;
JPEG_INFO jpg_info;
if (verify_png_image(image_path)) {
/* Create a pixmap to render on, fill it with the background color */
img = cairo_image_surface_create_from_png(image_path);
} else if (file_is_jpg(image_path)) {
DEBUG("Image looks like a jpeg, decoding\n");
unsigned char* jpg_data = read_JPEG_file(image_path, &jpg_info);
if (jpg_data != NULL) {
img = cairo_image_surface_create_for_data(jpg_data,
CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height,
jpg_info.stride);
}
}
/* In case loading failed, we just pretend no -i was specified. */
if (img && cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) {
fprintf(stderr, "Could not load image \"%s\": %s\n",
image_path, cairo_status_to_string(cairo_surface_status(img)));
img = NULL;
}
return img;
}
/* /*
* Loads the images from the provided directory and stores them in the pointer array * Loads the images from the provided directory and stores them in the pointer array
* img_slideshow * img_slideshow
@ -1089,7 +1119,7 @@ void load_slideshow_images(const char *path) {
strcat(path_to_image, dir->d_name); strcat(path_to_image, dir->d_name);
if (verify_png_image(path_to_image)) { if (verify_png_image(path_to_image)) {
img_slideshow[file_count] = cairo_image_surface_create_from_png(path_to_image); img_slideshow[file_count] = load_image(path_to_image);
++file_count; ++file_count;
} }
@ -1104,7 +1134,6 @@ int main(int argc, char *argv[]) {
struct passwd *pw; struct passwd *pw;
char *username; char *username;
char *image_path = NULL; char *image_path = NULL;
JPEG_INFO jpg_info;
#ifndef __OpenBSD__ #ifndef __OpenBSD__
int ret; int ret;
struct pam_conv conv = {conv_callback, NULL}; struct pam_conv conv = {conv_callback, NULL};
@ -1812,24 +1841,7 @@ int main(int argc, char *argv[]) {
init_colors_once(); init_colors_once();
if (is_regular_file(image_path)) { if (is_regular_file(image_path)) {
if (verify_png_image(image_path)) { img = load_image(image_path);
/* Create a pixmap to render on, fill it with the background color */
img = cairo_image_surface_create_from_png(image_path);
} else if (file_is_jpg(image_path)) {
DEBUG("Image looks like a jpeg, decoding\n");
unsigned char* jpg_data = read_JPEG_file(image_path, &jpg_info);
if (jpg_data != NULL) {
img = cairo_image_surface_create_for_data(jpg_data,
CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height,
jpg_info.stride);
}
}
/* In case loading failed, we just pretend no -i was specified. */
if (img && cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) {
fprintf(stderr, "Could not load image \"%s\": %s\n",
image_path, cairo_status_to_string(cairo_surface_status(img)));
img = NULL;
}
} else if (image_path != NULL) { } else if (image_path != NULL) {
/* Path to a directory is provided -> use slideshow mode */ /* Path to a directory is provided -> use slideshow mode */
load_slideshow_images(image_path); load_slideshow_images(image_path);

Loading…
Cancel
Save