int main(int argc, char **argv) { int delay=10; int size_w=0,size_h=0; int i; int rv=0; int leaddelay=0; bool skipempty=false; void *gifOut=NULL; const char *fn=NULL; LICE_MemBitmap lastfr, fr,fr2; int accum_lat=0; for (i=1;i<argc;i++) { if (argv[i][0]=='-') { if (fn||gifOut) usage("Flag after filename",argv[i]); if (!strcmp(argv[i],"-w")) { if (++i >= argc) usage("Missing parameter",argv[i-1]); size_w = atoi(argv[i]); } else if (!strcmp(argv[i],"-h")) { if (++i >= argc) usage("Missing parameter",argv[i-1]); size_h = atoi(argv[i]); } else if (!strcmp(argv[i],"-d")) { if (++i >= argc) usage("Missing parameter",argv[i-1]); delay = atoi(argv[i]); } else if (!strcmp(argv[i],"-skipempty")) skipempty=true; else if (!strcmp(argv[i],"-leaddelay")) { if (++i >= argc) usage("Missing parameter",argv[i-1]); leaddelay=atoi(argv[i]); } else usage("Unknown option",argv[i]); } else if (!fn) fn=argv[i]; else { printf("Loading %s\n",argv[i]); if (!LICE_LoadImage(argv[i],&fr) || !fr.getWidth() || !fr.getHeight()) { printf("Error loading image: %s\n",argv[i]); continue; } if (!size_w) size_w=fr.getWidth(); if (!size_h) size_h=fr.getHeight(); LICE_MemBitmap *usefr = &fr; if (fr.getWidth() != size_w || fr.getHeight() != size_h) { fr2.resize(size_w,size_h); LICE_ScaledBlit(usefr=&fr2,&fr,0,0,size_w,size_h,0,0,fr.getWidth(),fr.getHeight(),1.0f,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR); } if (!gifOut) { gifOut=LICE_WriteGIFBegin(fn,usefr,0,leaddelay?leaddelay:delay,false); if (!gifOut) usage("Error writing to file",fn); } else { accum_lat += delay; int diffcoords[4]={0,0,size_w,size_h}; if (LICE_BitmapCmp(usefr,&lastfr,diffcoords)) { LICE_SubBitmap bm(usefr,diffcoords[0],diffcoords[1], diffcoords[2],diffcoords[3]); LICE_WriteGIFFrame(gifOut,&bm,diffcoords[0],diffcoords[1], true, accum_lat); accum_lat=0; } if (skipempty) accum_lat=0; } LICE_Copy(&lastfr,usefr); } } printf("finishing up\n"); if (gifOut) LICE_WriteGIFEnd(gifOut); return rv; }
static LICE_IBitmap *hbmToBit(HBITMAP hbm, LICE_IBitmap *bmp) { BITMAP bm; GetObject(hbm, sizeof(BITMAP), (LPSTR)&bm); LICE_SysBitmap sysbitmap(bm.bmWidth,bm.bmHeight); #ifdef _WIN32 HDC hdc=CreateCompatibleDC(NULL); HGDIOBJ oldBM=SelectObject(hdc,hbm); BitBlt(sysbitmap.getDC(),0,0,bm.bmWidth,bm.bmHeight,hdc,0,0,SRCCOPY); GdiFlush(); if (!bmp) bmp=new LICE_MemBitmap(bm.bmWidth,bm.bmHeight); LICE_Copy(bmp,&sysbitmap); SelectObject(hdc,oldBM); DeleteDC(hdc); #else LICE_Clear(&sysbitmap,0); RECT r={0,0,bm.bmWidth,bm.bmHeight}; DrawImageInRect(sysbitmap.getDC(),hbm,&r); if (!bmp) bmp=new LICE_MemBitmap(bm.bmWidth,bm.bmHeight); LICE_Copy(bmp,&sysbitmap); #endif LICE_FillRect(bmp,0,0,bmp->getWidth(),bmp->getHeight(),LICE_RGBA(0,0,0,255),1.0f,LICE_BLIT_MODE_ADD); return bmp; }