Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/jbig2dec/jbig2_image_png.c @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/jbig2dec/jbig2_image_png.c Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,152 @@ +/* Copyright (C) 2001-2023 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, + modified or distributed except as expressly authorized under the terms + of the license contained in the file LICENSE in this distribution. + + Refer to licensing information at http://www.artifex.com or contact + Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, + CA 94129, USA, for further information. +*/ + +/* + jbig2dec +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "os_types.h" + +#include <stdio.h> +#include <stdlib.h> +#include <png.h> + +#ifndef OLD_LIB_PNG +# if PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR < 2 +# define OLD_LIB_PNG 1 +# else +# define OLD_LIB_PNG 0 +# endif +#endif + +#if OLD_LIB_PNG +#include <pngstruct.h> +#endif + +#define CVT_PTR(ptr) (ptr) + +#include "jbig2.h" +#include "jbig2_priv.h" +#include "jbig2_image.h" + +/* take an image structure and write it out in png format */ + +static void +jbig2_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + +#if OLD_LIB_PNG + png_FILE_p f = (png_FILE_p) png_ptr->io_ptr; +#else + png_FILE_p f = (png_FILE_p) png_get_io_ptr(png_ptr); +#endif + + check = fwrite(data, 1, length, f); + if (check != length) { + png_error(png_ptr, "write error"); + } +} + +static void +jbig2_png_flush(png_structp png_ptr) +{ +#if OLD_LIB_PNG + png_FILE_p f = (png_FILE_p) png_ptr->io_ptr; +#else + png_FILE_p f = (png_FILE_p) png_get_io_ptr(png_ptr); +#endif + + if (f != NULL) + fflush(f); +} + +/* write out an image struct in png format to an open file pointer */ + +int +jbig2_image_write_png(Jbig2Image *image, FILE *out) +{ + uint32_t i; + png_structp png; + png_infop info; + png_bytep rowpointer; + + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png == NULL) { + fprintf(stderr, "unable to create png structure\n"); + return 2; + } + + info = png_create_info_struct(png); + if (info == NULL) { + fprintf(stderr, "unable to create png info structure\n"); + png_destroy_write_struct(&png, (png_infopp) NULL); + return 3; + } + + /* set/check error handling */ + if (setjmp(png_jmpbuf(png))) { + /* we've returned here after an internal error */ + fprintf(stderr, "internal error in libpng saving file\n"); + png_destroy_write_struct(&png, &info); + return 4; + } + + /* png_init_io() doesn't work linking dynamically to libpng on win32 + one has to either link statically or use callbacks because of runtime + variations */ + /* png_init_io(png, out); */ + png_set_write_fn(png, (png_voidp) out, jbig2_png_write_data, jbig2_png_flush); + + /* now we fill out the info structure with our format data */ + png_set_IHDR(png, info, image->width, image->height, 1, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + png_write_info(png, info); + + /* png natively treats 0 as black. This will convert for us */ + png_set_invert_mono(png); + + /* write out each row in turn */ + rowpointer = (png_bytep) image->data; + for (i = 0; i < image->height; i++) { + png_write_row(png, rowpointer); + rowpointer += image->stride; + } + + /* finish and clean up */ + png_write_end(png, info); + png_destroy_write_struct(&png, &info); + + return 0; +} + +int +jbig2_image_write_png_file(Jbig2Image *image, char *filename) +{ + FILE *out; + int code; + + if ((out = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "unable to open '%s' for writing\n", filename); + return 1; + } + + code = jbig2_image_write_png(image, out); + + fclose(out); + return (code); +}
