Donc les routines d'interface ne marchent pas sur Radeon quand l'icone est grisée. Par contre, en regardant le code de Interface, je ne vois pas quand le cas 'disabled' apparait; mais cela me parait assez clair qu'il y a un mode ou une fonction VDI mal gérée dans le driver, zView doit s'y prendre un peu différemment et ne pas tomber dans ce cas. C'est ma compréhension en tout cas!
Si quelqu'un y voit plus clair, il est le bienvenu! Je ne sais pas si un icone disabled est une icone à part (je ne la vois pas dans le resource) ou si elle est construite à partir de l'icone en cours (sans doute mais je me demande comment elle est affichée par Interface).
LOCAL VOID draw_bitblk (WORD *p, WORD x, WORD y, WORD w, WORD h, WORD num_planes, WORD mode, WORD *index)
{
WORD pxy[8] ;
MFDB s, d ;
d.mp = NULL ; /* screen */
s.mp = (VOID *)p ;
s.fwp = w ;
s.fh = h ;
s.fww = w >> 4 ;
s.ff = FALSE ;
s.np = num_planes ;
pxy[0] = 0 ;
pxy[1] = 0 ;
pxy[2] = s.fwp - 1 ;
pxy[3] = s.fh - 1 ;
pxy[4] = x ;
pxy[5] = y ;
pxy[6] = pxy[4] + pxy [2] ;
pxy[7] = pxy[5] + pxy [3] ;
/* DumpBitBlk( num_planes, p, w, h ) ;*/
if (num_planes > 1) vro_cpyfm (xvdi_handle, mode, pxy, &s, &d) ;
else vrt_cpyfm (xvdi_handle, mode, pxy, &s, &d, index ); /* copy it */
}
GLOBAL WORD CDECL xdraw_cicon (PARMBLK *pb)
{ WORD ob_x, ob_y, x, y, dummy, pxy[4], m_mode, i_mode, mskcol, icncol;
LONG ob_spec;
ICONBLK *iconblk;
CICON *cicn;
WORD *mask, *data, *dark = NULL;
BYTE letter[2];
WORD selected, mindex[2], iindex[2], buf, xy[4];
BOOLEAN invert = FALSE;
selected = pb->pb_currstate & SELECTED;
xrect2array ((GRECT *)&pb->pb_xc, xy);
vs_clip (xvdi_handle, TRUE, xy); /* d‚finit la zone rectangulaire */
ob_spec = pb->pb_parm;
ob_x = pb->pb_x;
ob_y = pb->pb_y;
iconblk = (ICONBLK *)ob_spec;
cicn = ((CICONBLK *)ob_spec)->mainlist;
m_mode = MD_TRANS;
if (selected) /* it was an objc_change */
{
if (cicn->sel_data != NULL)
{
mask = cicn->sel_mask;
data = cicn->sel_data;
if (cicn->num_planes > 1)
{ if (cicn->num_planes > 8) /* TrueColor, carte couleur en mode RVB? */
i_mode = S_AND_D;
else
i_mode = S_OR_D;
}
else
i_mode = MD_TRANS;
}
else
{
mask = cicn->col_mask;
data = cicn->col_data;
if (cicn->num_planes > 1)
{ if (cicn->num_planes > 8)
i_mode = S_AND_D;
else
i_mode = S_OR_D;
dark = cicn->sel_mask;
}
else
invert = TRUE;
}
}
else
{
mask = cicn->col_mask;
data = cicn->col_data;
if (cicn->num_planes > 1)
{ if (cicn->num_planes > 8)
i_mode = S_AND_D;
else
i_mode = S_OR_D;
}
else
i_mode = MD_TRANS;
}
mindex [0] = ((iconblk->ib_char & 0x0f00) != 0x0100) ? (iconblk->ib_char & 0x0f00) >> 8 : WHITE;
mindex [1] = WHITE;
icncol = iindex[0] = (WORD)(((UWORD)iconblk->ib_char & 0xf000U) >> 12U);
iindex[1] = WHITE;
mskcol = (iconblk->ib_char & 0x0f00) >> 8;
x = ob_x + iconblk->ib_xicon;
y = ob_y + iconblk->ib_yicon;
if (invert)
{
buf = iindex[0];
iindex[0] = mindex[0];
mindex[0] = buf;
i_mode = MD_TRANS;
}
if (selected)
{
buf = icncol;
icncol = mskcol;
mskcol = buf;
}
draw_bitblk (mask, x, y, iconblk->ib_wicon, iconblk->ib_hicon, 1, m_mode, mindex);
draw_bitblk (data, x, y, iconblk->ib_wicon, iconblk->ib_hicon, cicn->num_planes, i_mode, iindex);
if (dark)
{
mindex [0] = BLACK;
mindex [1] = WHITE;
draw_bitblk (dark, x, y, iconblk->ib_wicon, iconblk->ib_hicon, 1, MD_TRANS, mindex);
}
if (iconblk->ib_ptext[0])
{
x = ob_x + iconblk->ib_xtext;
y = ob_y + iconblk->ib_ytext;
pxy[0] = x;
pxy[1] = y;
pxy[2] = x + iconblk->ib_wtext - 1;
pxy[3] = y + iconblk->ib_htext - 1;
vswr_mode (xvdi_handle, MD_REPLACE); /* dessiner la boite texte (TextBox) */
vsf_color (xvdi_handle, mskcol);
vsf_interior (xvdi_handle, FIS_SOLID);
vsf_perimeter (xvdi_handle, FALSE);
v_bar (xvdi_handle, pxy);
}
vswr_mode (xvdi_handle, MD_TRANS);
vst_font (xvdi_handle, 1); /* Systemfont */
vst_height (xvdi_handle, 4, &dummy, &dummy, &dummy, &dummy);
vst_color (xvdi_handle, icncol);
vst_effects (xvdi_handle, TXT_NORMAL);
vst_alignment (xvdi_handle, ALI_LEFT, ALI_TOP, &dummy, &dummy);
vst_rotation (xvdi_handle, 0);
if (iconblk->ib_ptext[0])
{ x += (iconblk->ib_wtext - strlen ((char*)iconblk->ib_ptext) * 6) >> 1 ;
y += (iconblk->ib_htext - 6) >> 1 ;
v_gtext (xvdi_handle, x, y, iconblk->ib_ptext);
}
letter[0] = iconblk->ib_char & 0xff;
if (letter[0])
{
letter[1] = '\0';
x = ob_x + iconblk->ib_xicon + iconblk->ib_xchar;
y = ob_y + iconblk->ib_yicon + iconblk->ib_ychar;
v_gtext (xvdi_handle, x, y, letter);
}
xrect2array ((GRECT *)&pb->pb_xc, xy);
vs_clip (xvdi_handle, FALSE, xy);
return (pb->pb_currstate & ~ SELECTED);
} /* draw_userdef */