Löysin googlella tämmöisen funktion:
Uint32 getpixel(SDL_Surface * surf, int x, int y) { int bpp; Uint8 * p; bpp = surf->format->BytesPerPixel; p = (Uint8 *) (surf->pixels + (y * surf->pitch) + (x * bpp)); switch (bpp) { case 1: return *p; break; case 2: return *(Uint16 *)p; break; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; break; case 4: return *(Uint32 *)p; } return 0; }
Ja samalla sivulla mistä sen sanoin sanottiin, että sitä käytetään näin:
Uint32 the_color; SDL_Surface * my_surface; Uint8 r, g, b; int x, y; ... the_color = getpixel(my_surface, x, y); SDL_GetRGB(the_color, my_surface->format, &r, &g, &b);
Tajusin hyvin kuinka sitä käytetään, ja teinkin niin kuin tuossa sanotaan, mutta kääntäjäni (mingw) sanoopi että:
../testailu/main.cpp: In function `Uint32 getpixel(SDL_Surface*, int, int)': ../testailu/main.cpp:187: pointer of type `void *' used in arithmetic ../testailu/main.cpp:187: pointer of type `void *' used in arithmetic make.exe: *** [../testailu/main.o] Error 1
Rivi 187 on siis tämä: p = (Uint8 *) (surf->pixels + (y * surf->pitch) + (x * bpp));
ADD: jos jotakuta kiinnostaa mikä sivu on kyseessä niin se on http://www.libsdl.org/pipermail/sdl/2003-March/053071.html
Heh, sinäkin olet alkanut SDL:ää käyttämään :)
Itse mietin samaa asiaa muutama päivä sitten, ja erään henkilön avustuksella päädyttiin tälläiseen funktioon (32 bittisessä moodissa):
void GetPixelColor(SDL_Surface *screen, int x, int y, Uint8 *color){ Uint32 *bufp; bufp = (Uint32 *) screen -> pixels + y*screen -> pitch/4 + x; SDL_GetRGB(*bufp, screen -> format, &color[0], &color[1], &color[2]); }
Käyttö:
GetPixelColor(screen, x, y, rgb); int r = rgb[0]; int g = rgb[1]; int b = rgb[2]; ...
Palauttaa siis pikselin väriarvon kolmisoluisessa taulukossa
Ja tässä se pikselin piirto (32 bittisessä moodissa):
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B){ Uint32 color = SDL_MapRGB(screen -> format, R, G, B); Uint32 *bufp; bufp = (Uint32 *) screen -> pixels + y*screen -> pitch/4 + x; *bufp = color; }
Mikäli en muista väärin, niin pinnan täytyy olla lukittuna kun väriä haetaan.
surf->pixels on ilmeisesti 'void *', ja koska sen datan kokoa ei tiedetä ei sille voida myöskään suorittaa aritmeettisia operaatioita.
Kokeiles vaikka näin:
p = (Uint8 *)surf->pixels + (y * surf->pitch) + (x * bpp);
http://sdldoc.csn.ul.ie/guidevideo.php#GUIDEVIDEOINTRO
tonne ja sivun loppuun.. lukekaa hyvät ihmiset sitä dokumentointia..
Aihe on jo aika vanha, joten et voi enää vastata siihen.