From: jwalz Date: Sat, 5 Jan 2002 21:06:01 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: MOVE2GIT~3579 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=41eabacf16992bfd7e9fa71a38eac4e0a617d3ca;p=nethack *** empty log message *** --- diff --git a/win/gem/load_img.c b/win/gem/load_img.c new file mode 100644 index 000000000..5386d2a66 --- /dev/null +++ b/win/gem/load_img.c @@ -0,0 +1,290 @@ +#define __TCC_COMPAT__ +#include +#include +#include +#include +#include +#include +#include +#include +#include "load_img.h" + +#ifndef FALSE +#define FALSE 0 +#define TRUE !FALSE +#endif + +/* VDI <-> Device palette order conversion matrixes: */ +/* Four-plane vdi-device */ +int vdi2dev4[]={0,15,1,2,4,6,3,5,7,8,9,10,12,14,11,13}; +/* Two-plane vdi-device */ +int vdi2dev2[]={0,3,1,2}; + +void get_colors(int handle, short *palette, int col){ + int i, idx; + + /* get current color palette */ + for(i=0; i < col; i ++){ + /* device->vdi->device palette order */ + switch(planes){ + case 1: + idx=i;break; + case 2: + idx=vdi2dev2[i];break; + case 4: + idx=vdi2dev4[i];break; + default: + if(i<16) + idx=vdi2dev4[i]; + else + idx=i; + } + vq_color(handle, i, 0, (int *)palette + idx * 3); + } +} + +void img_set_colors(int handle, short *palette, int col){ + int i, idx, end; + + /* set color palette */ + end=min(1<fd_addr; + + /* initialize some variables and zero temp. line buffer */ + mplanes=min(image->fd_nplanes, planes); + /* convert image */ + line_addr=image_addr; + buf_addr=screen_addr; + if(mplanes>1){ + /* cut/pad color planes into temp buf */ + for(plane=0; planefd_addr); + /* convert image line in temp into current device raster format */ + if((new1_addr=(char *) calloc(1,new_size)) == NULL) + return(FALSE); + dev_form.fd_addr=new1_addr; + vr_trnfm(x_handle, &tmp, &dev_form); + free(new_addr); + + /* change image description */ + image->fd_stand=0; /* device format */ + image->fd_addr=new1_addr; + image->fd_nplanes=planes; + return(TRUE); +} + +int transform_img(MFDB *image){ /* return FALSE if transform_img fails */ + int success; + long size; + + if(!image->fd_addr) + return(FALSE); + + size=(long)((long)image->fd_wdwidth * (long)image->fd_h); + success=convert(image, size); /* Use vr_trfm(), which needs quite a lot memory. */ + if(success) return(TRUE); +/* else show_error(ERR_ALLOC); */ + return(FALSE); +} + + +/* Loads & depacks IMG (0 if succeded, else error). */ +/* Bitplanes are one after another in address IMG_HEADER.addr. */ +int depack_img(char *name, IMG_header *pic){ + int b, line, plane, width, word_aligned, opcode, patt_len, pal_size, + byte_repeat, patt_repeat, scan_repeat, error = FALSE; + char *pattern, *to, *endline, *puffer, sol_pat; + long size; + FILE *fp; + + if((fp = fopen(name, "rb")) == NULL) + return(ERR_FILE); + + setvbuf(fp,NULL,_IOLBF,BUFSIZ); + + /* read header info (bw & ximg) into image structure */ + fread((char *)&(pic->version), 2, 8 + 3, fp); + + /* only 2-256 color imgs */ + if(pic->planes < 1 || pic->planes > 8){ + error = ERR_COLOR; + goto end_depack; + } + + /* if XIMG, read info */ + if(pic->magic == XIMG && pic->paltype == 0){ + pal_size = (1 << pic->planes) * 3 * 2; + if((pic->palette = (short *)calloc(1,pal_size))){ + fread((char *)pic->palette, 1, pal_size, fp); + } + }else{ + pic->palette = NULL; + } + + /* width in bytes word aliged */ + word_aligned = (pic->img_w + 15) >> 4; + word_aligned <<= 1; + + /* width byte aligned */ + width = (pic->img_w + 7) >> 3; + + /* allocate memory for the picture */ + free(pic->addr); + size = (long)((long)word_aligned * (long)pic->img_h * (long)pic->planes); /*MAR*/ + + /* check for header validity & malloc long... */ + if (pic->length > 7 && pic->planes < 33 && pic->img_w > 0 && pic->img_h > 0){ + if(!(pic->addr=(char *)calloc(1,size))){ + error = ERR_ALLOC; + goto end_depack; + } + }else{ + error = ERR_HEADER; + goto end_depack; + } + + patt_len = pic->pat_len; + + /* jump over the header and possible (XIMG) info */ + fseek(fp, (long) pic->length * 2L, SEEK_SET); + + for(line=0,to=pic->addr; lineimg_h; line+=scan_repeat){ /* depack whole img */ + for(plane=0,scan_repeat=1; planeplanes; plane++){ /* depack one scan line */ + puffer=to=pic->addr+(long)(line+plane*pic->img_h)*(long)word_aligned; + endline=puffer+width; + do{ /* depack one line in one bitplane */ + switch((opcode= fgetc(fp))){ + case 0: /* pattern or scan repeat */ + if((patt_repeat=fgetc(fp))){ /* repeat a pattern */ + fread(to,patt_len,1,fp); + pattern=to; + to+=patt_len; + while(--patt_repeat){ /* copy pattern */ + memcpy(to,pattern,patt_len); + to+=patt_len; + } + }else{ /* repeat a line */ + if(fgetc(fp)==0xFF) + scan_repeat=fgetc(fp); + else{ + error = ERR_DEPACK; + goto end_depack; + } + } + break; + case 0x80: /* Literal */ + byte_repeat=fgetc(fp); + fread(to,byte_repeat,1,fp); + to+=byte_repeat; + break; + default: /* Solid run */ + byte_repeat = opcode & 0x7F; + sol_pat = opcode&0x80 ? 0xFF : 0x00; + while(byte_repeat--) *to++=sol_pat; + } + }while(to pic->img_h) + scan_repeat = pic->img_h - line; + + /* copy line to image buffer */ + if(scan_repeat>1){ + /* calculate address of a current line in a current bitplane */ +/* to=pic->addr+(long)(line+1+plane*pic->img_h)*(long)word_aligned;*/ + for(b=scan_repeat-1; b; --b){ + memcpy(to, puffer, width); + to+=word_aligned; + } + } + }else{ + error = ERR_DEPACK; + goto end_depack; + } + } + } + + end_depack: + fclose(fp); + return(error); +} + +int half_img(MFDB *s, MFDB *d){ + int pxy[8], i, j; + MFDB tmp; + + mfdb(&tmp,NULL,s->fd_w/2,s->fd_h,s->fd_stand,s->fd_nplanes); + tmp.fd_w=s->fd_w/2; + tmp.fd_addr=calloc(1,mfdb_size(&tmp)); + if(!tmp.fd_addr) + return(FALSE); + + pxy[1]=pxy[5]=0; + pxy[3]=pxy[7]=s->fd_h-1; + for(i=0;ifd_w/2;i++){ + pxy[0]=pxy[2]=2*i; + pxy[4]=pxy[6]=i; + vro_cpyfm(x_handle,S_ONLY,pxy,s,&tmp); + } + pxy[0]=pxy[4]=0; + pxy[2]=pxy[6]=s->fd_w/2-1; + for(j=0;jfd_h/2;j++){ + pxy[1]=pxy[3]=2*j; + pxy[5]=pxy[7]=j; + vro_cpyfm(x_handle,S_ONLY,pxy,&tmp,d); + } + free(tmp.fd_addr); + return(TRUE); +}