Ignore:
Timestamp:
Jan 13, 2009, 12:51:44 AM (11 years ago)
Author:
Sam Hocevar
Message:

Minor reorg in the JPEG codec.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/codec/jpeg.c

    r3343 r3344  
    3333static int pipi_free_jpeg(pipi_image_t *img);
    3434
    35 struct my_error_mgr {
     35struct my_error_mgr
     36{
    3637    struct jpeg_error_mgr pub;
    3738    jmp_buf setjmp_buffer;
     
    4344{
    4445}
     46
    4547static void emit_msg(j_common_ptr cinfo, int level)
    4648{
    4749}
     50
    4851static void error_msg(j_common_ptr cinfo)
    4952{
     
    5255    longjmp(myerr->setjmp_buffer, 1);
    5356}
     57
    5458static void output_msg(j_common_ptr cinfo)
    5559{
     
    6670
    6771    fp = fopen(name, "rb");
    68     if(!fp) goto end;
    69 
    70 
    71     if (setjmp(jerr.setjmp_buffer)) {
    72         goto end;
    73     }
     72    if(!fp)
     73        goto end;
     74
     75    if(setjmp(jerr.setjmp_buffer))
     76        goto end;
     77
    7478    cinfo.err = jpeg_std_error(&jerr.pub);
    7579    jerr.pub.error_exit = error_msg;
     
    8286    cinfo.client_data = 0x0;
    8387    jpeg_stdio_src(&cinfo, fp);
    84     if(cinfo.client_data == (void *)0x1) {
    85         goto end;
    86     }
     88    if(cinfo.client_data == (void *)0x1)
     89        goto end;
    8790    jpeg_read_header(&cinfo, TRUE);
    88     if(cinfo.client_data == (void *)0x1) {
    89         goto end;
    90     }
     91    if(cinfo.client_data == (void *)0x1)
     92        goto end;
    9193    jpeg_start_decompress(&cinfo);
    92     if(cinfo.client_data == (void *)0x1) {
    93         goto end;
    94     }
     94    if(cinfo.client_data == (void *)0x1)
     95        goto end;
    9596
    9697    /* One scanline */
    9798    image = malloc(cinfo.output_width * cinfo.output_height * 4);
    98     if(!image) goto end;
     99    if(!image)
     100        goto end;
    99101
    100102    scanline = malloc(cinfo.output_width * 3);
    101103
    102 
    103     for(i=0; i < cinfo.output_height; i++)
     104    for(i = 0; i < cinfo.output_height; i++)
    104105    {
    105106        jpeg_read_scanlines(&cinfo, &scanline, 1);
    106         if(cinfo.client_data == (void *)0x1) {
     107        if(cinfo.client_data == (void *)0x1)
     108        {
    107109            free(img);
    108110            img = NULL;
    109111            goto end;
    110112        }
    111         for(j=0 ; j<cinfo.output_width*3; j+=3)
     113        for(j = 0; j < cinfo.output_width * 3; j += 3)
    112114        {
    113             image[k+2] = scanline[j];
    114             image[k+1] = scanline[j+1];
    115             image[k]   = scanline[j+2];
    116             image[k+3] = 255;
    117             k+=4;
     115            image[k + 2] = scanline[j];
     116            image[k + 1] = scanline[j + 1];
     117            image[k]     = scanline[j + 2];
     118            image[k + 3] = 255;
     119            k += 4;
    118120        }
    119121    }
     
    124126    img->p[PIPI_PIXELS_RGBA_U8].w = cinfo.output_width;
    125127    img->p[PIPI_PIXELS_RGBA_U8].h = cinfo.output_height;
    126     img->p[PIPI_PIXELS_RGBA_U8].pitch = cinfo.output_width*4;
     128    img->p[PIPI_PIXELS_RGBA_U8].pitch = cinfo.output_width * 4;
    127129    img->p[PIPI_PIXELS_RGBA_U8].bpp = 24;
    128130    img->p[PIPI_PIXELS_RGBA_U8].bytes = 4 * img->w * img->h;
     
    137139
    138140end:
    139     if(fp) fclose(fp);
    140     if(scanline) free(scanline);
     141    if(fp)
     142        fclose(fp);
     143    if(scanline)
     144        free(scanline);
    141145    jpeg_destroy_decompress(&cinfo);
    142146    return img;
     
    145149int pipi_save_jpeg(pipi_image_t *img, const char *name)
    146150{
    147     int quality = 75; /* FIXME */
    148 
    149151    struct jpeg_compress_struct cinfo;
    150152    struct my_error_mgr jerr;
    151     unsigned char *data = NULL;
    152     unsigned char *line = NULL;
     153    unsigned char *data;
     154    unsigned char *line;
     155    pipi_pixels_t *pixels;
     156    JSAMPROW *jbuf;
     157    uint32_t *ptr;
     158    FILE *fp;
     159    int i, j, y = 0;
    153160    size_t len;
     161
     162    int quality = 75; /* FIXME */
    154163
    155164    len = strlen(name);
     
    167176    }
    168177
    169     pipi_pixels_t *pixels = pipi_get_pixels(img, PIPI_PIXELS_RGBA_U8);
    170 
    171     if (!pixels)
    172         return 0;
     178    pixels = pipi_get_pixels(img, PIPI_PIXELS_RGBA_U8);
     179    if(!pixels)
     180        return -1;
    173181
    174182    data = pixels->pixels;
    175183
    176184    line = malloc(img->w * 3 * sizeof(unsigned char));
    177     if (!line)
    178         return 0;
    179 
    180     FILE *fp = fopen(name, "wb");
    181     if (!fp) {
     185    if(!line)
     186        return -1;
     187
     188    fp = fopen(name, "wb");
     189    if(!fp)
     190    {
    182191        free(line);
    183         return 0;
    184     }
    185    
    186     if (setjmp(jerr.setjmp_buffer)) {
    187         goto end;
    188     }
    189    
     192        return -1;
     193    }
     194
     195    if(setjmp(jerr.setjmp_buffer))
     196        goto end;
     197
    190198    jerr.pub.error_exit = error_msg;
    191199    jerr.pub.emit_message = emit_msg;
     
    205213    jpeg_start_compress(&cinfo, TRUE);
    206214
    207     int j, i, y = 0;
    208     uint32_t *ptr = (uint32_t*)data;
    209     JSAMPROW           *jbuf;
    210 
    211     while (cinfo.next_scanline < cinfo.image_height)
     215    ptr = (uint32_t*)data;
     216
     217    while(cinfo.next_scanline < cinfo.image_height)
    212218    {
    213219        for (j = 0, i = 0; i < img->w; i++)
     
    224230
    225231    jpeg_finish_compress(&cinfo);
     232
    226233end:
    227234    jpeg_destroy_compress(&cinfo);
     
    231238    pipi_release_pixels(img, pixels);
    232239
    233     return 1;
     240    return 0;
    234241}
    235242
     
    241248}
    242249
    243 
    244 
    245 
Note: See TracChangeset for help on using the changeset viewer.