mga_vid_test.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:4k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * mga_vid_test.c
  4.  *
  5.  * Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
  6.  * Sept 1999
  7.  *
  8.  * This software has been released under the terms of the GNU Public
  9.  * license. See http://www.gnu.org/copyleft/gpl.html for details.
  10.  */
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <sys/ioctl.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <sys/mman.h>
  18. #include "mga_vid.h"
  19. mga_vid_config_t config;
  20. uint_8 *mga_vid_base;
  21. uint_32 is_g400;
  22. #define SRC_IMAGE_WIDTH 256
  23. #define SRC_IMAGE_HEIGHT 256
  24. uint_8 y_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  25. uint_8 cr_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  26. uint_8 cb_image[SRC_IMAGE_WIDTH * SRC_IMAGE_HEIGHT];
  27. void
  28. write_frame_g200(uint_8 *y,uint_8 *cr, uint_8 *cb)
  29. {
  30. uint_8 *dest;
  31. uint_32 bespitch,h,w;
  32. dest = mga_vid_base;
  33. bespitch = (config.src_width + 31) & ~31;
  34. for(h=0; h < config.src_height; h++) 
  35. {
  36. memcpy(dest, y, config.src_width);
  37. y += config.src_width;
  38. dest += bespitch;
  39. }
  40. for(h=0; h < config.src_height/2; h++) 
  41. {
  42. for(w=0; w < config.src_width/2; w++) 
  43. {
  44. *dest++ = *cb++;
  45. *dest++ = *cr++;
  46. }
  47. dest += bespitch - config.src_width;
  48. }
  49. }
  50. void
  51. write_frame_g400(uint_8 *y,uint_8 *cr, uint_8 *cb)
  52. {
  53. uint_8 *dest;
  54. uint_32 bespitch,h;
  55. dest = mga_vid_base;
  56. bespitch = (config.src_width + 31) & ~31;
  57. for(h=0; h < config.src_height; h++) 
  58. {
  59. memcpy(dest, y, config.src_width);
  60. y += config.src_width;
  61. dest += bespitch;
  62. }
  63. for(h=0; h < config.src_height/2; h++) 
  64. {
  65. memcpy(dest, cb, config.src_width/2);
  66. cb += config.src_width/2;
  67. dest += bespitch/2;
  68. }
  69. for(h=0; h < config.src_height/2; h++) 
  70. {
  71. memcpy(dest, cr, config.src_width/2);
  72. cr += config.src_width/2;
  73. dest += bespitch/2;
  74. }
  75. }
  76. void write_frame(uint_8 *y,uint_8 *cr, uint_8 *cb)
  77. {
  78. if(is_g400)
  79. write_frame_g400(y,cr,cb);
  80. else
  81. write_frame_g200(y,cr,cb);
  82. }
  83. void
  84. draw_cool_pattern(void)
  85. {
  86. int i,x,y;
  87. i = 0;
  88. for (y=0; y<config.src_height; y++) {
  89. for (x=0; x<config.src_width; x++) {
  90. y_image[i++] = x*x/2 + y*y/2 - 128;
  91. }
  92. }
  93. i = 0;
  94. for (y=0; y<config.src_height/2; y++) 
  95. for (x=0; x<config.src_width/2; x++) 
  96. {
  97. cr_image[i++] = x - 128;
  98. }
  99. i = 0;
  100. for (y=0; y<config.src_height/2; y++) 
  101. for (x=0; x<config.src_width/2; x++) 
  102. {
  103. cb_image[i++] = y - 128;
  104. }
  105. }
  106. void
  107. draw_color_blend(void)
  108. {
  109. int i,x,y;
  110. i = 0;
  111. for (y=0; y<config.src_height; y++) {
  112. for (x=0; x<config.src_width; x++) {
  113. y_image[i++] = 0;
  114. }
  115. }
  116. i = 0;
  117. for (y=0; y<config.src_height/2; y++) 
  118. for (x=0; x<config.src_width/2; x++) 
  119. {
  120. cr_image[i++] = x - 128;
  121. }
  122. i = 0;
  123. for (y=0; y<config.src_height/2; y++) 
  124. for (x=0; x<config.src_width/2; x++) 
  125. {
  126. cb_image[i++] = y - 128;
  127. }
  128. }
  129. int 
  130. main(int argc, char *argv[])
  131. {
  132. int f;
  133. f = open("/dev/mga_vid",O_RDWR);
  134. if(f == -1)
  135. {
  136. fprintf(stderr,"Couldn't open drivern");
  137. exit(1);
  138. }
  139. config.src_width = SRC_IMAGE_WIDTH;
  140. config.src_height= SRC_IMAGE_HEIGHT;
  141. config.dest_width = SRC_IMAGE_WIDTH;
  142. config.dest_height = SRC_IMAGE_HEIGHT;
  143. config.x_org= 10;
  144. config.y_org= 10;
  145. config.colkey_on = 0;
  146. if (ioctl(f,MGA_VID_CONFIG,&config))
  147. {
  148. perror("Error in config ioctl");
  149. }
  150. if (config.card_type == MGA_G200) 
  151. {
  152. printf("Testing MGA G200 Backend Scalern");
  153.   is_g400 = 0;
  154. }
  155. else
  156. {
  157. printf("Testing MGA G400 Backend Scalern");
  158.   is_g400 = 1;
  159. }
  160. ioctl(f,MGA_VID_ON,0);
  161. mga_vid_base = (uint_8*)mmap(0,256 * 4096,PROT_WRITE,MAP_SHARED,f,0);
  162. printf("mga_vid_base = %8pn",mga_vid_base);
  163. write_frame(y_image,cr_image,cb_image);
  164. printf("(1) There should be a green square, offset by 10 pixels fromn"
  165.    "    the upper left corner displayedn");
  166. sleep(3);
  167. draw_cool_pattern();
  168. write_frame(y_image,cr_image,cb_image);
  169. printf("(2) There should be a cool mosaic like pattern now.n");
  170. sleep(3);
  171. draw_color_blend();
  172. write_frame(y_image,cr_image,cb_image);
  173. printf("(3) There should be a color blend with black, red, purple, bluen"
  174.    "    corners (starting top left going CW)n");
  175. sleep(3);
  176. ioctl(f,MGA_VID_OFF,0);
  177. close(f);
  178. return 0;
  179. }