/* * * File: pict_98.c * Project: libpict 1.1 * Date: Fri, May 19, 1995 * (c) SPDsoft 1992-95 * */ #include #include #include #include "pict.h" #ifndef SEEK_SET #define SEEK_SET 0 #endif #define PINFPMH98 pict_info->pixMap98 /* Abrev. */ extern char sccsid[]; #ifdef __STDC__ int pict_write_header_98( Pict pict, US_int im_H, US_int im_W, US_int modo, C_MAP c_table ) #else /* __STDC__ */ int pict_write_header_98( pict, im_H, im_W, modo, c_table) Pict pict; US_int im_H,im_W,modo; C_MAP c_table ; #endif /* __STDC__ */ { Header98 *pict_info; unsigned short int i; if (pict->file_mode!=P_WRITE) return -1; pict_info = (Header98 *)malloc(sizeof(Header98)); if (pict_info==NULL) { fprintf(stderr,"RAM insuficiente, bye...\n"); exit(-1); } pict->clr_mode = modo; pict->image_H = im_H; pict->image_W = im_W; PINFPMH98.packType= 0; PINFPMH98.packSize= 0; PINFPMH98.pixelType= 0; PINFPMH98.pixelSize= 8; PINFPMH98.cmpCount= 1; PINFPMH98.cmpSize= 8; /* poner tabla de colores */ if ( (pict->clr_mode==M_RGB8) && (c_table!=NULL) ){ /* tabla de usuario */ for(i=0; i<=255; i++){ #ifdef LITEND PINFPMH98.ctData[i].ctIndex = SWAP_W(i); #else PINFPMH98.ctData[i].ctIndex = i; #endif PINFPMH98.ctData[i].ctRed = PINFPMH98.ctData[i].ctRedP = c_table[i][0]; PINFPMH98.ctData[i].ctGreen = PINFPMH98.ctData[i].ctGreenP = c_table[i][1]; PINFPMH98.ctData[i].ctBlue = PINFPMH98.ctData[i].ctBlueP = c_table[i][2]; } } else{ /* escala de grises */ for(i=0; i<=255; i++){ #ifdef LITEND PINFPMH98.ctData[i].ctIndex = SWAP_W(i); #else PINFPMH98.ctData[i].ctIndex = i; #endif PINFPMH98.ctData[i].ctRed = PINFPMH98.ctData[i].ctRedP = PINFPMH98.ctData[i].ctGreen = PINFPMH98.ctData[i].ctGreenP = PINFPMH98.ctData[i].ctBlue = PINFPMH98.ctData[i].ctBlueP = i; } } /* Fin c_table */ PINFPMH98.rowBytes = im_W; if ( PINFPMH98.rowBytes %2 == 1 ) PINFPMH98.rowBytes ++ ; pict->row_bytes = PINFPMH98.rowBytes; pict->n_comp = PINFPMH98.cmpCount; pict->ctr_size = (pict->row_bytes <= 250 ? BYTE : WORD); /* Escribiendo fileHeader */ strcpy((char*)pict_info->fileHeader,sccsid); /* Escribiendo picSize = 0000 */ pict_info->picSize = 0; /* Escribiendo picFrame */ PUTFRAME(pict_info->picFrame); /* version */ pict_info->versOp = VERSOP; pict_info->vers2 = VERS2; /* Header */ pict_info->pictHeader.HeaderOp = HEADEROP; pict_info->pictHeader.unk1 = UNK1; pict_info->pictHeader.hres.fpint = _72PPP_INT; pict_info->pictHeader.hres.fpfrac = _72PPP_FRAC; pict_info->pictHeader.vres.fpint = _72PPP_INT; pict_info->pictHeader.vres.fpfrac= _72PPP_FRAC; PUTFRAME(pict_info->pictHeader.fBBox); pict_info->pictHeader.unk2 = CERO_L; /* clipRect */ pict_info->clipRect.clipRectOp = CLIPRECTOPT; pict_info->clipRect.clipSize = CLIPSIZE; PUTFRAME(pict_info->clipRect.clipFrame); /* pixMap98 */ PINFPMH98.pixMapOp = PIXMAP_98; PUTFRAME(PINFPMH98.bounds); PINFPMH98.pmVersion = CERO_W; PINFPMH98.hres.fpint = _72PPP_INT; PINFPMH98.hres.fpfrac = _72PPP_FRAC; PINFPMH98.vres.fpint = _72PPP_INT; PINFPMH98.vres.fpfrac= _72PPP_FRAC; PINFPMH98.planeBytes = CERO_L; PINFPMH98.pmTable = CERO_L; PINFPMH98.pmReserved = CERO_L; PINFPMH98.ctSeed = CERO_L; PINFPMH98.ctFlags = CERO_W; PINFPMH98.ctSize = 255; PUTFRAME(PINFPMH98.srcRect); PUTFRAME(PINFPMH98.dstRect); PINFPMH98.mode = CERO_W; /* Fin */ #ifdef LITEND /* let's swap */ PINFPMH98.pixelSize = SWAP_W( PINFPMH98.pixelSize ); PINFPMH98.cmpCount = SWAP_W( PINFPMH98.cmpCount ); PINFPMH98.cmpSize = SWAP_W( PINFPMH98.cmpSize ); PINFPMH98.rowBytes = SWAP_W( PINFPMH98.rowBytes ); PINFPMH98.ctSize = SWAP_W( PINFPMH98.ctSize ); #endif /* LITEND */ PINFPMH98.rowBytes |= HB_MASK; /* hb set rgb */ /* fwrite((void *) pict_info,sizeof(Header98),1,pict->fp); */ fwrite((void *)pict_info->fileHeader,512,1,pict->fp); fwrite((void *)&(pict_info->picSize),2,1,pict->fp); fwrite((void *)&(pict_info->picFrame),12,1,pict->fp); fwrite((void *)&(pict_info->pictHeader.HeaderOp),2,1,pict->fp); fwrite((void *)&(pict_info->pictHeader.unk1),4,1,pict->fp); fwrite((void *)&(pict_info->pictHeader.hres),20,1,pict->fp); fwrite((void *)&(pict_info->clipRect),12,1,pict->fp); fwrite((void *)&(pict_info->pixMap98),2122,1,pict->fp); free(pict_info); return pict->row_bytes; } #ifdef __STDC__ int pict_read_header_98( Pict pict, C_MAP c_table) #else /* __STDC__ */ int pict_read_header_98( pict, c_table) Pict pict; C_MAP c_table; #endif /* __STDC__ */ { Header98 *pict_info; unsigned int i,grey_scale; if (pict->file_mode!=P_READ) return -1; pict_info = (Header98 *)malloc(sizeof(Header98)); if (pict_info==NULL) { fprintf(stderr,"RAM insuficiente, bye...\n"); exit(-1); } fseek(pict->fp,0,SEEK_SET); fread((char *)pict_info->fileHeader,512,1,pict->fp); fread((char *)&(pict_info->picSize),2,1,pict->fp); fread((char *)&(pict_info->picFrame),12,1,pict->fp); fread((char *)&(pict_info->pictHeader.HeaderOp),2,1,pict->fp); fread((char *)&(pict_info->pictHeader.unk1),4,1,pict->fp); fread((char *)&(pict_info->pictHeader.hres),20,1,pict->fp); fread((char *)&(pict_info->clipRect),12,1,pict->fp); fread((char *)&(pict_info->pixMap98),56,1,pict->fp); #ifndef LITEND pict->image_H = pict_info->pictHeader.fBBox.bottom- pict_info->pictHeader.fBBox.top; pict->image_W = pict_info->pictHeader.fBBox.right- pict_info->pictHeader.fBBox.left; #else pict->image_H = SWAP_W(pict_info->pictHeader.fBBox.bottom)- SWAP_W(pict_info->pictHeader.fBBox.top); pict->image_W = SWAP_W(pict_info->pictHeader.fBBox.right)- SWAP_W(pict_info->pictHeader.fBBox.left); PINFPMH98.ctSize = SWAP_W( PINFPMH98.ctSize ); #endif /* LITEND */ fread((char *)PINFPMH98.ctData, (unsigned int)PINFPMH98.ctSize+1,8,pict->fp); for (i=0; i<(unsigned int)PINFPMH98.ctSize+1; i++) { #ifdef LITEND PINFPMH98.ctData[i].ctIndex = SWAP_W(PINFPMH98.ctData[i].ctIndex); #endif c_table[PINFPMH98.ctData[i].ctIndex][0]= PINFPMH98.ctData[i].ctRedP; c_table[PINFPMH98.ctData[i].ctIndex][1]= PINFPMH98.ctData[i].ctGreenP; c_table[PINFPMH98.ctData[i].ctIndex][2]= PINFPMH98.ctData[i].ctBlueP; } grey_scale=1; for (i=0; i<256; i++) if ( c_table[i][1] != c_table[i][0] || c_table[i][2] != c_table[i][0] ) { grey_scale = 0; break; } if (grey_scale) pict->clr_mode = M_MONO; else pict->clr_mode = M_RGB8; pict->n_comp = 1; PINFPMH98.ctSize = 255; fread((void *)&PINFPMH98.srcRect,(size_t)18,(size_t)1,pict->fp); pict->row_bytes = PINFPMH98.rowBytes &= ~HB_MASK; #ifdef LITEND PINFPMH98.rowBytes = SWAP_W(PINFPMH98.rowBytes); pict->row_bytes = SWAP_W(pict->row_bytes); #endif pict->ctr_size = (pict->row_bytes <= 250 ? BYTE : WORD); free(pict_info); return pict->row_bytes; } #ifdef __STDC__ int pict_ctable_98( Pict pict, C_MAP c_table) #else /* __STDC__ */ int pict_ctable_98( pict, c_table) Pict pict; C_MAP c_table; #endif /* __STDC__ */ { L_int pos; unsigned int i,j; U_char *color; colorTable color_table98[256]; color = (U_char *)color_table98; if ( c_table!=NULL ) { for (i=0;i<256;i++) { *color++ = 0; *color++ = i; *color++ = c_table[i][0]; *color++ = c_table[i][0]; *color++ = c_table[i][1]; *color++ = c_table[i][1]; *color++ = c_table[i][2]; *color++ = c_table[i][2]; } } else { for (i=0,j=255;i<256;i++,j--) { *color++ = 0; *color++ = i; *color++ = j; *color++ = j; *color++ = j; *color++ = j; *color++ = j; *color++ = j; } } pos = ftell(pict->fp); fseek(pict->fp,108L,SEEK_SET); fwrite((void *) color_table98,sizeof(color_table98),1,pict->fp); fseek(pict->fp,pos,SEEK_SET); return 0; }