0,0 → 1,147 |
/* |
* Project: S.Ha.R.K. |
* |
* Coordinators: |
* Giorgio Buttazzo <giorgio@sssup.it> |
* Paolo Gai <pj@gandalf.sssup.it> |
* |
* Authors : |
* Mauro Marinoni <mauro.marinoni@unipv.it> |
* (see the web pages for full authors list) |
* |
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
* |
* http://www.sssup.it |
* http://retis.sssup.it |
* http://shark.sssup.it |
*/ |
|
/* |
* This program is free software; you can redistribute it and/or modify |
* it under the terms of the GNU General Public License as published by |
* the Free Software Foundation; either version 2 of the License, or |
* (at your option) any later version. |
* |
* This program is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with this program; if not, write to the Free Software |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
*/ |
|
#include "kernel/kern.h" |
#include "string.h" |
#include "drivers/shark_fb26.h" |
#include "snapshot.h" |
|
struct SNAP_SLOT{ |
char used; |
int x; |
int y; |
int** buff; |
} sslot[16]; |
|
int** snapshot_getslot(int nbuff, int sx, int sy) |
{ |
int i; |
int** tmp; |
|
if ((sx<=0) || (sy<=0) || (nbuff<=0) || (nbuff>15)){ |
return NULL; |
} |
if (sslot[nbuff].used) |
return NULL; |
|
/* Allocate pointers to rows. */ |
tmp = (int **) kern_alloc((unsigned) (sy)*sizeof(int*)); |
if (!tmp) |
return NULL; |
|
/* Allocate rows and set pointers to them. */ |
for (i = 0; i < sy; i++){ |
tmp[i] = (int *) kern_alloc((unsigned) (sx)*sizeof(int)); |
if (!tmp[i]) |
return NULL; |
} |
|
sslot[nbuff].used = 1; |
sslot[nbuff].x = sx; |
sslot[nbuff].y = sy; |
sslot[nbuff].buff = tmp; |
return tmp; |
} |
|
void snapshot_freeslot(int nbuff) |
{ |
int i; |
|
if (sslot[nbuff].used){ |
for (i = 0; i < sslot[nbuff].y; i++) |
kern_free(sslot[nbuff].buff[i], (unsigned) (sslot[nbuff].x)*sizeof(int)); |
kern_free(sslot[nbuff].buff, (unsigned) (sslot[nbuff].y)*sizeof(int*)); |
sslot[nbuff].used = 0; |
} |
} |
|
void snapshot_grab(int nbuff) |
{ |
int i, j; |
|
for (i = 0; i < sslot[nbuff].x; i++) |
for (j = 0; j < sslot[nbuff].x; j++) |
sslot[nbuff].buff[i][j] = grx_getpixel(i,j); |
} |
|
int snapshot_save_pgm(int nbuff, char *fname) |
{ |
char out_st[40]; |
register int i, j; |
DOS_FILE *outf; |
|
if ((outf = DOS_fopen(fname, "w")) == NULL) { |
return -1; |
} else { |
sprintf(out_st, "P5\n%d %d\n%d\n", sslot[nbuff].x, sslot[nbuff].y, 255); |
DOS_fwrite(out_st, strlen(out_st), 1, outf); |
cprintf(out_st); |
|
for (j = 0; j < sslot[nbuff].y; j++) { |
for (i = 0; i < sslot[nbuff].x; i++) { |
DOS_fwrite(&(sslot[nbuff].buff[i][j]), 1, 1, outf); |
} |
} |
DOS_fclose(outf); |
} |
return 0; |
} |
|
int snapshot_save_ppm(int nbuff, char *fname) |
{ |
char out_st[40]; |
register int i, j; |
int col_r, col_g, col_b; |
DOS_FILE *outf; |
|
if ((outf = DOS_fopen(fname, "w")) == NULL) { |
return -1; |
} else { |
sprintf(out_st, "P3\n%d %d\n%d\n", sslot[nbuff].x, sslot[nbuff].y, 255); |
DOS_fwrite(out_st, strlen(out_st), 1, outf); |
cprintf(out_st); |
|
for (j = 0; j < sslot[nbuff].y; j++) { |
for (i = 0; i < sslot[nbuff].x; i++) { |
col_r = ((sslot[nbuff].buff[i][j] & 0xF800) >> 11) * 4; |
col_g = ((sslot[nbuff].buff[i][j] & 0x07E0) >> 5) * 2; |
col_b = (sslot[nbuff].buff[i][j] & 0x001F) * 4; |
sprintf(out_st, "%d %d %d ", col_r, col_g, col_b); |
DOS_fwrite(out_st, strlen(out_st), 1, outf); |
} |
} |
DOS_fclose(outf); |
} |
return 0; |
} |