summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc')
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc265
1 files changed, 0 insertions, 265 deletions
diff --git a/Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc b/Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc
deleted file mode 100644
index 4665ca83889..00000000000
--- a/Build/source/libs/poppler/poppler-src/poppler/DCTStream.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-//========================================================================
-//
-// DCTStream.cc
-//
-// This file is licensed under the GPLv2 or later
-//
-// Copyright 2005 Jeff Muizelaar <jeff@infidigm.net>
-// Copyright 2005-2010, 2012, 2017 Albert Astals Cid <aacid@kde.org>
-// Copyright 2009 Ryszard Trojnacki <rysiek@menel.com>
-// Copyright 2010 Carlos Garcia Campos <carlosgc@gnome.org>
-// Copyright 2011 Daiki Ueno <ueno@unixuser.org>
-// Copyright 2011 Tomas Hoger <thoger@redhat.com>
-// Copyright 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
-// Copyright 2017 Adrian Johnson <ajohnson@redneon.com>
-//
-//========================================================================
-
-#include "DCTStream.h"
-
-static void str_init_source(j_decompress_ptr cinfo)
-{
-}
-
-static boolean str_fill_input_buffer(j_decompress_ptr cinfo)
-{
- int c;
- struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
- if (src->index == 0) {
- c = 0xFF;
- src->index++;
- }
- else if (src->index == 1) {
- c = 0xD8;
- src->index++;
- }
- else c = src->str->getChar();
- if (c != EOF)
- {
- src->buffer = c;
- src->pub.next_input_byte = &src->buffer;
- src->pub.bytes_in_buffer = 1;
- return TRUE;
- }
- else return FALSE;
-}
-
-static void str_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
-{
- struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
- if (num_bytes > 0) {
- while (num_bytes > (long) src->pub.bytes_in_buffer) {
- num_bytes -= (long) src->pub.bytes_in_buffer;
- str_fill_input_buffer(cinfo);
- }
- src->pub.next_input_byte += (size_t) num_bytes;
- src->pub.bytes_in_buffer -= (size_t) num_bytes;
- }
-}
-
-static void str_term_source(j_decompress_ptr cinfo)
-{
-}
-
-DCTStream::DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion) :
- FilterStream(strA) {
- colorXform = colorXformA;
- if (dict != nullptr) {
- Object obj = dict->lookup("Width", recursion);
- err.width = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
- obj = dict->lookup("Height", recursion);
- err.height = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
- } else
- err.height = err.width = 0;
- init();
-}
-
-DCTStream::~DCTStream() {
- jpeg_destroy_decompress(&cinfo);
- delete str;
-}
-
-static void exitErrorHandler(jpeg_common_struct *error) {
- j_decompress_ptr cinfo = (j_decompress_ptr)error;
- str_error_mgr * err = (struct str_error_mgr *)cinfo->err;
- if (cinfo->err->msg_code == JERR_IMAGE_TOO_BIG && err->width != 0 && err->height != 0) {
- cinfo->image_height = err->height;
- cinfo->image_width = err->width;
- } else {
- longjmp(err->setjmp_buffer, 1);
- }
-}
-
-void DCTStream::init()
-{
- jpeg_std_error(&err.pub);
- err.pub.error_exit = &exitErrorHandler;
- src.pub.init_source = str_init_source;
- src.pub.fill_input_buffer = str_fill_input_buffer;
- src.pub.skip_input_data = str_skip_input_data;
- src.pub.resync_to_restart = jpeg_resync_to_restart;
- src.pub.term_source = str_term_source;
- src.pub.bytes_in_buffer = 0;
- src.pub.next_input_byte = nullptr;
- src.str = str;
- src.index = 0;
- current = nullptr;
- limit = nullptr;
-
- cinfo.err = &err.pub;
- if (!setjmp(err.setjmp_buffer)) {
- jpeg_create_decompress(&cinfo);
- cinfo.src = (jpeg_source_mgr *)&src;
- }
- row_buffer = nullptr;
-}
-
-void DCTStream::reset() {
- int row_stride;
-
- str->reset();
-
- if (row_buffer)
- {
- jpeg_destroy_decompress(&cinfo);
- init();
- }
-
- // JPEG data has to start with 0xFF 0xD8
- // but some pdf like the one on
- // https://bugs.freedesktop.org/show_bug.cgi?id=3299
- // does have some garbage before that this seeks for
- // the start marker...
- bool startFound = false;
- int c = 0, c2 = 0;
- while (!startFound)
- {
- if (!c)
- {
- c = str->getChar();
- if (c == -1)
- {
- error(errSyntaxError, -1, "Could not find start of jpeg data");
- return;
- }
- if (c != 0xFF) c = 0;
- }
- else
- {
- c2 = str->getChar();
- if (c2 != 0xD8)
- {
- c = 0;
- c2 = 0;
- }
- else startFound = true;
- }
- }
-
- if (!setjmp(err.setjmp_buffer))
- {
- if (jpeg_read_header(&cinfo, TRUE) != JPEG_SUSPENDED)
- {
- // figure out color transform
- if (colorXform == -1 && !cinfo.saw_Adobe_marker) {
- if (cinfo.num_components == 3) {
- if (cinfo.saw_JFIF_marker) {
- colorXform = 1;
- } else if (cinfo.cur_comp_info[0]->component_id == 82 &&
- cinfo.cur_comp_info[1]->component_id == 71 &&
- cinfo.cur_comp_info[2]->component_id == 66) { // ASCII "RGB"
- colorXform = 0;
- } else {
- colorXform = 1;
- }
- } else {
- colorXform = 0;
- }
- } else if (cinfo.saw_Adobe_marker) {
- colorXform = cinfo.Adobe_transform;
- }
-
- switch (cinfo.num_components) {
- case 3:
- cinfo.jpeg_color_space = colorXform ? JCS_YCbCr : JCS_RGB;
- break;
- case 4:
- cinfo.jpeg_color_space = colorXform ? JCS_YCCK : JCS_CMYK;
- break;
- }
-
- jpeg_start_decompress(&cinfo);
-
- row_stride = cinfo.output_width * cinfo.output_components;
- row_buffer = cinfo.mem->alloc_sarray((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
- }
- }
-}
-
-// we can not go with inline since gcc
-// refuses to inline because of setjmp
-#define DO_GET_CHAR \
- if (current == limit) { \
- if (cinfo.output_scanline < cinfo.output_height) \
- { \
- if (!setjmp(err.setjmp_buffer)) \
- { \
- if (!jpeg_read_scanlines(&cinfo, row_buffer, 1)) c = EOF; \
- else { \
- current = &row_buffer[0][0]; \
- limit = &row_buffer[0][(cinfo.output_width - 1) * cinfo.output_components] + cinfo.output_components; \
- c = *current; \
- ++current; \
- } \
- } \
- else c = EOF; \
- } \
- else c = EOF; \
- } else { \
- c = *current; \
- ++current; \
- } \
-
-int DCTStream::getChar() {
- int c;
-
- DO_GET_CHAR
-
- return c;
-}
-
-int DCTStream::getChars(int nChars, Guchar *buffer) {
- // Use volatile to prevent the compiler optimizing
- // variables into registers. See setjmp man page.
- volatile int i, c;
- for (i = 0; i < nChars; ++i) {
- DO_GET_CHAR
- if (likely(c != EOF)) buffer[i] = c;
- else return i;
- }
- return nChars;
-}
-
-int DCTStream::lookChar() {
- if (unlikely(current == nullptr)) {
- return EOF;
- }
- return *current;
-}
-
-GooString *DCTStream::getPSFilter(int psLevel, const char *indent) {
- GooString *s;
-
- if (psLevel < 2) {
- return nullptr;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return nullptr;
- }
- s->append(indent)->append("<< >> /DCTDecode filter\n");
- return s;
-}
-
-GBool DCTStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}