void WDL_VirtualIconButton::SetIcon(WDL_VirtualIconButton_SkinConfig *cfg, float alpha, bool buttonownsicon) { if (m_iconCfg != cfg || m_alpha != alpha) { bool combineRects=false; RECT r; if (m_iconCfg && m_iconCfg != cfg && m_iconCfg->olimage) { combineRects=true; GetPositionPaintExtent(&r); if (WantsPaintOver()) { RECT r3; GetPositionPaintOverExtent(&r3); if (r3.left<r.left) r.left=r3.left; if (r3.top<r.top) r.top=r3.top; if (r3.right>r.right) r.right=r3.right; if (r3.bottom>r.bottom) r.bottom=r3.bottom; } } if (m_ownsicon && m_iconCfg && m_iconCfg != cfg) { delete m_iconCfg->image; delete m_iconCfg->olimage; delete m_iconCfg; } m_alpha=alpha; m_iconCfg=cfg; if (combineRects) { RECT r3; GetPositionPaintExtent(&r3); if (r3.left<r.left) r.left=r3.left; if (r3.top<r.top) r.top=r3.top; if (r3.right>r.right) r.right=r3.right; if (r3.bottom>r.bottom) r.bottom=r3.bottom; if (WantsPaintOver()) { GetPositionPaintOverExtent(&r3); if (r3.left<r.left) r.left=r3.left; if (r3.top<r.top) r.top=r3.top; if (r3.right>r.right) r.right=r3.right; if (r3.bottom>r.bottom) r.bottom=r3.bottom; } r.left -= m_position.left; r.right -= m_position.left; r.top -= m_position.top; r.bottom -= m_position.top; RequestRedraw(&r); } else { RequestRedraw(NULL); } } m_ownsicon = buttonownsicon; }
void WDL_VirtualIconButton::OnPaintOver(LICE_IBitmap *drawbm, int origin_x, int origin_y, RECT *cliprect) { if (m_iconCfg && m_iconCfg->olimage) { int sx=0; int sy=0; int w=m_iconCfg->olimage->getWidth(); int h=m_iconCfg->olimage->getHeight(); if (m_iconCfg->image_ltrb_used.flags&1) { w-=2; h-= 2; sx++,sy++; } w/=3; if (w>0 && h>0) { if (m_is_button) { if ((m_pressed&2)) sx+=(m_pressed&1) ? w*2 : w; } if (m_iconCfg->image_ltrb_used.flags&2) // use main image's stretch areas (outer areas become unstretched) { WDL_VirtualWnd_BGCfg cfg={0,}; LICE_SubBitmap sb(m_iconCfg->olimage,sx,sy,w,h); cfg.bgimage = &sb; cfg.bgimage_lt[0] = m_iconCfg->image_ltrb_main[0]+1; // image_ltrb_main expects 1-based number cfg.bgimage_lt[1] = m_iconCfg->image_ltrb_main[1]+1; cfg.bgimage_rb[0] = m_iconCfg->image_ltrb_main[2]+1; cfg.bgimage_rb[1] = m_iconCfg->image_ltrb_main[3]+1; cfg.bgimage_lt_out[0] = m_iconCfg->image_ltrb_ol[0]+1; cfg.bgimage_lt_out[1] = m_iconCfg->image_ltrb_ol[1]+1; cfg.bgimage_rb_out[0] = m_iconCfg->image_ltrb_ol[2]+1; cfg.bgimage_rb_out[1] = m_iconCfg->image_ltrb_ol[3]+1; cfg.bgimage_noalphaflags=0; RECT r=m_position,r2; GetPositionPaintOverExtent(&r2); WDL_VirtualWnd_ScaledBlitBG(drawbm,&cfg, r.left+origin_x,r.top+origin_y,r.right-r.left,r.bottom-r.top, r2.left+origin_x,r2.top+origin_y,r2.right-r2.left,r2.bottom-r2.top, m_alpha,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA); } else { RECT r; GetPositionPaintOverExtent(&r); LICE_ScaledBlit(drawbm,m_iconCfg->olimage,r.left+origin_x,r.top+origin_y, r.right-r.left, r.bottom-r.top, (float)sx,(float)sy,(float)w,(float)h, m_alpha, // m_grayed? LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA); } } } }
void WDL_VirtualIconButton::OnPaintOver(LICE_IBitmap *drawbm, int origin_x, int origin_y, RECT *cliprect) { if (m_iconCfg && m_iconCfg->olimage) { RECT r; GetPositionPaintOverExtent(&r); int sx=0; int sy=0; int w=m_iconCfg->olimage->getWidth(); int h=m_iconCfg->olimage->getHeight(); if (m_iconCfg->image_ltrb_used.flags&1) { w-=2; h-= 2; sx++,sy++; } w/=3; if (w>0 && h>0) { if (m_is_button) { if ((m_pressed&2)) sx+=(m_pressed&1) ? w*2 : w; } LICE_ScaledBlit(drawbm,m_iconCfg->olimage,r.left+origin_x,r.top+origin_y, r.right-r.left, r.bottom-r.top, (float)sx,(float)sy,(float)w,(float)h, m_alpha, // m_grayed? LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA); } } }