From 09abe70df1fb7ae8d8ae1218ae477d9b413949a6 Mon Sep 17 00:00:00 2001 From: waker Date: Sat, 23 Apr 2011 19:26:14 +0200 Subject: nuked imlib2 usage; use libjpeg directly to prepare images for notifications --- README | 2 +- configure.ac | 10 +- lib-x86-32/include/Imlib2.h | 513 -------------------------------------------- lib-x86-32/libImlib2.a | Bin 886792 -> 0 bytes plugins/artwork/Makefile.am | 4 +- plugins/artwork/artwork.c | 175 ++++++++++++++- 6 files changed, 180 insertions(+), 524 deletions(-) delete mode 100644 lib-x86-32/include/Imlib2.h delete mode 100644 lib-x86-32/libImlib2.a diff --git a/README b/README index 0c2537da..bedc3517 100644 --- a/README +++ b/README @@ -31,7 +31,7 @@ full list of dependencies: alsa-lib: ALSA support libvorbis and libogg: for ogg vorbis plugin libcurl >= 7.10: for last.fm, vfs_curl (shoutcast/icecast), artwork plugins - imlib2: for artwork plugin + libjpeg: for artwork plugin libmad: for mp3 plugin (mpeg1,2 layers1,2,3) libFLAC: for flac plugin wavpack: for wavpack plugin diff --git a/configure.ac b/configure.ac index 09942782..364fb678 100644 --- a/configure.ac +++ b/configure.ac @@ -415,14 +415,14 @@ fi if test "x$enable_artwork" != "xno" ; then if test "x$enable_staticlink" != "xno" ; then - HAVE_IMLIB2=yes - IMLIB2_DEPS_LIBS="../../$LIB/libImlib2.a ../../$LIB/ft2.o" - AC_SUBST(IMLIB2_DEPS_LIBS) + HAVE_JPEG=yes + JPEG_DEPS_LIBS="../../$LIB/libjpeg.a" + AC_SUBST(JPEG_DEPS_LIBS) else - PKG_CHECK_MODULES(IMLIB2_DEPS, imlib2, HAVE_IMLIB2=yes, HAVE_IMLIB2=no) + PKG_CHECK_MODULES(JPEG_DEPS, jpeg, HAVE_JPEG=yes, HAVE_JPEG=no) fi - if test "x$HAVE_VFS_CURL" = "xyes" && test "x$HAVE_IMLIB2" == "xyes" ; then + if test "x$HAVE_VFS_CURL" = "xyes" && test "x$HAVE_JPEG" == "xyes" ; then HAVE_ARTWORK=yes fi fi diff --git a/lib-x86-32/include/Imlib2.h b/lib-x86-32/include/Imlib2.h deleted file mode 100644 index 554ae9bb..00000000 --- a/lib-x86-32/include/Imlib2.h +++ /dev/null @@ -1,513 +0,0 @@ -#ifndef __IMLIB_API_H -# define __IMLIB_API_H 1 - -# ifdef EAPI -# undef EAPI -# endif -# ifdef WIN32 -# ifdef BUILDING_DLL -# define EAPI __declspec(dllexport) -# else -# define EAPI __declspec(dllimport) -# endif -# else -# ifdef __GNUC__ -# if __GNUC__ >= 4 -# define EAPI __attribute__ ((visibility("default"))) -# else -# define EAPI -# endif -# else -# define EAPI -# endif -# endif - -# ifndef X_DISPLAY_MISSING -# include -# endif - -/* Data types to use */ -# ifndef DATA64 -# define DATA64 unsigned long long -# define DATA32 unsigned int -# define DATA16 unsigned short -# define DATA8 unsigned char -# endif - -/* opaque data types */ -typedef void *Imlib_Context; -typedef void *Imlib_Image; -typedef void *Imlib_Color_Modifier; -typedef void *Imlib_Updates; -typedef void *Imlib_Font; -typedef void *Imlib_Color_Range; -typedef void *Imlib_Filter; -typedef struct _imlib_border Imlib_Border; -typedef struct _imlib_color Imlib_Color; -typedef void *ImlibPolygon; - -/* blending operations */ -enum _imlib_operation -{ - IMLIB_OP_COPY, - IMLIB_OP_ADD, - IMLIB_OP_SUBTRACT, - IMLIB_OP_RESHADE -}; - -enum _imlib_text_direction -{ - IMLIB_TEXT_TO_RIGHT = 0, - IMLIB_TEXT_TO_LEFT = 1, - IMLIB_TEXT_TO_DOWN = 2, - IMLIB_TEXT_TO_UP = 3, - IMLIB_TEXT_TO_ANGLE = 4 -}; - -enum _imlib_load_error -{ - IMLIB_LOAD_ERROR_NONE, - IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST, - IMLIB_LOAD_ERROR_FILE_IS_DIRECTORY, - IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_READ, - IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT, - IMLIB_LOAD_ERROR_PATH_TOO_LONG, - IMLIB_LOAD_ERROR_PATH_COMPONENT_NON_EXISTANT, - IMLIB_LOAD_ERROR_PATH_COMPONENT_NOT_DIRECTORY, - IMLIB_LOAD_ERROR_PATH_POINTS_OUTSIDE_ADDRESS_SPACE, - IMLIB_LOAD_ERROR_TOO_MANY_SYMBOLIC_LINKS, - IMLIB_LOAD_ERROR_OUT_OF_MEMORY, - IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS, - IMLIB_LOAD_ERROR_PERMISSION_DENIED_TO_WRITE, - IMLIB_LOAD_ERROR_OUT_OF_DISK_SPACE, - IMLIB_LOAD_ERROR_UNKNOWN -}; - -/* Encodings known to Imlib2 (so far) */ -enum _imlib_TTF_encoding -{ - IMLIB_TTF_ENCODING_ISO_8859_1, - IMLIB_TTF_ENCODING_ISO_8859_2, - IMLIB_TTF_ENCODING_ISO_8859_3, - IMLIB_TTF_ENCODING_ISO_8859_4, - IMLIB_TTF_ENCODING_ISO_8859_5 -}; - -typedef enum _imlib_operation Imlib_Operation; -typedef enum _imlib_load_error Imlib_Load_Error; -typedef enum _imlib_load_error ImlibLoadError; -typedef enum _imlib_text_direction Imlib_Text_Direction; -typedef enum _imlib_TTF_encoding Imlib_TTF_Encoding; - -struct _imlib_border -{ - int left, right, top, bottom; -}; - -struct _imlib_color -{ - int alpha, red, green, blue; -}; - -/* Progressive loading callbacks */ -typedef int (*Imlib_Progress_Function) (Imlib_Image im, char percent, - int update_x, int update_y, - int update_w, int update_h); -typedef void (*Imlib_Data_Destructor_Function) (Imlib_Image im, void *data); - -# ifdef __cplusplus -extern "C" -{ -# endif - -/* context handling */ - EAPI Imlib_Context imlib_context_new(void); - EAPI void imlib_context_free(Imlib_Context context); - - EAPI void imlib_context_push(Imlib_Context context); - EAPI void imlib_context_pop(void); - EAPI Imlib_Context imlib_context_get(void); - -/* context setting */ -# ifndef X_DISPLAY_MISSING - EAPI void imlib_context_set_display(Display * display); - EAPI void imlib_context_disconnect_display(void); - EAPI void imlib_context_set_visual(Visual * visual); - EAPI void imlib_context_set_colormap(Colormap colormap); - EAPI void imlib_context_set_drawable(Drawable drawable); - EAPI void imlib_context_set_mask(Pixmap mask); -# endif - EAPI void imlib_context_set_dither_mask(char dither_mask); - EAPI void imlib_context_set_mask_alpha_threshold(int mask_alpha_threshold); - EAPI void imlib_context_set_anti_alias(char anti_alias); - EAPI void imlib_context_set_dither(char dither); - EAPI void imlib_context_set_blend(char blend); - EAPI void imlib_context_set_color_modifier(Imlib_Color_Modifier color_modifier); - EAPI void imlib_context_set_operation(Imlib_Operation operation); - EAPI void imlib_context_set_font(Imlib_Font font); - EAPI void imlib_context_set_direction(Imlib_Text_Direction direction); - EAPI void imlib_context_set_angle(double angle); - EAPI void imlib_context_set_color(int red, int green, int blue, int alpha); - EAPI void imlib_context_set_color_hsva(float hue, float saturation, float value, int alpha); - EAPI void imlib_context_set_color_hlsa(float hue, float lightness, float saturation, int alpha); - EAPI void imlib_context_set_color_cmya(int cyan, int magenta, int yellow, int alpha); - EAPI void imlib_context_set_color_range(Imlib_Color_Range color_range); - EAPI void imlib_context_set_progress_function(Imlib_Progress_Function - progress_function); - EAPI void imlib_context_set_progress_granularity(char progress_granularity); - EAPI void imlib_context_set_image(Imlib_Image image); - EAPI void imlib_context_set_cliprect(int x, int y, int w, int h); - EAPI void imlib_context_set_TTF_encoding(Imlib_TTF_Encoding encoding); - -/* context getting */ -# ifndef X_DISPLAY_MISSING - EAPI Display *imlib_context_get_display(void); - EAPI Visual *imlib_context_get_visual(void); - EAPI Colormap imlib_context_get_colormap(void); - EAPI Drawable imlib_context_get_drawable(void); - EAPI Pixmap imlib_context_get_mask(void); -# endif - EAPI char imlib_context_get_dither_mask(void); - EAPI char imlib_context_get_anti_alias(void); - EAPI int imlib_context_get_mask_alpha_threshold(void); - EAPI char imlib_context_get_dither(void); - EAPI char imlib_context_get_blend(void); - EAPI Imlib_Color_Modifier imlib_context_get_color_modifier(void); - EAPI Imlib_Operation imlib_context_get_operation(void); - EAPI Imlib_Font imlib_context_get_font(void); - EAPI double imlib_context_get_angle(void); - EAPI Imlib_Text_Direction imlib_context_get_direction(void); - EAPI void imlib_context_get_color(int *red, int *green, int *blue, int *alpha); - EAPI void imlib_context_get_color_hsva(float *hue, float *saturation, float *value, int *alpha); - EAPI void imlib_context_get_color_hlsa(float *hue, float *lightness, float *saturation, int *alpha); - EAPI void imlib_context_get_color_cmya(int *cyan, int *magenta, int *yellow, int *alpha); - EAPI Imlib_Color *imlib_context_get_imlib_color(void); - EAPI Imlib_Color_Range imlib_context_get_color_range(void); - EAPI Imlib_Progress_Function imlib_context_get_progress_function(void); - EAPI char imlib_context_get_progress_granularity(void); - EAPI Imlib_Image imlib_context_get_image(void); - EAPI void imlib_context_get_cliprect(int *x, int *y, int *w, int *h); - EAPI Imlib_TTF_Encoding imlib_context_get_TTF_encoding(void); - - EAPI int imlib_get_cache_size(void); - EAPI void imlib_set_cache_size(int bytes); - EAPI int imlib_get_color_usage(void); - EAPI void imlib_set_color_usage(int max); - EAPI void imlib_flush_loaders(void); -# ifndef X_DISPLAY_MISSING - EAPI int imlib_get_visual_depth(Display * display, Visual * visual); - EAPI Visual *imlib_get_best_visual(Display * display, int screen, - int *depth_return); -# endif - - EAPI Imlib_Image imlib_load_image(const char *file); - EAPI Imlib_Image imlib_load_image_immediately(const char *file); - EAPI Imlib_Image imlib_load_image_without_cache(const char *file); - EAPI Imlib_Image imlib_load_image_immediately_without_cache(const char *file); - EAPI Imlib_Image imlib_load_image_with_error_return(const char *file, - Imlib_Load_Error * - error_return); - EAPI void imlib_free_image(void); - EAPI void imlib_free_image_and_decache(void); - -/* query/modify image parameters */ - EAPI int imlib_image_get_width(void); - EAPI int imlib_image_get_height(void); - EAPI const char *imlib_image_get_filename(void); - EAPI DATA32 *imlib_image_get_data(void); - EAPI DATA32 *imlib_image_get_data_for_reading_only(void); - EAPI void imlib_image_put_back_data(DATA32 * data); - EAPI char imlib_image_has_alpha(void); - EAPI void imlib_image_set_changes_on_disk(void); - EAPI void imlib_image_get_border(Imlib_Border * border); - EAPI void imlib_image_set_border(Imlib_Border * border); - EAPI void imlib_image_set_format(const char *format); - EAPI void imlib_image_set_irrelevant_format(char irrelevant); - EAPI void imlib_image_set_irrelevant_border(char irrelevant); - EAPI void imlib_image_set_irrelevant_alpha(char irrelevant); - EAPI char *imlib_image_format(void); - EAPI void imlib_image_set_has_alpha(char has_alpha); - EAPI void imlib_image_query_pixel(int x, int y, Imlib_Color * color_return); - EAPI void imlib_image_query_pixel_hsva(int x, int y, float *hue, float *saturation, float *value, int *alpha); - EAPI void imlib_image_query_pixel_hlsa(int x, int y, float *hue, float *lightness, float *saturation, int *alpha); - EAPI void imlib_image_query_pixel_cmya(int x, int y, int *cyan, int *magenta, int *yellow, int *alpha); - -/* rendering functions */ -# ifndef X_DISPLAY_MISSING - EAPI void imlib_render_pixmaps_for_whole_image(Pixmap * pixmap_return, - Pixmap * mask_return); - EAPI void imlib_render_pixmaps_for_whole_image_at_size(Pixmap * pixmap_return, - Pixmap * mask_return, - int width, int height); - EAPI void imlib_free_pixmap_and_mask(Pixmap pixmap); - EAPI void imlib_render_image_on_drawable(int x, int y); - EAPI void imlib_render_image_on_drawable_at_size(int x, int y, int width, - int height); - EAPI void imlib_render_image_part_on_drawable_at_size(int source_x, - int source_y, - int source_width, - int source_height, int x, - int y, int width, - int height); - EAPI DATA32 imlib_render_get_pixel_color(void); -# endif - EAPI void imlib_blend_image_onto_image(Imlib_Image source_image, - char merge_alpha, int source_x, - int source_y, int source_width, - int source_height, int destination_x, - int destination_y, int destination_width, - int destination_height); - -/* creation functions */ - EAPI Imlib_Image imlib_create_image(int width, int height); - EAPI Imlib_Image imlib_create_image_using_data(int width, int height, - DATA32 * data); - EAPI Imlib_Image imlib_create_image_using_copied_data(int width, int height, - DATA32 * data); -# ifndef X_DISPLAY_MISSING - EAPI Imlib_Image imlib_create_image_from_drawable(Pixmap mask, int x, int y, - int width, int height, - char need_to_grab_x); - EAPI Imlib_Image imlib_create_image_from_ximage(XImage *image, XImage *mask, int x, int y, - int width, int height, - char need_to_grab_x); - EAPI Imlib_Image imlib_create_scaled_image_from_drawable(Pixmap mask, - int source_x, - int source_y, - int source_width, - int source_height, - int destination_width, - int destination_height, - char need_to_grab_x, - char - get_mask_from_shape); - EAPI char imlib_copy_drawable_to_image(Pixmap mask, int x, int y, int width, - int height, int destination_x, - int destination_y, char need_to_grab_x); -# endif - EAPI Imlib_Image imlib_clone_image(void); - EAPI Imlib_Image imlib_create_cropped_image(int x, int y, int width, - int height); - EAPI Imlib_Image imlib_create_cropped_scaled_image(int source_x, int source_y, - int source_width, - int source_height, - int destination_width, - int destination_height); - -/* imlib updates. lists of rectangles for storing required update draws */ - EAPI Imlib_Updates imlib_updates_clone(Imlib_Updates updates); - EAPI Imlib_Updates imlib_update_append_rect(Imlib_Updates updates, int x, int y, - int w, int h); - EAPI Imlib_Updates imlib_updates_merge(Imlib_Updates updates, int w, int h); - EAPI Imlib_Updates imlib_updates_merge_for_rendering(Imlib_Updates updates, - int w, int h); - EAPI void imlib_updates_free(Imlib_Updates updates); - EAPI Imlib_Updates imlib_updates_get_next(Imlib_Updates updates); - EAPI void imlib_updates_get_coordinates(Imlib_Updates updates, int *x_return, - int *y_return, int *width_return, - int *height_return); - EAPI void imlib_updates_set_coordinates(Imlib_Updates updates, int x, int y, - int width, int height); - EAPI void imlib_render_image_updates_on_drawable(Imlib_Updates updates, int x, - int y); - EAPI Imlib_Updates imlib_updates_init(void); - EAPI Imlib_Updates imlib_updates_append_updates(Imlib_Updates updates, - Imlib_Updates appended_updates); - -/* image modification */ - EAPI void imlib_image_flip_horizontal(void); - EAPI void imlib_image_flip_vertical(void); - EAPI void imlib_image_flip_diagonal(void); - EAPI void imlib_image_orientate(int orientation); - EAPI void imlib_image_blur(int radius); - EAPI void imlib_image_sharpen(int radius); - EAPI void imlib_image_tile_horizontal(void); - EAPI void imlib_image_tile_vertical(void); - EAPI void imlib_image_tile(void); - -/* fonts and text */ - EAPI Imlib_Font imlib_load_font(const char *font_name); - EAPI void imlib_free_font(void); - /* NB! The four functions below are deprecated. */ - EAPI int imlib_insert_font_into_fallback_chain(Imlib_Font font, Imlib_Font fallback_font); - EAPI void imlib_remove_font_from_fallback_chain(Imlib_Font fallback_font); - EAPI Imlib_Font imlib_get_prev_font_in_fallback_chain(Imlib_Font fn); - EAPI Imlib_Font imlib_get_next_font_in_fallback_chain(Imlib_Font fn); - /* NB! The four functions above are deprecated. */ - EAPI void imlib_text_draw(int x, int y, const char *text); - EAPI void imlib_text_draw_with_return_metrics(int x, int y, const char *text, - int *width_return, - int *height_return, - int *horizontal_advance_return, - int *vertical_advance_return); - EAPI void imlib_get_text_size(const char *text, int *width_return, - int *height_return); - EAPI void imlib_get_text_advance(const char *text, - int *horizontal_advance_return, - int *vertical_advance_return); - EAPI int imlib_get_text_inset(const char *text); - EAPI void imlib_add_path_to_font_path(const char *path); - EAPI void imlib_remove_path_from_font_path(const char *path); - EAPI char **imlib_list_font_path(int *number_return); - EAPI int imlib_text_get_index_and_location(const char *text, int x, int y, - int *char_x_return, - int *char_y_return, - int *char_width_return, - int *char_height_return); - EAPI void imlib_text_get_location_at_index(const char *text, int index, - int *char_x_return, - int *char_y_return, - int *char_width_return, - int *char_height_return); - EAPI char **imlib_list_fonts(int *number_return); - EAPI void imlib_free_font_list(char **font_list, int number); - EAPI int imlib_get_font_cache_size(void); - EAPI void imlib_set_font_cache_size(int bytes); - EAPI void imlib_flush_font_cache(void); - EAPI int imlib_get_font_ascent(void); - EAPI int imlib_get_font_descent(void); - EAPI int imlib_get_maximum_font_ascent(void); - EAPI int imlib_get_maximum_font_descent(void); - -/* color modifiers */ - EAPI Imlib_Color_Modifier imlib_create_color_modifier(void); - EAPI void imlib_free_color_modifier(void); - EAPI void imlib_modify_color_modifier_gamma(double gamma_value); - EAPI void imlib_modify_color_modifier_brightness(double brightness_value); - EAPI void imlib_modify_color_modifier_contrast(double contrast_value); - EAPI void imlib_set_color_modifier_tables(DATA8 * red_table, - DATA8 * green_table, - DATA8 * blue_table, - DATA8 * alpha_table); - EAPI void imlib_get_color_modifier_tables(DATA8 * red_table, - DATA8 * green_table, - DATA8 * blue_table, - DATA8 * alpha_table); - EAPI void imlib_reset_color_modifier(void); - EAPI void imlib_apply_color_modifier(void); - EAPI void imlib_apply_color_modifier_to_rectangle(int x, int y, int width, - int height); - -/* drawing on images */ - EAPI Imlib_Updates imlib_image_draw_pixel(int x, int y, char make_updates); - EAPI Imlib_Updates imlib_image_draw_line(int x1, int y1, int x2, int y2, - char make_updates); - EAPI void imlib_image_draw_rectangle(int x, int y, int width, int height); - EAPI void imlib_image_fill_rectangle(int x, int y, int width, int height); - EAPI void imlib_image_copy_alpha_to_image(Imlib_Image image_source, int x, - int y); - EAPI void imlib_image_copy_alpha_rectangle_to_image(Imlib_Image image_source, - int x, int y, int width, - int height, - int destination_x, - int destination_y); - EAPI void imlib_image_scroll_rect(int x, int y, int width, int height, - int delta_x, int delta_y); - EAPI void imlib_image_copy_rect(int x, int y, int width, int height, int new_x, - int new_y); - -/* polygons */ - EAPI ImlibPolygon imlib_polygon_new(void); - EAPI void imlib_polygon_free(ImlibPolygon poly); - EAPI void imlib_polygon_add_point(ImlibPolygon poly, int x, int y); - EAPI void imlib_image_draw_polygon(ImlibPolygon poly, unsigned char closed); - EAPI void imlib_image_fill_polygon(ImlibPolygon poly); - EAPI void imlib_polygon_get_bounds(ImlibPolygon poly, int *px1, int *py1, - int *px2, int *py2); - EAPI unsigned char imlib_polygon_contains_point(ImlibPolygon poly, int x, - int y); - -/* ellipses */ - EAPI void imlib_image_draw_ellipse(int xc, int yc, int a, int b); - EAPI void imlib_image_fill_ellipse(int xc, int yc, int a, int b); - -/* color ranges */ - EAPI Imlib_Color_Range imlib_create_color_range(void); - EAPI void imlib_free_color_range(void); - EAPI void imlib_add_color_to_color_range(int distance_away); - EAPI void imlib_image_fill_color_range_rectangle(int x, int y, int width, - int height, double angle); - EAPI void imlib_image_fill_hsva_color_range_rectangle(int x, int y, int width, - int height, double angle); - -/* image data */ - EAPI void imlib_image_attach_data_value(const char *key, void *data, int value, - Imlib_Data_Destructor_Function - destructor_function); - EAPI void *imlib_image_get_attached_data(const char *key); - EAPI int imlib_image_get_attached_value(const char *key); - EAPI void imlib_image_remove_attached_data_value(const char *key); - EAPI void imlib_image_remove_and_free_attached_data_value(const char *key); - -/* saving */ - EAPI void imlib_save_image(const char *filename); - EAPI void imlib_save_image_with_error_return(const char *filename, - Imlib_Load_Error * error_return); - -/* FIXME: */ -/* need to add arbitary rotation routines */ - -/* rotation/skewing */ - EAPI Imlib_Image imlib_create_rotated_image(double angle); - -/* rotation from buffer to context (without copying)*/ - EAPI void imlib_rotate_image_from_buffer(double angle, - Imlib_Image source_image); - - EAPI void imlib_blend_image_onto_image_at_angle(Imlib_Image source_image, - char merge_alpha, int source_x, - int source_y, int source_width, - int source_height, - int destination_x, - int destination_y, int angle_x, - int angle_y); - EAPI void imlib_blend_image_onto_image_skewed(Imlib_Image source_image, - char merge_alpha, int source_x, - int source_y, int source_width, - int source_height, - int destination_x, - int destination_y, int h_angle_x, - int h_angle_y, int v_angle_x, - int v_angle_y); -# ifndef X_DISPLAY_MISSING - EAPI void imlib_render_image_on_drawable_skewed(int source_x, int source_y, - int source_width, - int source_height, - int destination_x, - int destination_y, - int h_angle_x, int h_angle_y, - int v_angle_x, int v_angle_y); - EAPI void imlib_render_image_on_drawable_at_angle(int source_x, int source_y, - int source_width, - int source_height, - int destination_x, - int destination_y, - int angle_x, int angle_y); -# endif - -/* image filters */ - EAPI void imlib_image_filter(void); - EAPI Imlib_Filter imlib_create_filter(int initsize); - EAPI void imlib_context_set_filter(Imlib_Filter filter); - EAPI Imlib_Filter imlib_context_get_filter(void); - EAPI void imlib_free_filter(void); - EAPI void imlib_filter_set(int xoff, int yoff, int a, int r, int g, int b); - EAPI void imlib_filter_set_alpha(int xoff, int yoff, int a, int r, int g, - int b); - EAPI void imlib_filter_set_red(int xoff, int yoff, int a, int r, int g, int b); - EAPI void imlib_filter_set_green(int xoff, int yoff, int a, int r, int g, - int b); - EAPI void imlib_filter_set_blue(int xoff, int yoff, int a, int r, int g, int b); - EAPI void imlib_filter_constants(int a, int r, int g, int b); - EAPI void imlib_filter_divisors(int a, int r, int g, int b); - - EAPI void imlib_apply_filter(char *script, ...); - - EAPI void imlib_image_clear(void); - EAPI void imlib_image_clear_color(int r, int g, int b, int a); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/lib-x86-32/libImlib2.a b/lib-x86-32/libImlib2.a deleted file mode 100644 index c97354eb..00000000 Binary files a/lib-x86-32/libImlib2.a and /dev/null differ diff --git a/plugins/artwork/Makefile.am b/plugins/artwork/Makefile.am index 8f9ea166..aa0c7d14 100644 --- a/plugins/artwork/Makefile.am +++ b/plugins/artwork/Makefile.am @@ -5,6 +5,6 @@ artwork_la_SOURCES = artwork.c artwork.h albumartorg.c albumartorg.h lastfm.c la artwork_la_LDFLAGS = -module -artwork_la_LIBADD = $(LDADD) $(ARTWORK_DEPS_LIBS) $(IMLIB2_DEPS_LIBS) -AM_CFLAGS = -std=c99 $(ARTWORK_DEPS_CFLAGS) $(IMLIB2_DEPS_CFLAGS) +artwork_la_LIBADD = $(LDADD) $(JPEG_DEPS_LIBS) +AM_CFLAGS = -std=c99 endif diff --git a/plugins/artwork/artwork.c b/plugins/artwork/artwork.c index 82b677dd..76cb31fe 100644 --- a/plugins/artwork/artwork.c +++ b/plugins/artwork/artwork.c @@ -7,12 +7,20 @@ #include #include #include -#include #include "../../deadbeef.h" #include "artwork.h" #include "lastfm.h" #include "albumartorg.h" +#ifdef USE_IMLIB2 +#include +static uintptr_t imlib_mutex; +#else +#include +#include +#include +#endif + #define min(x,y) ((x)<(y)?(x):(y)) //#define trace(...) { fprintf(stderr, __VA_ARGS__); } @@ -39,7 +47,6 @@ typedef struct cover_query_s { static cover_query_t *queue; static cover_query_t *queue_tail; static uintptr_t mutex; -static uintptr_t imlib_mutex; static uintptr_t cond; static volatile int terminate; static volatile int clear_queue; @@ -173,6 +180,158 @@ check_dir (const char *dir, mode_t mode) return 1; } +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +typedef struct my_error_mgr * my_error_ptr; + +METHODDEF(void) +my_error_exit (j_common_ptr cinfo) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + + +static int +jpeg_resize (const char *fname, const char *outname, int scaled_size) { + trace ("resizing %s into %s\n", fname, outname); + struct jpeg_decompress_struct cinfo; + struct jpeg_compress_struct cinfo_out; + + memset (&cinfo, 0, sizeof (cinfo)); + memset (&cinfo_out, 0, sizeof (cinfo_out)); + + struct my_error_mgr jerr; + + uint8_t *c; + FILE *fp = NULL, *out = NULL; + + + cinfo.err = jpeg_std_error (&jerr.pub); + + jerr.pub.error_exit = my_error_exit; + /* Establish the setjmp return context for my_error_exit to use. */ + if (setjmp(jerr.setjmp_buffer)) { + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + jpeg_destroy_compress(&cinfo_out); + if (fp) { + fclose(fp); + } + if (out) { + fclose (out); + } + return -1; + } + + jpeg_create_decompress (&cinfo); + + fp = fopen (fname, "rb"); + if (!fp) { + return -1; + } + out = fopen (outname, "w+b"); + if (!out) { + fclose (fp); + return -1; + } + + jpeg_stdio_src (&cinfo, fp); + + jpeg_read_header (&cinfo, TRUE); + jpeg_start_decompress (&cinfo); + + int i; + + cinfo_out.err = cinfo.err; + + jpeg_create_compress(&cinfo_out); + + jpeg_stdio_dest(&cinfo_out, out); + + int sw, sh; + if (deadbeef->conf_get_int ("artwork.scale_towards_longer", 1)) { + if (cinfo.image_width > cinfo.image_height) { + sh = scaled_size; + sw = scaled_size * cinfo.image_width / cinfo.image_height; + } + else { + sw = scaled_size; + sh = scaled_size * cinfo.image_height / cinfo.image_width; + } + } + else { + if (cinfo.image_width < cinfo.image_height) { + sh = scaled_size; + sw = scaled_size * cinfo.image_width / cinfo.image_height; + } + else { + sw = scaled_size; + sh = scaled_size * cinfo.image_height / cinfo.image_width; + } + } + + + cinfo_out.image_width = sw; + cinfo_out.image_height = sh; + cinfo_out.input_components = cinfo.output_components; + cinfo_out.in_color_space = cinfo.out_color_space; + + jpeg_set_defaults(&cinfo_out); + + jpeg_set_quality(&cinfo_out, 100, TRUE); + jpeg_start_compress(&cinfo_out, TRUE); + + float sy = 0; + float dy = (float)cinfo.output_height / (float)sh; + + while (cinfo.output_scanline < cinfo.output_height) + { + uint8_t buf[cinfo.output_width * cinfo.output_components]; + uint8_t *ptr = buf; + jpeg_read_scanlines (&cinfo, &ptr, 1); + + // scale row + uint8_t out_buf[sw * cinfo.output_components]; + float sx = 0; + float dx = (float)cinfo.output_width/(float)sw; + for (int i = 0; i < sw; i++) { + memcpy (&out_buf[i * cinfo.output_components], &buf[(int)sx * cinfo.output_components], cinfo.output_components); + sx += dx; + } + + while ((int)sy == cinfo.output_scanline-1) { + uint8_t *ptr = out_buf; + jpeg_write_scanlines(&cinfo_out, &ptr, 1); + sy += dy; + } + } + + jpeg_finish_compress(&cinfo_out); //Always finish + jpeg_destroy_compress(&cinfo_out); //Free resources + + jpeg_finish_decompress (&cinfo); + jpeg_destroy_decompress (&cinfo); + + fclose(fp); + fclose(out); + + return 0; +} + #define BUFFER_SIZE 4096 static int @@ -180,6 +339,7 @@ copy_file (const char *in, const char *out, int img_size) { trace ("copying %s to %s\n", in, out); if (img_size != -1) { +#ifdef USE_IMLIB2 deadbeef->mutex_lock (imlib_mutex); // need to scale, use imlib2 Imlib_Image img = imlib_load_image_immediately (in); @@ -230,7 +390,12 @@ copy_file (const char *in, const char *out, int img_size) { imlib_context_set_image(img); imlib_free_image (); deadbeef->mutex_unlock (imlib_mutex); - +#else + int res = jpeg_resize (in, out, img_size); + if (res != 0) { + unlink (out); + } +#endif return 0; } @@ -788,7 +953,9 @@ artwork_plugin_start (void) artwork_filemask[sizeof(artwork_filemask)-1] = 0; mutex = deadbeef->mutex_create_nonrecursive (); +#ifdef USE_IMLIB2 imlib_mutex = deadbeef->mutex_create_nonrecursive (); +#endif cond = deadbeef->cond_create (); tid = deadbeef->thread_start_low_priority (fetcher_thread, NULL); @@ -814,10 +981,12 @@ artwork_plugin_stop (void) deadbeef->mutex_free (mutex); mutex = 0; } +#ifdef USE_IMLIB2 if (imlib_mutex) { deadbeef->mutex_free (imlib_mutex); imlib_mutex = 0; } +#endif if (cond) { deadbeef->cond_free (cond); cond = 0; -- cgit v1.2.3