mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 01:47:47 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * The Python Imaging Library.
 | 
						|
 * $Id$
 | 
						|
 *
 | 
						|
 * decoder for uncompressed PCD image data.
 | 
						|
 *
 | 
						|
 * history:
 | 
						|
 *	96-05-10 fl	Created
 | 
						|
 *	96-05-18 fl	New tables
 | 
						|
 *	97-01-25 fl	Use PhotoYCC unpacker
 | 
						|
 *
 | 
						|
 * notes:
 | 
						|
 *	This driver supports uncompressed PCD modes only
 | 
						|
 *	(resolutions up to 768x512).
 | 
						|
 *
 | 
						|
 * Copyright (c) Fredrik Lundh 1996-97.
 | 
						|
 * Copyright (c) Secret Labs AB 1997.
 | 
						|
 *
 | 
						|
 * See the README file for information on usage and redistribution.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#include "Imaging.h"
 | 
						|
 | 
						|
 | 
						|
int
 | 
						|
ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes)
 | 
						|
{
 | 
						|
    int x;
 | 
						|
    int chunk;
 | 
						|
    UINT8* out;
 | 
						|
    UINT8* ptr;
 | 
						|
 | 
						|
    ptr = buf;
 | 
						|
 | 
						|
    chunk = 3 * state->xsize;
 | 
						|
 | 
						|
    for (;;) {
 | 
						|
 | 
						|
	/* We need data for two full lines before we can do anything */
 | 
						|
	if (bytes < chunk)
 | 
						|
	    return ptr - buf;
 | 
						|
 | 
						|
	/* Unpack first line */
 | 
						|
	out = state->buffer;
 | 
						|
	for (x = 0; x < state->xsize; x++) {
 | 
						|
	    out[0] = ptr[x];
 | 
						|
	    out[1] = ptr[(x+4*state->xsize)/2];
 | 
						|
	    out[2] = ptr[(x+5*state->xsize)/2];
 | 
						|
	    out += 3;
 | 
						|
	}
 | 
						|
 | 
						|
	state->shuffle((UINT8*) im->image[state->y],
 | 
						|
		       state->buffer, state->xsize);
 | 
						|
 | 
						|
	if (++state->y >= state->ysize)
 | 
						|
	    return -1; /* This can hardly happen */
 | 
						|
 | 
						|
	/* Unpack second line */
 | 
						|
	out = state->buffer;
 | 
						|
	for (x = 0; x < state->xsize; x++) {
 | 
						|
	    out[0] = ptr[x+state->xsize];
 | 
						|
	    out[1] = ptr[(x+4*state->xsize)/2];
 | 
						|
	    out[2] = ptr[(x+5*state->xsize)/2];
 | 
						|
	    out += 3;
 | 
						|
	}
 | 
						|
 | 
						|
	state->shuffle((UINT8*) im->image[state->y],
 | 
						|
		       state->buffer, state->xsize);
 | 
						|
 | 
						|
	if (++state->y >= state->ysize)
 | 
						|
	    return -1;
 | 
						|
 | 
						|
	ptr += chunk;
 | 
						|
	bytes -= chunk;
 | 
						|
 | 
						|
    }
 | 
						|
}
 |