硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1977|回复: 3
收起左侧

[emWin] STemWin自定义驱动中函数_DrawBitmap的优化问题

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107642
QQ
发表于 2017-6-12 00:53:58 | 显示全部楼层 |阅读模式
函数原型是如下这个样子的:
  1. /*********************************************************************
  2. *
  3. *       _DrawBitmap
  4. */
  5. static void _DrawBitmap(GUI_DEVICE * pDevice, int x0, int y0,
  6.                        int xSize, int ySize,
  7.                        int BitsPerPixel,
  8.                        int BytesPerLine,
  9.                        const U8 * pData, int Diff,
  10.                        const LCD_PIXELINDEX * pTrans) {
  11.   int i;
  12.   switch (BitsPerPixel) {
  13.   case 1:
  14.     for (i = 0; i < ySize; i++) {
  15.       _DrawBitLine1BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
  16.       pData += BytesPerLine;
  17.     }
  18.     break;
  19.   case 2:
  20.     for (i = 0; i < ySize; i++) {
  21.       _DrawBitLine2BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
  22.       pData += BytesPerLine;
  23.     }
  24.     break;
  25.   case 4:
  26.     for (i = 0; i < ySize; i++) {
  27.       _DrawBitLine4BPP(pDevice, x0, i + y0, pData, Diff, xSize, pTrans);
  28.       pData += BytesPerLine;
  29.     }
  30.     break;
  31.   case 8:
  32.     for (i = 0; i < ySize; i++) {
  33.       _DrawBitLine8BPP(pDevice, x0, i + y0, pData, xSize, pTrans);
  34.       pData += BytesPerLine;
  35.     }
  36.     break;
  37.   //
  38.   // Only required for 16bpp color depth of target. Should be removed otherwise.
  39.   //
  40.   case 16:
  41.     for (i = 0; i < ySize; i++) {
  42.       _DrawBitLine16BPP(pDevice, x0, i + y0, (const U16 *)pData, xSize);
  43.       pData += BytesPerLine;
  44.     }
  45.     break;
  46.   //
  47.   // Only required for 32bpp color depth of target. Should be removed otherwise.
  48.   //
  49.   case 32:
  50.     for (i = 0; i < ySize; i++) {
  51.       _DrawBitLine32BPP(pDevice, x0, i + y0, (const U32 *)pData, xSize);
  52.       pData += BytesPerLine;
  53.     }
  54.     break;
  55.   }
  56. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107642
QQ
 楼主| 发表于 2017-6-12 00:55:51 | 显示全部楼层
一般我们主要是用16BPP,优化的时候仅续优化里面的函数   
for (i = 0; i < ySize; i++) {
      _DrawBitLine16BPP(pDevice, x0, i + y0, (const U16 *)pData, xSize);
      pData += BytesPerLine;
    }

采用下面的这个函数进行优化即可:
/*
*********************************************************************************************************
*    函 数 名: _LCD_DrawBitmap16bpp
*    功能说明: 16bpp位图绘制
*    形    参: --
*    返 回 值: 无
*********************************************************************************************************
*/
static void _LCD_DrawBitmap16bpp(int LayerIndex, int x, int y, U16 const * p, int xSize, int ySize, int BytesPerLine) {
  U32 BufferSize, AddrDst;
  int OffLineSrc, OffLineDst;

  BufferSize = _GetBufferSize(LayerIndex);
  AddrDst = _aAddr[LayerIndex] + BufferSize * _aBufferIndex[LayerIndex] + (y * _axSize[LayerIndex] + x) * _aBytesPerPixels[LayerIndex];
  OffLineSrc = (BytesPerLine / 2) - xSize;
  OffLineDst = _axSize[LayerIndex] - xSize;
  _DMA_Copy(LayerIndex, (void *)p, (void *)AddrDst, xSize, ySize, OffLineSrc, OffLineDst);
}
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2017-11-7 10:30:22 | 显示全部楼层
_DMA_Copy
、是安富莱特有的么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107642
QQ
 楼主| 发表于 2017-11-7 10:45:49 | 显示全部楼层

回 924045559@qq 的帖子

924045559@qq:_DMA_Copy
、是安富莱特有的么 (2017-11-07 10:30) 
这个是F429的DMA2D,做这个例子的时候专门弄了一个:http://www.armbbs.cn/forum.php?mod=viewthread&tid=30543
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-9 21:30 , Processed in 0.193285 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表