eVC++ problem z kolorami w GAPI

  • 9 Odpowiedzi
  • 1134 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

eVC++ problem z kolorami w GAPI
« dnia: Czerwiec 15, 2006, 13:09:14 »
Witam jestem nowy, ponieważ niedawno się zarejstrowałem :) a to dla tego że zacząłem programować w eVC++ 3.0 i mam problem dla mnie nie rozwiązalny :| a mianowicie zająłem się GAPI i wszystko jest ok. tylko mam problem z kolorami :/ w pda jest kolor 16 bitowy i teraz tak mam plik z paletą 256 kolorów każdy z trzech odcieni jest zapisany jednym bajtem czyli 0..255 i plka ma 768 bjatów czyli wszystko sie zgadza i teraz tak odczyt z pliku mam dobry bo sprawdzałem, ale sami jak coś możecie sprawdzić. Oto moja funkcjia do ustawiania koloru znalazłem ją na stronie http://www.pocketpcdn.com/

unsigned short PixelColor(int r, int g, int b)
{
// Calculate the pixel color from the r,g,b components.
if (g_gxdp.ffFormat & kfDirect565)
        return (unsigned short) (r & 0xff) << 11 | (g & 0xff) << 6 | (b & 0xff);
    else
        return (unsigned short) (r & 0xff) << 10 | (g & 0xff) << 5 | (b & 0xff);
}


i teraz jak wszystko odpalam to wyświetlona paleta nie zgadza się z parwdziwą tzn. źle wyświetla kolory oto jak wyswietla http://www.krzysiek147.republika.pl/obrazki/pda/2.jpg i tak dla przykładu pierwsza linia powinna być przejściem od koloru białego do czarnego, to są moje funkcje:

unsigned short *InitPaleta()
{
unsigned short *paleta;
paleta = new unsigned short[256];
return paleta;
}


void DeletePaleta(unsigned short *paleta)
{
delete paleta;
}


bool UstawPalete(LPCTSTR nazwa, unsigned short *paleta)
{
struct rgb
{
unsigned char r;
unsigned char g;
unsigned char b;
};

FILE *plik;
unsigned short *kolor = paleta;
rgb color;

if((plik=_wfopen(nazwa,L"rb"))!=NULL)
{
for( int i=0; i<256; i++)
{
fread(&color,sizeof(color),1,plik);
*kolor = PixelColor(color.r,color.g,color.b);
kolor++;
}
}
else
{
MessageBox(hwndMain,L"Nieudało się otworzyć pliku",L"error",MB_OK);
return false;
}
fclose(plik);
return true;
}


dalej sprawdziłem jak PDA wyświetli kolory i zrobiłem prostą funckjie oto ona:

void Rysuj(int x, int y)
{
int i=0;
unsigned short *start;

start = InitDraw();
if(start)
{
for(i=0; i<256; i++)
Prostokat(x,y+i,25,1,PixelColor(i,0,0),start);
for(i=0; i<256; i++)
Prostokat(x+26,y+i,25,1,PixelColor(0,i,0),start);
for(i=0; i<256; i++)
Prostokat(x+52,y+i,25,1,PixelColor(0,0,i),start);
}
CloseDraw();
}


i wyświetlone powinny być trzy pasy odpowiednio r,g,b od czarnego płynnie przechodząc w kolor a tu mi wyswietla o tak: http://www.krzysiek147.republika.pl/obrazki/pda/4.jpg a jak tu widać na każdy kolor jest 8 paseczków tego płynnego przejścia. Jak tak pomyslałem to, to jest wysztko dobrze jeśli chodzi o obliczenia bo w 16 bitach każdy odcien jest opisany przez 5 bitów czyli od 0..31 wiec jak ja mu podaje wartość odcienia z przedziału 0..255 to powinienem ją podzielić przez 8 i powinno być dobrze i w tej funkcji do wyświetlania tych pasków działa to dobrze i wyswietla tak jak powinno czyli http://www.krzysiek147.republika.pl/obrazki/pda/5.jpg ale moim programie z tą paletą to nie działa. Te dzielienie przez 8 wstawiłem przy zapisywaniu koloru w palecie czyli wtej części funkcji void Rysuj(int x, int y):

*kolor = PixelColor(color.r/8,color.g/8,color.b/8);

i tak o prosze jak mi to wyswietla: http://www.krzysiek147.republika.pl/obrazki/pda/6.jpg same czarne i ziolone no i ten jaskrawy niebieski.i teraz pytanie do Was :) Dlaczego to nie działa !! :| i przepraszam że tak się rozpisałem ale chciąłem dobrze przedstawić problem i mój tok myslenia, jak namieszałem to też przepraszam.
Prosze o pomoc może ktoś mi powie co ja robie źle?

aha jesli trzeb to to jest ta paleta kolorów
http://www.krzysiek147.republika.pl/obrazki/pda/default.pal i dla wyjaśnienie testowałem rózne wersje tzn. jakie tylko znalazłem tej funkcji koloru piksela i każda wyswietla tak samo :/

Re: eVC++ problem z kolorami w GAPI
« Odpowiedź #1 dnia: Czerwiec 15, 2006, 18:40:50 »
Hmmm... moze to nie pomoze na twoje bolaczki (w zasadzie to na PPC jeszcze nie programowalem) ale widze jak mi sie zdaje kilka bledow:
Cytat: "Krzysiek147"
unsigned short PixelColor(int r, int g, int b)
{
// Calculate the pixel color from the r,g,b components.
if (g_gxdp.ffFormat & kfDirect565)
        return (unsigned short) (r & 0xff) << 11 | (g & 0xff) << 6 | (b & 0xff);

Piszesz ze uzywasz 16 bitowej palety i powyzsze stwierdza ze jest to 565. Tak wiec wg mnie masz zle przesuniecia oraz obliczenia slow 5;6;5. Czyli kolor czerwony przesuniety o 11 bitopw w lewo (5 bit niebieskiego + 6 bit zielonego), a kolor zielony o 5 bit (tyle co niebieskiego). Dodatkowo dodawales na siebie trzy liczby 8 bitowe (iloczyn logiczny 0xff) co z blednymi przesunieciami wygladalo tak:15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
 R| R| R| R| R| R| R| R|  |  |  |  |  |  |  |  |
  |  |  | G| G| G| G| G| G| G| G|  |  |  |  |  |
  |  |  |  |  |  |  |  | B| B| B| B| B| B| B| B|

Zauwaz ze w tym schemacie kolor zielony sumuje sie z kolorem czerwonym i niebieskim. powyzszy graf powinien wygladac nastepujaco:
15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00|
 R| R| R| R| R|  |  |  |  |  |  |  |  |  |  |  |
  |  |  |  |  | G| G| G| G| G| G|  |  |  |  |  |
  |  |  |  |  |  |  |  |  |  |  | B| B| B| B| B|
Wg mnie powinno to wygladac tak:
unsigned short PixelColor(int r, int g, int b)
{
// Calculate the pixel color from the r,g,b components.
if (g_gxdp.ffFormat & kfDirect565)
        return (unsigned short) (r & 0x1f) << 11 | (g & 0x3f) << 5 | (b & 0x1f);


Nie rozumiem jaka palete koloru to ma przedstawiac:
Cytat: "Krzysiek147"

    else
        return (unsigned short) (r & 0xff) << 10 | (g & 0xff) << 5 | (b & 0xff);
}


Nastepne co nie dokonca poprawnie rozumiesz to:
Cytat: "Krzysiek147"
Jak tak pomyslałem to, to jest wysztko dobrze jeśli chodzi o obliczenia bo w 16 bitach każdy odcien jest opisany przez 5 bitów czyli od 0..31 wiec jak ja mu podaje wartość odcienia z przedziału 0..255 to powinienem ją podzielić przez 8 i powinno być dobrze i w tej funkcji do wyświetlania tych pasków działa to dobrze i wyswietla tak jak powinno czyli http://www.krzysiek147.republika.pl/obrazki/pda/5.jpg ale moim programie z tą paletą to nie działa. Te dzielienie przez 8 wstawiłem przy zapisywaniu koloru w palecie czyli wtej części funkcji void Rysuj(int x, int y):
*kolor = PixelColor(color.r/8,color.g/8,color.b/8);

Jak juz wczesniej zauwazylem koloru zielonego jest 6bit, tak wiec dzielenie powino byc dla czerwonego i nieboeskiego przez 8, a dla zielonego przez 4.
*kolor = PixelColor(color.r/8,color.g/4,color.b/8);

*

Offline fp

  • **
  • 113
    • http://pdaclub.pl/forum/index.php?action=search
Re: eVC++ problem z kolorami w GAPI
« Odpowiedź #2 dnia: Czerwiec 16, 2006, 06:28:10 »
Cytat: "Sanjuro"

Nie rozumiem jaka palete koloru to ma przedstawiac:
Cytat: "Krzysiek147"

    else
        return (unsigned short) (r & 0xff) << 10 | (g & 0xff) << 5 | (b & 0xff);
}




to miało być kfDirect555, ale też brakuje obcinania najmniej znaczących bitów z każdej z 8-bitowych składowych.

Re: eVC++ problem z kolorami w GAPI
« Odpowiedź #3 dnia: Czerwiec 16, 2006, 10:45:41 »
Jestem spowrotem, sorry że nie odpowiedałem ale nie mogłem i tak dobrze że "Sanjuro" zwróciłs uwage żę problem jest w tym odwzorowaniu kolorów bo faktycznie ta moja funkcja której używałem jest jakaś dziwna a dla tego mnożenia przez 0xff to mi tyko jedno wyjśnienie przychodzi autor chyba chciał wrazie czego wyciąć z int-a liczbe jedno bitową, chyba. :) a co do tego drugiego odworowania to "fp" ma racje to miało być niby odwzorowanie 555 gdzie najbardziej znaczący bit ma być pusty. A więc tak przetestowałem twoją funkcjie i jak najbadziej jest ona oczywiście dobra tylko jednak program obsługuje chyba te drugie odwzorwanie :| jednak znalazłem nową funkcjie oto ona:
unsigned short PixelColor(int r, int g, int b)
{
if (g_gxdp.ffFormat & kfDirect565)
return (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3));
else
return (((r & 0xF8) << 7) | ((g & 0xF8) << 2) | (b >> 3));
}

i są dobre, sprawdzałem nawet na papierze i są o tyle fajne że z każdej barwy wycinają najbardziej znaczące bity i wtedy nie jest już potrzebne te dzielenie :) wrzuciłem te funkcjie to programu i ja już nie wiem, one też nie dziłają :| jest to samo co wcześniej, wychodzą kolory same zielone i czarne i ten jaskrawy niebieski. Próbowałem też zamiast podawać int r, int g, int b użyć ogtowje struktury COLORREF w jednym samplu widziałem, że tak robili ale nawet z tym działa tak samo, może to już jednak nie jest problem odwzorowania??

*

Offline fp

  • **
  • 113
    • http://pdaclub.pl/forum/index.php?action=search
eVC++ problem z kolorami w GAPI
« Odpowiedź #4 dnia: Czerwiec 17, 2006, 00:05:50 »
ja bym zwrócił uwagę na to:

   struct rgb
   {
      unsigned char r;
      unsigned char g;
      unsigned char b;
   };


wczytujesz z pliku całe struktury przez
fread(&color,sizeof(color),1,plik);

sprawdź lepiej czy kompilator nie dopełnia struktury do WORD-ów albo DWORD-ów. może się okazać, że ta struktura zajmuje 12 bajtów albo 4 a nie 3. kompilator ma prawo 'rozlokować' zmienne w strukturze tak jak mu się podoba (kwestia optymalizacji, itp.)

Re: eVC++ problem z kolorami w GAPI
« Odpowiedź #5 dnia: Czerwiec 17, 2006, 13:09:53 »
jeśli chodzi o te wczytywanie to jest dobrze bo testowałem tą funkcjie i sprawdzałem jakie wartości rgb odczytuje i się zgadzają idealnie z tymi zapisanymi w pliku sprawdzałem chyba do 10 "paczki" rgb i wyświetlałem wartości rgb.  A dodaktowo próbowałem zrobić tak jak mi radziłeś i zamiast struktury odczytywałem pojedyncze wrtości i jest to samo. Jeśli chodzi o tą funkcji PixelColor to dodatkowo testowałem na zasadzie że podałem chyba z 10 róznych kombinacji kolorów rgb na zasadzie co mi do głowy przyniesie i takie same wartości wpisywałem w ustawieniu koloru zwykłej bitmapy kolory sie zgadzały, więc jedynie gdzieś może być błąd w moich funkcjach i to są wszystkie moje funkcje które biorą udział w tym rysowaniu tych wcześniejszych nie wypisuje drugi raz:

//---------------- Stawianie Piskela --------------------
void SetFPixel(int x, int y, unsigned short color, unsigned short * buffer)
{
unsigned short * pixel = buffer;
pixel = buffer + (x * g_gxdp.cbxPitch >> 1) + (y * g_gxdp.cbyPitch >> 1);
* pixel = color;
}


//---------------- Rysowanie Prostokatu --------------------
void Prostokat(int x, int y, int s, int h, unsigned short color, unsigned short

*start)
{
int ix=0,iy=0;
for(iy=0; iy<h; iy++)
for(ix=0; ix<s; ix++)
SetFPixel(x+ix,y+iy,color,start);
}


//---------------- Rysowanie Palety --------------------
void Rysuj(int x, int y, unsigned short *paleta)
{
int ix=0,iy=0;
unsigned short *start;
unsigned short *pal = paleta;

start = InitDraw();
if(start)
{
for(iy=0; iy<16; iy++)
for(ix=0; ix<16; ix++)
{
Prostokat(x+(ix*14),y+(iy*14),12,12,*pal,start);
pal++;
}
}
CloseDraw();
}


// ----------   Inicjowanie rysowania ----------------
unsigned short * InitDraw()
{
unsigned short * buffer  = (unsigned short *) GXBeginDraw();
return buffer;
}


// ----------   Konczenie rysowania ----------------
void CloseDraw()
{
GXEndDraw();
}

i co moge więcej powiedzieć próbowałem pozmieniać wszystkie unsigned short na WORD i efekt jest taki sam, jedyne co mi do głowy przychodzi to że musi być jaiś głupi błąd gdzieś w tych funkcjach :( innej możliwości nie ma, już siedzie nad tym od tygodnia i nic nie moge wypatrzyć :| jeśli ktoś by miał ochote to mogę udostępnić cały ten projekt.

*

Offline fp

  • **
  • 113
    • http://pdaclub.pl/forum/index.php?action=search
eVC++ problem z kolorami w GAPI
« Odpowiedź #6 dnia: Czerwiec 20, 2006, 11:42:58 »
weź ino podeślij ten kod jakoś, to zajrzę  8)

Re: eVC++ problem z kolorami w GAPI
« Odpowiedź #7 dnia: Czerwiec 21, 2006, 16:46:05 »
A więc tak w końcu jestem, i udało mi się przypadkiem zrobić żeby działało :] w funkcji PixelColor wystarczyło pomnożyć każdą ze składowych koloru przez 4 :| ale dla czego, to nie mam pojęcia, patrzyłem jak to wygląda bitowo i jakoś nie za ciekawie. Jeśli ktoś by wiedział dlaczego tak to jest, to chętnie się dowiem a na razie mam już tego dość i zaczynam dalej pisać program :)

*

Offline fp

  • **
  • 113
    • http://pdaclub.pl/forum/index.php?action=search
eVC++ problem z kolorami w GAPI
« Odpowiedź #8 dnia: Czerwiec 22, 2006, 08:39:26 »
może brałeś swoją "paletę kolorów" z GIFa? tam jest zdaje się 6-bitów na każdą składową.

eVC++ problem z kolorami w GAPI
« Odpowiedź #9 dnia: Czerwiec 22, 2006, 11:31:33 »
nie nie, już pisałem wczesniej to jest paleta kolorów, wktórej każda z trzech składowa ma jeden bajt i jest 256 kolorów, nie ma ona żadnego nagłówka odrazu są dane. Sprawdzałem ją w pascalu :) zrobiłem szybko funkcje do wyświetlenia tej palety w trybie 101h czyli 640x480x256 i w pascalu działa normlanie a to jest paleta kolorów z jednej gry, w pierwszym poście na samym dole jest odnośnik do tej palety, jakby cię to interesowało. A tu jest link do tej palety poprawnie wyświetlonej http://www.krzysiek147.republika.pl/obrazki/pda/7.jpg