summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfmx/src/jpegimage.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfmx/src/jpegimage.c')
-rw-r--r--Build/source/texk/dvipdfmx/src/jpegimage.c68
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;
+}