⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitmap.c

📁 An complete pmp solution for mattel juicebox player. Using crossworks for arm.
💻 C
字号:

#include "bitmap.h"

//-------------------------------------------------------------
void wSetPixel (xTBitmap *pxBitmap, u32 x, u32 y, u16 uxColor)
{
  u32 *uiStart = pxBitmap->pxData;
  uiStart += ((pxBitmap->uiSizeX>>3)*3)*y + (x>>3)*3;
  u32 uxcColor = (uxColor<<20);
  u32 ulShift = (x&0x00000007)*12;
  uiStart+= ulShift>>5;
  ulShift&=0x0000001F;
  *uiStart = (*uiStart & ~((0xFFF00000) >> ulShift))|((u32)uxcColor>>ulShift);
  if (ulShift>20) 
    {
	uiStart++;
	*uiStart = (*uiStart & ~((0xFFF00000) << (32-ulShift)))|((u32)uxcColor<< (32-ulShift));
    }
  return;
}
//-------------------------------------------------------------
void wClear (xTBitmap *pxBitmap, u16 color)

{
  u32 x, y, x2, y2;
  x2 = pxBitmap->uiSizeX / 3;
  y2 = pxBitmap->uiSizeY;
  u32 *uiStart = pxBitmap->pxData;

  u32 d1, d2, d3;
  d1 = (color << 20) | (color << 8) | (color >> 4);
  d2 = (d1 << 8) | (color >> 8);
  d3 = (d1 << 4) | (color);
  for (y = 0; y < y2; y++)
    for (x = 0; x < x2; x++)
	  {
	  *(uiStart++)=d1;
      *(uiStart++)=d2;
      *(uiStart++)=d3;
	  }

  /* TODO: implement the case when the number of pixels in bitmap line is undivisible from 8 */
  /*                                                                          <optimize>
  for (y = 0; y < y2; y++)
    for (x = 0; x < x2; x++)
      wSetPixel(pxBitmap, x, y, color);
  //                                                                          </optimize> */
}
//-------------------------------------------------------------
/* uxShift: first 16 bits are y shift, last 16 bits are x shift*/
void wFloodFill (xTBitmap *pxBitmap, 
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u16 color)
{
  
  u32 x, y, x2, y1, y2;
  u16 sy = uxShift>>16;
  u16 sx = uxShift&0x0000FFFF;
  x = pxRectangle->x1 + sx;
  x2 = pxRectangle->x2 + sx;
  y1 = pxRectangle->y1 + sy;
  y2 = pxRectangle->y2 + sy;
  
  //                                                                          <optimize>
  for (; x < x2; x++)
    for (y = y1; y < y2; y++)
      wSetPixel(pxBitmap, x, y, color);
  //                                                                          </optimize>
}

//-------------------------------------------------------------
void wDrawChar(xTBitmap *pxBitmap, 
               xTFont *pxFont, 
               u08 c, u32 x, u32 y, u16 color)
{
    /* Draw a single ascii character on screen at location x,y */
    u32 i;
    u32 j;
    u16 uiSizeX = pxFont->uiSizeX;
    u16 uiSizeY = pxFont->uiSizeY;
    
    if (uiSizeX>8)
      {
      u16 *pxChar = (u16*)pxFont->pxData;
      u16 uiMask;
      pxChar+= c*((uiSizeY+1)&0xFFFE);
      x+=uiSizeX;
      y+=uiSizeY;
      for (i=uiSizeY; i>0; i--)
        {
        uiMask = 0x0001 << (uiSizeX-1);
        for (j=uiSizeX; j>0; j--)
          {
          if (*pxChar & uiMask)
          //                                                                 <optimize>
            wSetPixel(pxBitmap, x-j, y-i, color);
          //                                                                </optimize>
		  uiMask>>=1;
		  }
        pxChar++; 
        }
      }
      else
      {
      u08 *pxChar = (u08*)pxFont->pxData;
      u08 uiMask;
      pxChar+= c*((uiSizeY+3)&0xFFFC);
      x+=uiSizeX;
      y+=uiSizeY;
      for (i=uiSizeY; i>0; i--)
        {
        uiMask = 0x01 << (uiSizeX-1);
        for (j=uiSizeX; j>0; j--)
          {
          if (*pxChar & uiMask)
          //                                                                 <optimize>
            wSetPixel(pxBitmap, x-j, y-i, color);
          //                                                                </optimize>
		  uiMask>>=1;
		  }
        pxChar++; 
        }
      }
}

//-------------------------------------------------------------
void wDrawString(xTBitmap *pxBitmap, 
                 xTFont *pxFont, 
                 u08* s, 
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u16 color)
{
    /* Draw a string of ascii chars on screen */
    u16 x = pxRectangle->x1 + (uxShift&0x0000FFFF);
    u16 x2 = pxRectangle->x2 + (uxShift&0x0000FFFF);
	u16 y = pxRectangle->y1 + (uxShift>>16);
    u16 uiSizeX = pxFont->uiSizeX;
    uiSizeX+= uiSizeX>>2;
    while (*s)
    {
        wDrawChar(pxBitmap, pxFont, *s++, x, y, color);
        x+=uiSizeX;
        if (x>=x2) return;
    }
}

//-------------------------------------------------------------
void wDrawStringL(xTBitmap *pxBitmap, 
                 xTFont *pxFont, 
                 u08* s, 
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u32 ulLength,
                 u16 color)
{
    /* Draw a string of ascii chars on screen */
    u16 x = pxRectangle->x1 + (uxShift&0x0000FFFF);
    u16 x2 = pxRectangle->x2 + (uxShift&0x0000FFFF);
    u16 y = pxRectangle->y1 + (uxShift>>16);
    u16 uiSizeX = pxFont->uiSizeX;
    uiSizeX+= uiSizeX>>2;
    u32 i = ulLength;
    for (;i>0;i--)
      {
        wDrawChar(pxBitmap, pxFont, *s++, x, y, color);
        x+=uiSizeX;
        if (x>=x2) return;
      }
}

//----------------------------------------------------------
void wDrawHex32 (xTBitmap *pxBitmap, 
                 xTFont *pxFont,
                 u32 s, 
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u16 color)
{
  u08 number;
  u16 uiSizeX = pxFont->uiSizeX;
  uiSizeX+= uiSizeX>>2;
  i32 x = pxRectangle->x1 + uiSizeX*8 + (uxShift&0x0000FFFF);
  u32 y = pxRectangle->y1 + (uxShift>>16);
  
  u08 i = 0;
  for (;i<8;i++) 
    {
    number = s%16;
    if (number>9) number += 7;
    wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
    x -= uiSizeX;
    s>>=4;
    } 

}
//----------------------------------------------------------
void wDrawHex8 (xTBitmap *pxBitmap, 
                 xTFont *pxFont,
                 u32 s, 
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u16 color)
{
  u08 number;
  u16 uiSizeX = pxFont->uiSizeX;
  uiSizeX += uiSizeX>>2;
  i32 x = pxRectangle->x1 + uiSizeX*8 + (uxShift&0x0000FFFF);
  u32 y = pxRectangle->y1 + (uxShift>>16);
  
  u08 i = 0;

  for (;i<2;i++) 
    {
    number = s%16;
    if (number>9) number += 7;
    wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
    x -= uiSizeX;
    s>>=4;
    } 

}
//----------------------------------------------------------
/*
  c: 
  bit|function
  8  |0 - zeroes aren't viewed, 1 - zeroes viewed
  7:0|number length
*/
void wDrawNumber (xTBitmap *pxBitmap, 
                 xTFont *pxFont,
                 u32 s, 
                 u32 c,
                 xTRectangle *pxRectangle, 
                 u32 uxShift, 
                 u16 color)
{
  u08 number;
  u08 zero = ((c&0x100)>>8);
  
  u16 uiSizeX = pxFont->uiSizeX;
  uiSizeX+= uiSizeX>>2;
  u32 x1 = pxRectangle->x1 + (uxShift&0x0000FFFF);
  i32 x = pxRectangle->x2 + (uxShift&0x0000FFFF);
  u32 y = pxRectangle->y1 + (uxShift>>16);
  
  
  while (s)
    {
    number = (s%10);
    s/=10;
    wDrawChar(pxBitmap, pxFont, (number+48), x, y, color);
    x-= uiSizeX;
    if(x<x1) return;    
    }
}
//----------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -