📄 lcd13xx.c
字号:
col = Data;
#endif
#endif
return col;
}
static void XorPixel (int x, int y) {
LCD_PIXELINDEX Index = GetPixelIndex(x,y);
_SetPixel(x,y,LCD_NUM_COLORS-1-Index);
}
/*
*********************************************************
* *
* LCD_L0_XorPixel *
* *
*********************************************************
Purpose: This routine is called by emWin. It writes 1 pixel into the
display.
*/
void LCD_L0_XorPixel(int x, int y) {
XORPIXEL(x, y);
}
/*
*********************************************************
* *
* LCD_L0_SetPixelIndex *
* *
*********************************************************
Purpose: This routine is called by emWin. It writes 1 pixel into the
display.
*/
void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
SETPIXEL(x, y, ColorIndex);
}
/*
*********************************************************
* *
* LCD_L0_DrawHLine optimized *
* *
* 16 bit bus, Using BITBLT *
* *
*********************************************************
*/
#if (LCD_USE_BITBLT) \
&& (!LCD_SWAP_XY) \
&& (LCD_BUSWIDTH==16) \
&& (!defined (LCD_LUT_COM)) \
&& (!defined (LCD_LUT_SEG)) \
&& ((LCD_CONTROLLER == 1356)||(LCD_CONTROLLER == 13806))
void LCD_L0_DrawHLine (int x0, int y, int x1) {
#if LCD_MIRROR_X
#define X0 (LCD_XSIZE-1-(x1))
#define X1 (LCD_XSIZE-1-(x0))
#else
#define X0 x0
#define X1 x1
#endif
#if LCD_MIRROR_Y
#define Y0 (LCD_YSIZE-1-(y))
#else
#define Y0 y
#endif
if (x0>x1) return;
LCD_FillRectBB(X0,Y0,X1,Y0);
#undef X0
#undef X1
#undef Y0
}
/*
*********************************************************
* *
* LCD_L0_DrawHLine optimized *
* *
* 16 bit bus, 16 bpp *
* *
*********************************************************
*/
#elif (LCD_OPTIMIZE) \
&& (!LCD_SWAP_XY) \
&& (!LCD_MIRROR_Y) \
&& (LCD_BUSWIDTH==16) \
&& (!defined (LCD_LUT_COM)) \
&& (!defined (LCD_LUT_SEG)) \
&& ((LCD_BITSPERPIXEL == 16) || (LCD_BITSPERPIXEL == 15))
void LCD_L0_DrawHLine (int x0, int y, int x1) {
#if LCD_MIRROR_X
#define X0 (LCD_XSIZE-1-(x1))
#else
#define X0 x0
#endif
if (x0>x1) return;
{
register tOff Off = XY2OFF(X0,y);
register int Rem = x1-x0+1;
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; Rem--; Off++) {
U16 Data;
READ_MEM(Off, Data);
Data = LCD_NUM_COLORS-1-Data;
WRITE_MEM(Off,Data);
}
} else {
for (; Rem >= 8; Off += 8) {
WRITE_MEM(Off,COLOR);
WRITE_MEM(Off+1,COLOR);
WRITE_MEM(Off+2,COLOR);
WRITE_MEM(Off+3,COLOR);
WRITE_MEM(Off+4,COLOR);
WRITE_MEM(Off+5,COLOR);
WRITE_MEM(Off+6,COLOR);
WRITE_MEM(Off+7,COLOR);
Rem -=8;
}
for (; Rem--; Off++) {
WRITE_MEM(Off,COLOR);
}
}
}
#undef X0
}
/*
*********************************************************
* *
* LCD_L0_DrawHLine optimized *
* *
* 16 bit bus, 8 bpp *
* *
*********************************************************
*/
#elif (LCD_OPTIMIZE) \
&& (!LCD_SWAP_XY) \
&& (LCD_BUSWIDTH==16) \
&& (!defined (LCD_LUT_SEG)) \
&& (LCD_BITSPERPIXEL == 8)
void LCD_L0_DrawHLine (int x0, int y, int x1) {
#if LCD_MIRROR_X
{
int t = (LCD_XSIZE-1-(x0));
x0 = (LCD_XSIZE-1-(x1));
x1 = t;
}
#endif
#if LCD_MIRROR_Y
y = (LCD_YSIZE-1-(y));
#endif
{
register tOff Off = XY2OFF(x0,y);
/* register */ U16 Data;
/* XOR mode */
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
if (x0&1) {
READ_MEM(Off, Data);
Data ^= ((unsigned int)255);
WRITE_MEM(Off,Data);
x0++;
Off++;
}
for (; x0<x1; x0+=2, Off++) {
READ_MEM(Off,Data);
Data ^= 0xffff;
WRITE_MEM(Off,Data);
}
if ((x1&1)==0) {
READ_MEM(Off,Data);
Data ^= (U16)255<<8;
WRITE_MEM(Off,Data);
}
/* WRITE mode */
} else {
if (x0&1) {
READ_MEM(Off,Data);
Data = (Data&((U16)0xff<<8)) | (COLOR);
WRITE_MEM(Off,Data);
x0++;
Off++;
}
Data = COLOR|((U16)COLOR<<8);
/* Optimization for longer lines ... */
#ifdef LCD_WRITE_MEM32
if ((x0<x1-4) && (x0&2)) { /* Write 16 bits if necessary */
WRITE_MEM(Off,Data);
x0+=2;
Off++;
}
/* write 4 pixels at a time, loop unrolled */
{ register U32 Data32 = Data| (Data<<16);
for (;x0<x1-32-2; x0+=32, Off+=16) {
LCD_WRITE_MEM32(Off+0,Data32);
LCD_WRITE_MEM32(Off+2,Data32);
LCD_WRITE_MEM32(Off+4,Data32);
LCD_WRITE_MEM32(Off+6,Data32);
LCD_WRITE_MEM32(Off+8,Data32);
LCD_WRITE_MEM32(Off+10,Data32);
LCD_WRITE_MEM32(Off+12,Data32);
LCD_WRITE_MEM32(Off+14,Data32);
}
}
{ register U32 Data32 = Data| (Data<<16);
for (;x0<x1-16-2; x0+=16, Off+=8) {
LCD_WRITE_MEM32(Off+0,Data32);
LCD_WRITE_MEM32(Off+2,Data32);
LCD_WRITE_MEM32(Off+4,Data32);
LCD_WRITE_MEM32(Off+6,Data32);
}
}
{ register U32 Data32 = Data| (Data<<16);
for (;x0<x1-8-2; x0+=8, Off+=4) {
LCD_WRITE_MEM32(Off+0,Data32);
LCD_WRITE_MEM32(Off+2,Data32);
}
}
#else
for (;x0<x1-10; x0+=12, Off+=6) {
/* swapping can be ignored, so use faster LCD_WRITE_MEM */
LCD_WRITE_MEM(Off,Data);
LCD_WRITE_MEM(Off+1,Data);
LCD_WRITE_MEM(Off+2,Data);
LCD_WRITE_MEM(Off+3,Data);
LCD_WRITE_MEM(Off+4,Data);
LCD_WRITE_MEM(Off+5,Data);
}
#endif
/* write the last pixels 2 at a time */
for (; x0<x1; x0+=2, Off++) {
/* swapping can be ignored, so use faster LCD_WRITE_MEM */
LCD_WRITE_MEM(Off,Data);
}
if ((x1&1)==0) {
READ_MEM(Off, Data);
Data = (Data&((unsigned int)0xff)) | ((U16)COLOR<<8);
WRITE_MEM(Off,Data);
}
}
}
}
/*
*********************************************************
* *
* LCD_L0_DrawHLine optimized *
* *
* 16 bit bus, 4 bpp *
* *
*********************************************************
*/
#elif (LCD_OPTIMIZE) \
&& (!LCD_SWAP_XY) \
&& (LCD_BUSWIDTH==16) \
&& (!defined (LCD_LUT_SEG)) \
&& (LCD_BITSPERPIXEL == 4)
void LCD_L0_DrawHLine (int x0, int y, int x1) {
#if LCD_MIRROR_X
#define X0 (LCD_XSIZE-1-(x1))
#else
#define X0 x0
#endif
#if LCD_MIRROR_Y
#define Y (LCD_YSIZE - 1 - y)
#else
#define Y y
#endif
if (x0>x1) return;
{
register tOff Off;
register int Rem;
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; (x0&3 )&&(x0<=x1); x0++) XORPIXEL(x0, y);
for (; ((x1+1)&3)&&(x0<=x1); x1--) XORPIXEL(x1, y);
Off = XY2OFF(X0,Y);
Rem = (x1-x0+4)>>2;
for (; Rem--; Off++) {
U16 c;
READ_MEM(Off, c);
c ^= 0xffff;
WRITE_MEM(Off,c);
}
} else {
U16 col = COLOR+(COLOR<<4)+(COLOR<<8)+(COLOR<<12);
for (; (x0&3 )&&(x0<=x1); x0++)
SETPIXEL(x0, y, COLOR);
for (; ((x1+1)&3)&&(x0<=x1); x1--)
SETPIXEL(x1, y, COLOR);
Off = XY2OFF(X0,Y);
Rem = (x1-x0+4)>>2;
for (; Rem--; Off++) {
/* swapping can be ignored, so use faster LCD_WRITE_MEM */
LCD_WRITE_MEM(Off,col);
}
}
}
#undef X0
}
/*
*********************************************************
* *
* LCD_L0_DrawHLine optimized *
* *
* 16 bit bus, 1 bpp *
* *
*********************************************************
*/
#elif (LCD_OPTIMIZE) \
&& (!LCD_SWAP_XY) \
&& (LCD_BUSWIDTH==16) \
&& (!defined (LCD_LUT_SEG)) \
&& (LCD_BITSPERPIXEL == 1)
void LCD_L0_DrawHLine (int x0, int y, int x1) {
#if LCD_MIRROR_X
{
int temp = x0;
x0 = (LCD_XSIZE-1-(x1));
x1 = (LCD_XSIZE-1-(temp));
}
#endif
#if LCD_MIRROR_Y
{
y = (LCD_YSIZE - 1 - y);
}
#endif
{
register tOff Off = XY2OFF(x0,y);
int iWord = x0>>4;
int Word1 = x1>>4;
U16 Mask = 0xffff >> (x0&15);
U16 EndMask = 0xffff8000 >> (x1&15);
U16 Data;
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; iWord<Word1; iWord++) {
READ_MEM(Off,Data);
Data ^= Mask;
WRITE_MEM(Off++,Data);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -