summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/jp2image.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipdfm-x/jp2image.c')
-rw-r--r--Build/source/texk/dvipdfm-x/jp2image.c422
1 files changed, 0 insertions, 422 deletions
diff --git a/Build/source/texk/dvipdfm-x/jp2image.c b/Build/source/texk/dvipdfm-x/jp2image.c
deleted file mode 100644
index f94d460db96..00000000000
--- a/Build/source/texk/dvipdfm-x/jp2image.c
+++ /dev/null
@@ -1,422 +0,0 @@
-/* This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks.
-
- Copyright (C) 2002-2020 by Jin-Hwan Cho and Matthias Franz,
- the dvipdfmx project team.
-
- Copyright (C) 1998, 1999 by Mark A. Wicks <mwicks@kettering.edu>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/*
- * JP2 & JPX baseline support
- *
- * 20150412 Added opacity (transparency) support.
- * TODO: XMP Metadata
- */
-
-#include <math.h>
-#include "system.h"
-#include "error.h"
-#include "mem.h"
-
-#include "dpxconf.h"
-
-#include "pdfobj.h"
-
-#include "jp2image.h"
-
-/* Box types. */
-#define JP2_BOX_JP__ 0x6a502020 /* Signature */
-#define JP2_BOX_FTYP 0x66747970 /* File Type */
-
-#define JP2_BOX_JP2H 0x6a703268 /* JP2 Header */
-#define JP2_BOX_IHDR 0x69686472 /* Image Header */
-#define JP2_BOX_BPCC 0x62706363 /* Bits Per Component */
-#define JP2_BOX_COLR 0x636f6c72 /* Color Specification */
-#define JP2_BOX_PCLR 0x70636c72 /* Palette */
-#define JP2_BOX_CMAP 0x636d6170 /* Component Mapping */
-#define JP2_BOX_CDEF 0x63646566 /* Channel Definition */
-#define JP2_BOX_RES_ 0x72657320 /* Resolution */
-#define JP2_BOX_RESC 0x72657363 /* Capture Resolution */
-#define JP2_BOX_RESD 0x72657364 /* Default Display Resolution */
-
-#define JP2_BOX_JP2C 0x6a703263 /* Contiguous Code Stream */
-
-#define JPX_BOX_LBL_ 0x6c626c20 /* Label */
-
-
-static unsigned int
-read_box_hdr (FILE *fp, unsigned int *lbox, unsigned int *tbox)
-{
- unsigned int bytesread = 0;
-
- *lbox = get_unsigned_quad(fp);
- *tbox = get_unsigned_quad(fp);
- bytesread += 8;
- if (*lbox == 1) {
- if (get_unsigned_quad(fp) != 0)
- ERROR("JPEG2000: LBox value in JP2 file >32 bits.\nI can't handle this!");
- *lbox = get_unsigned_quad(fp);
- bytesread += 8;
- } else if (*lbox > 1 && *lbox < 8) {
- WARN("JPEG2000: Unknown LBox value %lu in JP2 file!", lbox);
- }
-
- return bytesread;
-}
-
-#define FTYP_BR_JP2_ 0x6a703220
-#define FTYP_BR_JPX_ 0x6a707820
-#define FTYP_CL_JPXB 0x6a707862
-
-static int
-check_jp___box (FILE *fp)
-{
- if (get_unsigned_quad(fp) != 0x0c)
- return 0;
- if (get_unsigned_quad(fp) != JP2_BOX_JP__)
- return 0;
- /* Next 4 bytes shall be 0D 0A 87 0A */
- if (get_unsigned_quad(fp) != 0x0D0A870A)
- return 0;
- return 1;
-}
-
-static int
-check_ftyp_data (FILE *fp, unsigned int size)
-{
- int supported = 0;
- unsigned int BR, CLi;
-
- BR = get_unsigned_quad(fp);
- size -= 4;
- /* MinV = */ get_unsigned_quad(fp);
- size -= 4;
- switch (BR) {
- case FTYP_BR_JP2_: /* "jp2 " ... supported */
- seek_relative(fp, size);
- size = 0;
- supported = 1;
- break;
- case FTYP_BR_JPX_: /* "jpx " ... baseline subset supported */
- while (size > 0) {
- CLi = get_unsigned_quad(fp);
- if (CLi == FTYP_CL_JPXB)
- supported = 1;
- size -= 4;
- }
- break;
- default:
- WARN("JPEG2000: Unknown JPEG 2000 File Type box Brand field value.");
- seek_relative(fp, size);
- size = 0;
- supported = 0;
- }
-
- return supported;
-}
-
-
-static void
-read_res__data (ximage_info *info, FILE *fp, unsigned int size)
-{
- unsigned int VR_N, VR_D, HR_N, HR_D;
- unsigned char VR_E, HR_E;
-
- VR_N = get_unsigned_pair(fp);
- VR_D = get_unsigned_pair(fp);
- HR_N = get_unsigned_pair(fp);
- HR_D = get_unsigned_pair(fp);
- VR_E = get_unsigned_byte(fp);
- HR_E = get_unsigned_byte(fp);
- if (dpx_conf.compat_mode == dpx_mode_compat_mode)
- info->xdensity = info->ydensity = 72.0 / 100.0;
- else {
- info->xdensity = 72.0/(((double) HR_N / HR_D) * pow(10.0, HR_E) * 0.0254);
- info->ydensity = 72.0/(((double) VR_N / VR_D) * pow(10.0, VR_E) * 0.0254);
- }
-}
-
-static int
-scan_res_ (ximage_info *info, FILE *fp, unsigned int size)
-{
- unsigned int len, lbox, tbox;
- int have_resd = 0;
-
- while (size > 0) {
- len = read_box_hdr(fp, &lbox, &tbox);
- if (lbox == 0) {
- WARN("JPEG2000: Unexpected lbox value 0 in JP2 Resolution box.");
- break;
- }
- switch (tbox) {
- case JP2_BOX_RESC:
- if (!have_resd) {
- read_res__data(info, fp, lbox - len);
- } else {
- seek_relative(fp, lbox - len);
- }
- break;
- case JP2_BOX_RESD:
- read_res__data(info, fp, lbox - len);
- have_resd = 1;
- break;
- default:
- WARN("JPEG2000: Unknown JPEG 2000 box type in Resolution box.");
- seek_relative(fp, lbox - len);
- }
- size -= lbox;
- }
-
- return size == 0 ? 0 : -1;
-}
-
-/* Acrobat seems require Channel Definition box to be defined when image data
- * contains opacity channel. However, OpenJPEG (and maybe most of JPEG 2000 coders?)
- * does not write Channel Definition box so transparency will be ignored.
- */
-static int
-scan_cdef (ximage_info *info, int *smask, FILE *fp, unsigned int size)
-{
- int opacity_channels = 0;
- int have_type0 = 0;
- unsigned int i, Cn, N, Typ, Asoc;
-
- *smask = 0;
-
- N = get_unsigned_pair(fp);
- if (size < N * 6 + 2) {
- WARN("JPEG2000: Inconsistent N value in Channel Definition box.");
- return -1;
- }
- for (i = 0; i < N; i++) {
- Cn = get_unsigned_pair(fp); /* Cn */
- Typ = get_unsigned_pair(fp);
- Asoc = get_unsigned_pair(fp); /* must be 0 for SMask */
- if (Cn > N)
- WARN("JPEG2000: Invalid Cn value in Channel Definition box.");
- if (Typ == 1) {
- if (Asoc == 0)
- have_type0 = 1;
- opacity_channels++;
- } else if (Typ == 2) {
- opacity_channels++;
- }
- }
-
- if (opacity_channels == 1)
- *smask = have_type0 ? 1 : 0;
- else if (opacity_channels > 1) {
- WARN("JPEG2000: Unsupported transparency type. (ignored)");
- }
-
- return 0;
-}
-
-static int
-scan_jp2h (ximage_info *info, int *smask, FILE *fp, unsigned int size)
-{
- int error = 0, have_ihdr = 0;
- unsigned int len, lbox, tbox;
-
- while (size > 0 && !error) {
- len = read_box_hdr(fp, &lbox, &tbox);
- if (lbox == 0) {
- WARN("JPEG2000: Unexpected lbox value 0 in JP2 Header box...");
- error = -1;
- break;
- }
- switch (tbox) {
- case JP2_BOX_IHDR:
- info->height = get_unsigned_quad(fp);
- info->width = get_unsigned_quad(fp);
- info->num_components = get_unsigned_pair(fp);
- /* c = */ get_unsigned_byte(fp); /* BPC - 1 */
- /* c = */ get_unsigned_byte(fp); /* C: Compression type */
- /* c = */ get_unsigned_byte(fp); /* UnkC */
- /* c = */ get_unsigned_byte(fp); /* IPR */
- have_ihdr = 1;
- break;
- case JP2_BOX_RES_:
- error = scan_res_(info, fp, lbox - len);
- break;
- case JP2_BOX_CDEF:
- error = scan_cdef(info, smask, fp, lbox - len);
- break;
- case JP2_BOX_BPCC: case JP2_BOX_COLR: case JP2_BOX_PCLR:
- case JP2_BOX_CMAP:
- case JPX_BOX_LBL_:
- seek_relative(fp, lbox - len);
- break;
- default:
- WARN("JPEG2000: Unknown JPEG 2000 box in JP2 Header box.");
- seek_relative(fp, lbox - len);
- error = -1;
- }
- size -= lbox;
- }
-
- if (!have_ihdr)
- WARN("JPEG2000: Expecting JPEG 2000 Image Header box but could not find.");
- return (!error && have_ihdr && size == 0) ? 0 : -1;
-}
-
-static int
-scan_file (ximage_info *info, int *smask, FILE *fp)
-{
- int error = 0, have_jp2h = 0;
- int size;
- unsigned int len, lbox, tbox;
-
-
- size = file_size(fp);
-
- /* Should have already been checked before. */
- /* JPEG 2000 Singature box */
- if (!check_jp___box(fp))
- return -1;
- size -= 12;
- /* File Type box shall immediately follow */
- len = read_box_hdr(fp, &lbox, &tbox);
- if (tbox != JP2_BOX_FTYP)
- return -1;
- if (!check_ftyp_data(fp, lbox - len))
- return -1;
- size -= lbox;
-
- /* Search for JP2 Header box */
- while (size > 0 && !error) {
- len = read_box_hdr(fp, &lbox, &tbox);
- if (lbox == 0)
- lbox = size;
- switch (tbox) {
- case JP2_BOX_JP2H:
- error = scan_jp2h(info, smask, fp, lbox - len);
- have_jp2h = 1;
- break;
- case JP2_BOX_JP2C:
- /* JP2 requires JP2H appears before JP2C. */
- if (!have_jp2h)
- WARN("JPEG2000: JPEG 2000 Codestream box found before JP2 Header box.");
- seek_relative(fp, lbox - len);
- break;
- default:
- seek_relative(fp, lbox - len);
- }
- size -= lbox;
- }
-
- /* From ISO/IEC 15444-2 M.9.2.7
- * The JP2 Header box shall be found in the file before the first
- * Contiguous Codestream box, Fragment Table box, Media Data box,
- * Codestream Header box, and Compositing Layer Header box. ...
- */
- if (!have_jp2h && !error) {
- WARN("JPEG2000: No JP2 Header box found. Not a JP2/JPX baseline file?");
- error = -1;
- }
- return error;
-}
-
-int
-check_for_jp2 (FILE *fp)
-{
- unsigned int len, lbox, tbox;
-
- if (!fp)
- return 0;
-
- rewind(fp);
-
- /* JPEG 2000 Singature box */
- if (!check_jp___box(fp))
- return 0;
-
- /* File Type box shall immediately follow */
- len = read_box_hdr(fp, &lbox, &tbox);
- if (tbox != JP2_BOX_FTYP)
- return 0;
- if (!check_ftyp_data(fp, lbox - len))
- return 0;
-
- return 1;
-}
-
-int
-jp2_include_image (pdf_ximage *ximage, FILE *fp)
-{
- int smask = 0;
- pdf_obj *stream, *stream_dict;
- ximage_info info;
-
- if (pdf_check_version(1, 5) < 0) {
- WARN("JPEG 2000 support requires PDF version >= 1.5 (Current setting %d.%d)\n", pdf_get_version_major(), pdf_get_version_minor());
- return -1;
- }
-
- pdf_ximage_init_image_info(&info);
- stream = stream_dict = NULL;
-
- rewind(fp);
- if (scan_file(&info, &smask, fp) < 0) {
- WARN("JPEG2000: Reading JPEG 2000 file failed.");
- return -1;
- }
-
- stream = pdf_new_stream(0);
- stream_dict = pdf_stream_dict(stream);
- pdf_add_dict(stream_dict,
- pdf_new_name("Filter"), pdf_new_name("JPXDecode"));
- if (smask)
- pdf_add_dict(stream_dict,
- pdf_new_name("SMaskInData"), pdf_new_number(1));
- /* Read whole file */
- {
- int nb_read;
- rewind(fp);
- while ((nb_read =
- fread(work_buffer, sizeof(char), WORK_BUFFER_SIZE, fp)) > 0)
- pdf_add_stream(stream, work_buffer, nb_read);
- }
-
- pdf_ximage_set_image(ximage, &info, stream);
-
- return 0;
-}
-
-int
-jp2_get_bbox (FILE *fp, int *width, int *height,
- double *xdensity, double *ydensity)
-{
- int r, smask = 0;
- ximage_info info;
-
- pdf_ximage_init_image_info(&info);
-
- rewind(fp);
- r = scan_file(&info, &smask, fp);
-
- *width = info.width;
- *height = info.height;
- *xdensity = info.xdensity;
- *ydensity = info.ydensity;
-
- return r;
-}