Ticket #36053: patch-src-hpdf_image_png.c.diff

File patch-src-hpdf_image_png.c.diff, 13.0 KB (added by jwhowse4, 8 years ago)

Patch file

  • src/hpdf_image_png.c

    old new ReadPngData_Interlaced (HPDF_Dict image, 
    109109                         png_infop    info_ptr)
    110110{
    111111    png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
     112    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
    112113    png_bytep* row_pointers = HPDF_GetMem (image->mmgr,
    113                 info_ptr->height * sizeof (png_bytep));
     114                height * sizeof (png_bytep));
    114115
    115116    if (row_pointers) {
    116117        HPDF_UINT i;
    117118
    118         HPDF_MemSet (row_pointers, 0, info_ptr->height * sizeof (png_bytep));
    119         for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     119        HPDF_MemSet (row_pointers, 0, height * sizeof (png_bytep));
     120        for (i = 0; i < (HPDF_UINT)height; i++) {
    120121            row_pointers[i] = HPDF_GetMem (image->mmgr, len);
    121122
    122123            if (image->error->error_no != HPDF_OK)
    ReadPngData_Interlaced (HPDF_Dict image, 
    126127        if (image->error->error_no == HPDF_OK) {
    127128            png_read_image(png_ptr, row_pointers);
    128129            if (image->error->error_no == HPDF_OK) {       /* add this line */
    129                 for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     130                for (i = 0; i < (HPDF_UINT)height; i++) {
    130131                    if (HPDF_Stream_Write (image->stream, row_pointers[i], len) !=
    131132                            HPDF_OK)
    132133                        break;
    ReadPngData_Interlaced (HPDF_Dict image, 
    135136        }
    136137
    137138        /* clean up */
    138         for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     139        for (i = 0; i < (HPDF_UINT)height; i++) {
    139140            HPDF_FreeMem (image->mmgr, row_pointers[i]);
    140141        }
    141142
    ReadPngData (HPDF_Dict image, 
    151152              png_infop    info_ptr)
    152153{
    153154    png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
     155    png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
    154156    png_bytep buf_ptr = HPDF_GetMem (image->mmgr, len);
    155157
    156158    if (buf_ptr) {
    157159        HPDF_UINT i;
    158160
    159         for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     161        for (i = 0; i < (HPDF_UINT)height; i++) {
    160162            png_read_rows(png_ptr, (png_byte**)&buf_ptr, NULL, 1);
    161163            if (image->error->error_no != HPDF_OK)
    162164                break;
    ReadTransparentPaletteData (HPDF_Dict image, 
    182184        HPDF_STATUS ret = HPDF_OK;
    183185        HPDF_UINT i, j;
    184186        png_bytep *row_ptr;
     187        png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
     188        png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
    185189
    186         row_ptr = HPDF_GetMem (image->mmgr, info_ptr->height * sizeof(png_bytep));
     190        row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep));
    187191        if (!row_ptr) {
    188192                return HPDF_FAILD_TO_ALLOC_MEM;
    189193        } else {
    190194                png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
    191195
    192                 for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     196                for (i = 0; i < (HPDF_UINT)height; i++) {
    193197                        row_ptr[i] = HPDF_GetMem(image->mmgr, len);
    194198                        if (!row_ptr[i]) {
    195                                 for (; i >= 0; i--) {
     199                                for (; i > 0; i--) {
    196200                                        HPDF_FreeMem (image->mmgr, row_ptr[i]);
    197201                                }
    198202                                HPDF_FreeMem (image->mmgr, row_ptr);
    ReadTransparentPaletteData (HPDF_Dict image, 
    207211                goto Error;
    208212        }
    209213
    210         for (j = 0; j < info_ptr->height; j++) {
    211                 for (i = 0; i < info_ptr->width; i++) {
    212                         smask_data[info_ptr->width * j + i] = (row_ptr[j][i] < num_trans) ? trans[row_ptr[j][i]] : 0xFF;
     214        for (j = 0; j < height; j++) {
     215                for (i = 0; i < width; i++) {
     216                        smask_data[width * j + i] = (row_ptr[j][i] < num_trans) ? trans[row_ptr[j][i]] : 0xFF;
    213217                }
    214218
    215                 if (HPDF_Stream_Write (image->stream, row_ptr[j], info_ptr->width) != HPDF_OK) {
     219                if (HPDF_Stream_Write (image->stream, row_ptr[j], width) != HPDF_OK) {
    216220                        ret = HPDF_FILE_IO_ERROR;
    217221                        goto Error;
    218222                }
    219223        }
    220224
    221225Error:
    222         for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     226        for (i = 0; i < (HPDF_UINT)height; i++) {
    223227                HPDF_FreeMem (image->mmgr, row_ptr[i]);
    224228        }
    225229
    ReadTransparentPngData (HPDF_Dict image, 
    238242        HPDF_UINT i, j;
    239243        png_bytep *row_ptr, row;
    240244        png_byte color_type;
     245        png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
     246        png_uint_32 width = png_get_image_width(png_ptr, info_ptr);
    241247
    242248        color_type = png_get_color_type(png_ptr, info_ptr);
    243249
    ReadTransparentPngData (HPDF_Dict image, 
    245251                return HPDF_INVALID_PNG_IMAGE;
    246252        }
    247253
    248         row_ptr = HPDF_GetMem (image->mmgr, info_ptr->height * sizeof(png_bytep));
     254        row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep));
    249255        if (!row_ptr) {
    250256                return HPDF_FAILD_TO_ALLOC_MEM;
    251257        } else {
    252258                png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
    253259
    254                 for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     260                for (i = 0; i < (HPDF_UINT)height; i++) {
    255261                        row_ptr[i] = HPDF_GetMem(image->mmgr, len);
    256262                        if (!row_ptr[i]) {
    257                                 for (; i >= 0; i--) {
     263                                for (; i > 0; i--) {
    258264                                        HPDF_FreeMem (image->mmgr, row_ptr[i]);
    259265                                }
    260266                                HPDF_FreeMem (image->mmgr, row_ptr);
    ReadTransparentPngData (HPDF_Dict image, 
    271277
    272278        switch (color_type) {
    273279                case PNG_COLOR_TYPE_RGB_ALPHA:
    274                         row_len = 3 * info_ptr->width * sizeof(png_byte);
    275                         for (j = 0; j < info_ptr->height; j++) {
    276                                 for (i = 0; i < info_ptr->width; i++) {
     280                        row_len = 3 * width * sizeof(png_byte);
     281                        for (j = 0; j < height; j++) {
     282                                for (i = 0; i < width; i++) {
    277283                                        row = row_ptr[j];
    278284                                        memmove(row + (3 * i), row + (4*i), 3);
    279                                         smask_data[info_ptr->width * j + i] = row[4 * i + 3];
     285                                        smask_data[width * j + i] = row[4 * i + 3];
    280286                                }
    281287
    282288                                if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) {
    ReadTransparentPngData (HPDF_Dict image, 
    286292                        }
    287293                        break;
    288294                case PNG_COLOR_TYPE_GRAY_ALPHA:
    289                         row_len = info_ptr->width * sizeof(png_byte);
    290                         for (j = 0; j < info_ptr->height; j++) {
    291                                 for (i = 0; i < info_ptr->width; i++) {
     295                        row_len = width * sizeof(png_byte);
     296                        for (j = 0; j < height; j++) {
     297                                for (i = 0; i < width; i++) {
    292298                                        row = row_ptr[j];
    293299                                        row[i] = row[2 * i];
    294                                         smask_data[info_ptr->width * j + i] = row[2 * i + 1];
     300                                        smask_data[width * j + i] = row[2 * i + 1];
    295301                                }
    296302
    297303                                if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) {
    ReadTransparentPngData (HPDF_Dict image, 
    306312        }
    307313
    308314Error:
    309         for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
     315        for (i = 0; i < (HPDF_UINT)height; i++) {
    310316                HPDF_FreeMem (image->mmgr, row_ptr[i]);
    311317        }
    312318
    LoadPngData (HPDF_Dict image, 
    415421
    416422{
    417423        HPDF_STATUS ret = HPDF_OK;
    418 
     424        png_uint_32 width, height;
     425        int bit_depth, color_type;
    419426        png_structp png_ptr = NULL;
    420427        png_infop info_ptr = NULL;
    421428
    LoadPngData (HPDF_Dict image, 
    447454                goto Exit;
    448455        }
    449456
     457        png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
     458
    450459        /* 16bit images are not supported. */
    451         if (info_ptr->bit_depth == 16) {
     460        if (bit_depth == 16) {
    452461                png_set_strip_16(png_ptr);
    453462        }
    454463
    LoadPngData (HPDF_Dict image, 
    458467        }
    459468
    460469        /* check palette-based images for transparent areas and load them immediately if found */
    461         if (xref && PNG_COLOR_TYPE_PALETTE & info_ptr->color_type) {
     470        if (xref && PNG_COLOR_TYPE_PALETTE & color_type) {
    462471                png_bytep trans;
    463472                int num_trans;
    464473                HPDF_Dict smask;
    LoadPngData (HPDF_Dict image, 
    478487                smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
    479488                ret = HPDF_Dict_AddName (smask, "Type", "XObject");
    480489                ret += HPDF_Dict_AddName (smask, "Subtype", "Image");
    481                 ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)info_ptr->width);
    482                 ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)info_ptr->height);
     490                ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width);
     491                ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height);
    483492                ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray");
    484                 ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)info_ptr->bit_depth);
     493                ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth);
    485494
    486495                if (ret != HPDF_OK) {
    487496                        HPDF_Dict_Free(smask);
    LoadPngData (HPDF_Dict image, 
    489498                        goto Exit;
    490499                }
    491500
    492                 smask_data = HPDF_GetMem(image->mmgr, info_ptr->width * info_ptr->height);
     501                smask_data = HPDF_GetMem(image->mmgr, width * height);
    493502                if (!smask_data) {
    494503                        HPDF_Dict_Free(smask);
    495504                        ret = HPDF_FAILD_TO_ALLOC_MEM;
    LoadPngData (HPDF_Dict image, 
    503512                        goto Exit;
    504513                }
    505514
    506                 if (HPDF_Stream_Write(smask->stream, smask_data, info_ptr->width * info_ptr->height) != HPDF_OK) {
     515                if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) {
    507516                        HPDF_FreeMem(image->mmgr, smask_data);
    508517                        HPDF_Dict_Free(smask);
    509518                        ret = HPDF_FILE_IO_ERROR;
    LoadPngData (HPDF_Dict image, 
    513522
    514523
    515524                ret += CreatePallet(image, png_ptr, info_ptr);
    516                 ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width);
    517                 ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height);
    518                 ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",  (HPDF_UINT)info_ptr->bit_depth);
     525                ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width);
     526                ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height);
     527                ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",  (HPDF_UINT)bit_depth);
    519528                ret += HPDF_Dict_Add (image, "SMask", smask);
    520529
    521530                png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    no_transparent_color_in_palette: 
    526535
    527536        /* read images with alpha channel right away
    528537           we have to do this because image transparent mask must be added to the Xref */
    529         if (xref && PNG_COLOR_MASK_ALPHA & info_ptr->color_type) {
     538        if (xref && PNG_COLOR_MASK_ALPHA & color_type) {
    530539                HPDF_Dict smask;
    531540                png_bytep smask_data;
    532541
    no_transparent_color_in_palette: 
    539548                smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
    540549                ret = HPDF_Dict_AddName (smask, "Type", "XObject");
    541550                ret += HPDF_Dict_AddName (smask, "Subtype", "Image");
    542                 ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)info_ptr->width);
    543                 ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)info_ptr->height);
     551                ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width);
     552                ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height);
    544553                ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray");
    545                 ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)info_ptr->bit_depth);
     554                ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth);
    546555
    547556                if (ret != HPDF_OK) {
    548557                        HPDF_Dict_Free(smask);
    no_transparent_color_in_palette: 
    550559                        goto Exit;
    551560                }
    552561
    553                 smask_data = HPDF_GetMem(image->mmgr, info_ptr->width * info_ptr->height);
     562                smask_data = HPDF_GetMem(image->mmgr, width * height);
    554563                if (!smask_data) {
    555564                        HPDF_Dict_Free(smask);
    556565                        ret = HPDF_FAILD_TO_ALLOC_MEM;
    no_transparent_color_in_palette: 
    564573                        goto Exit;
    565574                }
    566575
    567                 if (HPDF_Stream_Write(smask->stream, smask_data, info_ptr->width * info_ptr->height) != HPDF_OK) {
     576                if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) {
    568577                        HPDF_FreeMem(image->mmgr, smask_data);
    569578                        HPDF_Dict_Free(smask);
    570579                        ret = HPDF_FILE_IO_ERROR;
    no_transparent_color_in_palette: 
    572581                }
    573582                HPDF_FreeMem(image->mmgr, smask_data);
    574583
    575                 if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
     584                if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
    576585                        ret += HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray");
    577586                } else {
    578587                        ret += HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB");
    579588                }
    580                 ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width);
    581                 ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height);
    582                 ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",  (HPDF_UINT)info_ptr->bit_depth);
     589                ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width);
     590                ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height);
     591                ret += HPDF_Dict_AddNumber (image, "BitsPerComponent",  (HPDF_UINT)bit_depth);
    583592                ret += HPDF_Dict_Add (image, "SMask", smask);
    584593
    585594                png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
    no_transparent_color_in_palette: 
    589598        /* if the image has color palette, copy the pallet of the image to
    590599         * create color map.
    591600         */
    592         if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
     601        if (color_type == PNG_COLOR_TYPE_PALETTE)
    593602                ret = CreatePallet(image, png_ptr, info_ptr);
    594         else if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
     603        else if (color_type == PNG_COLOR_TYPE_GRAY)
    595604                ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray");
    596605        else
    597606                ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB");
    no_transparent_color_in_palette: 
    617626        }
    618627
    619628        /* setting the info of the image. */
    620         if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width)
     629        if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width)
    621630                        != HPDF_OK)
    622631                goto Exit;
    623632
    624         if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height)
     633        if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height)
    625634                        != HPDF_OK)
    626635                goto Exit;
    627636
    628637        if (HPDF_Dict_AddNumber (image, "BitsPerComponent",
    629                                 (HPDF_UINT)info_ptr->bit_depth) != HPDF_OK)
     638                                (HPDF_UINT)bit_depth) != HPDF_OK)
    630639                goto Exit;
    631640
    632641        /* clean up */