kip/kip-sdl2.c

60 lines
2.4 KiB
C

#include<SDL.h>
#include"kip.h"
#define hig 480
#define wid 640
SDL_Window*win;
SDL_Surface*surf;
SDL_Renderer*ren;
SDL_Texture*tex;
_ W palette[0x10]={0x212425,0x212425,0x86215f,0xc33479,0x392874,0x0a5c9f,0xa0c5c6,0x0e8743,
0xe67216,0xe1202d,0xeb5b2b,0xed7275,0xb1739a,0xbf98ac,0xf3e46d,0xfef6dd};
_ B layer[4][wid*hig]={0},redraw;
_ W computed[wid*hig]={0};
_ Ws min(Ws x,Ws y){R x<y?x:y;}
_ Ws max(Ws x,Ws y){R x>y?x:y;}
_ NR V err(V){die("sdl:%s\n",SDL_GetError());}
V front_init(V){
Q(SDL_Init(SDL_INIT_VIDEO),err())
SDL_ShowCursor(SDL_DISABLE);
N(win=SDL_CreateWindow("kip emulator",SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,wid,hig,0),err())
N(ren=SDL_CreateRenderer(win,-1,0),err())
Q(SDL_RenderSetLogicalSize(ren,wid,hig),err())
N(tex=SDL_CreateTexture(ren,SDL_PIXELFORMAT_XRGB8888,SDL_TEXTUREACCESS_STREAMING,wid,hig),err())
redraw=1;}
_ H mx,my,px,py;
_ W blit,out;
V front_events(V){_ SDL_Event ev;W t;
while(SDL_PollEvent(&ev)){t=ev.type;
Q(SDL_MOUSEMOTION==t,mx=min(wid,max(0,ev.motion.x)),my=min(hig,max(0,ev.motion.y)))OR
Q(SDL_MOUSEBUTTONDOWN==t,vec(0x04))OR
Q(SDL_MOUSEBUTTONUP==t,vec(0x08))OR
Q(SDL_QUIT==t,front_deinit(),exit(0));}}
V front_redraw(V){W i,j,k;
Q(redraw,for(i=0;i<wid*hig;++i)computed[i]=palette[0];
for(i=0;i<4;++i)for(j=0;j<wid*hig;++j)Q(k=layer[i][j],computed[j]=palette[k]);
SDL_UpdateTexture(tex,0,computed,wid*(SZ(W)/SZ(B))),
SDL_RenderClear(ren),
SDL_RenderCopy(ren,tex,0,0),
SDL_RenderPresent(ren))
vec(0x00),redraw=0;}
V front_deinit(V){SDL_DestroyTexture(tex),SDL_DestroyRenderer(ren),SDL_DestroyWindow(win),SDL_Quit();}
_ V out_pixel(B l,W c,H x,H y){Q(c,redraw=1,layer[l&3][x+wid*y]=(l>>2)?0:(B)c&0xf;)}
_ V out_1bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=lob(blit+1*i);j<8;k<<=1,++j)out_pixel(l,(c&0xf)*(1&(k>>7)),x+j,y+i);}
_ V out_2bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=loh(blit+2*i);j<8;k<<=2,++j)out_pixel(l,0xf&(c>>4*(3&(k>>14))),x+j,y+i);}
_ V out_4bpp(B l,W c,H x,H y){W i,j,k;for(i=0;i<8;++i)for(j=0,k=low(blit+4*i);j<8;k<<=4,++j)out_pixel(l,(k>>28),x+j,y+i);(V)c;}
_ V(*outs[])(B,W,H,H)={out_pixel,out_1bpp,out_2bpp,out_4bpp};
DEV(display_pos,(px=x>>16,py=x),(R px<<16|py))
DEV(display_blit,(blit=x),(R blit))
DEV(display_out,(W c;B m,l;out=x,m=0xf&x,l=(0xf0&x)>>4,c=x>>8,outs[m](l,c,px,py)),(R out))
DEV(mouse_pos,(mx=x<<16,my=x),(R mx<<16|my))