/*
* Copyright (c) 2001 Dan Gudmundsson
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*
* $Id: esdl_spec.c,v 1.2 2005/06/29 14:45:39 dgud Exp $
*/
/* The special functions */
#include "esdl.h"
void es_getSurface(sdl_data *sd, int len, char * buff)
{
char *bp, *start;
int sendlen;
SDL_Surface *screen;
bp = buff;
POPGLPTR(screen, bp);
if(screen == NULL) {
error();
}
bp = start = sdl_getbuff(sd, 4*4+2+8*2);
put32be(bp, screen->flags);
PUSHGLPTR(screen->format, bp);
put32be(bp, screen->w);
put32be(bp, screen->h);
put16be(bp, screen->pitch);
PUSHGLPTR(screen->pixels, bp);
put32be(bp, screen->offset);
/* put32be(bp, screen->clip_minx); */
/* put32be(bp, screen->clip_maxx); */
/* put32be(bp, screen->clip_miny); */
/* put32be(bp, screen->clip_maxy); */
sendlen = bp - start;
sdl_send(sd, sendlen);
}
void es_getPixelFormat(sdl_data *sd, int len, char * buff)
{
char *bp, *start;
int sendlen;
SDL_Surface * sptr;
SDL_PixelFormat *format;
bp = buff;
POPGLPTR(sptr, bp);
if(sptr == NULL)
error();
format = sptr->format;
if(format == NULL)
error();
bp = start = sdl_get_temp_buff(sd, 8+5*4+11);
PUSHGLPTR(format->palette, bp);
put8(bp, format->BitsPerPixel);
put8(bp, format->BytesPerPixel);
put8(bp, format->Rloss);
put8(bp, format->Gloss);
put8(bp, format->Bloss);
put8(bp, format->Aloss);
put8(bp, format->Rshift);
put8(bp, format->Gshift);
put8(bp, format->Bshift);
put8(bp, format->Ashift);
put32be(bp, format->Rmask);
put32be(bp, format->Gmask);
put32be(bp, format->Bmask);
put32be(bp, format->Amask);
put32be(bp, format->colorkey);
put8(bp, format->alpha);
sendlen = bp - start;
sdl_send(sd, sendlen);
}
void es_getPalette(sdl_data *sd, int len, char * buff)
{
char *bp, *start;
int sendlen;
SDL_Palette *palette;
SDL_Surface *sptr;
int i;
bp = buff;
POPGLPTR(sptr, bp);
palette = sptr->format->palette;
if(palette == NULL) {
bp = start = sdl_getbuff(sd, 2);
put16be(bp, 0);
sendlen = bp - start;
sdl_send(sd, sendlen);
return;
}
bp = start = sdl_getbuff(sd, 2 + palette->ncolors * 3);
put16be(bp, palette->ncolors);
for(i = 0; i < palette->ncolors; i++)
{
put8(bp, palette->colors[i].r);
put8(bp, palette->colors[i].g);
put8(bp, palette->colors[i].b);
}
sendlen = bp - start;
sdl_send(sd, sendlen);
}
void es_getPixels(sdl_data *sd, int len, char * buff)
{
char *bp, *start;
SDL_Surface *sptr;
int sendlen, x, y, w, h, xi, yi;
Uint8 *row;
bp = buff;
POPGLPTR(sptr, bp);
if(sptr == NULL)
error();
x = get16be(bp);
y = get16be(bp);
w = get16be(bp);
h = get16be(bp);
if(sptr->pixels == NULL)
error();
/* see /usr/local/src/SDL-1.1.3/src/video/SDL_surface.c FillRect */
start = bp = sdl_getbuff(sd, w*h*sptr->format->BytesPerPixel);
row = (Uint8 *) sptr->pixels + y * sptr->pitch +
x * sptr->format->BytesPerPixel;
switch(sptr->format->BytesPerPixel) {
case 1: {
Uint8 *pixels;
for(yi = h; yi; --yi){
pixels = (Uint8 *) row;
for(xi = w; xi; --xi){
put8(bp, *pixels);
pixels += 1;
}
row += sptr->pitch;
}
break;
}
case 2:
{
Uint16 *pixels;
for(yi = h; yi; --yi){
pixels = (Uint16 *) row;
for(xi = w; xi; --xi){
put16be(bp, *pixels);
pixels++;
}
row += sptr->pitch;
}
}
break;
case 3:
{
Uint8 *pixels;
for(yi = h; yi; --yi){
pixels = (Uint8 *) row;
for(xi = w; xi; --xi){
put8(bp, *pixels);
put8(bp, *(pixels+1));
put8(bp, *(pixels+2));
pixels += 3;
}
row += sptr->pitch;
}
}
break;
case 4:
{
Uint32 *pixels;
for(yi = h; yi; --yi){
pixels = (Uint32 *) row;
for(xi = w; xi; --xi){
put32be(bp, *pixels);
pixels++;
}
row += sptr->pitch;
}
}
break;
}
sendlen = bp - start;
sdl_send(sd, sendlen);
}
syntax highlighted by Code2HTML, v. 0.9.1