static void GrLoadImageFromBufferWrapper(void *r) { GR_IMAGE_ID id; imagelist_t *buffer; nxLoadImageFromBufferReq *req = r; buffer = findImageBuffer(req->buffer); if (!buffer) return; id = GrLoadImageFromBuffer(buffer->data, buffer->size, req->flags); GsWriteType(current_fd, GrNumLoadImageFromBuffer); GsWrite(current_fd, &id, sizeof(id)); freeImageBuffer(buffer); }
void GrLoadImageFromBufferWrapper(void *r) { GR_IMAGE_ID id; imagelist_t *buffer = 0; nxLoadImageFromBufferReq *req = r; for(buffer = imageListHead; buffer; buffer = buffer->next) if (buffer->id == req->buffer) break; if (!buffer) return; id = GrLoadImageFromBuffer(buffer->data, buffer->size, req->flags); GsWriteType(current_fd, GrNumLoadImageFromBuffer); GsWrite(current_fd, &id, sizeof(id)); freeImageBuffer(buffer); }
int GrBitmapEx_Apollo_FOUR(GR_WINDOW_ID id,GR_GC_ID gc,int x,int y,int width,int height,int src_x,int src_y, int src_width,int src_height, GR_CHAR *imagebits) { // TODO: Add extra validation here //4 bit 16 level degree color BMPHEADER_256 lpHeader; GR_IMAGE_ID ImageId; int HeaderLen; int i; int Lines; int BmpBufBytsPerLine=0,BytesPerLine=0; unsigned char char1,char2,char3,char4,BmpChar1; unsigned char *Screen_Buf=NULL,*BmpFileBuf=NULL,*BufPtr=NULL,*HeaderBuf=NULL; int GrayLevel=8;//256 gray level int BmpWidth=0,BmpHeight=0,PixesPerByte=0,BmpPanelNumbers=0,Bmpheadersize=0; BmpWidth=min(width,src_width); BmpHeight=min(height,src_height); PixesPerByte=8/GrayLevel; BmpPanelNumbers=1<<GrayLevel; BytesPerLine=(BmpWidth*GrayLevel+31)/32*4; BmpBufBytsPerLine=(src_width*2+7)/8; i=sizeof(BMPHEADER_256); HeaderLen=BITMAPFILEHEADER_SIZE+sizeof(BITMAPINFOHEADER)+sizeof(MWPALENTRY)*BmpPanelNumbers; memcpy((unsigned char *)&lpHeader.FileHeader.bfType,"BM",2); lpHeader.FileHeader.bfSize=(BmpHeight*BytesPerLine)/PixesPerByte+HeaderLen; lpHeader.FileHeader.bfReserved1=0; lpHeader.FileHeader.bfReserved2=0; lpHeader.FileHeader.bfOffBits=HeaderLen; lpHeader.BmpInfo.biSize=sizeof(BITMAPINFOHEADER); lpHeader.BmpInfo.biWidth=BmpWidth; lpHeader.BmpInfo.biHeight=BmpHeight; lpHeader.BmpInfo.biPlanes=1; lpHeader.BmpInfo.biBitCount=GrayLevel; lpHeader.BmpInfo.biCompression=0; lpHeader.BmpInfo.biSizeImage=lpHeader.FileHeader.bfSize-HeaderLen; lpHeader.BmpInfo.biXPelsPerMeter=0x257E; lpHeader.BmpInfo.biYPelsPerMeter=0x257E; lpHeader.BmpInfo.biClrUsed=0; lpHeader.BmpInfo.biClrImportant=0; Bmpheadersize=HeaderLen; BmpFileBuf=new unsigned char[BmpHeight*BytesPerLine+Bmpheadersize]; if(!BmpFileBuf) { return 1; } memset(BmpFileBuf,0x0,BmpHeight*BytesPerLine+Bmpheadersize); HeaderBuf=BmpFileBuf; Screen_Buf=BmpFileBuf+Bmpheadersize; BufPtr=Screen_Buf; memcpy(HeaderBuf,(char *)&lpHeader.FileHeader.bfType,2); memcpy(&HeaderBuf[2],(char *)&lpHeader.FileHeader.bfSize,4); memcpy(&HeaderBuf[6],(char *)&lpHeader.FileHeader.bfReserved1,2); memcpy(&HeaderBuf[8],(char *)&lpHeader.FileHeader.bfReserved2,2); memcpy(&HeaderBuf[10],(char *)&lpHeader.FileHeader.bfOffBits,4); HeaderBuf+=BITMAPFILEHEADER_SIZE; memcpy(HeaderBuf,(unsigned char *)&lpHeader.BmpInfo,BITMAPINFOHEADER_SIZE); HeaderBuf+=BITMAPINFOHEADER_SIZE; memcpy(HeaderBuf,(unsigned char *)&panel16,sizeof(MWPALENTRY)*BmpPanelNumbers); HeaderBuf=BmpFileBuf; Lines=0; //4 color degress change to 16 color degress,mainframe_img_bits is 4 color degress for(Lines=0;Lines<BmpHeight;Lines++) { char1=0; char2=0; char3=0; char4=0; // BufPtr=(unsigned char *)&Screen_Buf[(BmpHeight-1-Lines)*BytesPerLine]; for(i=0;i<(BmpWidth*2+7)/8;i++) { BmpChar1=imagebits[i+(Lines+src_y)*BmpBufBytsPerLine+src_x/4]; // char1=BmpChar1&0xc0; char1>>=6; *BufPtr=char1; BufPtr++; char2=BmpChar1&0x30; char2>>=4; *BufPtr=char2; BufPtr++; char3=BmpChar1&0x0c; char3>>=2; *BufPtr=char3; BufPtr++; char4=BmpChar1&0x03; *BufPtr=char4; BufPtr++; } } ImageId=GrLoadImageFromBuffer(BmpFileBuf,lpHeader.FileHeader.bfSize,GR_BACKGROUND_TOPLEFT); GrDrawImageToFit(id,gc,x,y,BmpWidth,BmpHeight,ImageId); GrFreeImage(ImageId); free(BmpFileBuf); return 0; }
int GrBitmapEx_Apollo_NEW(GR_WINDOW_ID id,GR_GC_ID gc,int x,int y,int width,int height,int src_x,int src_y, int src_width,int src_height, GR_CHAR *imagebits) { BMPHEADER_256 lpHeader; GR_IMAGE_ID ImageId; int HeaderLen; int i; int Lines; int BmpBufBytsPerLine=0,BytesPerLine=0; unsigned char char1,char2,char3,char4,BmpChar1; unsigned char *Screen_Buf=NULL,*BmpFileBuf=NULL,*BufPtr=NULL,*HeaderBuf=NULL,*pimg = NULL; int GrayLevel=8;//256 gray level int BmpWidth=0,BmpHeight=0,PixesPerByte=0,BmpPanelNumbers=0,Bmpheadersize=0; BmpWidth=min(width,src_width); BmpHeight=min(height,src_height-src_y); // BmpHeight=min(height,src_height); if(BmpHeight<=0) BmpHeight=1; PixesPerByte=8/GrayLevel; BmpPanelNumbers=1<<GrayLevel; BytesPerLine=(BmpWidth*GrayLevel+31)/32*4;// BmpBufBytsPerLine=(((src_width*GrayLevel+7)/8+3)/4)*4; i=sizeof(BMPHEADER_256); HeaderLen=BITMAPFILEHEADER_SIZE+sizeof(BITMAPINFOHEADER)+sizeof(MWPALENTRY)*BmpPanelNumbers; memcpy((unsigned char *)&lpHeader.FileHeader.bfType,"BM",2);// lpHeader.FileHeader.bfSize=(BmpHeight*BytesPerLine)/PixesPerByte+HeaderLen; // lpHeader.FileHeader.bfReserved1=0;// lpHeader.FileHeader.bfReserved2=0;// lpHeader.FileHeader.bfOffBits=HeaderLen;// lpHeader.BmpInfo.biSize=sizeof(BITMAPINFOHEADER);//BMP lpHeader.BmpInfo.biWidth=BmpWidth;// lpHeader.BmpInfo.biHeight=BmpHeight;// lpHeader.BmpInfo.biPlanes=1;// lpHeader.BmpInfo.biBitCount=GrayLevel;// lpHeader.BmpInfo.biCompression=0; lpHeader.BmpInfo.biSizeImage=lpHeader.FileHeader.bfSize-HeaderLen; lpHeader.BmpInfo.biXPelsPerMeter=0x257E; lpHeader.BmpInfo.biYPelsPerMeter=0x257E; lpHeader.BmpInfo.biClrUsed=0; lpHeader.BmpInfo.biClrImportant=0; Bmpheadersize=HeaderLen; BmpFileBuf=new unsigned char[BmpHeight*BytesPerLine+Bmpheadersize]; if(!BmpFileBuf) { return 1; } memset(BmpFileBuf,0xFF,BmpHeight*BytesPerLine+Bmpheadersize); HeaderBuf=BmpFileBuf; Screen_Buf=BmpFileBuf+Bmpheadersize; BufPtr=Screen_Buf; memcpy(HeaderBuf,(char *)&lpHeader.FileHeader.bfType,2); memcpy(&HeaderBuf[2],(char *)&lpHeader.FileHeader.bfSize,4); memcpy(&HeaderBuf[6],(char *)&lpHeader.FileHeader.bfReserved1,2); memcpy(&HeaderBuf[8],(char *)&lpHeader.FileHeader.bfReserved2,2); memcpy(&HeaderBuf[10],(char *)&lpHeader.FileHeader.bfOffBits,4); HeaderBuf+=BITMAPFILEHEADER_SIZE; memcpy(HeaderBuf,(unsigned char *)&lpHeader.BmpInfo,BITMAPINFOHEADER_SIZE); HeaderBuf+=BITMAPINFOHEADER_SIZE; memcpy(HeaderBuf,(unsigned char *)&panel256,sizeof(MWPALENTRY)*BmpPanelNumbers); HeaderBuf=BmpFileBuf; Lines=0; BufPtr = (unsigned char *)(Screen_Buf+(BmpHeight-1)*BytesPerLine); pimg = (unsigned char *)(imagebits + src_y*BmpBufBytsPerLine +src_x); for(Lines=0;Lines<BmpHeight;Lines++) { //printf("%s line = %d,height =%d,byte = %d,buf =%d\n",__FUNCTION__,Lines,BmpHeight,BytesPerLine,BufPtr); // BufPtr=(unsigned char *)&Screen_Buf[(BmpHeight-1-Lines)*BytesPerLine]; // memcpy(BufPtr,(unsigned char *)&imagebits[(Lines+src_y)*BmpBufBytsPerLine+src_x],BytesPerLine); memcpy(BufPtr,pimg,BytesPerLine); BufPtr -= BytesPerLine; pimg += BmpBufBytsPerLine; } ImageId=GrLoadImageFromBuffer(BmpFileBuf,lpHeader.FileHeader.bfSize,GR_BACKGROUND_TOPLEFT); GrDrawImageToFit(id,gc,x,y,BmpWidth,BmpHeight,ImageId); printf("x=%d,y=%d,BmpWidth=%d,BmpHeight=%d\n",x,y,BmpWidth,BmpHeight); GrFreeImage(ImageId); delete(BmpFileBuf); return 0; }
/* Create a new sprite from the specified image file. Returns the address of * the new sprite on success or 0 on failure. If width is -1, the real * dimensions of the image file will be used, otherwise the image will be * scaled up or down to the specified dimensions. */ sprite *load_sprite(nbstate *state, unsigned char *fname, int width, int height) { sprite *s; GR_DRAW_ID a; GR_DRAW_ID p; GR_IMAGE_ID img; GR_IMAGE_INFO ii; /* Make sure the file name has been specified: */ if (! fname) return 0; /* Try to find a sprite in the list with the specified filename and * dimensions (any dimensions are OK if width is -1). If one is found, * increment its usage count and return its address. */ for(s = state->spritelist; s; s = s->next) { if ((width == -1 || (width == s->w && height == s->h)) && s->fname && !strcmp(fname, s->fname)) { s->usage++; return s; } } #ifdef HAVE_FILEIO { /* Make the full path to the filename because the Nano-X server * probably isn't running from the game data directory: */ char buf[256]; if (snprintf(buf, 256, "%s/%s", state->gamedir, fname) >= 256){ debug_printf ("Warning: image path \"%s/%s\" is too long\n", state->gamedir, fname); return 0; } /* Try to load the image file, and return 0 on failure: */ img = GrLoadImageFromFile (buf, 0); } #else if (strcmp (fname, (unsigned char*) "nbb1.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb1_data, sizeof( nbb1_data), 0); else if (strcmp (fname, (unsigned char*) "nbb2.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb2_data, sizeof( nbb2_data), 0); else if (strcmp (fname, (unsigned char*) "nbb3.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb3_data, sizeof( nbb3_data), 0); else if (strcmp (fname, (unsigned char*) "nbb4.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb4_data, sizeof( nbb4_data), 0); else if (strcmp (fname, (unsigned char*) "nbb5.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb5_data, sizeof( nbb5_data), 0); else if (strcmp (fname, (unsigned char*) "nbb6.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb6_data, sizeof( nbb6_data), 0); else if (strcmp (fname, (unsigned char*) "nbb7.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb7_data, sizeof( nbb7_data), 0); else if (strcmp (fname, (unsigned char*) "nbb8.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb8_data, sizeof( nbb8_data), 0); else if (strcmp (fname, (unsigned char*) "nbb9.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbb9_data, sizeof( nbb9_data), 0); else if (strcmp (fname, (unsigned char*)"nbball1.gif") == 0) img = GrLoadImageFromBuffer ((char*)nbball1_data, sizeof(nbball1_data), 0); else if (strcmp (fname, (unsigned char*) "nbbat1.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbat1_data, sizeof( nbbat1_data), 0); else if (strcmp (fname, (unsigned char*) "nbbat2.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbat2_data, sizeof( nbbat2_data), 0); else if (strcmp (fname, (unsigned char*) "nbbat3.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbat3_data, sizeof( nbbat3_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg10.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg10_data, sizeof( nbbg10_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg1.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg1_data, sizeof( nbbg1_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg2.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg2_data, sizeof( nbbg2_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg3.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg3_data, sizeof( nbbg3_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg4.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg4_data, sizeof( nbbg4_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg5.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg5_data, sizeof( nbbg5_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg6.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg6_data, sizeof( nbbg6_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg7.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg7_data, sizeof( nbbg7_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg8.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg8_data, sizeof( nbbg8_data), 0); else if (strcmp (fname, (unsigned char*) "nbbg9.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbbg9_data, sizeof( nbbg9_data), 0); else if (strcmp (fname, (unsigned char*) "nbpf.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbpf_data, sizeof( nbpf_data), 0); else if (strcmp (fname, (unsigned char*) "nbpn.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbpn_data, sizeof( nbpn_data), 0); else if (strcmp (fname, (unsigned char*) "nbpp.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbpp_data, sizeof( nbpp_data), 0); else if (strcmp (fname, (unsigned char*) "nbps.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbps_data, sizeof( nbps_data), 0); else if (strcmp (fname, (unsigned char*) "nbpt.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbpt_data, sizeof( nbpt_data), 0); else if (strcmp (fname, (unsigned char*) "nbpw.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbpw_data, sizeof( nbpw_data), 0); else if (strcmp (fname, (unsigned char*) "nbsp1.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbsp1_data, sizeof( nbsp1_data), 0); else if (strcmp (fname, (unsigned char*) "nbsp2.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbsp2_data, sizeof( nbsp2_data), 0); else if (strcmp (fname, (unsigned char*) "nbsp3.gif") == 0) img = GrLoadImageFromBuffer ((char*) nbsp3_data, sizeof( nbsp3_data), 0); else { debug_printf ("No such image: \"%s\"\n", fname); uos_halt (0); return 0; } #endif if (! img) { debug_printf ("Warning: failed to load image \"%s\"- make " "sure it is where the server can find it and " "that support for loading the relevant image " "type has been built into the server\n", fname); return 0; } /* If a size wasn't specified, get the real image size from the server * instead: */ if(width == -1 || height == -1) { GrGetImageInfo(img, &ii); width = ii.width; height = ii.height; } /* Make the alpha channel and pixmap to store the image in: */ if(!(a = GrNewPixmap(width, height, 0))) { GrFreeImage(img); return 0; } if(!(p = GrNewPixmap(width, height, 0))) { GrFreeImage(img); GrDestroyWindow(a); return 0; } /* Draw the image into the specified pixmap and alpha channel, scaling * it up or down if necessary: */ GrDrawImageToFit(p, state->gc, 0, 0, width, height, img); GrFreeImage(img); /* Destroy the server image object. */ /* Make a new sprite and link it into the list, then return its * address to the caller: */ s = make_sprite(state, fname, width, height, p, a); if (! s) { GrDestroyWindow(a); GrDestroyWindow(p); return 0; } return s; }