Z-Pocket Game Pro(ZPG Pro)
libffb
libffb.c
#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