See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Un problème de transparence...  (Read 2189 times)

0 Members and 1 Guest are viewing this topic.

Offline Spacingbluefrog

  • Jr. Member
  • **
  • Posts: 96
  • Karma: 0
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...


In space, nobody can hear you scream...

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 255
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 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


Offline Spacingbluefrog

  • Jr. Member
  • **
  • Posts: 96
  • Karma: 0
Reply #2 - 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?


In space, nobody can hear you scream...

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 255
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 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


Offline Spacingbluefrog

  • Jr. Member
  • **
  • Posts: 96
  • Karma: 0
Reply #4 - 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.....


In space, nobody can hear you scream...

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 255
  • Hein, quoi !?
    • FsPassengers
Reply #5 - 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)


Offline Spacingbluefrog

  • Jr. Member
  • **
  • Posts: 96
  • Karma: 0
Reply #6 - 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! :)


In space, nobody can hear you scream...

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 255
  • Hein, quoi !?
    • FsPassengers
Reply #7 - 06 April 2004, 18:12:35
La version normale tu verra marche aussi bien :)

Dan

« Last Edit: 06 April 2004, 18:12:35 by DanSteph »