SDL_xbios.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:20k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_xbios.c,v 1.1 2002/04/22 21:38:06 wmay Exp $";
  21. #endif
  22. /*
  23.  * Xbios SDL video driver
  24.  * 
  25.  * Patrice Mandin
  26.  */
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <sys/stat.h>
  31. #include <unistd.h>
  32. /* Mint includes */
  33. #include <sys/cookie.h>
  34. #include <mint/osbind.h>
  35. #include <mint/falcon.h>
  36. #include "SDL.h"
  37. #include "SDL_error.h"
  38. #include "SDL_video.h"
  39. #include "SDL_mouse.h"
  40. #include "SDL_sysvideo.h"
  41. #include "SDL_pixels_c.h"
  42. #include "SDL_events_c.h"
  43. #include "SDL_ataric2p_s.h"
  44. #include "SDL_ataric2p060_c.h"
  45. #include "SDL_atarievents_c.h"
  46. #include "SDL_atarimxalloc_c.h"
  47. #include "SDL_xbios.h"
  48. #define XBIOS_VID_DRIVER_NAME "xbios"
  49. /* Initialization/Query functions */
  50. static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat);
  51. static SDL_Rect **XBIOS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
  52. static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
  53. static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
  54. static void XBIOS_VideoQuit(_THIS);
  55. /* Hardware surface functions */
  56. static int XBIOS_AllocHWSurface(_THIS, SDL_Surface *surface);
  57. static int XBIOS_LockHWSurface(_THIS, SDL_Surface *surface);
  58. static int XBIOS_FlipHWSurface(_THIS, SDL_Surface *surface);
  59. static void XBIOS_UnlockHWSurface(_THIS, SDL_Surface *surface);
  60. static void XBIOS_FreeHWSurface(_THIS, SDL_Surface *surface);
  61. static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
  62. /* List of video modes */
  63. /* ST modes */
  64. static int xbiosnummodes_st=1;
  65. static xbiosmode_t xbiosmodelist_st[]={
  66. {ST_LOW>>8,320,200,4,SDL_FALSE}
  67. };
  68. /* TT modes */
  69. static int xbiosnummodes_tt=2;
  70. static xbiosmode_t xbiosmodelist_tt[]={
  71. {TT_LOW,320,480,8,SDL_FALSE},
  72. {TT_LOW,320,240,8,SDL_TRUE} /* Software double-lined mode */
  73. };
  74. /* Falcon RVB modes */
  75. static int xbiosnummodes_f30rvb=16;
  76. static xbiosmode_t xbiosmodelist_f30rvb[]={
  77. {BPS16|COL80|OVERSCAN|VERTFLAG,768,480,16,SDL_FALSE},
  78. {BPS16|COL80|OVERSCAN,768,240,16,SDL_FALSE},
  79. {BPS16|COL80|VERTFLAG,640,400,16,SDL_FALSE},
  80. {BPS16|COL80,640,200,16,SDL_FALSE},
  81. {BPS16|OVERSCAN|VERTFLAG,384,480,16,SDL_FALSE},
  82. {BPS16|OVERSCAN,384,240,16,SDL_FALSE},
  83. {BPS16|VERTFLAG,320,400,16,SDL_FALSE},
  84. {BPS16,320,200,16,SDL_FALSE},
  85. {BPS8|COL80|OVERSCAN|VERTFLAG,768,480,8,SDL_FALSE},
  86. {BPS8|COL80|OVERSCAN,768,240,8,SDL_FALSE},
  87. {BPS8|COL80|VERTFLAG,640,400,8,SDL_FALSE},
  88. {BPS8|COL80,640,200,8,SDL_FALSE},
  89. {BPS8|OVERSCAN|VERTFLAG,384,480,8,SDL_FALSE},
  90. {BPS8|OVERSCAN,384,240,8,SDL_FALSE},
  91. {BPS8|VERTFLAG,320,400,8,SDL_FALSE},
  92. {BPS8,320,200,8,SDL_FALSE}
  93. };
  94. /* Falcon VGA modes */
  95. static int xbiosnummodes_f30vga=6;
  96. static xbiosmode_t xbiosmodelist_f30vga[]={
  97. {BPS16,320,480,16,SDL_FALSE},
  98. {BPS16|VERTFLAG,320,240,16,SDL_FALSE},
  99. {BPS8|COL80,640,480,8,SDL_FALSE},
  100. {BPS8|COL80|VERTFLAG,640,240,8,SDL_FALSE},
  101. {BPS8,320,480,8,SDL_FALSE},
  102. {BPS8|VERTFLAG,320,240,8,SDL_FALSE}
  103. };
  104. /* To setup palette */
  105. static unsigned short TT_palette[256];
  106. static unsigned long F30_palette[256];
  107. /* Xbios driver bootstrap functions */
  108. static int XBIOS_Available(void)
  109. {
  110. const char *envr = getenv("SDL_VIDEODRIVER");
  111. unsigned long cookie_vdo;
  112. /* Check if user asked a different video driver */
  113. if ((envr) && (strcmp(envr, XBIOS_VID_DRIVER_NAME)!=0)) {
  114. return 0;
  115. }
  116. /* Cookie _VDO present ? if not, assume ST machine */
  117. if (Getcookie(C__VDO, &cookie_vdo) != C_FOUND) {
  118. cookie_vdo = VDO_ST << 16;
  119. }
  120. /* Test if we have a monochrome monitor plugged in */
  121. switch( cookie_vdo >>16) {
  122. case VDO_ST:
  123. case VDO_STE:
  124. if ( Getrez() == (ST_HIGH>>8) )
  125. return 0;
  126. break;
  127. case VDO_TT:
  128. if ( (EgetShift() & ES_MODE) == TT_HIGH)
  129. return 0;
  130. break;
  131. case VDO_F30:
  132. if ( Montype() == MONITOR_MONO)
  133. return 0;
  134. break;
  135. default:
  136. return 0;
  137. }
  138. return 1;
  139. }
  140. static void XBIOS_DeleteDevice(SDL_VideoDevice *device)
  141. {
  142. free(device->hidden);
  143. free(device);
  144. }
  145. static SDL_VideoDevice *XBIOS_CreateDevice(int devindex)
  146. {
  147. SDL_VideoDevice *device;
  148. /* Initialize all variables that we clean on shutdown */
  149. device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
  150. if ( device ) {
  151. memset(device, 0, (sizeof *device));
  152. device->hidden = (struct SDL_PrivateVideoData *)
  153. malloc((sizeof *device->hidden));
  154. }
  155. if ( (device == NULL) || (device->hidden == NULL) ) {
  156. SDL_OutOfMemory();
  157. if ( device ) {
  158. free(device);
  159. }
  160. return(0);
  161. }
  162. memset(device->hidden, 0, (sizeof *device->hidden));
  163. atari_test_cpu060_present();
  164. /* Video functions */
  165. device->VideoInit = XBIOS_VideoInit;
  166. device->ListModes = XBIOS_ListModes;
  167. device->SetVideoMode = XBIOS_SetVideoMode;
  168. device->SetColors = XBIOS_SetColors;
  169. device->UpdateRects = NULL;
  170. device->VideoQuit = XBIOS_VideoQuit;
  171. device->AllocHWSurface = XBIOS_AllocHWSurface;
  172. device->LockHWSurface = XBIOS_LockHWSurface;
  173. device->UnlockHWSurface = XBIOS_UnlockHWSurface;
  174. device->FlipHWSurface = XBIOS_FlipHWSurface;
  175. device->FreeHWSurface = XBIOS_FreeHWSurface;
  176. /* Events */
  177. device->InitOSKeymap = Atari_InitOSKeymap;
  178. device->PumpEvents = Atari_PumpEvents;
  179. device->free = XBIOS_DeleteDevice;
  180. return device;
  181. }
  182. VideoBootStrap XBIOS_bootstrap = {
  183. XBIOS_VID_DRIVER_NAME, "Atari Xbios driver",
  184. XBIOS_Available, XBIOS_CreateDevice
  185. };
  186. static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
  187. {
  188. int i,j8,j16;
  189. xbiosmode_t *current_mode;
  190. /* Initialize all variables that we clean on shutdown */
  191. memset (SDL_modelist, 0, sizeof(SDL_modelist));
  192. /* Cookie _VDO present ? if not, assume ST machine */
  193. if (Getcookie(C__VDO, &XBIOS_cvdo) != C_FOUND) {
  194. XBIOS_cvdo = VDO_ST << 16;
  195. }
  196. /* Allocate memory for old palette */
  197. XBIOS_oldpalette = (void *)malloc(256*sizeof(long));
  198. if ( !XBIOS_oldpalette ) {
  199. SDL_SetError("Unable to allocate memory for old paletten");
  200. return(-1);
  201. }
  202. /* Initialize video mode list */
  203. /* and save current screen status (palette, screen address, video mode) */
  204. switch (XBIOS_cvdo >>16) {
  205. case VDO_ST:
  206. case VDO_STE:
  207. {
  208. short *oldpalette;
  209. XBIOS_nummodes=xbiosnummodes_st;
  210. XBIOS_modelist=xbiosmodelist_st;
  211. XBIOS_oldvbase=Physbase();
  212. XBIOS_oldvmode=Getrez();
  213. switch(XBIOS_oldvmode << 8) {
  214. case ST_LOW:
  215. XBIOS_oldnumcol=16;
  216. break;
  217. case ST_MED:
  218. XBIOS_oldnumcol=4;
  219. break;
  220. case ST_HIGH:
  221. XBIOS_oldnumcol=2;
  222. break;
  223. default:
  224. XBIOS_oldnumcol=0;
  225. break;
  226. }
  227. oldpalette= (short *) XBIOS_oldpalette;
  228. for (i=0;i<XBIOS_oldnumcol;i++) {
  229. *oldpalette++=Setcolor(i,-1);
  230. }
  231. vformat->BitsPerPixel = 8;
  232. }
  233. break;
  234. case VDO_TT:
  235. XBIOS_nummodes=xbiosnummodes_tt;
  236. XBIOS_modelist=xbiosmodelist_tt;
  237. XBIOS_oldvbase=Logbase();
  238. XBIOS_oldvmode=EgetShift();
  239. switch(XBIOS_oldvmode & ES_MODE) {
  240. case TT_LOW:
  241. XBIOS_oldnumcol=256;
  242. break;
  243. case ST_LOW:
  244. case TT_MED:
  245. XBIOS_oldnumcol=16;
  246. break;
  247. case ST_MED:
  248. XBIOS_oldnumcol=4;
  249. break;
  250. case ST_HIGH:
  251. case TT_HIGH:
  252. XBIOS_oldnumcol=2;
  253. break;
  254. default:
  255. XBIOS_oldnumcol=0;
  256. break;
  257. }
  258. if (XBIOS_oldnumcol) {
  259. EgetPalette(0, XBIOS_oldnumcol, XBIOS_oldpalette);
  260. }
  261. vformat->BitsPerPixel = 8;
  262. break;
  263. case VDO_F30:
  264. switch (Montype())
  265. {
  266. case MONITOR_MONO:
  267. /* Not usable */
  268. break;
  269. case MONITOR_RGB:
  270. case MONITOR_TV:
  271. XBIOS_nummodes = xbiosnummodes_f30rvb;
  272. XBIOS_modelist = xbiosmodelist_f30rvb;
  273. break;
  274. case MONITOR_VGA:
  275. XBIOS_nummodes = xbiosnummodes_f30vga;
  276. XBIOS_modelist = xbiosmodelist_f30vga;
  277. break;
  278. }
  279. XBIOS_oldvbase=Logbase();
  280. XBIOS_oldvmode=Vsetmode(-1);
  281. XBIOS_oldnumcol= 1<< (1 << (XBIOS_oldvmode & NUMCOLS));
  282. if (XBIOS_oldnumcol > 256) {
  283. XBIOS_oldnumcol = 0;
  284. }
  285. if (XBIOS_oldnumcol) {
  286. VgetRGB(0, XBIOS_oldnumcol, XBIOS_oldpalette);
  287. }
  288. vformat->BitsPerPixel = 16;
  289. /* Keep vga/rvb, and pal/ntsc bits */
  290. current_mode = XBIOS_modelist;
  291. for (i=0;i<XBIOS_nummodes;i++) {
  292. Uint16 newvmode;
  293. newvmode = current_mode->number;
  294. newvmode &= ~(VGA|PAL);
  295. newvmode |= XBIOS_oldvmode & (VGA|PAL);
  296. current_mode->number = newvmode;
  297. current_mode++;
  298. }
  299. break;
  300. }
  301. current_mode = XBIOS_modelist;
  302. j8 = j16 = 0;
  303. for (i=0;i<XBIOS_nummodes;i++) {
  304. switch (current_mode->depth) {
  305. case 4:
  306. case 8:
  307. SDL_modelist[0][j8] = malloc(sizeof(SDL_Rect));
  308. SDL_modelist[0][j8]->x = SDL_modelist[0][j8]->y = 0;
  309. SDL_modelist[0][j8]->w = current_mode->width;
  310. SDL_modelist[0][j8]->h = current_mode->height;
  311. XBIOS_videomodes[0][j8]=current_mode;
  312. current_mode++;
  313. j8++;
  314. break;
  315. case 16:
  316. SDL_modelist[1][j16] = malloc(sizeof(SDL_Rect));
  317. SDL_modelist[1][j16]->x = SDL_modelist[1][j16]->y = 0;
  318. SDL_modelist[1][j16]->w = current_mode->width;
  319. SDL_modelist[1][j16]->h = current_mode->height;
  320. XBIOS_videomodes[1][j16]=current_mode;
  321. current_mode++;
  322. j16++;
  323. break;
  324. }
  325. }
  326. SDL_modelist[0][j8] = NULL;
  327. SDL_modelist[1][j16] = NULL;
  328. XBIOS_screens[0]=NULL;
  329. XBIOS_screens[1]=NULL;
  330. XBIOS_shadowscreen=NULL;
  331. /* Update hardware info */
  332. this->info.hw_available = 1;
  333. this->info.video_mem = (Uint32) Atari_SysMalloc(-1L, MX_STRAM);
  334. /* Init chunky to planar routine */
  335. Atari_C2pInit = Atari_C2pInit8;
  336. if (atari_cpu060_avail) {
  337. Atari_C2pConvert = Atari_C2pConvert8_060;
  338. } else {
  339. Atari_C2pConvert = Atari_C2pConvert8;
  340. }
  341. Atari_C2pInit();
  342. /* We're done! */
  343. return(0);
  344. }
  345. static SDL_Rect **XBIOS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
  346. {
  347. /* 8 bits -> list 0 */
  348. /* 16 bits -> list 1 */
  349. return(SDL_modelist[(format->BitsPerPixel)>>4]);
  350. }
  351. static void XBIOS_FreeBuffers(_THIS)
  352. {
  353. int i;
  354. for (i=0;i<2;i++) {
  355. if (XBIOS_screensmem[i]!=NULL) {
  356. Mfree(XBIOS_screensmem[i]);
  357. XBIOS_screensmem[i]=NULL;
  358. }
  359. }
  360. if (XBIOS_shadowscreen!=NULL) {
  361. Mfree(XBIOS_shadowscreen);
  362. XBIOS_shadowscreen=NULL;
  363. }
  364. }
  365. static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current,
  366. int width, int height, int bpp, Uint32 flags)
  367. {
  368. int mode, new_depth;
  369. int i;
  370. xbiosmode_t *new_video_mode;
  371. Uint32 new_screen_size;
  372. Uint32 modeflags;
  373. /* Free current buffers */
  374. XBIOS_FreeBuffers(this);
  375. /* Search if the mode exists (width, height, bpp) */
  376. bpp >>= 4;
  377. for ( mode=0; SDL_modelist[bpp][mode]; ++mode ) {
  378. if ( (SDL_modelist[bpp][mode]->w == width) &&
  379.      (SDL_modelist[bpp][mode]->h == height) ) {
  380. break;
  381. }
  382. }
  383. if ( SDL_modelist[bpp][mode] == NULL ) {
  384. SDL_SetError("Couldn't find requested mode in list");
  385. return(NULL);
  386. }
  387. modeflags = (SDL_FULLSCREEN|SDL_HWPALETTE);
  388. /* Allocate needed buffers: simple/double buffer and shadow surface */
  389. new_video_mode = XBIOS_videomodes[bpp][mode];
  390. new_depth = new_video_mode->depth;
  391. if (new_depth == 4) {
  392. Atari_C2pInit = Atari_C2pInit4;
  393. if (atari_cpu060_avail) {
  394. Atari_C2pConvert = Atari_C2pConvert4_060;
  395. } else {
  396. Atari_C2pConvert = Atari_C2pConvert4;
  397. }
  398. new_depth=8;
  399. modeflags |= SDL_SWSURFACE;
  400. } else if (new_depth == 8) {
  401. Atari_C2pInit = Atari_C2pInit8;
  402. if (atari_cpu060_avail) {
  403. Atari_C2pConvert = Atari_C2pConvert8_060;
  404. } else {
  405. Atari_C2pConvert = Atari_C2pConvert8;
  406. }
  407. modeflags |= SDL_SWSURFACE;
  408. } else {
  409. modeflags |= SDL_HWSURFACE;
  410. }
  411. new_screen_size = width * height * ((new_depth)>>3);
  412. new_screen_size += 256; /* To align on a 256 byte adress */
  413. if (new_depth == 8) {
  414. XBIOS_shadowscreen = Atari_SysMalloc(new_screen_size, MX_PREFTTRAM);
  415. if (XBIOS_shadowscreen == NULL) {
  416. SDL_SetError("XBIOS_SetVideoMode: Not enough memory for shadow surface");
  417. return (NULL);
  418. }
  419. memset(XBIOS_shadowscreen, 0, new_screen_size);
  420. }
  421. /* Output buffer needs to be twice in size for the software double-line mode */
  422. XBIOS_doubleline = SDL_FALSE;
  423. if (new_video_mode->doubleline) {
  424. new_screen_size <<= 1;
  425. XBIOS_doubleline = SDL_TRUE;
  426. }
  427. XBIOS_screensmem[0] = Atari_SysMalloc(new_screen_size, MX_STRAM);
  428. if (XBIOS_screensmem[0]==NULL) {
  429. XBIOS_FreeBuffers(this);
  430. SDL_SetError("XBIOS_SetVideoMode: Not enough memory for video buffer");
  431. return (NULL);
  432. }
  433. memset(XBIOS_screensmem[0], 0, new_screen_size);
  434. XBIOS_screens[0]=(void *) (( (long) XBIOS_screensmem[0]+256) & 0xFFFFFF00UL);
  435. /* Double buffer ? */
  436. if (flags & SDL_DOUBLEBUF) {
  437. XBIOS_screensmem[1] = Atari_SysMalloc(new_screen_size, MX_STRAM);
  438. if (XBIOS_screensmem[1]==NULL) {
  439. XBIOS_FreeBuffers(this);
  440. SDL_SetError("XBIOS_SetVideoMode: Not enough memory for double buffer");
  441. return (NULL);
  442. }
  443. memset(XBIOS_screensmem[1], 0, new_screen_size);
  444. XBIOS_screens[1]=(void *) (( (long) XBIOS_screensmem[1]+256) & 0xFFFFFF00UL);
  445. modeflags |= SDL_DOUBLEBUF;
  446. }
  447. /* Allocate the new pixel format for the screen */
  448. if ( ! SDL_ReallocFormat(current, new_depth, 0, 0, 0, 0) ) {
  449. XBIOS_FreeBuffers(this);
  450. SDL_SetError("Couldn't allocate new pixel format for requested mode");
  451. return(NULL);
  452. }
  453. current->flags = modeflags;
  454. current->w = XBIOS_width = width;
  455. current->h = XBIOS_height = height;
  456. current->pitch = (width * new_depth)>>3;
  457. /* this is for C2P conversion */
  458. XBIOS_pitch = (new_video_mode->width * new_video_mode->depth)>>3;
  459. if (new_depth == 8)
  460. current->pixels = XBIOS_shadowscreen;
  461. else
  462. current->pixels = XBIOS_screens[0];
  463. XBIOS_fbnum = 0;
  464. /* Now set the video mode */
  465. Setscreen(-1,XBIOS_screens[0],-1);
  466. switch(XBIOS_cvdo >> 16) {
  467. case VDO_ST:
  468. Setscreen(-1,-1,new_video_mode->number);
  469. /* Reset palette */
  470. for (i=0;i<16;i++) {
  471. int c;
  472. c = ((i>>1)<<8) | ((i>>1)<<4) | (i>>1);
  473. if ((i & 1) && (i<15))
  474. c += (1<<4);
  475. if (i==14)
  476. c -= 1<<8;
  477. TT_palette[i]= c;
  478. }
  479. Setpalette(TT_palette);
  480. break;
  481. case VDO_STE:
  482. Setscreen(-1,-1,new_video_mode->number);
  483. /* Reset palette */
  484. for (i=0;i<16;i++)
  485. {
  486. int c;
  487. c=((i&1)<<3)|((i>>1)&7);
  488. TT_palette[i]=(c<<8)|(c<<4)|c;
  489. }
  490. Setpalette(TT_palette);
  491. break;
  492. case VDO_TT:
  493. EsetShift(new_video_mode->number);
  494. break;
  495. case VDO_F30:
  496. Vsetmode(new_video_mode->number);
  497. break;
  498. }
  499. Vsync();
  500. this->UpdateRects = XBIOS_UpdateRects;
  501. return (current);
  502. }
  503. /* We don't actually allow hardware surfaces other than the main one */
  504. static int XBIOS_AllocHWSurface(_THIS, SDL_Surface *surface)
  505. {
  506. return(-1);
  507. }
  508. static void XBIOS_FreeHWSurface(_THIS, SDL_Surface *surface)
  509. {
  510. return;
  511. }
  512. static int XBIOS_LockHWSurface(_THIS, SDL_Surface *surface)
  513. {
  514. return(0);
  515. }
  516. static void XBIOS_UnlockHWSurface(_THIS, SDL_Surface *surface)
  517. {
  518. return;
  519. }
  520. static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
  521. {
  522. SDL_Surface *surface;
  523. surface = this->screen;
  524. if ((surface->format->BitsPerPixel) == 8) {
  525. void *destscr;
  526. int destx;
  527. int i;
  528. /* Center on destination screen */
  529. destscr = XBIOS_screens[XBIOS_fbnum];
  530. destscr += XBIOS_pitch * ((XBIOS_height - surface->h) >> 1);
  531. destx = (XBIOS_width - surface->w) >> 1;
  532. destx &= ~15;
  533. destscr += destx;
  534. for (i=0;i<numrects;i++) {
  535. void *source,*destination;
  536. int x1,x2;
  537. x1 = rects[i].x & ~15;
  538. x2 = rects[i].x+rects[i].w;
  539. if (x2 & 15) {
  540. x2 = (x2 | 15) +1;
  541. }
  542. source = surface->pixels;
  543. source += surface->pitch * rects[i].y;
  544. source += x1;
  545. destination = destscr;
  546. destination += XBIOS_pitch * rects[i].y;
  547. destination += x1;
  548. /* Convert chunky to planar screen */
  549. Atari_C2pConvert(
  550. source,
  551. destination,
  552. x2-x1,
  553. rects[i].h,
  554. XBIOS_doubleline,
  555. surface->pitch,
  556. XBIOS_pitch
  557. );
  558. }
  559. }
  560. Setscreen(-1,XBIOS_screens[XBIOS_fbnum],-1);
  561. Vsync();
  562. if ((surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) {
  563. XBIOS_fbnum ^= 1;
  564. if ((surface->format->BitsPerPixel) > 8) {
  565. surface->pixels=XBIOS_screens[XBIOS_fbnum];
  566. }
  567. }
  568. }
  569. static int XBIOS_FlipHWSurface(_THIS, SDL_Surface *surface)
  570. {
  571. if ((surface->format->BitsPerPixel) == 8) {
  572. void *destscr;
  573. int destx;
  574. /* Center on destination screen */
  575. destscr = XBIOS_screens[XBIOS_fbnum];
  576. destscr += XBIOS_pitch * ((XBIOS_height - surface->h) >> 1);
  577. destx = (XBIOS_width - surface->w) >> 1;
  578. destx &= ~15;
  579. destscr += destx;
  580. /* Convert chunky to planar screen */
  581. Atari_C2pConvert(
  582. surface->pixels,
  583. destscr,
  584. surface->w,
  585. surface->h,
  586. XBIOS_doubleline,
  587. surface->pitch,
  588. XBIOS_pitch
  589. );
  590. }
  591. Setscreen(-1,XBIOS_screens[XBIOS_fbnum],-1);
  592. Vsync();
  593. if ((surface->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF) {
  594. XBIOS_fbnum ^= 1;
  595. if ((surface->format->BitsPerPixel) > 8) {
  596. surface->pixels=XBIOS_screens[XBIOS_fbnum];
  597. }
  598. }
  599. return(0);
  600. }
  601. static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
  602. {
  603. int i;
  604. int r,v,b;
  605. switch( XBIOS_cvdo >> 16) {
  606. case VDO_ST:
  607. case VDO_STE:
  608.   for (i=0;i<ncolors;i++)
  609. {
  610. r = colors[i].r;
  611. v = colors[i].g;
  612. b = colors[i].b;
  613. TT_palette[firstcolor+i]=((r*30)+(v*59)+(b*11))/100;
  614. }
  615. Atari_C2pConvert4_pal(TT_palette); /* convert the lighting */
  616. break;
  617. case VDO_TT:
  618. for(i = 0; i < ncolors; i++)
  619. {
  620. r = colors[i].r;
  621. v = colors[i].g;
  622. b = colors[i].b;
  623. TT_palette[i]=((r>>4)<<8)|((v>>4)<<4)|(b>>4);
  624. }
  625. EsetPalette(firstcolor,ncolors,TT_palette);
  626. break;
  627. case VDO_F30:
  628. for(i = 0; i < ncolors; i++)
  629. {
  630. r = colors[i].r;
  631. v = colors[i].g;
  632. b = colors[i].b;
  633. F30_palette[i]=(r<<16)|(v<<8)|b;
  634. }
  635. VsetRGB(firstcolor,ncolors,F30_palette);
  636. break;
  637. }
  638. return(1);
  639. }
  640. /* Note:  If we are terminated, this could be called in the middle of
  641.    another SDL video routine -- notably UpdateRects.
  642. */
  643. static void XBIOS_VideoQuit(_THIS)
  644. {
  645. int i,j;
  646. Atari_ShutdownEvents();
  647. /* Restore video mode and palette */
  648. switch(XBIOS_cvdo >> 16) {
  649. case VDO_ST:
  650. case VDO_STE:
  651. Setscreen(-1,XBIOS_oldvbase,XBIOS_oldvmode);
  652. if (XBIOS_oldnumcol) {
  653. Setpalette(XBIOS_oldpalette);
  654. }
  655. break;
  656. case VDO_TT:
  657. Setscreen(-1,XBIOS_oldvbase,-1);
  658. EsetShift(XBIOS_oldvmode);
  659. if (XBIOS_oldnumcol) {
  660. EsetPalette(0, XBIOS_oldnumcol, XBIOS_oldpalette);
  661. }
  662. break;
  663. case VDO_F30:
  664. Setscreen(-1, XBIOS_oldvbase, -1);
  665. Vsetmode(XBIOS_oldvmode);
  666. if (XBIOS_oldnumcol) {
  667. VsetRGB(0, XBIOS_oldnumcol, XBIOS_oldpalette);
  668. }
  669. break;
  670. }
  671. Vsync();
  672. if (XBIOS_oldpalette) {
  673. free(XBIOS_oldpalette);
  674. XBIOS_oldpalette=NULL;
  675. }
  676. XBIOS_FreeBuffers(this);
  677. /* Free mode list */
  678. for (j=0;j<NUM_MODELISTS;j++) {
  679. for (i=0;i<SDL_NUMMODES;i++) {
  680. if (SDL_modelist[j][i]!=NULL) {
  681. free(SDL_modelist[j][i]);
  682. SDL_modelist[j][i]=NULL;
  683. }
  684. }
  685. }
  686. this->screen->pixels = NULL;
  687. }