SDL: невозможно перевернуть несколько поверхностей - PullRequest
0 голосов
/ 29 декабря 2011

Я пытался перевернуть поверхности и добился успеха, если переворачивал только одну поверхность (ту же самую поверхность, которую я получил от SDL_SetVideoMode).Если я пытаюсь перевернуть поверхность, я возвращаюсь от SDL_DisplayFormat, ничего не происходит.Я приложил демонстрационный код, который демонстрирует мою проблему:

#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"

void main()
{
    int i;
    SDL_Surface *mysurface1;
    SDL_Surface *mysurface2;
    char *pxl;

    SDL_Init( SDL_INIT_EVERYTHING );

    mysurface1 = SDL_SetVideoMode( 640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE );

    for (i = 0; i < 20; i++)
    {
            pxl = (char *)mysurface1->pixels + i*mysurface1->pitch + i;
            *pxl = 100; // Red Line
    }

    SDL_Flip(mysurface1); // Works, we see a red line

    sleep(5);
    printf("Sleeping for 5...\n");

    mysurface2 = SDL_DisplayFormat(mysurface1);

    for (i = 0; i < 20; i++)
    {
            pxl = (char *)mysurface2->pixels + i*mysurface2->pitch + i;
            *pxl = 255; // White line
    }

    SDL_Flip(mysurface2); // White line doesnt appear

    printf("Done... No white line\n");

    sleep(10);
}

Кто-нибудь когда-либо видел это раньше?Опять же, я думаю, что отследил его до поверхностей, которые не будут отображаться, если это поверхность, которую я получил от SDL_DisplayFormat.Если я делаю это на поверхности, я возвращаюсь с SDL_SetVideoMode, тогда я вижу красную линию и все работает нормально.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2011

Передайте экран функции SDL_Flip.Функция flip изменяет значение screen->pixels так, чтобы оно указывало на поверхность, которая не видна на экране.

Однако это применимо только к видеоустройствам, таким как SVGA и DGA.На X11 вызов SDL_Flip(screen) эквивалентен вызову SDL_UpdateRect(screen, 0, 0, 0, 0).

#include <stdio.h>
#include <stdlib.h>
#include "SDL/SDL.h"

void main()
{
    int i;
    SDL_Surface *screen;
    char *pxl;

    SDL_Init( SDL_INIT_EVERYTHING );
    screen = SDL_SetVideoMode( 640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE );

    printf("Drawing the red line ...\n");
    printf("screen->pixels = %p\n", screen->pixels);
    for (i = 0; i < 100; i++)
    {
        pxl = (char *)screen->pixels + i*screen->pitch + i;
        *pxl = 100; // Red Line
    }

    printf("Flip screens\n");
    SDL_Flip(screen); // Display the red line

    printf("Drawing the white line ...\n");
    printf("screen->pixels = %p\n", screen->pixels);
    for (i = 0; i < 100; i++)
    {
        pxl = (char *)screen->pixels + i*screen->pitch + i;
        *pxl = 255; // White line
    }

    sleep(3);
    printf("Flip screens\n");
    SDL_Flip(screen); // Display the white line

    sleep(10);
}

На моем ноутбуке Linux это печатает:

Drawing the red line ...
screen->pixels = 0xb6c8c008
Flip screens
Drawing the white line ...
screen->pixels = 0xb6c8c008
Flip screens

Значение screen->pixels такое же, но это только потому, что на X11 операция переворота не выполняется.На видеоустройстве, таком как SVGA или DGA, эти два значения будут разными.

0 голосов
/ 29 декабря 2011

Во-первых, кажется, SDL_Flip() работает только на поверхностях, которые соответствуют экрану или окну, как те, которые созданы SDL_SetVideoMode(). Ваша другая поверхность вне экрана; не имеет смысла делать двойной буфер (или переворачивать его), и он, скорее всего, в любом случае не имеет двойной буферизации. Будучи за пределами экрана, он не появится, пока вы не перетянете его на поверхность дисплея с помощью SDL_BlitSurface() или аналогичной функции - тогда изменения будут видны в следующий раз, когда вы перевернете поверхность дисплея.

По сути, mysurface2 на самом деле не отображается на вашем дисплее, пока вы не поместите его туда, перетянув его на поверхность, которая равна на вашем дисплее. Если вы замените следующее:

SDL_Flip(mysurface2); // White line doesnt appear

С этим:

SDL_BlitSurface(mysurface2,NULL,mysurface1,NULL);
SDL_Flip(mysurface1);

... тогда ваш код, вероятно, будет работать так, как вы ожидаете.

0 голосов
/ 29 декабря 2011

Вы можете перевернуть только основную поверхность дисплея (созданную с помощью SDL_SetVideoMode). Для того чтобы сделать видимой другую поверхность, вам нужно перетянуть ее на основную поверхность. Найдите SDL_BlitSurface, чтобы узнать, как это сделать.

...