Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Mikä väri pisteessä x,y (SDL)

Gwaur [26.02.2004 00:33:33]

#

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

T.M. [26.02.2004 00:51:29]

#

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;
}

WinC [26.02.2004 01:07:00]

#

Mikäli en muista väärin, niin pinnan täytyy olla lukittuna kun väriä haetaan.

thefox [27.02.2004 11:32:11]

#

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);

Grusifix [29.02.2004 21:33:02]

#

http://sdldoc.csn.ul.ie/guidevideo.php­#GUIDEVIDEOINTRO

tonne ja sivun loppuun.. lukekaa hyvät ihmiset sitä dokumentointia..

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta