Dan's Orbiter page

Orbiter Francophone => Orbiter Francophone => Topic started by: Spacingbluefrog on 06 April 2004, 11:51:41

Title: Un problème de transparence...
Post by: Spacingbluefrog on 06 April 2004, 11:51:41
Salut Dan,

C'est une question toute spéciale pour toi.
J'ai besoin dans un de mes panels de faire apparaître un bitmap avec un fond transparent. Et pour la première fois, je suis
totalement coincé. J'ai bien trouvé sur le forum officiel (http://orbit.m6.net/v2/read.asp?id=14640) le même pb mais la
réponse me laisse plus que perplexe.
Le trick ne doit pas être bien sorcier, mais il y a une absence totale d'information dans la littérature. Et je SAIS que tu
as été confronté au pb à bien regarder le DG. :)
Alors un petit coup de pouce serait le bien venu...

AU fait, je me suis aperçu que j'ai toujours écrit içi en guest! Gasp! Je viens de m'enregistrer...

Title: Re: Un problème de transparence...
Post by: DanSteph on 06 April 2004, 12:17:31
oui re-bienvenu :)

pas grave j'ai passé tous tes vieux posts sous "enregistré".

Pour le fond facile, quand tu load ton bitmap dans le code tu defini
une "transparency color" le plus souvent blanc complet 'FFFFFF'
(255,255,255) (n'importe quel couleur mais le blanc est conseillé dans la doc
bien que les pro dans les jeux utilisent souvent un rose pétant le 'FF00FF')


Dans le code "OvcLoadPanel" quand tu enregistre ton fond
la "transparency color" est le dernier paramètre:

oapiRegisterPanelBackground (hBmp, PANEL_ATTACH_BOTTOM|PANEL_MOVEOUT_BOTTOM, 0xffffff); //<-- blanc

Sa n'empeche pas d'avoir du blanc (FEFEFE) et il suffit de peindre ton background
avec du FFFFFF pour avoir la tranparence.

Hope it aide ?

Dan
Title: Re: Un problème de transparence...
Post by: Spacingbluefrog on 06 April 2004, 12:36:24

Ouais, pour ça pas de pb, y'a longtemps que l'affaire est claire!

Ce dont j'ai besoin c'est qu'une fois défini un AID_NAWAK, et un IDB_Nawak, quand je passe la fonction :
oapiBlt (surf,nnnnnn)
le fond de mon bitmap soit transparent, id que je vois le fond de mon panel et que seule l'information graphique dont j'ai
besoin apparaisse.
Dans le thread sur orbit.m6, il est dit que la solution est :
oapiBlt( surf, nnnnnn, SURF_PREDEF_CK)
mais quand je l'utilise brut de décoffrage, mon bitmap n'apparaît pas! Ha, ça, pour être transparent, il l'est!

Ai-je été plus clair?

Title: Re: Un problème de transparence...
Post by: DanSteph on 06 April 2004, 12:53:53
ah ?

alors il y a un autre problème:

Est tu sure de définir la key de tranparence ?

ici noir:

srf[1] = oapiCreateSurface (LOADBMP (IDB_BITMAP_ECG));
oapiSetSurfaceColourKey (srf[1], 0);



Quand tu blit attention a la taille du cadre, si ton blit est plus
grand que ta surface ca pose problème

Gaffe toi de pas être dans un DC


oapiGetDC (surf);
// pas ici surtout
oapiReleaseDC (surf, hDC);
oapiBlt (surf, srf[1],78,46, [snip], SURF_PREDEF_CK);


Et surtout gaffe toi que "surf" soit valide
teste ca avant le redraw:
if(!surf)
sprintf (oapiDebugString(), "caca, surf est null");



et il bien declaré dans le panel init ?

oapiRegisterPanelArea (AID_OUTERAIRLOCKBUTTON,_R( 301,  30, 326,  68), PANEL_REDRAW_USER,
PANEL_MOUSE_LBDOWN);


Attention si "PANEL_REDRAW_USER" tu doit initier le refresh toi meme avec
"oapiTriggerPanelRedrawAreaDGII (0, AID_OUTERAIRLOCKBUTTON);"


Ta function redraw est elle bien appelée ?
sprintf (oapiDebugString(), "oui oui ce code est éxécuté");


Voila désolé c'est un peu le bordel mais tu a l'air de connaitre
alors tu devrais t'y retrouver

Dan
Title: Re: Un problème de transparence...
Post by: Spacingbluefrog on 06 April 2004, 13:09:36
Ouais, nickel!

J'ai trouvé la faille!

Honte sur le Doc! (surtout, fais pas suivre le message!)
Dans Orbitersdk.h la valeur SURF_PREDEF_CK est définie à 0xFFFFFFFE ! J'avais beau mettre mon fond à 255,255,254, nada! C'est
Parkinson qu'a frappé! La bonne valeur est   0xFFFFFE!

fffffp.....

Title: Re: Un problème de transparence...
Post by: DanSteph on 06 April 2004, 13:33:05
mhhh attention...SURF_PREDEF_CK est un flag pas une valeur de couleur.
la bonne couleur est definie dans:
oapiSetSurfaceColourKey().

le flag SURF_PREDEF_CK dit si le blit utilise la couleur définie
dans oapiSetSurfaceColourKey(). ou pas.


voir la doc:
Transparent blitting can be performed by specifying a colour key in ck. The
transparent colour can either be passed explicitly in ck, or ck can be set to
SURF_PREDEF_CK to use the key previously defined with
oapiSetSurfaceColourKey().


donc quand tu déclare ta surface tui fait:
srf = oapiCreateSurface (LOADBMP (IDB_BITMAP_ECG));
oapiSetSurfaceColourKey (srf, 0xFFFFFE);

et tu blit avec le flag SURF_PREDEF_CK:
oapiBlt (surf, srf[1],78,46, [snip], SURF_PREDEF_CK);

sinon tu blit EXPLICITEMENT avec la valeur CK mis sur une couleur
exemple:  oapiBlt (surf, srf[1],78,46, [snip], 0xFFFFFE);

Si tu a modifié le flag SURF_PREDEF_CK dans orbiter.h
c'est une très mauvais idée.


Dan



Message modifié (06-04-2004 13:58)
Title: Re: Un problème de transparence...
Post by: Spacingbluefrog on 06 April 2004, 15:21:42
Heuuuu, ha bon.....:???:

Ca marchait plutôt bien pourtant!

OK, Ok, on va faire les choses bien!

En tout cas merçi! :)

Title: Re: Un problème de transparence...
Post by: DanSteph on 06 April 2004, 18:12:35
La version normale tu verra marche aussi bien :)

Dan