?? guidev.c
字號:
/*********************************************************************************************************** uC/GUI* Universal graphic software for embedded applications** (c) Copyright 2002, Micrium Inc., Weston, FL* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH** 礐/GUI is protected by international copyright laws. Knowledge of the* source code may not be used to write a similar product. This file may* only be used in accordance with a license and should not be redistributed* in any way. We appreciate your understanding and fairness.*----------------------------------------------------------------------
File : GUIDev.C
Purpose : Implementation of memory devices
---------------------------END-OF-HEADER------------------------------
*/
#include <string.h>
#include "GUI_Private.H"
#include "GUIDebug.h"
/* Memory device capabilities are compiled only if support for them is enabled.*/
#if GUI_SUPPORT_MEMDEV
/*
*********************************************************
* *
* Macros *
* *
*********************************************************
*/
#define POS_AUTO -4095 /* Position value for auto-pos */
/*
********************************************************************
*
* ID translation table
*
********************************************************************
This table contains 0, 1, 2, ... and serves as translation table for DDBs
*/
#define INTS(Base) Base+0,Base+1,Base+2,Base+3,Base+4,Base+5, \
Base+6,Base+7,Base+8,Base+9,Base+10,Base+11, \
Base+12,Base+13,Base+14,Base+15
static const LCD_PIXELINDEX aID[] = {
INTS(0)
};
/*
*********************************************************
* *
* internal routines *
* *
* (not part of interface table) *
* *
*********************************************************
*/
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;
}
/*
*********************************************************
* *
* Draw Bitmap 1 BPP *
* *
*********************************************************
*/
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;
}
}
/*
*********************************************************
* *
* Draw Bitmap 2 BPP *
* *
*********************************************************
*/
static void DrawBitLine2BPP(GUI_USAGE* pUsage, int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
U8 pixels;
U8 PixelCnt;
LCD_PIXELINDEX* pData;
PixelCnt = 4- (Diff&3);
pixels = (*p) << ((Diff&3)<<1);
pData = GUI_MEMDEV_XY2PTR(x,y);
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
case 0: /* Write mode */
PixelLoopWrite:
if (PixelCnt>xsize) {
PixelCnt =xsize;
}
xsize -= PixelCnt;
do {
*pData++ = *(pTrans + (pixels>>6));
pixels<<=2;
} while (--PixelCnt);
if (xsize) {
PixelCnt=4;
pixels = *(++p);
goto PixelLoopWrite;
}
break;
case LCD_DRAWMODE_TRANS:
PixelLoopTrans:
if (PixelCnt>xsize)
PixelCnt =xsize;
xsize -= PixelCnt;
do {
if (pixels&0xc0) {
*pData = *(pTrans + (pixels>>6));
GUI_USAGE_AddPixel(pUsage, x,y);
}
pData++;
pixels<<=2;
} while (--PixelCnt);
if (xsize) {
PixelCnt=4;
pixels = *(++p);
goto PixelLoopTrans;
}
break;
case LCD_DRAWMODE_XOR:;
PixelLoopXor:
if (PixelCnt>xsize)
PixelCnt =xsize;
xsize -= PixelCnt;
do {
if ((pixels&0xc0))
*pData ^= 255;
pData++;
pixels<<=2;
} while (--PixelCnt);
if (xsize) {
PixelCnt=4;
pixels = *(++p);
goto PixelLoopXor;
}
break;
}
}
/*
*********************************************************
* *
* Draw Bitmap 4 BPP *
* *
*********************************************************
*/
static void DrawBitLine4BPP(GUI_USAGE* pUsage, int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
U8 pixels;
LCD_PIXELINDEX* pData;
U8 PixelCnt;
PixelCnt = 2- (Diff&1);
pixels = (*p) << ((Diff&1)<<2);
pData = GUI_MEMDEV_XY2PTR(x,y);
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
/*
* Write mode *
*/
case 0:
/* Draw incomplete bytes to the left of center area */
if (Diff) {
*pData = *(pTrans + (pixels >>4));
pData++;
xsize--;
pixels = *++p;
}
/* Draw center area (2 pixels in one byte) */
if (xsize >= 2) {
int i = xsize>>1;
xsize &= 1;
do {
*pData = *(pTrans + (pixels>>4)); /* Draw 1. (left) pixel */
*(pData+1) = *(pTrans + (pixels&15)); /* Draw 2. (right) pixel */
pData +=2;
pixels = *++p;
} while (--i);
}
/* Draw incomplete bytes to the right of center area */
if (xsize) {
*pData = * (pTrans + (pixels >> 4));
}
break;
/*
* Transparent draw mode *
*/
case LCD_DRAWMODE_TRANS:
/* Draw incomplete bytes to the left of center area */
if (Diff) {
if (pixels&0xF0) {
*pData = *(pTrans + (pixels>>4));
if (pUsage)
GUI_USAGE_AddPixel(pUsage, x,y);
}
pData++;
x++;
xsize--;
pixels = *++p;
}
/* Draw center area (2 pixels in one byte) */
while (xsize >= 2) {
/* Draw 1. (left) pixel */
if (pixels&0xF0) {
*pData = *(pTrans + (pixels>>4));
if (pUsage)
GUI_USAGE_AddPixel(pUsage, x,y);
}
/* Draw 2. (right) pixel */
if (pixels &= 15) {
*(pData+1) = *(pTrans + pixels);
if (pUsage)
GUI_USAGE_AddPixel(pUsage, x+1,y);
}
pData +=2;
x+=2;
xsize-=2;
pixels = *++p;
}
/* Draw incomplete bytes to the right of center area */
if (xsize) {
if (pixels >>= 4) {
*pData = *(pTrans + pixels);
if (pUsage)
GUI_USAGE_AddPixel(pUsage, x,y);
}
}
break;
case LCD_DRAWMODE_XOR:;
PixelLoopXor:
if (PixelCnt>xsize)
PixelCnt =xsize;
xsize -= PixelCnt;
do {
if ((pixels&0xc0))
*pData ^= 255;
pData++;
pixels<<=4;
} while (--PixelCnt);
if (xsize) {
PixelCnt=2;
pixels = *(++p);
goto PixelLoopXor;
}
break;
}
}
/*
*********************************************************
* *
* Draw Bitmap 8 BPP Trans *
* *
*********************************************************
*/
static void DrawBitLine8BPP(GUI_USAGE* pUsage, int x, int y, U8 const*pSrc, int xsize, const LCD_PIXELINDEX*pTrans) {
LCD_PIXELINDEX* pDest;
pDest = GUI_MEMDEV_XY2PTR(x,y);
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
case 0: /* Write mode */
do {
*pDest = *(pTrans + *pSrc);
pDest++;
pSrc++;
} while (--xsize);
break;
case LCD_DRAWMODE_TRANS:
do {
if (*pSrc) {
*pDest = *(pTrans + *pSrc);
GUI_USAGE_AddPixel(pUsage, x,y);
}
x++;
pDest++;
pSrc++;
} while (--xsize);
break;
}
}
/*
*********************************************************
* *
* Draw Bitmap 8 BPP No Trans *
* *
*********************************************************
*/
static void DrawBitLine8BPP_DDB(GUI_USAGE* pUsage, int x, int y, U8 const*pSrc, int xsize) {
LCD_PIXELINDEX* pDest;
pDest = GUI_MEMDEV_XY2PTR(x,y);
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
case 0: /* Write mode */
#if LCD_BITSPERPIXEL <=8
memcpy(pDest, pSrc, xsize);
#else
*pDest = *pSrc;
while (--xsize) {
*++pDest = *++pSrc;
}
#endif
break;
case LCD_DRAWMODE_TRANS:
do {
if (*pSrc) {
*pDest = *pSrc;
GUI_USAGE_AddPixel(pUsage, x,y);
}
x++;
pDest++;
pSrc++;
} while (--xsize);
break;
}
}
/********************************************************
*
* Draw Bitmap 16 BPP DDB
*
*********************************************************
*/
#if LCD_BITSPERPIXEL >8
static void DrawBitLine16BPP_DDB(GUI_USAGE* pUsage, int x, int y, const U16 *pSrc, int xsize) {
LCD_PIXELINDEX* pDest;
pDest = GUI_MEMDEV_XY2PTR(x,y);
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
case 0: /* Write mode */
memcpy(pDest, pSrc, xsize*2);
break;
case LCD_DRAWMODE_TRANS:
do {
if (*pSrc) {
*pDest = *pSrc;
GUI_USAGE_AddPixel(pUsage, x,y);
}
x++;
pDest++;
pSrc++;
} while (--xsize);
break;
}
}
#endif
/*
*********************************************************
* *
* Universal draw Bitmap routine *
* *
*********************************************************
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -