#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <string.h>
#include <linux/fb.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include "libffb.h"
static uint32_t sdl_w = 0;
static uint32_t sdl_h = 0;
static uint32_t sdl_bpp = 0;
static SDL_Joystick *joy = NULL;
static SDL_Window *window = NULL;
static SDL_Surface *screen = NULL;
static SDL_Texture *texture = NULL;
static SDL_Renderer *renderer = NULL;
int MYSDL_Init(uint32_t v)
{
int r = 0;
r = SDL_Init(v | SDL_INIT_JOYSTICK);
joy = SDL_JoystickOpen(0);
printf("%s, r=%d, joy=%p\n", __func__, r, joy);
return r;
}
int MYSDL_WasInit(uint32_t v)
{
return SDL_WasInit(v);
}
int MYSDL_InitSubSystem(uint32_t v)
{
int r = 0;
r = SDL_InitSubSystem(v);
printf("%s, r=%d\n", __func__, r);
return r;
}
void MYSDL_QuitSubSystem(uint32_t v)
{
SDL_QuitSubSystem(v);
}
SDL_Surface* MYSDL_SetVideoMode(uint32_t w, uint32_t h, uint32_t bpp, uint32_t flags)
{
sdl_w = w;
sdl_h = h;
sdl_bpp = bpp;
window = SDL_CreateWindow("libffb", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
screen = SDL_CreateRGBSurface(0, w, h, bpp, 0, 0, 0, 0);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, w, h);
printf("%s, w=%d, h=%d, bpp=%d\n", __func__, w, h, bpp);
return screen;
}
void MYSDL_Flip(SDL_Surface *s)
{
SDL_UpdateTexture(texture, NULL, s->pixels, s->pitch);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
void MYSDL_Quit(void)
{
SDL_FreeSurface(screen);
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
if (joy) {
SDL_JoystickClose(joy);
}
SDL_Quit();
}
int MYSDL_PollEvent(uint32_t *type, uint32_t *btn)
{
int r = 0;
SDL_Event e = { 0 };
r = SDL_PollEvent(&e);
*type = e.type & 0xff;
*btn = e.jbutton.button;
return r;
}
libffb.h
#ifndef __FFB_H__
#define __FFB_H__
#ifdef ZPG
#define MYSDL_KEYDOWN 3
#define MYSDL_KEYUP 4
#define MYSDLK_LALT 0
#define MYSDLK_LCTRL 1
#define MYSDLK_SPACE 2
#define MYSDLK_LSHIFT 3
#define MYSDLK_TAB 4
#define MYSDLK_BACKSPACE 5
#define MYSDLK_PAGEUP 6
#define MYSDLK_PAGEDOWN 7
#define MYSDLK_UP 8
#define MYSDLK_DOWN 9
#define MYSDLK_LEFT 10
#define MYSDLK_RIGHT 11
#define MYSDLK_HOME 12
#define MYSDLK_END 13
#define MYSDLK_ESCAPE 14
#define MYSDLK_RETURN 15
#define MYSDLK_VOLUP 16
#define MYSDLK_VOLDOWN 17
int MYSDL_Init(uint32_t);
int MYSDL_WasInit(uint32_t);
int MYSDL_InitSubSystem(uint32_t);
void MYSDL_QuitSubSystem(uint32_t);
SDL_Surface* MYSDL_SetVideoMode(uint32_t, uint32_t, uint32_t, uint32_t);
void MYSDL_Quit(void);
void MYSDL_Flip(SDL_Surface*);
int MYSDL_PollEvent(uint32_t*, uint32_t*);
#else
#define MYSDL_KEYDOWN SDL_KEYDOWN
#define MYSDL_KEYUP SDL_KEYUP
#define MYSDLK_LALT SDLK_LALT
#define MYSDLK_LCTRL SDLK_LCTRL
#define MYSDLK_SPACE SDLK_SPACE
#define MYSDLK_LSHIFT SDLK_LSHIFT
#define MYSDLK_TAB SDLK_TAB
#define MYSDLK_BACKSPACE SDLK_BACKSPACE
#define MYSDLK_PAGEUP SDLK_PAGEUP
#define MYSDLK_PAGEDOWN SDLK_PAGEDOWN
#define MYSDLK_UP SDLK_UP
#define MYSDLK_DOWN SDLK_DOWN
#define MYSDLK_LEFT SDLK_LEFT
#define MYSDLK_RIGHT SDLK_RIGHT
#define MYSDLK_HOME SDLK_HOME
#define MYSDLK_END SDLK_END
#define MYSDLK_ESCAPE SDLK_ESCAPE
#define MYSDLK_RETURN SDLK_RETURN
#define MYSDLK_VOLUP SDLK_VOLUP
#define MYSDLK_VOLDOWN SDLK_VOLDOWN
#define MYSDL_Init SDL_Init
#define MYSDL_InitSubSystem SDL_InitSubSystem
#define MYSDL_SetVideoMode SDL_SetVideoMode
#define MYSDL_Quit SDL_Quit
#define MYSDL_Flip SDL_Flip
#define MYSDL_PollEvent SDL_PollEvent
#endif
#endif
編譯
$ gcc libffb.c -DZPG -fPIC -shared -o libffbcc.so -ggdb -lSDL2 -I/usr/include/SDL2 $ g++ libffb.c -DZPG -fPIC -shared -o libffbcxx.so -ggdb -lSDL2 -I/usr/include/SDL2 -fpermissive