void WDL_VirtualSlider_PreprocessSkinConfig(WDL_VirtualSlider_SkinConfig *a) { if (a&&a->thumbimage[0]) { int w=a->thumbimage[0]->getWidth(); int h=a->thumbimage[0]->getHeight(); int x; for (x = 0; x < w && LICE_GetPixel(a->thumbimage[0],x,h-1)==LICE_RGBA(255,0,255,255); x ++); a->thumbimage_lt[0] = x; for (x = w-1; x > a->thumbimage_lt[0]+1 && LICE_GetPixel(a->thumbimage[0],x,h-1)==LICE_RGBA(255,0,255,255); x --); a->thumbimage_rb[0] = x; } if (a&&a->thumbimage[1]) { int w=a->thumbimage[1]->getWidth(); int h=a->thumbimage[1]->getHeight(); int y; for (y = 0; y < h-4 && LICE_GetPixel(a->thumbimage[1],w-1,y)==LICE_RGBA(255,0,255,255); y++); a->thumbimage_lt[1] = y; for (y = h-1; y > a->thumbimage_lt[1]+1 && LICE_GetPixel(a->thumbimage[1],w-1,y)==LICE_RGBA(255,0,255,255); y --); a->thumbimage_rb[1] = y; } WDL_VirtualWnd_PreprocessBGConfig(&a->bgimagecfg[0]); WDL_VirtualWnd_PreprocessBGConfig(&a->bgimagecfg[1]); }
void WDL_VirtualIconButton_PreprocessSkinConfig(WDL_VirtualIconButton_SkinConfig *a) { if (a && a->image) { a->image_ltrb_used.flags=0; int wi; for(wi=0;wi<2;wi++) { LICE_IBitmap *srcimg = wi ? a->image : a->olimage; if (!srcimg) continue; int w=srcimg->getWidth(); int h=srcimg->getHeight(); if (LICE_GetPixel(srcimg,0,0)==LICE_RGBA(255,0,255,255)&& LICE_GetPixel(srcimg,w-1,h-1)==LICE_RGBA(255,0,255,255)) { int lext=0,rext=0,bext=0,text=0; int x; for (x = 1; x < w/3 && LICE_GetPixel(srcimg,x,0)==LICE_RGBA(255,0,255,255); x ++); lext=x-1; for (x = 1; x < h && LICE_GetPixel(srcimg,0,x)==LICE_RGBA(255,0,255,255); x ++); text=x-1; for (x = w-2; x >= (w*2/3) && LICE_GetPixel(srcimg,x,h-1)==LICE_RGBA(255,0,255,255); x --); rext=w-2-x; for (x = h-2; x >= text && LICE_GetPixel(srcimg,w-1,x)==LICE_RGBA(255,0,255,255); x --); bext=h-2-x; if (lext||text||rext||bext) { a->image_ltrb_used.flags |= 1 << wi; short *buf = wi ? a->image_ltrb_main : a->image_ltrb_ol; buf[0]=lext; buf[1]=text; buf[2]=rext; buf[3]=bext; } } } } }
static LICE_IBitmap *icoToBitmap(HICON icon, LICE_IBitmap *bmpOut) { int icon_w = 16, icon_h=16; #ifdef _WIN32 ICONINFO ii={0,}; if (GetIconInfo(icon,&ii)) { bool blah=false; if (ii.hbmColor) { BITMAP bm={0,}; if (GetObject(ii.hbmColor,sizeof(bm),&bm) && bm.bmWidth && bm.bmHeight) { icon_w=bm.bmWidth; icon_h=bm.bmHeight; blah=true; } DeleteObject(ii.hbmColor); } if (ii.hbmMask) { BITMAP bm={0,}; if (!blah && GetObject(ii.hbmMask,sizeof(bm),&bm) && bm.bmWidth && bm.bmHeight) { icon_w=bm.bmWidth; icon_h=bm.bmHeight; } DeleteObject(ii.hbmMask); } } #else BITMAP bm={0,}; if (GetObject(icon,sizeof(bm),&bm) && bm.bmWidth && bm.bmHeight) // SWELL's GetObject() works on icons { icon_w=bm.bmWidth; icon_h=bm.bmHeight; } #endif LICE_SysBitmap tempbm(icon_w*2,icon_h); LICE_FillRect(&tempbm,0,0,icon_w,icon_h,LICE_RGBA(0,0,0,255),1.0f,LICE_BLIT_MODE_COPY); #ifdef _WIN32 DrawIconEx(tempbm.getDC(),0,0,icon,icon_w,icon_h,0,NULL,DI_NORMAL); #else { RECT r={0,0,icon_w,icon_h}; DrawImageInRect(tempbm.getDC(),icon,&r); } #endif LICE_FillRect(&tempbm,icon_w,0,icon_w,icon_h,LICE_RGBA(255,255,255,255),1.0f,LICE_BLIT_MODE_COPY); #ifdef _WIN32 DrawIconEx(tempbm.getDC(),icon_w,0,icon,icon_w,icon_h,0,NULL,DI_NORMAL); #else { RECT r={icon_w,0,icon_w+icon_w,icon_h}; DrawImageInRect(tempbm.getDC(),icon,&r); } #endif if (!bmpOut) bmpOut = new LICE_MemBitmap(icon_w,icon_h); else bmpOut->resize(icon_w,icon_h); int y; // since we have the image drawn on white and on black, we can calculate the alpha channel... for(y=0;y<icon_h;y++) { int x; for(x=0;x<icon_w;x++) { LICE_pixel p = LICE_GetPixel(&tempbm,x,y); LICE_pixel p2 = LICE_GetPixel(&tempbm,x+icon_w,y); int r1=LICE_GETR(p); int g1=LICE_GETG(p); int b1=LICE_GETB(p); int alpha=255 - (LICE_GETR(p2)-r1); if (alpha>=255) alpha=255; else if (alpha>0) { r1 = (r1*255)/alpha; // LICE stores its alpha channel non-premultiplied, so we need to scale these up. g1 = (g1*255)/alpha; b1 = (b1*255)/alpha; if (r1>255)r1=255; if (g1>255)g1=255; if (b1>255)b1=255; } else alpha=0; LICE_PutPixel(bmpOut,x,y,LICE_RGBA(r1,g1,b1,alpha),1.0f,LICE_BLIT_MODE_COPY); } } return bmpOut; }