diff options
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/jpegimage.c')
-rw-r--r-- | Build/source/texk/dvipdfmx/src/jpegimage.c | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/Build/source/texk/dvipdfmx/src/jpegimage.c b/Build/source/texk/dvipdfmx/src/jpegimage.c index c605394311e..ed8d69165a2 100644 --- a/Build/source/texk/dvipdfmx/src/jpegimage.c +++ b/Build/source/texk/dvipdfmx/src/jpegimage.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/jpegimage.c,v 1.9 2007/05/18 05:19:01 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/jpegimage.c,v 1.10 2009/03/24 02:07:48 matthias Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -194,6 +194,8 @@ static int JPEG_copy_stream (struct JPEG_info *j_info, static void JPEG_info_init (struct JPEG_info *j_info); static void JPEG_info_clear (struct JPEG_info *j_info); static pdf_obj *JPEG_get_iccp (struct JPEG_info *j_info); +static void jpeg_get_density (struct JPEG_info *j_info, + double *xdensity, double *ydensity); int check_for_jpeg (FILE *fp) @@ -331,36 +333,44 @@ jpeg_include_image (pdf_ximage *ximage, FILE *fp) info.bits_per_component = j_info.bits_per_component; info.num_components = j_info.num_components; -#define IS_JFIF(j) ((j).flags & HAVE_APPn_JFIF) + jpeg_get_density(&j_info, &info.xdensity, &info.ydensity); + + pdf_ximage_set_image(ximage, &info, stream); + JPEG_info_clear(&j_info); + + return 0; +} + +#define IS_JFIF(j) ((j)->flags & HAVE_APPn_JFIF) + +static void +jpeg_get_density (struct JPEG_info *j_info, + double *xdensity, double *ydensity) +{ if (IS_JFIF(j_info)) { struct JPEG_APPn_JFIF *app_data; int i; - for (i = 0; i < j_info.num_appn; i++) { - if (j_info.appn[i].marker != JM_APP0 || - j_info.appn[i].app_sig != JS_APPn_JFIF) - continue; + for (i = 0; i < j_info->num_appn; i++) { + if (j_info->appn[i].marker == JM_APP0 || + j_info->appn[i].app_sig == JS_APPn_JFIF) + break; } - if (i < j_info.num_appn) { - app_data = (struct JPEG_APPn_JFIF *)j_info.appn[i].app_data; + if (i < j_info->num_appn) { + app_data = (struct JPEG_APPn_JFIF *)j_info->appn[i].app_data; switch (app_data->units) { case 1: /* pixels per inch */ - info.xdensity = 72.0 / app_data->Xdensity; - info.ydensity = 72.0 / app_data->Ydensity; + *xdensity = 72.0 / app_data->Xdensity; + *ydensity = 72.0 / app_data->Ydensity; break; case 2: /* pixels per centimeter */ - info.xdensity = 72.0 / 2.54 / app_data->Xdensity; - info.ydensity = 72.0 / 2.54 / app_data->Ydensity; + *xdensity = 72.0 / 2.54 / app_data->Xdensity; + *ydensity = 72.0 / 2.54 / app_data->Ydensity; break; default: break; } } } - - pdf_ximage_set_image(ximage, &info, stream); - JPEG_info_clear(&j_info); - - return 0; } static void @@ -749,3 +759,27 @@ JPEG_scan_file (struct JPEG_info *j_info, FILE *fp) return (found_SOFn ? 0 : -1); } + +int +jpeg_get_bbox (FILE *fp, long *width, long *height, + double *xdensity, double *ydensity) +{ + struct JPEG_info j_info; + + JPEG_info_init(&j_info); + + if (JPEG_scan_file(&j_info, fp) < 0) { + WARN("%s: Not a JPEG file?", JPEG_DEBUG_STR); + JPEG_info_clear(&j_info); + return -1; + } + + *width = j_info.width; + *height = j_info.height; + + jpeg_get_density(&j_info, xdensity, ydensity); + + JPEG_info_clear(&j_info); + + return 0; +} |