LCD_PIXELINDEX* GUI_MEMDEV_XY2PTR(int x,int y) { GUI_MEMDEV* pDev = GUI_MEMDEV_h2p(GUI_Context.hDevData); U8 *pData = (U8*)(pDev+1); #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL if ((x >= pDev->x0+pDev->XSize) | (x<pDev->x0) | (y >= pDev->y0+pDev->YSize) | (y<pDev->y0)) { GUI_DEBUG_ERROROUT2("GUI_MEMDEV_XY2PTR: parameters out of bounds",x,y); } #endif pData += (y- pDev->y0) * pDev->BytesPerLine; return ((LCD_PIXELINDEX*)pData) + x - pDev->x0; }
void GUI_MEMDEV_SetOrg(GUI_MEMDEV_Handle hMem, int x0, int y0) { /* Make sure memory handle is valid */ if (!hMem) { if ((hMem = GUI_Context.hDevData) ==0) { return; } } GUI_LOCK(); { GUI_MEMDEV* pDev = GUI_MEMDEV_h2p(hMem); /* Convert to pointer */ pDev->y0 = y0; pDev->x0 = x0; LCD_SetClipRectMax(); /* Move usage along */ if (pDev->hUsage) { GUI_USAGE* pUsage = GUI_USAGE_h2p(pDev->hUsage); if (((pUsage->XSize = pDev->XSize) != 0) && ((pUsage->YSize = pDev->YSize) != 0)) { pUsage->x0 = x0; pUsage->y0 = y0; } } } GUI_UNLOCK(); }
static void DrawBitLine1BPP(GUI_USAGE* pUsage, int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) { LCD_PIXELINDEX pixels; LCD_PIXELINDEX Index0 = *(pTrans+0); LCD_PIXELINDEX Index1 = *(pTrans+1); LCD_PIXELINDEX* pData; U8 PixelCnt; GUI_MEMDEV* pDev = GUI_MEMDEV_h2p(GUI_Context.hDevData); PixelCnt = 8- (Diff&7); pixels = (*p) << (Diff&7); pData = GUI_MEMDEV_XY2PTR(x,y); GUI_DEBUG_ERROROUT3_IF( x < pDev->x0, "GUIDEV.c: DrawBitLine1BPP, Act= %d, Border= %d, Clip= %d" ,x,pDev->x0, GUI_Context.ClipRect.x0); switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) { case 0: /* Write mode */ PixelLoopWrite: if (PixelCnt>xsize) PixelCnt =xsize; xsize -= PixelCnt; do { *pData++ = (pixels&0x80) ? Index1 : Index0; pixels<<=1; } while (--PixelCnt); if (xsize) { PixelCnt=8; pixels = *(++p); goto PixelLoopWrite; } break; case LCD_DRAWMODE_TRANS: PixelLoopTrans: if (PixelCnt>xsize) PixelCnt =xsize; xsize -= PixelCnt; do { if ((pixels&0x80)) { if (pUsage) GUI_USAGE_AddPixel(pUsage, x,y); *pData = Index1; } x++; pData++; pixels<<=1; } while (--PixelCnt); if (xsize) { PixelCnt=8; pixels = *(++p); goto PixelLoopTrans; } break; case LCD_DRAWMODE_XOR:; PixelLoopXor: if (PixelCnt>xsize) PixelCnt =xsize; xsize -= PixelCnt; do { if ((pixels&0x80)) *pData = pDev->NumColors - 1 - *pData; pData++; pixels<<=1; } while (--PixelCnt); if (xsize) { PixelCnt=8; pixels = *(++p); goto PixelLoopXor; } break; } }