pack_pixels.c revision e0e0c19eefceaf5d4ec40f9466b58a771f50e799
/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "packer.h"
#include "cr_pixeldata.h"
#include "cr_error.h"
#include "cr_mem.h"
#include "cr_version.h"
void PACK_APIENTRY crPackDrawPixels( GLsizei width, GLsizei height,
GLenum format, GLenum type,
const GLvoid *pixels,
const CRPixelPackState *unpackstate )
{
unsigned char *data_ptr;
int packet_length;
if (pixels == NULL)
{
return;
}
#if 0
/* WHAT IS THIS FOR? Disabled by Brian on 3 Dec 2003 */
if (type == GL_BITMAP)
{
crPackBitmap( width, height, 0, 0, 0, 0,
(const GLubyte *) pixels, unpackstate );
}
#endif
packet_length =
sizeof( width ) +
sizeof( height ) +
sizeof( format ) +
sizeof( type );
packet_length += crImageSize( format, type, width, height );
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLsizei, width );
WRITE_DATA( 4, GLsizei, height );
WRITE_DATA( 8, GLenum, format );
WRITE_DATA( 12, GLenum, type );
crPixelCopy2D( width, height,
(void *) (data_ptr + 16), format, type, NULL, /* dst */
pixels, format, type, unpackstate ); /* src */
crHugePacket( CR_DRAWPIXELS_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY crPackReadPixels( GLint x, GLint y, GLsizei width,
GLsizei height, GLenum format,
GLenum type, GLvoid *pixels,
const CRPixelPackState *packstate,
int *writeback)
{
GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
GLint stride = 0;
GLint bytes_per_row;
int bytes_per_pixel;
(void)writeback;
bytes_per_pixel = crPixelSize(format, type);
if (bytes_per_pixel <= 0) {
char string[80];
sprintf(string, "crPackReadPixels(format 0x%x or type 0x%x)", format, type);
__PackError(__LINE__, __FILE__, GL_INVALID_ENUM, string);
return;
}
/* default bytes_per_row so crserver can allocate memory */
bytes_per_row = width * bytes_per_pixel;
stride = bytes_per_row;
if (packstate->alignment != 1) {
GLint remainder = bytes_per_row % packstate->alignment;
if (remainder)
stride = bytes_per_row + (packstate->alignment - remainder);
}
GET_BUFFERED_POINTER(pc, 48 + sizeof(CRNetworkPointer) );
WRITE_DATA( 0, GLint, x );
WRITE_DATA( 4, GLint, y );
WRITE_DATA( 8, GLsizei, width );
WRITE_DATA( 12, GLsizei, height );
WRITE_DATA( 16, GLenum, format );
WRITE_DATA( 20, GLenum, type );
WRITE_DATA( 24, GLint, stride ); /* XXX not really used! */
WRITE_DATA( 28, GLint, packstate->alignment );
WRITE_DATA( 32, GLint, packstate->skipRows );
WRITE_DATA( 36, GLint, packstate->skipPixels );
WRITE_DATA( 40, GLint, bytes_per_row );
WRITE_DATA( 44, GLint, packstate->rowLength );
WRITE_NETWORK_POINTER( 48, (char *) pixels );
WRITE_OPCODE( pc, CR_READPIXELS_OPCODE );
}
/* Round N up to the next multiple of 8 */
#define CEIL8(N) (((N) + 7) & ~0x7)
void PACK_APIENTRY crPackBitmap( GLsizei width, GLsizei height,
GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove,
const GLubyte *bitmap, const CRPixelPackState *unpack )
{
const int isnull = (bitmap == NULL);
unsigned char *data_ptr;
int data_length = 0;
GLubyte *destBitmap = NULL;
int packet_length =
sizeof( width ) +
sizeof( height ) +
sizeof( xorig ) +
sizeof( yorig ) +
sizeof( xmove ) +
sizeof( ymove ) +
sizeof( GLuint );
if ( bitmap )
{
data_length = CEIL8(width) * height / 8;
packet_length += data_length;
data_ptr = (unsigned char *) crPackAlloc( packet_length );
destBitmap = data_ptr + 28;
crBitmapCopy(width, height, destBitmap, bitmap, unpack);
/*
crMemcpy(destBitmap, bitmap, data_length);
*/
}
else {
data_ptr = (unsigned char *) crPackAlloc( packet_length );
}
WRITE_DATA( 0, GLsizei, width );
WRITE_DATA( 4, GLsizei, height );
WRITE_DATA( 8, GLfloat, xorig );
WRITE_DATA( 12, GLfloat, yorig );
WRITE_DATA( 16, GLfloat, xmove );
WRITE_DATA( 20, GLfloat, ymove );
WRITE_DATA( 24, GLuint, isnull );
crHugePacket( CR_BITMAP_OPCODE, data_ptr );
crPackFree( data_ptr );
}
/*
ZPix - compressed DrawPixels
*/
void PACK_APIENTRY crPackZPixCR( GLsizei width, GLsizei height,
GLenum format, GLenum type,
GLenum ztype, GLint zparm, GLint length,
const GLvoid *pixels,
const CRPixelPackState *unpackstate )
{
unsigned char *data_ptr;
int packet_length;
(void)unpackstate;
if (pixels == NULL)
{
return;
}
packet_length =
sizeof( int ) + /* packet size */
sizeof( GLenum ) + /* extended opcode */
sizeof( width ) +
sizeof( height ) +
sizeof( format ) +
sizeof( type ) +
sizeof( ztype ) +
sizeof( zparm ) +
sizeof( length );
packet_length += length;
/* XXX JAG
crDebug("PackZPixCR: fb %d x %d, state %d, zlen = %d, plen = %d",
width, height, ztype, length, packet_length);
*/
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLenum , CR_ZPIXCR_EXTEND_OPCODE );
WRITE_DATA( 4, GLsizei, width );
WRITE_DATA( 8, GLsizei, height );
WRITE_DATA( 12, GLenum, format );
WRITE_DATA( 16, GLenum, type );
WRITE_DATA( 20, GLenum, ztype );
WRITE_DATA( 24, GLint, zparm );
WRITE_DATA( 28, GLint, length );
crMemcpy((void *) (data_ptr+32), pixels, length);
crHugePacket( CR_EXTEND_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY
crPackGetTexImage( GLenum target, GLint level, GLenum format, GLenum type,
GLvoid * pixels, const CRPixelPackState * packstate,
int * writeback )
{
GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
(void) pc;
GET_BUFFERED_POINTER( pc, 40 );
WRITE_DATA( 0, GLint, 40 );
WRITE_DATA( 4, GLenum, CR_GETTEXIMAGE_EXTEND_OPCODE );
WRITE_DATA( 8, GLenum, target );
WRITE_DATA( 12, GLint, level );
WRITE_DATA( 16, GLenum, format );
WRITE_DATA( 20, GLenum, type );
WRITE_NETWORK_POINTER( 24, (void *) pixels );
WRITE_NETWORK_POINTER( 32, (void *) writeback );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
}