qjpeg/JPEGFile.cpp
author viric@llimona
Mon, 22 Jan 2007 00:45:57 +0100
changeset 76 9cbf4c7e7986
child 78 a55bf2fa3f74
permissions -rw-r--r--
First classes for the qjpeg project.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     1
#include <cstring>
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     2
#include <cstdio>
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     3
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     4
extern "C"
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     5
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     6
#include <stdio.h>
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     7
#include <jpeglib.h>
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     8
}
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
     9
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    10
#include "FloatPlane.h"
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    11
#include "Image.h"
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    12
#include "JPEGFile.h"
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    13
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    14
JPEGFile::JPEGFile(const char *_filename)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    15
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    16
    using namespace std;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    17
    filename = new char[std::strlen(_filename) + 1];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    18
    std::strcpy(filename, _filename);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    19
    srcinfo = new jpeg_decompress_struct;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    20
    jsrcerr = new jpeg_error_mgr;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    21
}
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    22
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    23
void JPEGFile::readHeader()
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    24
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    25
    srcinfo->err = jpeg_std_error(jsrcerr);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    26
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    27
    jpeg_create_decompress(srcinfo);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    28
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    29
    inputh = fopen(filename, "rb");
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    30
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    31
    jpeg_stdio_src(srcinfo, inputh);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    32
    jpeg_read_header(srcinfo, TRUE);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    33
}
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    34
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    35
Image *JPEGFile::getiDCTImage()
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    36
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    37
    readHeader();
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    38
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    39
    /* Set our JPEG decompression parameters */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    40
    srcinfo->dct_method = JDCT_FLOAT;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    41
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    42
    /* jpeglib don't do any postprocessing (scaling/colorq). */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    43
    srcinfo->raw_data_out = TRUE;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    44
    
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    45
    /* Start decompression of pixels */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    46
    jpeg_start_decompress(srcinfo);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    47
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    48
    unsigned int nplanes = srcinfo->num_components;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    49
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    50
    /* Create the planes */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    51
    FloatPlane *planes = new FloatPlane[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    52
    unsigned int width[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    53
    unsigned int height[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    54
    unsigned int max_width_in_blocks = 0;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    55
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    56
    /* Get the pointers to the planes */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    57
    float *bmp[srcinfo->out_color_components];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    58
    for (unsigned int i=0; i < nplanes; i++)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    59
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    60
        /* get the dimensions for every plane*/
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    61
        width[i] = srcinfo->comp_info[i].downsampled_width;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    62
        height[i] = srcinfo->comp_info[i].downsampled_height;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    63
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    64
        if (srcinfo->comp_info[i].width_in_blocks > max_width_in_blocks)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    65
            max_width_in_blocks = srcinfo->comp_info[i].width_in_blocks;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    66
        /* Allocate and prepare bmp[] */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    67
        planes[i].allocate(width[i], height[i]);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    68
        bmp[i] = planes[i].ptr;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    69
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    70
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    71
    /* The function jpeg_read_raw_data will return an MCU per call */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    72
    int nscanlines = srcinfo->max_v_samp_factor*DCTSIZE;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    73
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    74
    /* Get memory for the buffer scanline pointers */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    75
    JSAMPARRAY *scanplanes = new JSAMPARRAY[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    76
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    77
    /* Get memory for each scanline in the buffer */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    78
    for (unsigned int plane = 0; plane < nplanes; ++plane)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    79
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    80
        scanplanes[plane] = new JSAMPROW[nscanlines];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    81
        for (int isl = 0; isl < nscanlines; ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    82
            scanplanes[plane][isl] = new JSAMPLE[max_width_in_blocks * DCTSIZE];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    83
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    84
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    85
    unsigned int row[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    86
    unsigned int div_v_factor[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    87
    for (unsigned int plane = 0; plane < nplanes; ++plane)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    88
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    89
        row[plane] = 0;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    90
        div_v_factor[plane] = srcinfo->max_v_samp_factor /
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    91
            srcinfo->comp_info[plane].v_samp_factor;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    92
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    93
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    94
    while (srcinfo->output_scanline < srcinfo->output_height) {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    95
        int read_scanlines =
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    96
            jpeg_read_raw_data(srcinfo, scanplanes, nscanlines);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    97
        for (unsigned int plane = 0; plane < nplanes; ++plane)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    98
        {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
    99
            if (row[plane] >= height[plane])
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   100
                continue;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   101
            for (int isl = 0; isl < (read_scanlines / (int) div_v_factor[plane]); ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   102
            {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   103
                for (unsigned int column = 0; column < width[plane];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   104
                    ++column) {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   105
                    bmp[plane][row[plane] * width[plane] + column] =
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   106
                        scanplanes[plane][isl][column];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   107
                }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   108
            ++row[plane];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   109
            }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   110
        }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   111
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   112
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   113
    jpeg_destroy_decompress(srcinfo);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   114
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   115
    fclose(inputh);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   116
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   117
    Image *i = new Image(planes, nplanes);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   118
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   119
    delete[] planes;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   120
    for (unsigned int plane = 0; plane < nplanes; ++plane)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   121
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   122
        for (int isl = 0; isl < nscanlines; ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   123
            delete[] scanplanes[plane][isl];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   124
        delete[] scanplanes[plane];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   125
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   126
    delete[] scanplanes;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   127
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   128
    return i;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   129
}
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   130
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   131
Image *JPEGFile::getUnpackedImage()
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   132
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   133
    readHeader();
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   134
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   135
    /* Set our JPEG decompression parameters */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   136
    srcinfo->do_fancy_upsampling = 1;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   137
    srcinfo->dct_method = JDCT_FLOAT;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   138
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   139
    /* Get the number of planes */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   140
    if (srcinfo->num_components == 1 &&
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   141
            srcinfo->jpeg_color_space == JCS_GRAYSCALE) {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   142
        srcinfo->out_color_components = 1;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   143
        srcinfo->out_color_space = JCS_GRAYSCALE;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   144
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   145
    else {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   146
        srcinfo->out_color_components = 3;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   147
        srcinfo->out_color_space = JCS_RGB;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   148
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   149
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   150
    /* Start decompression of pixels */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   151
    jpeg_start_decompress(srcinfo);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   152
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   153
    unsigned int nplanes = srcinfo->out_color_components;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   154
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   155
    /* Create the planes */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   156
    FloatPlane *planes = new FloatPlane[nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   157
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   158
    /* Get the pointers to the planes */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   159
    float *bmp[srcinfo->out_color_components];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   160
    for (unsigned int i=0; i < nplanes; i++)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   161
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   162
        planes[i].allocate(srcinfo->output_width, srcinfo->output_height);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   163
        bmp[i] = planes[i].ptr;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   164
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   165
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   166
    /* Get the recommended number of buffer scanlines */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   167
    int nscanlines = srcinfo->rec_outbuf_height;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   168
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   169
    /* Get memory for the buffer scanline pointers */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   170
    JSAMPROW *scanlines = new JSAMPROW[nscanlines];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   171
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   172
    /* Get memory for each scanline in the buffer */
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   173
    for (int isl = 0; isl < nscanlines; ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   174
    {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   175
        scanlines[isl] = new JSAMPLE[srcinfo->output_width * nplanes];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   176
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   177
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   178
    int row = 0;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   179
    while (srcinfo->output_scanline < srcinfo->output_height) {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   180
        int read_scanlines =
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   181
            jpeg_read_scanlines(srcinfo, scanlines, nscanlines);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   182
        for (int isl = 0; isl < read_scanlines; ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   183
        {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   184
            for (unsigned int column = 0; column < srcinfo->output_width;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   185
                    ++column) {
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   186
                for (unsigned int plane = 0; plane < nplanes; plane++)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   187
                    bmp[plane][row * srcinfo->output_width + column] =
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   188
                        scanlines[isl][column * srcinfo->out_color_components
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   189
                        + plane];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   190
            }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   191
            ++row;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   192
        }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   193
    }
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   194
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   195
    jpeg_destroy_decompress(srcinfo);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   196
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   197
    fclose(inputh);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   198
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   199
    Image *i = new Image(planes, nplanes);
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   200
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   201
    delete[] planes;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   202
    for (int isl = 0; isl < nscanlines; ++isl)
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   203
        delete[] scanlines[isl];
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   204
    delete[] scanlines;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   205
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   206
    return i;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   207
}
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   208
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   209
JPEGFile::~JPEGFile()
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   210
{
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   211
    delete[] filename;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   212
    delete srcinfo;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   213
    delete jsrcerr;
9cbf4c7e7986 First classes for the qjpeg project.
viric@llimona
parents:
diff changeset
   214
}