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

流媒体/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_ataric2p060.c,v 1.1 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. /*
  23.  * Chunky to planar conversion routine
  24.  *  for 68060 CPU, without movep instruction
  25.  * 1 byte/pixel -> 4 or 8 bit planes
  26.  *
  27.  * Patrice Mandin
  28.  */
  29. #include <string.h>
  30. #include <sys/cookie.h>
  31. #include "SDL_ataric2p_s.h"
  32. /*--- Variables ---*/
  33. /* CPU is 060 ? */
  34. int atari_cpu060_avail;
  35. /*--- Functions ---*/
  36. void atari_test_cpu060_present(void)
  37. {
  38. unsigned long cookie_cpu;
  39. atari_cpu060_avail=0;
  40. /* Cookie _CPU present ? */
  41. if (Getcookie(C__CPU, &cookie_cpu) == C_FOUND) {
  42. atari_cpu060_avail = (cookie_cpu == 60);
  43. }
  44. }
  45. void Atari_C2pConvert8_060(
  46. Uint8 *src, /* Source screen (one byte=one pixel) */
  47. Uint8 *dest, /* Destination (8 bits planes) */
  48. Uint32 width, /* Dimensions of screen to convert */
  49. Uint32 height,
  50. Uint32 dblligne, /* Double the lines when converting ? */
  51. Uint32 srcpitch, /* Length of one source line in bytes */
  52. Uint32 dstpitch /* Length of one destination line in bytes */
  53. )
  54. {
  55. int x,y,z;
  56. Uint8 *src_line, *dst_line;
  57. for (y=0; y<height; y++) {
  58. src_line = src;
  59. dst_line = dest;
  60. for (x=0; x<(width>>4); x++) {
  61. Uint32 somme1, somme2;
  62. Uint32 *convtable;
  63. /* bytes 0-7 */
  64. somme1 = somme2 = 0;
  65. for (z=0; z<8 ;z++) {
  66. convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<3];
  67. somme1 <<= 1;
  68. somme2 <<= 1;
  69. somme1 |= *convtable++;
  70. somme2 |= *convtable;
  71. }
  72. *(dst_line+14) = somme2; /* 000000FF */
  73. *(dst_line+6) = somme1; /* 000000FF */
  74. somme2 >>= 8;
  75. somme1 >>= 8;
  76. *(dst_line+12) = somme2; /* 0000FF00 */
  77. *(dst_line+4) = somme1; /* 0000FF00 */
  78. somme2 >>= 8;
  79. somme1 >>= 8;
  80. *(dst_line+10) = somme2; /* 00FF0000 */
  81. *(dst_line+2) = somme1; /* 00FF0000 */
  82. somme2 >>= 8;
  83. somme1 >>= 8;
  84. *(dst_line+8) = somme2; /* FF000000 */
  85. *dst_line++ = somme1; /* FF000000 */
  86. /* bytes 8-15 */
  87. somme1 = somme2 = 0;
  88. for (z=0; z<8 ;z++) {
  89. convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<3];
  90. somme1 <<= 1;
  91. somme2 <<= 1;
  92. somme1 |= *convtable++;
  93. somme2 |= *convtable;
  94. }
  95. *(dst_line+14) = somme2; /* 000000FF */
  96. *(dst_line+6) = somme1; /* 000000FF */
  97. somme2 >>= 8;
  98. somme1 >>= 8;
  99. *(dst_line+12) = somme2; /* 0000FF00 */
  100. *(dst_line+4) = somme1; /* 0000FF00 */
  101. somme2 >>= 8;
  102. somme1 >>= 8;
  103. *(dst_line+10) = somme2; /* 00FF0000 */
  104. *(dst_line+2) = somme1; /* 00FF0000 */
  105. somme2 >>= 8;
  106. somme1 >>= 8;
  107. *(dst_line+8) = somme2; /* FF000000 */
  108. *dst_line = somme1; /* FF000000 */
  109. dst_line += 15;
  110. }
  111. if (dblligne) {
  112. memcpy(dest+dstpitch, dest, width);
  113. dest += dstpitch;
  114. }
  115. src += srcpitch;
  116. dest += dstpitch;
  117. }
  118. }
  119. void Atari_C2pConvert4_060(
  120. Uint8 *src, /* Source screen (one byte=one pixel) */
  121. Uint8 *dest, /* Destination (4 bits planes) */
  122. Uint32 width, /* Dimensions of screen to convert */
  123. Uint32 height,
  124. Uint32 dblligne, /* Double the lines when converting ? */
  125. Uint32 srcpitch, /* Length of one source line in bytes */
  126. Uint32 dstpitch /* Length of one destination line in bytes */
  127. )
  128. {
  129. int x,y,z;
  130. Uint8 *src_line, *dst_line;
  131. for (y=0;y<height;y++) {
  132. src_line = src;
  133. dst_line = dest;
  134. for (x=0; x<(width>>4);x++) {
  135. Uint32 somme;
  136. Uint32 *convtable;
  137. /* bytes 0-7 */
  138. somme=0;
  139. for (z=0; z<8 ; z++) {
  140. convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<2];
  141. somme <<= 1;
  142. somme |= *convtable;
  143. }
  144. *(dst_line+6) = somme; somme >>= 8; /* 000000FF */
  145. *(dst_line+4) = somme; somme >>= 8; /* 0000FF00 */
  146. *(dst_line+2) = somme; somme >>= 8; /* 00FF0000 */
  147. *dst_line++ = somme; /* FF000000 */
  148. /* bytes 8-15 */
  149. somme = 0;
  150. for (z=0; z<8 ;z++) {
  151. convtable = (Uint32 *) &Atari_table_c2p[(*src_line++)<<2];
  152. somme <<= 1;
  153. somme |= *convtable;
  154. }
  155. *(dst_line+6) = somme; somme >>= 8; /* 000000FF */
  156. *(dst_line+4) = somme; somme >>= 8; /* 0000FF00 */
  157. *(dst_line+2) = somme; somme >>= 8; /* 00FF0000 */
  158. *dst_line = somme; /* FF000000 */
  159. dst_line += 7;
  160. }
  161. if (dblligne) {
  162. memcpy(dest+dstpitch, dest, width>>1);
  163. dest += dstpitch;
  164. }
  165. src += srcpitch;
  166. dest += dstpitch;
  167. }
  168. }