Problema con pasar de SDL_Surface a map.

Started by Elelegido, February 28, 2009, 09:29:32 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Elelegido

Me he estado fijando en lo que habéis discutido en el hilo de la Pango, pero me falla algo. Cuando compruebo el mapa en bennu con "map_exists" me devuelve falso y obviamente en los frames no muestra nada.

Esto es lo que he puesto:
[code language="bennu"]
   if(SDL_GetVideoSurface()->format->BitsPerPixel == 16) {
      surface = SDL_CreateRGBSurface(0, iinfo.w,iinfo.h, 16, (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 , ((Uint32)0xff) >> 3, 0);
   } else if (SDL_GetVideoSurface()->format->BitsPerPixel == 32) {
      surface = SDL_CreateRGBSurface(0, iinfo.w,iinfo.h, 32, (Uint32)(255 << (8*2)), (Uint32)(255 << (8*1)), (Uint32)(255 << 8*0), (Uint32)(255 << 8*3) );
   }

   SDL_BlitSurface(chipset,&rect, surface,0); // chipset es una imagen cargada con IMG_Load

   SDL_SaveBMP(surface, "prueba.bmp");

   GRAPH* gr1 = bitmap_new_ex(0, surface->w, surface->h, surface->format->BitsPerPixel, surface->pixels, surface->pitch);
   GRAPH* gr = bitmap_clone(gr1);
        bitmap_destroy(gr1);
        gr->code = bitmap_next_code() ;
        grlib_add_map( fpg, gr ) ; // fpg=0.

   return (gr->code);
[/code]

El archivo 'prueba.bmp' me sale perfecto, lo que me hace pensar que el error es de lo que viene después. La surface la guardo en una pila, y le aplico SDL_FreeSurface después del return y de testear con map_exists. Eso es todo, gracias por adelantado.

Elelegido

#1
Ahora si me detecta el mapa bien con map_exists pero no me saca la imagen por la pantalla de todas formas (me la saca negro).

He probado a hacer este paso al cargar el chipset:
[code language="bennu"]
        SDL_Surface* sdl_surf, *chipset=IMG_Load("tiles.png");
   if(SDL_GetVideoSurface()->format->BitsPerPixel == 16) {
      sdl_surf = SDL_CreateRGBSurfaceFrom(chipset->pixels,0, chipset->w,chipset->h, 16, (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 , ((Uint32)0xff) >> 3, 0);
   } else if (SDL_GetVideoSurface()->format->BitsPerPixel == 32) {
      sdl_surf = SDL_CreateRGBSurfaceFrom(chipset->pixels,0, chipset->w,chipset->h, 32, (Uint32)(255 << (8*2)), (Uint32)(255 << (8*1)), (Uint32)(255 << 8*0), (Uint32)(255 << 8*3) );
   }
   SDL_FreeSurface(chipset);
   chipset=sdl_surf;
[/code]
Y creo que esto es lo que ha producido ese efecto, o igual no, que he tocado alguna cosa más...

En cualquier caso compruebo que como cabria de esperar gr->data tiene exactamente la misma info que surface->pixels. Se me hace raro que siendo así no me cargue nada por la pantalla.

EDIT: Pero ahora los .bmp obtenidos en SDL_SaveBMP salen mal. Totalmente negros... creo que el fallo tiene que estar en por ahí, en la creación de chipset o surface, y que tendrá que ver con las máscaras, pero no tengo idea...

SplinterGU

ahora mismo no tengo ni 10 minutos, pero en estos dias tendre algo de tiempo y te dare una mano...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Elelegido


SplinterGU

preguntas:

1) Version de Bennu?
2) Profundidad de colores de la pantalla?
3) Profundidad de colores de las surface?

La modificacion que posteaste que decis supones hace que funcione el map_exists, no puede ser... debes tener otro cambio... o seria bueno que pongas log e imprimas que te retorna cada funcion...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2