Avatar billede thomas_nj Nybegynder
21. december 2005 - 20:03 Der er 10 kommentarer og
1 løsning

Farv pixel i SDL Funktionsforståelse

Hejsa

  Jeg har en funktion til at male en pixel i SDL. SOm sådan giver det meste mening, men der er lige at par steder, hvor den er helt uforståelig for mig. Stederne er markeret med et nr i en parentes eks (1). Spørgsmålene til de pågældende steder står nedunder.

void DrawPixel(SDL_Surface *screen, int x, int y,
                                    Uint8 R, Uint8 G, Uint8 B)
{
  Uint32 color = SDL_MapRGB(screen->format, R, G, B); // (1)
  switch (screen->format->BytesPerPixel)
  {
    case 1: // Assuming 8-bpp
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; // (2)
        *bufp = color;
      }
      break;
    case 2: // Probably 15-bpp or 16-bpp
      {
        Uint16 *bufp;
        bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
        *bufp = color;
      }
      break;
    case 3: // Slow 24-bpp mode, usually not used
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
        if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
        {
          bufp[0] = color;
          bufp[1] = color >> 8;
          bufp[2] = color >> 16;
        } else {
          bufp[2] = color;
          bufp[1] = color >> 8;
          bufp[0] = color >> 16;
        }
      }
      break;
    case 4: // Probably 32-bpp
      {
        Uint32 *bufp;
        bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
        *bufp = color;
      }
      break;
  }
}

  Det skal bare forklares kort of overfladisk. Jeg har endnu ikke den helt store forståelse af grafik så alt for meget information vil bare forvirre mig yderligere.

(1) Hvad skal format bruges til? Kan godt se at funktionen giver variablen de nødvendige data til den pågælende farve, men hvad skal den bruge format fra screen (en struktur) til?

(2) Hvordan kan det regnestykke lige blive noget brugbart data?
  (Uint8 *)screen->pixels + y*screen->pitch + x ??
Avatar billede bertelbrander Novice
21. december 2005 - 20:21 #1
Uden at vide noget om SDL:

1: Hvis skærmen har et begrænset antal farver (f.ex. sat til 256 farver) skal SDL_MapRGB bruge denne information og bruge "skærmen" til at mappe til den farve der passer bedst til netop denne skærm (f.ex. hvis der bruges palette).

2: Hvis skærmen er definert som Screen[MAX_Y][MAX_X] er det logisk at sætte:
Screen[y][x] = Color (right?) Men nu er skærmen tilsyneladende defineret som Screen[MAX_Y*MAX_X] (eller uint8 *), screen->pitch er så vidt jeg kan regne ud det samme som MAX_X (width), så man får den rigtige pixel med screen + y*MAX_X + x
Avatar billede jpk Nybegynder
21. december 2005 - 20:26 #2
1) R, G, B er hvert 8 pixel og kan altså beskrive en farve i 24bits dybde. Hvis der fx kun anvendes 8/16 bit (screen->format->BytesPerPixel), skal farven "oversættes", det gøres v.h.a. en palette. Funktionen ta'r SDL_PixelFormat som parameter fordi denne kan indeholde en palette som så bruges.

2) screen->pixels er en pointer til et array hvor pixels ligger. For at finde den pixel der skal ændres, bruges denne pointer som udgangspunkt, hvortil der lægges et antal pixels, svarende til y-koordinatet*pixels_i_bredden (screen->pitch) samt x-koordinatet.
Avatar billede thomas_nj Nybegynder
21. december 2005 - 20:42 #3
Jeg har stadig ikke helt forstået hvorfor y-koordinatet skal ganges med antallet af pixels i bredden?
Avatar billede jpk Nybegynder
21. december 2005 - 20:48 #4
Forestil dig et array som det herunder. 30 pixels delt over 3 linier.
For at finde den pixel der skal ændres (her markeret med stort X), bruges:

x=4 (0-baseret)
y=2 (0-baseret)
pitch 10 (pixels i bredden)
2*10+4

xxxxxxxxxx
xxxxxxxxxx
xxxxXxxxxx
Avatar billede jpk Nybegynder
21. december 2005 - 20:49 #5
Altså pixel 2*10+4 = 24.
xxxxxxxxxxxxxxxxxxxxxxxxXxxxxx <- X er pixel på index 24.
Avatar billede thomas_nj Nybegynder
21. december 2005 - 20:54 #6
Tror jeg har den nu. Vil det sige at pixels'ne ligger i et array i en lang køre?
Avatar billede jpk Nybegynder
21. december 2005 - 20:59 #7
jep
Avatar billede jpk Nybegynder
21. december 2005 - 21:02 #8
Det gør de iøvrigt også selvom man fx laver et 2D array, understående ligger i virkeligheden i "en lang køre" på 25 int's:

int array[5][5];
Avatar billede thomas_nj Nybegynder
21. december 2005 - 21:08 #9
Aha, det klarede en del. Har lige en sidste ting så har jeg styr på det jeg ville. Hvorfor deler man screen->pitch med henholdsvis 2 og 4 ved 16 og 32 bit.

  Kan tænke mig frem til at det har noget at gøre med at 1 byte = 8 bit = 16/2 bit = 32/4 bit, men jeg kan ikke lige se sammenhængen.

  Hvad har farven med skærmens bredde at gøre?
Avatar billede jpk Nybegynder
21. december 2005 - 21:15 #10
Din antagelse med 1 byte = 8 bit osv. er korrekt.

hvis dybden er 8 bit fylder fx 10 pixel 10 byte. Er den 24 bit fylder de 30 byte.
Derfor skal man bruge farvedybden til at regne ud hvor mange bytes man skal frem i pixel-arrayet for at finde den korrekte pixel.
Avatar billede thomas_nj Nybegynder
21. december 2005 - 21:19 #11
ok, så tror jeg jeg har styr på det hele nu. Mange tak for hjælpen jpk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester