Mercurial > hg > Members > e085722 > Cerium
diff Renderer/Engine/viewerSDL.cc @ 0:04e28d8d3c6f
first commit
author | Daiki KINJYO <e085722@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Nov 2010 01:23:25 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/viewerSDL.cc Mon Nov 08 01:23:25 2010 +0900 @@ -0,0 +1,125 @@ +#include "viewerSDL.h" +#include "Func.h" +#include "TaskManager.h" +#include "viewer_types.h" +#include "fb.h" + +#define UGA 1 + +extern void post2runLoop(void *); + +#define default_sdl_flag SDL_INIT_TIMER | SDL_INIT_JOYSTICK + +ViewerSDL::ViewerSDL() {} +ViewerSDL::~ViewerSDL() {} + +#define DEVICE_NAME "/dev/fb0" +#define DIV_BYTE 8 + +Uint32 * +ViewerSDL::video_init(TaskManager *manager, int bpp, int width, int height) +{ + +#if defined(__linux__) + + int fd_framebuffer ; + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; + + // 読み書き用にファイルを開く + fd_framebuffer = open( DEVICE_NAME , O_RDWR); + if ( !fd_framebuffer ) { + send_current_error_msg("Framebuffer device open error !"); + exit(1); + } + send_current_information("The framebuffer device was opened !"); + + // 固定スクリーン情報取得 + if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) { + send_current_error_msg("Fixed information not gotton !"); + exit(2); + } + + // 変動スクリーン情報取得 + if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) { + send_current_error_msg("Variable information not gotton !"); + exit(3); + } + + close(fd_framebuffer); + + width = vinfo.xres; + height = vinfo.yres; + bpp = vinfo.bits_per_pixel; + +#endif + + Uint32 sdl_flag = default_sdl_flag | SDL_INIT_VIDEO; + Uint32 *p; + + if (SDL_Init(sdl_flag) < 0) { + fprintf(stderr,"Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + + screen = SDL_SetVideoMode(width, height, bpp, SDL_HWSURFACE); + if (screen == NULL) { + fprintf(stderr, "Couldn't set SDL mode: %s\n", SDL_GetError()); + SDL_Quit(); + exit(1); + } + + this->width = screen->w; + this->height = screen->h; + this->bpp = screen->format->BitsPerPixel; + + p = (Uint32*)manager->allocate(screen->pitch*height); + + return p; +} + +void +ViewerSDL::clean_pixels() +{ + //bzero(pixels, sizeof(int)*width*height); + + //SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0)); +} + +void +ViewerSDL::clear_screen() +{ + +#if !UGA + SDL_BlitSurface(bitmap, NULL, screen, NULL); + SDL_UpdateRect(screen, 0, 0, 0, 0); +#endif + +} + +uint32_t * +ViewerSDL::flip_screen(uint32_t *old) +{ +#if UGA + + bitmap = SDL_CreateRGBSurfaceFrom((void *)old, + screen->w, screen->h, + screen->format->BitsPerPixel, + screen->pitch, + //redMask, greenMask, blueMask, alphaMask); + redMask, greenMask, blueMask, 0); + + SDL_BlitSurface(bitmap,NULL,screen,NULL); + SDL_UpdateRect(screen,0,0,0,0); + +#endif + + return old; +} + +void +ViewerSDL::free_device() +{ + free(bitmap->pixels); + SDL_FreeSurface(bitmap); +}