osd_16BDC.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:6k
源码类别:

DVD

开发平台:

C/C++

  1. //for supporting 16bit OSD
  2. //created by jslin  //20041022
  3. #include "memmap0.h"    // 2004/11/05 yltseng
  4. #include "memcfg.h"
  5. void osd_16BDC_init_bitmap(UINT8 *hp, int w, int h);
  6. void osd_16BDC_set_region(t_osd_region *p);
  7. void osd_16BDC_create_region(t_osd_region *p, int X, int Y, t_osd_region *prev);//, int scanmd);
  8. void osd_16BDC_init(void);
  9. void osd_16BDC_draw_bitmap(UINT16 *ptr, int x, int y, int w, int h, UINT8 mask);
  10. void osd_16BDC_setbuf(void);
  11. void osd_16BDC_get_block(UINT8 *ptr, int x, int y, int w, int h);
  12. #define MONE_OSD_16BDC
  13. void osd_16BDC_setbuf()
  14. {
  15.     //OSD Display Buffer pointer
  16.     if(OSD_buffer_16bit==1) {
  17.         REG_OSDYA                   = GP_REF1_LUMA + 64;
  18.         REG_OSDYA2                  = GP_REF1_LUMA + 64;//osdya_n;
  19.     } 
  20. }
  21. void osd_16BDC_init(void)
  22. {
  23.     #ifdef MONE_OSD_16BDC
  24.     osd_puts("nnosd init flashnn");
  25.     #endif
  26.     
  27.     osd_16BDC_setbuf();
  28.     #ifdef MONE_OSD_16BDC
  29.         printf("nn>>>>>16bit OSD buffer ptr[%x]  [%d]n", get_osdbuf_baseptr(), OSD_buffer_16bit);
  30.     #endif
  31.     
  32.     osd_free = 0;
  33.     region[0].osd_w = 360;
  34.     if(p_scan) {
  35. region[0].osd_h = 480;
  36.     } else {
  37.      region[0].osd_h = 240;
  38.     }
  39.     region[0].osd_format = OSD_FORMAT_DIRECT16B;     //A-RGB 1-555
  40.     osd_16BDC_create_region(&region[0], 0, 0, NULL);//, 0);
  41.     osd_active_regions = 1;
  42.     ENABLE_OSD();
  43. }
  44. void osd_16BDC_create_region(t_osd_region *p, int X, int Y, t_osd_region *prev)
  45. {
  46.     int                       oW, oH;
  47.     t_osdv2_header    hdr;
  48.     UINT16                lnkprev;
  49.     UINT8                 *hp;
  50.     unsigned              clut_type;
  51.     int  color_format;
  52.     int                       hdr_size;
  53.     unsigned clut_update;
  54.     
  55.     lnkprev = (prev!=NULL) ? prev->osd_header[0] : LINK_NULL;
  56.     p->osd_header[0] = osd_free;
  57.     p->osd_header[1] = osd_free;
  58.     oW = p->osd_w/2;
  59.     oH = p->osd_h;
  60.     color_format = p->osd_format;
  61.     clut_type = OSDV2_CLUT_32b;
  62.     hdr_size  = 16;
  63.     clut_update =0;// 1;
  64.     hp = (UINT8 *)get_osdbuf_baseptr() + (osd_free<<5);
  65.     osd_free  = osd_free + ((hdr_size+31)>>5);
  66.     memset(&hdr,0,sizeof(hdr));
  67.     hdr.config0   = ((clut_update & 0x01) << BIT_CU)
  68.                 | ((0x0) << BIT_FT)
  69.                 | ((0x1) << BIT_PR)
  70.                 | ((color_format & 0x07) << BIT_MD);
  71.     hdr.config1   = ((0x00 & 0x0f) << BIT_SHD)
  72.                 | ((0x0f & 0x0f) << BIT_BLND);
  73.     hdr.config2   = V2_CLUT_TYPE(clut_type)
  74.    | V2_RGB_MODE
  75. | V2_SWAP_BYTE_OFF
  76. | V2_SHADE_MODE_A;
  77.   
  78.     hdr.v_size    = SWAP16(oH);
  79.     hdr.h_size    = SWAP16(oW);
  80.     hdr.x         = SWAP16(X);
  81.     hdr.y         = SWAP16(Y);
  82.     hdr.link_data = SWAP16(osd_free);
  83.     hdr.link_next = SWAP16(lnkprev);
  84.     memcpy(hp,&hdr,sizeof(hdr));
  85.     // initialize bitmap
  86.     hp        = get_osdbuf_baseptr() + (osd_free<<5);
  87.     osd_16BDC_init_bitmap(hp, oW, oH);
  88. }
  89. void osd_16BDC_init_bitmap(UINT8 *hp, int w, int h)
  90. {
  91.     int i, j;
  92.   
  93.     unsigned a, R, G, B;
  94.     unsigned v;
  95.     R = 0x00;
  96.     G = 0x00;
  97.     B = 0x00;
  98.     a   = 0x0;
  99.     #ifdef MONE_OSD_16BDC
  100.         printf("w[%d] h[%d] [%x] [%x]n", w, h, REG_OSDYA, REG_OSDYA2);
  101.     #endif
  102.     
  103.     v = ((a&0x1)<<15)|(((R>>3)&0x1f)<<10) | (((G>>3)&0x1f)<<5) | (((B>>3)&0x1f)<<0) ; // 1555
  104. if(p_scan)
  105. {
  106. for (i=0;i<h;i++)
  107. {
  108. for (j=0;j<w;j++)
  109. {
  110.  *(UINT16 *)(&hp[0]) = SWAP16(v);
  111.  *(UINT16 *)(&hp[2]) = SWAP16(v);
  112. hp+=(w*4);
  113.  *(UINT16 *)(&hp[0]) = SWAP16(v);
  114.  *(UINT16 *)(&hp[2]) = SWAP16(v);
  115. hp-=(w*4);
  116. hp+=4;
  117. }
  118. hp+=(w*4);
  119. i++;
  120. }
  121. }
  122. else
  123. {
  124.   for (i=0;i<h;i++)
  125.   {
  126. for (j=0;j<w;j++)
  127.       {
  128. *(UINT16 *)(&hp[0]) = SWAP16(v);
  129. *(UINT16 *)(&hp[2]) = SWAP16(v);
  130. hp+=4;
  131.   }
  132.     }
  133. }
  134. void osd_16BDC_draw_bitmap(UINT16 *ptr, int x, int y, int w, int h, UINT8 mask)
  135. {
  136. UINT8 *hp;
  137. UINT16 v, colorMask;
  138. int region_W;
  139. int i, j;//, Dcase;
  140. if(mask){
  141. colorMask = 0x0;
  142. } else {
  143. colorMask = 0xffff;
  144. }
  145. hp = get_osdbuf_baseptr() + (osd_free<<5);
  146. region_W = (region[0].osd_w/2)*4;
  147. if(p_scan)
  148. {
  149. hp = hp +(2*y*region_W) + (x*2);
  150. for (i=0; i<h; i++)
  151. {
  152. for(j=0; j<w; j++)
  153. {
  154. v=(UINT16)ptr[j+(i*w)];
  155. *(UINT16 *)(&hp[0]) = (v&colorMask);
  156. hp+=region_W;
  157. v=(UINT16)ptr[j+(i*w)];
  158. *(UINT16 *)(&hp[0]) = (v&colorMask);
  159. hp-=region_W;
  160. hp+=2;
  161. }
  162. hp+=region_W;
  163. hp+=(region_W-(w*2));
  164. }
  165. }
  166. else
  167. {
  168. hp = hp +(y*region_W) + (x*2);
  169. for (i=0; i<h; i++)
  170. {
  171. for(j=0; j<w; j++)
  172. {
  173. v=(UINT16)ptr[j+(i*w)];
  174. *(UINT16 *)(&hp[0]) = (v&colorMask);
  175. hp+=2;
  176. }
  177. hp+=(region_W-(w*2));
  178. }
  179. }
  180. }
  181. void osd_16BDC_get_block(UINT8 * ptr, int x, int y, int w, int h)
  182. {
  183.     UINT8 *hp;
  184.     int region_W;
  185.     int i, j, Bpos;
  186.     hp = get_osdbuf_baseptr() + (osd_free<<5);
  187.     region_W = (region[0].osd_w/2)*4;
  188.     if(p_scan)
  189.     {
  190.         hp = hp +(2*y*region_W) + (x*2);
  191.         for(i=0; i<h; i++)
  192.         {
  193.             for(j=0; j<w; j++)
  194.             {
  195.                 Bpos = (i*w*2)+(j*2);
  196.                 ptr[Bpos] = hp[0];
  197.                 ptr[Bpos+1] = hp[1];
  198.                 hp+=2;
  199.             }
  200.             hp+=(region_W-(w*2));
  201.             hp+=region_W;
  202.         }
  203.     }
  204.     else
  205.     {
  206.         hp = hp + (y*region_W) + (x*2);
  207.         for(i=0; i<h; i++)
  208.         {
  209.             for(j=0; j<w; j++)
  210.             {
  211.                 Bpos = (i*w*2)+(j*2);
  212.                 ptr[Bpos] = hp[0];
  213.                 ptr[Bpos+1] = hp[1];
  214.                 hp+=2;
  215.             }
  216.             hp+=(region_W-(w*2));
  217.         }
  218.     }
  219. }