Eli miten voi ottaa SDL_Surfacesta yhden pikselin rgb arvon int-muuttujaan tai muuttajiin?
void SDL_GetPixel(int x, int y, SDLSurface *s, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a) { Uint8 v[4]; Uint32 c = *(Uint32*)((char*)s->pixels + y * s->pitch + x * s->format->BytesPerPixel) & (0xffffffffUL >> (32 - s->format->BitsPerPixel)); SDL_GetRGBA(c, s->format, v, v+1, v+2, v+3); if (r) *r = v[0]; if (g) *g = v[1]; if (b) *b = v[2]; if (a) *a = v[3]; }
Jos tiedät valmiiksi pinnan värisyvyyden, voit optimoida tuosta bittisiirtokikkailun pois, ja jos tiedät myös värien järjestyksen, joka on Windowsissa usein 32-bittisellä pinnalla 0xAARRGGBB ellei muuta ole määritelty, voit tehdä koko funktion paljon lyhyemmin ilman SDL_GetRGBA-kutsua.
Öh... miten tuota funktiota siis kuuluu käyttää, kun mitä syötetään sitä kutsuessa noihin neljään viimeiseen kohtaan. Kokeilin NULLIA, ja ei tuntunut toimivan. Eikä auttanut laitta locksurfacea, vaan heittää pihalle. Kerran meni Dev-cpp:kin sekaisin...
kray kirjoitti:
Öh... miten tuota funktiota siis kuuluu käyttää, kun mitä syötetään sitä kutsuessa noihin neljään viimeiseen kohtaan.
Pointteri siihen surfaasiin, josta pikseli luetaan, ja kolme int-pointteria, johon se tulos varastoidaan.
kray kirjoitti:
Öh... miten tuota funktiota siis kuuluu käyttää, kun mitä syötetään sitä kutsuessa noihin neljään viimeiseen kohtaan.
Osoittimet Uint8-tyyppisiin muuttujiin, joihin laitetaan eri värien arvot. Miten oikein kuvittelit sen värin saavasi, jos laitat NULL niihin? :D Ja näkeehän tuon niiden nimistäkin, rgba.
Aihe on jo aika vanha, joten et voi enää vastata siihen.