1,7 → 1,6 |
#include <stdlib.h> |
#include <stdio.h> |
#include <menuet/os.h> |
#include <kos32sys.h> |
#include <sys/ksys.h> |
#include "SDL.h" |
#include "SDL_error.h" |
#include "SDL_video.h" |
8,7 → 7,6 |
#include "SDL_mouse.h" |
#include "SDL_sysvideo.h" |
#include "SDL_pixels_c.h" |
#include "SDL_events_c.h" |
#include "SDL_menuetvideo.h" |
#include <string.h> |
|
16,339 → 14,256 |
static int was_initialized=0; |
|
static int has_null_cursor=0; |
static int null_cursor; |
static void* null_cursor; |
|
//#define KEEP_OBSOLETE_STYLE3 |
#define WINDOW_BORDER_H 4 |
#define WINDOW_BORDER_W 9 |
|
#ifdef KEEP_OBSOLETE_STYLE3 |
static int IsStyle4Available=0; |
#endif |
|
void kol_define_window(unsigned short x1,unsigned short y1,unsigned short xsize,unsigned short ysize, |
unsigned long body_color,unsigned long grab_color,unsigned long frame_color) |
void kos_SDL_RepaintWnd(void) |
{ |
unsigned long a,b; |
a=(x1<<16)|xsize; |
b=(y1<<16)|ysize; |
__asm__ __volatile__("int $0x40"::"a"(0),"b"(a),"c"(b),"d"(body_color),"S"(grab_color), |
"D"(frame_color)); |
} |
_ksys_start_draw(); |
_ksys_create_window(1, 1, vm_suf->hidden->win_size_x+WINDOW_BORDER_W, |
vm_suf->hidden->win_size_y+_ksys_get_skin_height()+ WINDOW_BORDER_H, |
vm_suf->hidden->__title, 0, 0x34); |
|
void MenuetOS_SDL_RepaintWnd(void) |
{ |
begin_draw(); |
kol_define_window(1,1,vm_suf->hidden->win_size_x+9,vm_suf->hidden->win_size_y+get_skin_height()+4, |
#ifdef KEEP_OBSOLETE_STYLE3 |
IsStyle4Available?0x34000000:0x33000000 |
#else |
0x34000000 |
#endif |
,0,(int)vm_suf->hidden->__title); |
|
// __asm__ __volatile__("int3"); |
|
if(vm_suf && vm_suf->hidden->__video_buffer) |
draw_bitmap(vm_suf->hidden->__video_buffer, 0,0, |
vm_suf->hidden->win_size_x,vm_suf->hidden->win_size_y); |
end_draw(); |
if (vm_suf && vm_suf->hidden->__video_buffer) { |
_ksys_draw_bitmap(vm_suf->hidden->__video_buffer, 0, 0, |
vm_suf->hidden->win_size_x, vm_suf->hidden->win_size_y); |
} |
_ksys_end_draw(); |
} |
|
static int MenuetOS_AllocHWSurface(_THIS,SDL_Surface * surface) |
static int kos_AllocHWSurface(_THIS,SDL_Surface * surface) |
{ |
return -1; |
return -1; |
} |
|
static void MenuetOS_FreeHWSurface(_THIS,SDL_Surface * surface) |
{ |
} |
static void kos_FreeHWSurface(_THIS,SDL_Surface * surface) {/*STUB*/} |
|
static int MenuetOS_LockHWSurface(_THIS,SDL_Surface * surface) |
static int kos_LockHWSurface(_THIS,SDL_Surface * surface) |
{ |
return 0; |
return 0; |
} |
|
static void MenuetOS_UnlockHWSurface(_THIS,SDL_Surface * surface) |
{ |
} |
static void kos_UnlockHWSurface(_THIS,SDL_Surface * surface) {/*STUB*/} |
|
static void MenuetOS_DirectUpdate(_THIS,int numrects,SDL_Rect * rects) |
static void kos_DirectUpdate(_THIS,int numrects,SDL_Rect * rects) |
{ |
if(numrects) |
{ |
draw_bitmap(this->hidden->__video_buffer, 0,0, |
vm_suf->hidden->win_size_x,vm_suf->hidden->win_size_y); |
} |
if (numrects) { |
_ksys_draw_bitmap(this->hidden->__video_buffer, 0,0, |
vm_suf->hidden->win_size_x,vm_suf->hidden->win_size_y); |
} |
} |
|
int MenuetOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) |
int kos_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors) |
{ |
return 0; |
return 0; |
} |
|
void MenuetOS_VideoQuit(_THIS) |
void kos_VideoQuit(_THIS) |
{ |
if (has_null_cursor) |
{ |
__asm__("int $0x40"::"a"(37),"b"(6),"c"(null_cursor)); |
has_null_cursor = 0; |
} |
if (has_null_cursor) { |
_ksys_delete_cursor(null_cursor); |
has_null_cursor = 0; |
} |
} |
|
void MenuetOS_FinalQuit(void) |
{ |
} |
void kos_FinalQuit(void) {/*STUB*/} |
|
void MenuetOS_SetCaption(_THIS,const char * title,const char * icon) |
void kos_SetCaption(_THIS,const char * title, const char * icon) |
{ |
this->hidden->__title=(char *)title; |
if(was_initialized) __asm__("int $0x40"::"a"(71),"b"(1),"c"(title)); |
this->hidden->__title=(char *)title; |
if (was_initialized) _ksys_set_window_title(title); |
} |
|
SDL_Surface * MenuetOS_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) |
SDL_Surface *kos_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) |
{ |
int ly; |
char * lx; |
if(bpp!=24) return NULL; |
current->flags=flags; |
current->w=width; |
current->h=height; |
current->pitch=width*(bpp>>3); |
int ly; |
unsigned char* lx; |
if (bpp!=24) return NULL; |
|
char info[100]; |
sprintf(info, "width = %d, height = %d, pitch = %d, bpp = %d\n", current->w, current->h, current->pitch, bpp); |
|
|
void debug_board_write_byte(const char ch){ |
__asm__ __volatile__( |
"int $0x40" |
: |
:"a"(63), "b"(1), "c"(ch)); |
} |
|
void debug_board_write_str(const char* str){ |
while(*str) |
debug_board_write_byte(*str++); |
} |
|
debug_board_write_str(info); |
// __asm__ __volatile__("int3"); |
current->flags=flags; |
current->w=width; |
current->h=height; |
current->pitch=width*(bpp>>3); |
|
current->pixels=this->hidden->__video_buffer=realloc(this->hidden->__video_buffer, |
current->pitch*current->h); |
this->hidden->__lines=(unsigned char **)realloc(this->hidden->__lines, |
sizeof(unsigned char *)*current->h); |
char info[100]; |
sprintf(info, "width = %d, height = %d, pitch = %d, bpp = %d\n", current->w, current->h, current->pitch, bpp); |
_ksys_debug_puts(info); |
|
for(ly=0,lx=current->pixels;ly<current->h;ly++,lx+=current->pitch) |
this->hidden->__lines[ly]=lx; |
current->pixels=this->hidden->__video_buffer=realloc(this->hidden->__video_buffer, current->pitch*current->h); |
this->hidden->__lines=(unsigned char **)realloc(this->hidden->__lines, sizeof(unsigned char *)*current->h); |
|
this->UpdateRects=MenuetOS_DirectUpdate; |
this->hidden->win_size_x=width; |
this->hidden->win_size_y=height; |
vm_suf=this; |
for (ly=0, lx=current->pixels; ly<current->h; ly++, lx+=current->pitch) |
this->hidden->__lines[ly]=lx; |
|
this->UpdateRects=kos_DirectUpdate; |
this->hidden->win_size_x=width; |
this->hidden->win_size_y=height; |
vm_suf=this; |
|
if (was_initialized) |
{ |
unsigned newheight = height+get_skin_height+4; |
unsigned newwidth = width+9; |
|
sys_change_window(-1, -1, newwidth, newheight); |
} |
else |
{ |
|
set_wanted_events_mask(0x27); |
was_initialized=1; |
MenuetOS_SDL_RepaintWnd(); |
} |
return current; |
if (was_initialized) { |
unsigned newheight = height+_ksys_get_skin_height()+WINDOW_BORDER_H; |
unsigned newwidth = width+WINDOW_BORDER_W; |
_ksys_change_window(-1, -1, newwidth, newheight); |
} else { |
_ksys_set_event_mask(0x27); |
was_initialized=1; |
kos_SDL_RepaintWnd(); |
} |
return current; |
} |
|
/*static SDL_Rect video_mode[4]; |
static SDL_Rect * SDL_modelist[4]={NULL,NULL,NULL,NULL};*/ |
|
static SDL_Rect ** MenuetOS_ListModes(_THIS,SDL_PixelFormat * fmt,Uint32 flags) |
static SDL_Rect** kos_ListModes(_THIS,SDL_PixelFormat * fmt,Uint32 flags) |
{ |
// return (&SDL_modelist[((fmt->BitsPerPixel+7)/8)-1]); |
if (fmt->BitsPerPixel==24) |
return (SDL_Rect**)-1; |
else |
return NULL; |
if (fmt->BitsPerPixel==24) |
return (SDL_Rect**)-1; |
else |
return NULL; |
} |
|
static int MenuetOS_Available(void) |
static int kos_Available(void) |
{ |
return 1; |
return 1; |
} |
|
static void MenuetOS_DeleteDevice(_THIS) |
static void kos_DeleteDevice(_THIS) |
{ |
// free(this->hidden->__video_buffer); // it will be freed as current->pixels |
free(this->hidden->__lines); |
// free(this->hidden->__video_buffer); // it will be freed as current->pixels |
free(this->hidden->__lines); |
} |
|
static int MenuetOS_VideoInit(_THIS,SDL_PixelFormat * vformat) |
static int kos_VideoInit(_THIS,SDL_PixelFormat * vformat) |
{ |
#ifdef KEEP_OBSOLETE_STYLE3 |
char buf[16]; |
__asm__("int $0x40"::"a"(18),"b"(13),"c"(buf)); |
if (buf[5]=='K' && buf[6]=='o' && buf[7]=='l' && buf[8]=='i') |
/* kernels up to 0.7.0.0 do not support style 4 */; |
else if (*(unsigned*)(buf+5) >= 549) |
/* window style 4 was introduced in revision 549 */ |
IsStyle4Available = 1; |
#endif |
vformat->BitsPerPixel=24; |
vformat->BytesPerPixel=3; |
this->info.wm_available=1; |
this->info.hw_available=0; |
this->info.video_mem=0x200000; |
/* video_mode[3].x=0; |
video_mode[3].y=0; |
video_mode[3].w=320; |
video_mode[3].h=200; |
video_mode[2].x=0; |
video_mode[2].y=0; |
video_mode[2].w=640; |
video_mode[2].h=400; |
video_mode[1].x=0; |
video_mode[1].y=0; |
video_mode[1].w=320; |
video_mode[1].h=240; |
video_mode[0].x=0; |
video_mode[0].y=0; |
video_mode[0].w=640; |
video_mode[0].h=480; |
SDL_modelist[2]=video_mode+0;*/ |
return 0; |
vformat->BitsPerPixel = 24; |
vformat->BytesPerPixel = 3; |
this->info.wm_available = 1; |
this->info.hw_available = 0; |
this->info.video_mem = 0x200000; |
return 0; |
} |
|
static int MenuetOS_FlipHWSurface(_THIS,SDL_Surface * surface) |
static int kos_FlipHWSurface(_THIS,SDL_Surface * surface) |
{ |
draw_bitmap(surface->pixels, 0,0,surface->w,surface->h); |
return 0; |
_ksys_draw_bitmap(surface->pixels, 0, 0, surface->w,surface->h); |
return 0; |
} |
|
WMcursor* KolibriOS_CreateWMCursor(_THIS, |
Uint8* data, Uint8* mask, int w, int h, int hot_x, int hot_y) |
WMcursor* kos_CreateWMCursor(_THIS, Uint8* data, Uint8* mask, int w, int h, int hot_x, int hot_y) |
{ |
int i,j; |
Uint32* cursor; |
WMcursor* res; |
int i,j; |
Uint32* cursor; |
WMcursor* res; |
|
if (w>32 || h>32) return NULL; |
if (w%8 || h%8) return NULL; |
cursor = (Uint32*)malloc(32*32*4); |
if (!cursor) return NULL; |
for (i=0;i<32;i++) |
for (j=0;j<32;j++) |
{ |
if (i>=h || j>=w) |
{ |
cursor[i*32+j] = 0x00000000; |
continue; |
} |
if (mask[i*w/8+j/8] & (0x80>>(j&7))) |
cursor[i*32+j] = (data[i*w/8+j/8] & (0x80>>(j&7)))?0xFF000000:0xFFFFFFFF; |
else |
cursor[i*32+j] = 0x00000000; |
} |
__asm__ ("int $0x40" : "=a"(res) : "a"(37),"b"(4), |
"c"(cursor),"d"((hot_x<<24)+(hot_y<<16)+2)); |
free(cursor); |
return res; |
if (w>32 || h>32) return NULL; |
if (w%8 || h%8) return NULL; |
cursor = (Uint32*)malloc(32*32*4); |
if (!cursor) return NULL; |
for (i=0;i<32;i++) { |
for (j=0;j<32;j++) { |
if (i>=h || j>=w) { |
cursor[i*32+j] = 0x00000000; |
continue; |
} |
if (mask[i*w/8+j/8] & (0x80>>(j&7))) |
cursor[i*32+j] = (data[i*w/8+j/8] & (0x80>>(j&7)))?0xFF000000:0xFFFFFFFF; |
else |
cursor[i*32+j] = 0x00000000; |
} |
} |
res = _ksys_load_cursor(cursor, (hot_x<<24)+(hot_y<<16)+KSYS_CURSOR_INDIRECT); |
free(cursor); |
return res; |
} |
int KolibriOS_ShowWMCursor(_THIS,WMcursor*cursor) |
|
int kos_ShowWMCursor(_THIS, WMcursor* cursor) |
{ |
if (!cursor) |
{ |
if (!has_null_cursor) |
{ |
unsigned* u = malloc(32*32*4); |
if (!u) return 1; |
memset(u,0,32*32*4); |
__asm__("int $0x40":"=a"(null_cursor): |
"a"(37),"b"(4),"c"(u),"d"(2)); |
free(u); |
has_null_cursor = 1; |
} |
cursor = (WMcursor*)null_cursor; |
} |
__asm__("int $0x40" : : "a"(37),"b"(5),"c"(cursor)); |
return 1; |
if (!cursor) { |
if (!has_null_cursor) { |
unsigned* u = malloc(32*32*4); |
if (!u) return 1; |
memset(u,0,32*32*4); |
null_cursor = _ksys_load_cursor(u, KSYS_CURSOR_INDIRECT); |
free(u); |
has_null_cursor = 1; |
} |
cursor = (WMcursor*)null_cursor; |
} |
_ksys_set_cursor(cursor); |
return 1; |
} |
void KolibriOS_FreeWMCursor(_THIS,WMcursor*cursor) |
void kos_FreeWMCursor(_THIS, WMcursor* cursor) |
{ |
__asm__("int $0x40" : : "a"(37),"b"(6),"c"(cursor)); |
_ksys_delete_cursor(cursor); |
} |
void KolibriOS_CheckMouseMode(_THIS) |
void kos_CheckMouseMode(_THIS) |
{ |
if (this->input_grab == SDL_GRAB_OFF) |
return; |
struct process_table_entry buf; |
int res; |
__asm__ volatile("int $0x40" : "=a"(res): "a"(9), "b"(&buf), "c"(-1)); |
if (res == buf.pos_in_windowing_stack) |
{ |
int x = buf.winx_start + buf.client_left + this->hidden->win_size_x/2; |
int y = buf.winy_start + buf.client_top + this->hidden->win_size_y/2; |
__asm__("int $0x40" : : "a"(18),"b"(19),"c"(4), |
"d"(x*65536+y)); |
} |
if (this->input_grab == SDL_GRAB_OFF) |
return; |
ksys_thread_t thread_info; |
int res = _ksys_thread_info(&thread_info, -1); |
if (res == thread_info.window_pos_info) { |
int x = thread_info.winx_start + thread_info.clientx + this->hidden->win_size_x/2; |
int y = thread_info.winy_start + thread_info.clienty + this->hidden->win_size_y/2; |
_ksys_set_mouse_pos(x, y); |
} |
} |
|
char def_title[] = "KolibriOS SDL App"; |
static SDL_VideoDevice * MenuetOS_CreateDevice(int indx) |
|
static SDL_VideoDevice *kos_CreateDevice(int indx) |
{ |
SDL_VideoDevice * dev; |
dev=(SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); |
if(dev) |
{ |
memset(dev,0,(sizeof *dev)); |
dev->hidden = (struct SDL_PrivateVideoData *)malloc((sizeof *dev->hidden)); |
} |
if((dev==NULL) || (dev->hidden==NULL)) |
{ |
SDL_OutOfMemory(); |
if(dev) |
{ |
free(dev); |
} |
return(0); |
} |
memset(dev->hidden,0,(sizeof *dev->hidden)); |
dev->hidden->__title = def_title; |
dev->VideoInit=MenuetOS_VideoInit; |
dev->ListModes=MenuetOS_ListModes; |
dev->SetVideoMode=MenuetOS_SetVideoMode; |
dev->SetColors=MenuetOS_SetColors; |
dev->UpdateRects=NULL; |
dev->VideoQuit=MenuetOS_VideoQuit; |
dev->AllocHWSurface=MenuetOS_AllocHWSurface; |
dev->CheckHWBlit=NULL; |
dev->FillHWRect=NULL; |
dev->SetHWColorKey=NULL; |
dev->SetHWAlpha=NULL; |
dev->LockHWSurface=MenuetOS_LockHWSurface; |
dev->UnlockHWSurface=MenuetOS_UnlockHWSurface; |
dev->FlipHWSurface=MenuetOS_FlipHWSurface; |
dev->FreeHWSurface=MenuetOS_FreeHWSurface; |
dev->SetCaption=MenuetOS_SetCaption; |
dev->SetIcon=NULL; |
dev->IconifyWindow=NULL; |
dev->GrabInput=NULL; |
dev->GetWMInfo=NULL; |
dev->InitOSKeymap=MenuetOS_InitOSKeymap; |
dev->PumpEvents=MenuetOS_PumpEvents; |
dev->free=MenuetOS_DeleteDevice; |
dev->CreateWMCursor = KolibriOS_CreateWMCursor; |
dev->FreeWMCursor = KolibriOS_FreeWMCursor; |
dev->ShowWMCursor = KolibriOS_ShowWMCursor; |
dev->CheckMouseMode = KolibriOS_CheckMouseMode; |
return dev; |
SDL_VideoDevice * dev; |
dev = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice)); |
if (dev) { |
memset(dev,0,(sizeof *dev)); |
dev->hidden = (struct SDL_PrivateVideoData*)malloc((sizeof *dev->hidden)); |
} |
if ((dev==NULL) || (dev->hidden==NULL)) { |
SDL_OutOfMemory(); |
if(dev) { |
free(dev); |
} |
return(0); |
} |
|
memset(dev->hidden, 0, (sizeof *dev->hidden)); |
dev->hidden->__title = def_title; |
dev->VideoInit = kos_VideoInit; |
dev->ListModes = kos_ListModes; |
dev->SetVideoMode = kos_SetVideoMode; |
dev->SetColors = kos_SetColors; |
dev->UpdateRects = NULL; |
dev->VideoQuit = kos_VideoQuit; |
dev->AllocHWSurface=kos_AllocHWSurface; |
dev->CheckHWBlit = NULL; |
dev->FillHWRect = NULL; |
dev->SetHWColorKey = NULL; |
dev->SetHWAlpha = NULL; |
dev->LockHWSurface = kos_LockHWSurface; |
dev->UnlockHWSurface = kos_UnlockHWSurface; |
dev->FlipHWSurface = kos_FlipHWSurface; |
dev->FreeHWSurface = kos_FreeHWSurface; |
dev->SetCaption = kos_SetCaption; |
dev->SetIcon = NULL; |
dev->IconifyWindow = NULL; |
dev->GrabInput = NULL; |
dev->GetWMInfo = NULL; |
dev->InitOSKeymap = MenuetOS_InitOSKeymap; |
dev->PumpEvents = MenuetOS_PumpEvents; |
dev->free = kos_DeleteDevice; |
dev->CreateWMCursor = kos_CreateWMCursor; |
dev->FreeWMCursor = kos_FreeWMCursor; |
dev->ShowWMCursor = kos_ShowWMCursor; |
dev->CheckMouseMode = kos_CheckMouseMode; |
return dev; |
} |
|
VideoBootStrap mosvideo_bootstrab={ |
"menuetos","MenuetOS Device Driver", |
MenuetOS_Available,MenuetOS_CreateDevice, |
"kolibrios", "KolibriOS Device Driver", |
kos_Available, kos_CreateDevice, |
}; |