📄 sdl_riscosfullscreenvideo.c
字号:
{ from = this->hidden->bank[0] + rects->x * xmult + rects->y * pitch; to = this->hidden->bank[1] + rects->x * xmult + rects->y * pitch; for (row = 0; row < rects->h; row++) { SDL_memcpy(to, from, rects->w * xmult); from += pitch; to += pitch; } rects++; }}/* Use optimized assembler memory copy. Deliberately copies extra columns if necessary to ensure the rectangle is word aligned. */static void FULLSCREEN_UpdateRects8bpp(_THIS, int numrects, SDL_Rect *rects){ int j; char *to, *from; int pitch = this->screen->pitch; int width_bytes; int src_skip_bytes; for (j = 0; j < numrects; j++) { from = this->hidden->bank[0] + rects->x + rects->y * pitch; to = this->hidden->bank[1] + rects->x + rects->y * pitch; width_bytes = rects->w; if ((int)from & 3) { int extra = ((int)from & 3); from -= extra; to -= extra; width_bytes += extra; } if (width_bytes & 3) width_bytes += 4 - (width_bytes & 3); src_skip_bytes = pitch - width_bytes; RISCOS_Put32(to, (width_bytes >> 2), pitch, (int)rects->h, from, src_skip_bytes); rects++; }}/* Use optimized assembler memory copy. Deliberately copies extra columns if necessary to ensure the rectangle is word aligned. */static void FULLSCREEN_UpdateRects16bpp(_THIS, int numrects, SDL_Rect *rects){ int j; char *to, *from; int pitch = this->screen->pitch; int width_bytes; int src_skip_bytes; for (j = 0; j < numrects; j++) { from = this->hidden->bank[0] + (rects->x << 1) + rects->y * pitch; to = this->hidden->bank[1] + (rects->x << 1) + rects->y * pitch; width_bytes = (((int)rects->w) << 1); if ((int)from & 3) { from -= 2; to -= 2; width_bytes += 2; } if (width_bytes & 3) width_bytes += 2; src_skip_bytes = pitch - width_bytes; RISCOS_Put32(to, (width_bytes >> 2), pitch, (int)rects->h, from, src_skip_bytes); rects++; }}/* Use optimized assembler memory copy. 32 bpp modes are always word aligned */static void FULLSCREEN_UpdateRects32bpp(_THIS, int numrects, SDL_Rect *rects){ int j; char *to, *from; int pitch = this->screen->pitch; int width; for (j = 0; j < numrects; j++) { from = this->hidden->bank[0] + (rects->x << 2) + rects->y * pitch; to = this->hidden->bank[1] + (rects->x << 2) + rects->y * pitch; width = (int)rects->w ; RISCOS_Put32(to, width, pitch, (int)rects->h, from, pitch - (width << 2)); rects++; }}/* Use operating system sprite plots. Currently this is much slower than the other variants however accelerated sprite plotting can be seen on the horizon so this prepares for it. */static void FULLSCREEN_UpdateRectsOS(_THIS, int numrects, SDL_Rect *rects){ _kernel_swi_regs regs; _kernel_oserror *err; int j; int y; regs.r[0] = 28 + 512; regs.r[1] = (unsigned int)this->hidden->alloc_bank; regs.r[2] = (unsigned int)this->hidden->alloc_bank+16; regs.r[5] = 0; for (j = 0; j < numrects; j++) { y = this->screen->h - rects->y; /* top of clipping region */ _kernel_oswrch(24); /* Set graphics clip region */ _kernel_oswrch((rects->x << this->hidden->xeig) & 0xFF); /* left */ _kernel_oswrch(((rects->x << this->hidden->xeig) >> 8) & 0xFF); _kernel_oswrch(((y - rects->h) << this->hidden->yeig) & 0xFF); /* bottom */ _kernel_oswrch((((y - rects->h) << this->hidden->yeig)>> 8) & 0xFF); _kernel_oswrch(((rects->x + rects->w - 1) << this->hidden->xeig) & 0xFF); /* right */ _kernel_oswrch((((rects->x + rects->w - 1)<< this->hidden->xeig) >> 8) & 0xFF); _kernel_oswrch(((y-1) << this->hidden->yeig) & 0xFF); /* top */ _kernel_oswrch((((y-1) << this->hidden->yeig) >> 8) & 0xFF); regs.r[3] = 0; regs.r[4] = 0; if ((err = _kernel_swi(OS_SpriteOp, ®s, ®s)) != 0) { printf("OS_SpriteOp failed \n%s\n",err->errmess); } rects++; /* Reset to full screen clipping */ _kernel_oswrch(24); /* Set graphics clip region */ _kernel_oswrch(0); /* left */ _kernel_oswrch(0); _kernel_oswrch(0); /* bottom */ _kernel_oswrch(0); _kernel_oswrch(((this->screen->w-1) << this->hidden->xeig) & 0xFF); /* right */ _kernel_oswrch((((this->screen->w-1) << this->hidden->xeig) >> 8) & 0xFF); _kernel_oswrch(((this->screen->h-1) << this->hidden->yeig) & 0xFF); /* top */ _kernel_oswrch((((this->screen->h-1) << this->hidden->yeig) >> 8) & 0xFF); }}int FULLSCREEN_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors){ _kernel_swi_regs regs; int palette[256]; regs.r[0] = -1; regs.r[1] = -1; regs.r[2] = (int)palette; regs.r[3] = 1024; regs.r[4] = 0; _kernel_swi(ColourTrans_ReadPalette, ®s, ®s); while(ncolors--) { palette[firstcolor] = ((colors->b) << 24) | ((colors->g) << 16) | ((colors->r) << 8); firstcolor++; colors++; } regs.r[0] = -1; regs.r[1] = -1; regs.r[2] = (int)palette; regs.r[3] = 0; regs.r[4] = 0; _kernel_swi(ColourTrans_WritePalette, ®s, ®s); return(1);}static int cmpmodes(const void *va, const void *vb){ SDL_Rect *a = *(SDL_Rect **)va; SDL_Rect *b = *(SDL_Rect **)vb; if(a->w == b->w) return b->h - a->h; else return b->w - a->w;}static int FULLSCREEN_AddMode(_THIS, int bpp, int w, int h){ SDL_Rect *mode; int i, index; int next_mode; /* Check to see if we already have this mode */ if ( bpp < 8 ) { /* Not supported */ return(0); } index = ((bpp+7)/8)-1; for ( i=0; i<SDL_nummodes[index]; ++i ) { mode = SDL_modelist[index][i]; if ( (mode->w == w) && (mode->h == h) ) { return(0); } } /* Set up the new video mode rectangle */ mode = (SDL_Rect *)SDL_malloc(sizeof *mode); if ( mode == NULL ) { SDL_OutOfMemory(); return(-1); } mode->x = 0; mode->y = 0; mode->w = w; mode->h = h; /* Allocate the new list of modes, and fill in the new mode */ next_mode = SDL_nummodes[index]; SDL_modelist[index] = (SDL_Rect **) SDL_realloc(SDL_modelist[index], (1+next_mode+1)*sizeof(SDL_Rect *)); if ( SDL_modelist[index] == NULL ) { SDL_OutOfMemory(); SDL_nummodes[index] = 0; SDL_free(mode); return(-1); } SDL_modelist[index][next_mode] = mode; SDL_modelist[index][next_mode+1] = NULL; SDL_nummodes[index]++; return(0);}void FULLSCREEN_SetWriteBank(int bank){ _kernel_swi_regs regs; regs.r[0] = 112; regs.r[1] = bank+1; _kernel_swi(OS_Byte, ®s, ®s);}void FULLSCREEN_SetDisplayBank(int bank){ _kernel_swi_regs regs; regs.r[0] = 113; regs.r[1] = bank+1; _kernel_swi(OS_Byte, ®s, ®s);}/** Disable special escape key processing */static void FULLSCREEN_DisableEscape(){ _kernel_swi_regs regs; regs.r[0] = 229; regs.r[1] = 1; regs.r[2] = 0; _kernel_swi(OS_Byte, ®s, ®s); }/** Enable special escape key processing */static void FULLSCREEN_EnableEscape(){ _kernel_swi_regs regs; regs.r[0] = 229; regs.r[1] = 0; regs.r[2] = 0; _kernel_swi(OS_Byte, ®s, ®s); }/** Store caption in case this is called before we create a window */void FULLSCREEN_SetWMCaption(_THIS, const char *title, const char *icon){ SDL_strlcpy(this->hidden->title, title, SDL_arraysize(this->hidden->title));}/* Set screen mode** Returns 1 if mode is set ok, otherwise 0*/int FULLSCREEN_SetMode(int width, int height, int bpp){ SCREENMODEBLOCK smb; _kernel_swi_regs regs; smb.flags = 1; smb.x_pixels = width; smb.y_pixels = height; smb.mode_vars[0] = -1; switch(bpp) { case 8: smb.pixel_depth = 3; /* Note: Need to set ModeFlags to 128 and NColour variables to 255 get full 8 bit palette */ smb.mode_vars[0] = 0; smb.mode_vars[1] = 128; /* Mode flags */ smb.mode_vars[2] = 3; smb.mode_vars[3] = 255; /* NColour (number of colours -1) */ smb.mode_vars[4] = -1; /* End of list */ break; case 15: case 16: smb.pixel_depth = 4; break; case 32: smb.pixel_depth = 5; break; default: SDL_SetError("Pixel depth not supported"); return 0; break; } smb.frame_rate = -1; regs.r[0] = 0; regs.r[1] = (int)&smb; if (_kernel_swi(OS_ScreenMode, ®s, ®s) != 0) { SDL_SetError("Couldn't set requested mode"); return 0; } /* Turn cursor off*/ _kernel_oswrch(23);_kernel_oswrch(1);_kernel_oswrch(0); _kernel_oswrch(0);_kernel_oswrch(0);_kernel_oswrch(0); _kernel_oswrch(0);_kernel_oswrch(0);_kernel_oswrch(0); _kernel_oswrch(0);_kernel_oswrch(0); return 1;}/* Get Start addresses for the screen banks */void FULLSCREEN_SetupBanks(_THIS){ _kernel_swi_regs regs; int block[5]; block[0] = 148; /* Write screen start */ block[1] = 149; /* Display screen start */ block[2] = 4; /* X eig factor */ block[3] = 5; /* Y eig factor */ block[4] = -1; /* End of list of variables to request */ regs.r[0] = (int)block; regs.r[1] = (int)block; _kernel_swi(OS_ReadVduVariables, ®s, ®s); this->hidden->bank[0] = (void *)block[0]; this->hidden->bank[1] = (void *)block[1]; this->hidden->xeig = block[2]; this->hidden->yeig = block[3];}/* Toggle to full screen mode from the WIMP */int FULLSCREEN_ToggleFromWimp(_THIS){ int width = this->screen->w; int height = this->screen->h; int bpp = this->screen->format->BitsPerPixel; RISCOS_StoreWimpMode(); if (FULLSCREEN_SetMode(width, height, bpp)) { char *buffer = this->hidden->alloc_bank; /* This is start of sprite data */ /* Support back buffer mode only */ if (riscos_backbuffer == 0) riscos_backbuffer = 1; FULLSCREEN_SetupBanks(this); this->hidden->bank[0] = buffer + 60; /* Start of sprite data */ if (bpp == 8) this->hidden->bank[0] += 2048; /* 8bpp sprite have palette first */ this->hidden->current_bank = 0; this->screen->pixels = this->hidden->bank[0]; /* Copy back buffer to screen memory */ SDL_memcpy(this->hidden->bank[1], this->hidden->bank[0], width * height * this->screen->format->BytesPerPixel); FULLSCREEN_SetDeviceMode(this); return 1; } else RISCOS_RestoreWimpMode(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -