Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C][SDL] Scanline van een surface  (gelezen 885 keer)

Offline Joshua822

  • Lid
[C][SDL] Scanline van een surface
« Gepost op: 2010/04/06, 22:09:13 »
Hey allemaal,

is er iemand die me kan uitleggen wat de scanline van een surface is, in SDL ? Ik snap dat niet echt. Maar ik heb het wel nodig om de DrawPixel ( ) functie, die op deze pagina staat, te snappen.

Voor de rest kan ik het wel al redelijk volgen.

Alvast bedankt! :)

Offline Joshua822

  • Lid
Re: [C][SDL] Scanline van een surface
« Reactie #1 Gepost op: 2010/04/07, 12:52:57 »
Oké, ik snap het al. Ik heb nu de volgende functie geschreven om één pixel op mijn SDL_Surface te tekenen :
void DrawPixel ( SDL_Surface * screen, unsigned short x, unsigned short y, Uint8 r, Uint8 g, Uint8 b )
{
    Uint32 color = SDL_MapRGB ( screen->format, r, g, b );
    switch ( screen->format->BytesPerPixel )
    {
        case 1:
            Uint8 * px;
            px = ( Uint8 * ) screen->pixels + y * screen->pitch + y;
            * px = color;
            break;
        case 2:
            Uint16 * px;
            px = ( Uint16 * ) screen->pixels + y * screen->pitch / 2 + y;
            * px = color;
            break;
        case 4:
            Uint32 * px;
            px = ( Uint32 * ) screen->pixels + y * screen->pitch + y;
            * px = color;
            break;
    }
}
(Ja, ik ben me ervan bewust dat ik eerst de SDL_Surface * moet locken, maar deze functie wordt vanuit een andere gebruikt, en die andere functie doet dit. )

Nu is het probleem dat ik van gcc de volgende foutmeldingen krijg die ik niet snap :



Weet iemand wat ik fout doe ? Alvast bedankt :)

Offline muksie

  • Lid
Re: [C][SDL] Scanline van een surface
« Reactie #2 Gepost op: 2010/04/07, 13:10:33 »
Je hebt 3 variabelen px (met verschillende type)?

Probeer deze variable in iedere case eens een andere naam te geven.

Offline Joshua822

  • Lid
Re: [C][SDL] Scanline van een surface
« Reactie #3 Gepost op: 2010/04/07, 13:44:12 »
Bedankt! Wel, het lag er niet aan dat de variabelen dezelfde naam hadden, maar het bracht me wel op een idee. Ik heb de variabelen buiten het switch statement gedeclareerd en nu compileert het programma perfect.

Hier is de functie:

void DrawPixel ( SDL_Surface * screen, unsigned short x, unsigned short y, Uint8 r, Uint8 g, Uint8 b )
{
    Uint32 color = SDL_MapRGB ( screen->format, r, g, b );
    Uint8 * pixel_8;
    Uint16 * pixel_16;
    Uint32 * pixel_32;
    switch ( screen->format->BytesPerPixel )
    {
        case 1:
            pixel_8 = ( Uint8 * ) screen->pixels + y * screen->pitch + y;
            * pixel_8 = color;
            break;
        case 2:
            pixel_16 = ( Uint16 * ) screen->pixels + y * screen->pitch / 2 + y;
            * pixel_16 = color;
            break;
        case 4:
            pixel_32 = ( Uint32 * ) screen->pixels + y * screen->pitch + y;
            * pixel_32 = color;
            break;
    }
}

(Als iemand van het hele programma - dat met SDL pixels in een venster tekent - de broncode wilt hebben, zeg het dan even hier.)

Voor de gene die zich afvragen waarom het op deze manier wel werkt; ik denk dat de compiler gewoon niet kan voorspellen voor welke variabel hij geheugen moet reserveren aan het begin van het programma, en daarom een foutmelding geeft. Een workaround zou met de malloc() en free() (C) functies of met de new en delete operators (C++) bereikt kunnen worden.