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

📄 lcdlin32.c

📁 ucgui的3.98版本的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        if (++Diff == 8) {
          Diff = 0;
          p++;
        }
      } while (--xsize);
      break;
    }
  }
}

/*********************************************************************
*
*       Draw Bitmap 1 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 8, LCD_SWAP_XY == 1
*/
#elif (LCD_ENDIAN_BIG == 0) && \
    (LCD_BITSPERPIXEL == 8) && \
    ( LCD_SWAP_XY)
static void _DrawBitLine1BPP_Swap(unsigned x, unsigned y, U8 const GUI_UNI_PTR * pData, int ysize, const U8 * pTrans, int BytesPerLine, U8 Pos) {
  unsigned x0, y0, Off;
  U32 Buffer, Data;
  U8 Index, Pixel, BufferValid, ShiftPos, DataMask;
  #if LCD_MIRROR_Y
    y0 = LCD_XSIZE - x - 1;
  #else
    y0 = x;
  #endif
  #if LCD_MIRROR_X
    x0 = LCD_YSIZE - y - 1;
  #else
    x0 = y;
  #endif
  Off         = XY2OFF(x0, y0);
  BufferValid = 0;
  ShiftPos    = 7 - (Pos & 7);
  DataMask    = 0x80 >> (7 - ShiftPos);
  #if LCD_MIRROR_X
    for (; ysize; ysize--, pData += BytesPerLine, x0--) {
  #else
    for (; ysize; ysize--, pData += BytesPerLine, x0++) {
  #endif
    U8 Shift = (x0 & 0x3) << 3;
    Pixel = (*pData & DataMask) >> ShiftPos;
    if (!BufferValid) {
      Buffer = READ_MEM(Off);
      BufferValid = 1;
    }
    switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
    case 0:
      Buffer &= ~(0xff << Shift);
      Index = *(pTrans + Pixel);
      Data = Index << Shift;
      Buffer |= Data;
      break;
    case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
    case LCD_DRAWMODE_XOR:
      if (Pixel) {
        Buffer ^= (0xff << Shift);
      }
      break;
    case LCD_DRAWMODE_TRANS:
      if (Pixel) {
        Buffer &= ~(0xff << Shift);
        Index = *(pTrans + Pixel);
        Data = Index << Shift;
        Buffer |= Data;
      }
      break;
    }
    #if LCD_MIRROR_X
      if (!(x0 & 0x3)) {
        BufferValid = 0;
        WRITE_MEM(Off--, Buffer);
      }
    #else
      if ((x0 & 0x3) == 0x3) {
        BufferValid = 0;
        WRITE_MEM(Off++, Buffer);
      }
    #endif
  }
  if (BufferValid) {
    WRITE_MEM(Off, Buffer);
  }
}

/*********************************************************************
*
*       Draw Bitmap 1 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 4
*/
#elif (LCD_ENDIAN_BIG == 0) && \
    (LCD_BITSPERPIXEL == 4) && \
    (!LCD_MIRROR_X) && \
    (!LCD_MIRROR_Y) && \
    (!LCD_SWAP_XY)
static void _DrawBitLine1BPP(unsigned x, unsigned y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  U8 Mode;
  LCD_PIXELINDEX Index0 = *(pTrans + 0);
  LCD_PIXELINDEX Index1 = *(pTrans + 1);
  x += Diff;
  Mode = GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR);
  if (Mode == 0) {
    /* Check if filling will do ... */
    if (Index0 == Index1) {
      LCD_PIXELINDEX ColorIndexOld = LCD_COLORINDEX;  /* Save forground color */
      LCD_COLORINDEX = Index0;                        /* Set foreground color */
      LCD_L0_DrawHLine(x, y, x + xsize - 1);
      LCD_COLORINDEX = ColorIndexOld;
    } else { 
      /* O.K., we have to draw ... */
      int Off, NumPixel_0, NumPixel_1, i;
      U32 Data, ColorMask, AndMask;
      Off = y * DWORDS_PER_LINE + x / PIXELS_PER_DWORD;
      NumPixel_0 = x & (PIXELS_PER_DWORD - 1);
      NumPixel_1 = (x + xsize - 1) & (PIXELS_PER_DWORD - 1);
      /* First DWORD */
      if (NumPixel_0) {
        ColorMask = 0;
        AndMask = ~(0xFFFFFFFF << (4 * NumPixel_0));
        if ((8 - NumPixel_0) > xsize) {
          AndMask |= ~(0xFFFFFFFF >> (4 * (7 - NumPixel_1)));
        }
        for (i = NumPixel_0; (i < 8) && xsize; i++, xsize--) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (4 * i);
        }
        Data = READ_MEM(Off);
        Data &= AndMask;
        Data |= ColorMask;
        WRITE_MEM(Off, Data);
        Off++;
      }
      /* Complete DWORDS */
      while (xsize >= 8) {
        ColorMask = 0;
        for (i = 0; i < 8; i++) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (4 * i);
        }
        WRITE_MEM(Off, ColorMask);
        Off++;
        xsize -= 8;
      }
      /* Last DWORD */
      if (xsize) {
        ColorMask = i = 0;
        AndMask = 0xFFFFFFF0 << (4 * NumPixel_1);
        while (xsize) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (4 * i++);
          xsize--;
        }
        Data = READ_MEM(Off);
        Data &= AndMask;
        Data |= ColorMask;
        WRITE_MEM(Off, Data);
      }
    }
  } else {
    switch (Mode) {
    case LCD_DRAWMODE_TRANS:
      do {
        if (*p & (0x80 >> Diff)) {
          LCD_L0_SetPixelIndex(x, y, Index1);
        }
        x++;
        if (++Diff == 8) {
          Diff = 0;
          p++;
        }
      } while (--xsize);
      break;
    case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
    case LCD_DRAWMODE_XOR:
      do {
        if (*p & (0x80 >> Diff)) {
          int Pixel = LCD_L0_GetPixelIndex(x, y);
          LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
        }
        x++;
        if (++Diff == 8) {
          Diff = 0;
          p++;
        }
      } while (--xsize);
      break;
    }
  }
}

/*********************************************************************
*
*       Draw Bitmap 1 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 2
*/
#elif (LCD_ENDIAN_BIG == 0) && \
    (LCD_BITSPERPIXEL == 2) && \
    (!LCD_MIRROR_X) && \
    (!LCD_MIRROR_Y) && \
    (!LCD_SWAP_XY)
static void _DrawBitLine1BPP(unsigned x, unsigned y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  U8 Mode;
  LCD_PIXELINDEX Index0 = *(pTrans + 0);
  LCD_PIXELINDEX Index1 = *(pTrans + 1);
  x += Diff;
  Mode = GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR);
  if (Mode == 0) {
    /* Check if filling will do ... */
    if (Index0 == Index1) {
      LCD_PIXELINDEX ColorIndexOld = LCD_COLORINDEX;  /* Save forground color */
      LCD_COLORINDEX = Index0;                        /* Set foreground color */
      LCD_L0_DrawHLine(x, y, x + xsize - 1);
      LCD_COLORINDEX = ColorIndexOld;
    } else { 
      /* O.K., we have to draw ... */
      int Off, NumPixel_0, NumPixel_1, i;
      U32 Data, ColorMask, AndMask;
      Off = y * DWORDS_PER_LINE + x / PIXELS_PER_DWORD;
      NumPixel_0 = x & (PIXELS_PER_DWORD - 1);
      NumPixel_1 = (x + xsize - 1) & (PIXELS_PER_DWORD - 1);
      /* First DWORD */
      if (NumPixel_0) {
        ColorMask = 0;
        AndMask = ~(0xFFFFFFFF << (2 * NumPixel_0));
        if ((16 - NumPixel_0) > xsize) {
          AndMask |= ~(0xFFFFFFFF >> (2 * (15 - NumPixel_1)));
        }
        for (i = NumPixel_0; (i < 16) && xsize; i++, xsize--) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (2 * i);
        }
        Data = READ_MEM(Off);
        Data &= AndMask;
        Data |= ColorMask;
        WRITE_MEM(Off, Data);
        Off++;
      }
      /* Complete DWORDS */
      while (xsize >= 16) {
        ColorMask = 0;
        for (i = 0; i < 16; i++) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (2 * i);
        }
        WRITE_MEM(Off, ColorMask);
        Off++;
        xsize -= 16;
      }
      /* Last DWORD */
      if (xsize) {
        ColorMask = i = 0;
        AndMask = 0xFFFFFFFC << (2 * NumPixel_1);
        while (xsize) {
          U8 Index = *p & (0x80 >> Diff) ? Index1 : Index0;
          if (++Diff == 8) {
            Diff = 0;
            p++;
          }
          ColorMask |= Index << (2 * i++);
          xsize--;
        }
        Data = READ_MEM(Off);
        Data &= AndMask;
        Data |= ColorMask;
        WRITE_MEM(Off, Data);
      }
    }
  } else {
    switch (Mode) {
    case LCD_DRAWMODE_TRANS:
      do {
        if (*p & (0x80 >> Diff)) {
          LCD_L0_SetPixelIndex(x, y, Index1);
        }
        x++;
        if (++Diff == 8) {
          Diff = 0;
          p++;
        }
      } while (--xsize);
      break;
    case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
    case LCD_DRAWMODE_XOR:
      do {
        if (*p & (0x80 >> Diff)) {
          int Pixel = LCD_L0_GetPixelIndex(x, y);
          LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
        }
        x++;
        if (++Diff == 8) {
          Diff = 0;
          p++;
        }
      } while (--xsize);
      break;
    }
  }
}

/*********************************************************************
*
*       Draw Bitmap 1 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 2, LCD_SWAP_XY == 1
*/
#elif (LCD_ENDIAN_BIG == 0) && \
    (LCD_BITSPERPIXEL == 2) && \
    (LCD_SWAP_XY)
static void _DrawBitLine1BPP_Swap(unsigned x, unsigned y, U8 const GUI_UNI_PTR * pData, int ysize, const U8 * pTrans, int BytesPerLine, U8 Pos) {
  unsigned x0, y0, Off;
  U32 Buffer, Data;
  U8 Index, Pixel, BufferValid, ShiftPos, DataMask;
  #if LCD_MIRROR_Y
    y0 = LCD_XSIZE - x - 1;
  #else
    y0 = x;
  #endif
  #if LCD_MIRROR_X
    x0 = LCD_YSIZE - y - 1;
  #else
    x0 = y;
  #endif
  Off         = XY2OFF(x0, y0);
  BufferValid = 0;
  ShiftPos    = 7 - (Pos & 7);
  DataMask    = 0x80 >> (7 - ShiftPos);
  #if LCD_MIRROR_X
    for (; ysize; ysize--, pData += BytesPerLine, x0--) {
  #else
    for (; ysize; ysize--, pData += BytesPerLine, x0++) {
  #endif
    U8 Shift = (x0 & 0xf) << 1;
    Pixel = (*pData & DataMask) >> ShiftPos;
    if (!BufferValid) {
      Buffer = READ_MEM(Off);
      BufferValid = 1;
    }
    switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
    case 0:
      Buffer &= ~(0x3 << Shift);
      Index = *(pTrans + Pixel);
      Data = Index << Shift;
      Buffer |= Data;
      break;
    case LCD_DRAWMODE_XOR | LCD_DRAWMODE_TRANS:
    case LCD_DRAWMODE_XOR:
      if (Pixel) {
        Buffer ^= (0x3 << Shift);
      }
      break;
    case LCD_DRAWMODE_TRANS:
      if (Pixel) {
        Buffer &= ~(0x3 << Shift);
        Index = *(pTrans + Pixel);
        Data = Index << Shift;
        Buffer |= Data;
      }
      break;
    }
    #if LCD_MIRROR_X
      if (!(x0 & 0xf)) {
        BufferValid = 0;
        WRITE_MEM(Off--, Buffer);
      }
    #else
      if ((x0 & 0xf) == 0xf) {
        BufferValid = 0;
        WRITE_MEM(Off++, Buffer);
      }
    #endif
  }
  if (BufferValid) {
    WRITE_MEM(Off, Buffer);
  }
}

/*********************************************************************
*
*       Draw Bitmap 1 BPP, optimized for LCD_ENDIAN_BIG == 0, LCD_BITSPERPIXEL == 1
*/
#elif (LCD_ENDIAN_BIG == 0) && \
    (LCD_BITSPERPIXEL == 1) && \
    (!LCD_MIRROR_X) && \
    (!LCD_MIRROR_Y) && \
    (!LCD_SWAP_XY)
static void _DrawBitLine1BPP(unsigned x, unsigned y, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  U8 Mode;
  LCD_PIXELINDEX Index0, Index1;
  #if (GUI_USE_MEMDEV_1BPP_FOR_SCREEN == 1)
    const LCD_PIXELINDEX aTrans[2] = {0, 1};
    if (!pTrans) {
      pTrans = aTrans;
    }
  #endif
  Index0 = *(pTrans + 0);
  Index1 = *(pTrans + 1);
  x += Diff;
  Mode = GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR);
  if (Mode == 0) {
    /* Check if filling will do ... */
    if (Index0 == Index1) {
      LCD_PIXELINDEX ColorIndexOld = LCD_COLORINDEX;  /* Save forground color */
      LCD_COLORINDEX = Index0;                        /* Set foreground color */
      LCD_L0_DrawHLine(x, y, x + xsize - 1);
      LCD_COLORINDEX = ColorIndexOld;
    } else { 
      /* O.K., we have to draw ... */
      int Off, NumPixel_0, NumPixel_1, i;
      U32 Data, ColorMask, AndMask;
      Off = y * DWORDS_PER_LINE + x / PIXELS_PER_DWORD;
      NumPixel_0 = x & (PIXELS_PER_DWORD - 1);
      NumPixel_1 = (x + xsize - 1) & (PIXELS_PER_DWORD - 1);
      /* First DWORD */
      if (NumPixel_0) {
        ColorMask = 0;

⌨️ 快捷键说明

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