Italian Colori

AlpVir

Well-Known Member
Licensed User
Longtime User
Il seguente spezzone di codice B4A colora lo schermo di una tonalità di blu
B4X:
Dim coloreX AsLong
coloreX=Colors.RGB(50,109,179)Log(coloreX)
Activity.Color = coloreX
e stampa il numero del colore (-13472333)

Quest'altro spezzone (scritto in VB6) fa la medesima cosa (stesso colore) ma stampa un altro numero (11758898)
B4X:
Dim ColoreX AsLong
ColoreX = RGB(50, 109, 179)
Debug.Print ColoreX
BackColor = ColoreX
Intuisco che ci deve essere una relazione tra i 2 numeri ma non so quale. Qualcuno mi sa dare un suggerimento ?
Il tutto mi servirebbe per controllare la corretta trasposizione di codice da VB6 a B4A.
Grazie.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Sono la stessa cosa !!!
Sono solo in formato diverso ma non cambia nulla.

Per spiegare meglio lavoriamo in esadecimale, per cui il 50 è 32, il 109 è 6D e il 179 è B3.
Quando si crea un colore il sistema lo combina in un numero a 32 bit.

Il numero 11758898 trasformato in esadecimale è B36D32 (e come vedi ci sono i tuoi colori), mentre il numero -13472333 trasformato in esadecimale è FF326DB3 che è ancora la combinazione dei tuoi colori (però in ordine inverso) più il valore FF che dovrebbe essere il canale alfa.

Direi quindi che corrispondono, solo che il VB6 ha una rappresenzazione dei numeri "little endian" essendo basato su microprocessore Intel, mentre Android ha una rappresentazione "big endian" essendo basato su microprocessore ARM

Qui trovi info: http://it.wikipedia.org/wiki/Ordine_dei_byte

Sergio
 

Straker

Active Member
Licensed User
Longtime User
Sono la stessa cosa !!!
Sono solo in formato diverso ma non cambia nulla.

Per spiegare meglio lavoriamo in esadecimale, per cui il 50 è 32, il 109 è 6D e il 179 è B3.
Quando si crea un colore il sistema lo combina in un numero a 32 bit.

Il numero 11758898 trasformato in esadecimale è B36D32 (e come vedi ci sono i tuoi colori), mentre il numero -13472333 trasformato in esadecimale è FF326DB3 che è ancora la combinazione dei tuoi colori (però in ordine inverso) più il valore FF che dovrebbe essere il canale alfa.

Direi quindi che corrispondono, solo che il VB6 ha una rappresenzazione dei numeri "little endian" essendo basato su microprocessore Intel, mentre Android ha una rappresentazione "big endian" essendo basato su microprocessore ARM

Qui trovi info: http://it.wikipedia.org/wiki/Ordine_dei_byte

Sergio

Sergio, hai praticamente copiato la mia risposta :D (AlpVir aveva fatto un post anche nella sezione albionica).
Inoltre non concordo sul fatto che dipenda dalle uova di Jonathan Swift. In questo caso da che parte rompi l'uovo non c'entra, è semplicemente che b4a usa signed byte e vb6 unsigned. Little e big endian ti fanno problemi solo quando mischi i due sistemi, ad es. in una comunicazione socket o seriale in quanto un sistema rappresenta un intero di due bytes in modo diverso (per il decimale 1000 un sistema ti manderà 0x03E8 mentre l'altro 0xE803).
 

LucaMs

Expert
Licensed User
Longtime User
Bel casino!

:D


[P.S. mi spiego meglio, va. Non so se a voi capita, ma ci sono cose per le quali provo proprio idiosincrasia! Ad esempio, queste. Non mi va mai di capirle a fondo e memorizzarle. Di conseguenza, prima o poi ci sbatto il muso :(... eppure continuo con questo modo sbagliato di agire]
 

Straker

Active Member
Licensed User
Longtime User
Bel casino!

:D


[P.S. mi spiego meglio, va. Non so se a voi capita, ma ci sono cose per le quali provo proprio idiosincrasia! Ad esempio, queste. Non mi va mai di capirle a fondo e memorizzarle. Di conseguenza, prima o poi ci sbatto il muso :(... eppure continuo con questo modo sbagliato di agire]

Quando ti spieghi meglio io non capisco niente... :D
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ottime spiegazioni per le quali vi ringrazio, ma sarebbe possibile, da codice (il più possibile veloce: i valori da controllare sono circa 1.5 milioni), trasformare il long fornito da B4A con un long così come vuole VB6 (o viceversa).
Ho l'impressione che B4A fornisca di serie qualche istruzione per farlo mentre il VB6 no.
Altrimenti non vedo altra via che trasformare il long decimale in esadecimale, spezzettarne le 8 "cifre" in 4 gruppi di 2, invertirne l'ordine, ritrasformare il tutto in decimale. Il valore ottenuto dovrebbe essere pari pari a quello del VB6. Ma ci va una vita in tempo computazionale !
 

LucaMs

Expert
Licensed User
Longtime User
Direi quindi che corrispondono, solo che il VB6 ha una rappresenzazione dei numeri "little endian" essendo basato su microprocessore Intel, mentre Android ha una rappresentazione "big endian" essendo basato su microprocessore ARM

Per me è quasi arabo, dato che non me ne sono mai interessato a sufficienza (o per niente :D, è più comodo "lavorare" a livelli più alti) però immagino che la CPU non c'entri, dato che gli emulatori esistono con entrambi i tipi (quindi suppongo anche i dispositivi reali).
 

Straker

Active Member
Licensed User
Longtime User
Scusa, AlpVir, ti risponderanno (sperando con un bel convertitore :))
Mi sa che ha ragione Sergio e jonathan Swift colpisce ancora...
Infatti 0xB36D32 corrisponde ad una tonalità di blu su Windows mentre su android e apple ė una specie di arancione.
Bisogna invertire i 3 bytes per avere il blu, ovvero 326DB3
 

Straker

Active Member
Licensed User
Longtime User
Questa sun prende un colore in formato Vb6 e lo trasforma in formato B4A. Fare l'inverso è semplice.
Il parametro Vb6Color può essere anche espresso in formato 0xB36D32 ovviamente.

E' semplice, ma forse merita la pubblicazione in 'code snippet'? Che ne dite?

B4X:
Sub vb6Color2B4Acolor(Vb6Color As Int ) As Int
    Dim rgb(3) As Int, r As Int
    rgb(0) = Bit.UnsignedShiftRight(Bit.AND(vb6Color, 0xff0000), 16)
    rgb(1) = Bit.UnsignedShiftRight(Bit.AND(vb6Color, 0xff00), 8)
    rgb(2) = Bit.AND(vb6Color, 0xff)            
    r= Colors.RGB(rgb(2),rgb(1),rgb(0))
    Return r
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Questa sun prende un colore in formato Vb6 e lo trasforma in formato B4A. Fare l'inverso è semplice.
Il parametro Vb6Color può essere anche espresso in formato 0xB36D32 ovviamente.

E' semplice, ma forse merita la pubblicazione in 'code snippet'? Che ne dite?

B4X:
Sub vb6Color2B4Acolor(Vb6Color As Int ) As Int
    Dim rgb(3) As Int, r As Int
    rgb(0) = Bit.UnsignedShiftRight(Bit.AND(vb6Color, 0xff0000), 16)
    rgb(1) = Bit.UnsignedShiftRight(Bit.AND(vb6Color, 0xff00), 8)
    rgb(2) = Bit.AND(vb6Color, 0xff)           
    r= Colors.RGB(rgb(2),rgb(1),rgb(0))
    Return r
End Sub


Beh, penso di sì. C'è tanta gente che ha ancora molto codice in VB6.

Magari risparmierei un Color nel nome: ColorVB6toB4A
 

sirjo66

Well-Known Member
Licensed User
Longtime User
sarebbe possibile, da codice (il più possibile veloce: i valori da controllare sono circa 1.5 milioni), trasformare il long fornito da B4A con un long così come vuole VB6 (o viceversa).

Certo, ma in quale linguaggio ti serve ??
Farlo in VB6 è semplicissimo, e probabilmente l'esecuzione sarebbe più veloce che non in B4A

Sergio
 

sirjo66

Well-Known Member
Licensed User
Longtime User
su android e apple ė una specie di arancione

Va beh, accettiamo la definizione di "una specie di arancione",
ma se dovessi definirlo io, avrei scritto "un colore di merda" :D
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Credo di aver risolto tutto. In pratica, dopo aver seguito i vostri ottimi consigli, è stato sufficiente scrivere, in B4A un bel
B4X:
ColoreX = Colors.RGB (B,G,R)
dove R, G e B (notate il B e l'R invertiti) sono i colori cosi come VB6 comanda.
Un ulteriore
B4X:
B=B Mod 256
G=G Mod 256
R=R Mod 256
rende l'app scritta in B4A abbastanza simile, per quel che mi serve, ad un programma scritto in VB6.
 
Top