硬汉嵌入式论坛

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

[emWin] GUI_DrawBitmap和GUI_DrawBitmapMag

[复制链接]

3

主题

6

回帖

15

积分

新手上路

积分
15
发表于 2019-10-22 18:02:10 | 显示全部楼层 |阅读模式
本帖最后由 bl-2019 于 2019-10-22 19:28 编辑

static void _cbDialog(WM_MESSAGE * pMsg) {
  const void * pData;
  WM_HWIN      hItem;
  U32          FileSize;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Image'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    pData = _GetImageById(ID_IMAGE_0_IMAGE_0, &FileSize);
    IMAGE_SetBMP(hItem, pData, FileSize);
    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  case WM_PAINT:
          GUI_DrawBitmapMag(&bmstart1, 100, 10, 3, 3);
          GUI_DrawBitmap(&bmstart1, 200, 50);
          break;

  default:
    WM_DefaultProc(pMsg);
    break;
  }
}

发现一个奇怪的现象,红色的代码部分,也就是GUI_DrawBitmap不能显示图片,但是用GUI_DrawBitmapMag就可以显示图片这是为什么
并且我试验过不是放大后的图片遮住了,而且GUI_DrawBitmapMag(&bmstart1, 100, 10, 1, 1);只放大一倍也不能显示,最小要放大2倍,感觉好奇怪啊
下面时两个函数相关的代码
/*********************************************************************
*
*       GUI_DrawBitmap
*/
void GUI_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) {
  #if (GUI_WINSUPPORT)
    GUI_RECT r;
  #endif
  GUI_LOCK();
  #if (GUI_WINSUPPORT)
    WM_ADDORG(x0,y0);
    r.x1 = (r.x0 = x0) + pBitmap->XSize-1;
    r.y1 = (r.y0 = y0) + pBitmap->YSize-1;
    WM_ITERATE_START(&r) {
  #endif
  GL_DrawBitmap(pBitmap, x0, y0);
  #if (GUI_WINSUPPORT)
    } WM_ITERATE_END();
  #endif
  GUI_UNLOCK();

}
/*********************************************************************
*
*       GL_DrawBitmap
*
* Purpose:
*  Translates the external bitmap format into an internal
*  format. This turned out to be necessary as the internal
*  format is easier to create and more flexible for routines
*  that draw text-bitmaps.
*/
void GL_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) {
  GUI_DRAWMODE PrevDraw;
  const GUI_LOGPALETTE GUI_UNI_PTR * pPal;
  pPal = pBitmap->pPal;
  PrevDraw = GUI_SetDrawMode(0);  /* No Get... at this point */
  GUI_SetDrawMode((pPal && pPal->HasTrans) ? (PrevDraw|GUI_DRAWMODE_TRANS) : PrevDraw &(~GUI_DRAWMODE_TRANS));
  if (pBitmap->pMethods) {
    #if GUI_COMPILER_SUPPORTS_FP      /* Do not support this on VERY simple chips and compilers */
      pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, 1, 1);
    #endif
  } else {
    const LCD_PIXELINDEX* pTrans;
    pTrans = LCD_GetpPalConvTable(pBitmap->pPal);
    if (!pTrans) {
      pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
    }
    LCD_DrawBitmap( x0,y0
                    ,pBitmap->XSize ,pBitmap->YSize
                    ,1,1
                    ,pBitmap->BitsPerPixel
                    ,pBitmap->BytesPerLine
                    ,pBitmap->pData
                    ,pTrans);
  }
  GUI_SetDrawMode(PrevDraw);

}

*/
/*********************************************************************
*
*       GUI_DrawBitmapMag
*/
void GUI_DrawBitmapMag(const GUI_BITMAP GUI_UNI_PTR *pBitmap, int x0, int y0, int xMul, int yMul) {
  GUI_DRAWMODE PrevDraw;
  int xSize, ySize;
  const GUI_LOGPALETTE GUI_UNI_PTR * pPal;
  const LCD_PIXELINDEX* pTrans;
  GUI_LOCK();
  pPal = pBitmap->pPal;
  xSize = pBitmap->XSize;
  ySize = pBitmap->YSize;
  pTrans = LCD_GetpPalConvTable(pPal);
  if (!pTrans) {
    pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
  }
  PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0);
  #if (GUI_WINSUPPORT)
    WM_ADDORG(x0,y0);
    {
      GUI_RECT r;
      r.x0 = x0;
      r.x1 = x0 + xSize * xMul -1;
      r.y0 = y0;
      r.y1 = y0 + ySize * yMul -1;
      WM_ITERATE_START(&r);
  #endif
  if (pBitmap->pMethods) {
    #if GUI_COMPILER_SUPPORTS_FP      /* Do not support this on VERY simple chips and compilers */
      pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, xMul, yMul);
    #endif
  } else {
    LCD_DrawBitmap(x0, y0, xSize, ySize, xMul, yMul
                    ,pBitmap->BitsPerPixel, pBitmap->BytesPerLine
                    ,pBitmap->pData, pTrans);
  }
  #if (GUI_WINSUPPORT)
      WM_ITERATE_END();
    }
  #endif
  GUI_SetDrawMode(PrevDraw);
  GUI_UNLOCK();

}




回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2019-10-22 19:37:01 | 显示全部楼层
1.函数调用过程:

GUI_DrawBitmap( )------>GL_DrawBitmap( )------>LCD_DrawBitmap( )------>

LCDDEV_L0_DrawBitmap( )------>DrawBitLineXpp( )------>SETPIXEL( )

2.说明

   2.1  ucgui经过一层层的参数检查和转换,最终分成一条一条线,然后再将单个像素

    画出来。

  2.2 bitmap定义过程

   先定义个GUI_COLOR 数组,说明palette(调色板)中支持的颜色

  再定下定义一个palette结构体,说明支持的颜色入口及是否透明

  接着定义了一个unsigned char数组,用来存储图片的颜色信息

  最后定义一个GUI_BITMAP,指出图片的入口信息,调色板的入口信息,大小等。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2019-10-23 08:26:49 | 显示全部楼层
GUI_DrawBitmap属于基本的API,如果这个都无法显示的话,你的程序模板有问题。
回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2019-10-23 08:42:00 | 显示全部楼层
eric2013 发表于 2019-10-23 08:26
GUI_DrawBitmap属于基本的API,如果这个都无法显示的话,你的程序模板有问题。

原来是这样,我重新找个模板移植一遍试一试,谢谢!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 10:25 , Processed in 0.244294 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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