?? lcd.c
字號:
/*************************************************************************************************************
uC/GUI
嵌入式通用圖形軟件
File : LCD.c
Purpose : Link between GUI and LCD_L0 Performs most of the clipping.
*************************************************************************************************************/
#define LCD_C
#include <stdio.h>
#include "GUI_Private.H"
#include "LCD_Private.h"
#include "GUIDebug.h"
/*************************************************************************************************************
* Macros for internal use--供內部使用的宏
*************************************************************************************************************/
#define RETURN_IF_Y_OUT() \
if (y < GUI_Context.ClipRect.y0) return; \
if (y > GUI_Context.ClipRect.y1) return;
#define RETURN_IF_X_OUT() \
if (x < GUI_Context.ClipRect.x0) return; \
if (x > GUI_Context.ClipRect.x1) return;
#define CLIP_X() \
if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } \
if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; }
#define CLIP_Y() \
if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } \
if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; }
/*************************************************************************************************************
* LCD_SetColorIndex
* LCD_SetBkColorIndex
*************************************************************************************************************/
static int GetColorIndex(int i) /* i is 0 or 1 */
{
return (GUI_Context.DrawMode & LCD_DRAWMODE_REV) ? i-1 : i;
}
void LCD_SetColorIndex(int Index) { LCD_ACOLORINDEX[GetColorIndex(1)] = Index; }
void LCD_SetBkColorIndex(int Index) { LCD_ACOLORINDEX[GetColorIndex(0)] = Index; }
/*************************************************************************************************************
* LCD_SetDrawMode
*************************************************************************************************************/
LCD_DRAWMODE LCD_SetDrawMode (LCD_DRAWMODE dm)
{
LCD_DRAWMODE OldDM = GUI_Context.DrawMode;
if ((GUI_Context.DrawMode^dm) & LCD_DRAWMODE_REV)
{
LCD_PIXELINDEX temp = LCD_BKCOLORINDEX;
LCD_BKCOLORINDEX = LCD_COLORINDEX;
LCD_COLORINDEX = temp;
}
GUI_Context.DrawMode = dm;
return OldDM;
}
/*************************************************************************************************************
* LCD_DrawPixel
Purpose: This routine is called by emWin. It writes 1 pixel into the display using the current drawing mode.
*************************************************************************************************************/
void LCD_DrawPixel(int x, int y)
{
RETURN_IF_Y_OUT();
RETURN_IF_X_OUT();
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)
{
LCDDEV_L0_XorPixel(x, y);
}
else
{
LCDDEV_L0_SetPixelIndex(x, y, LCD_COLORINDEX);
}
}
/*************************************************************************************************************
* LCD_DrawLine vertical/horizontal
* LCD_DrawRect
*************************************************************************************************************/
void LCD_DrawHLine (int x0, int y, int x1)
{
/* Perform clipping and check if there is something to do */
RETURN_IF_Y_OUT();
CLIP_X();
if (x1<x0)
return;
/* Call driver to draw */
LCDDEV_L0_DrawHLine(x0, y, x1);
}
void LCD_FillRect(int x0, int y0, int x1, int y1)
{
/* Perform clipping and check if there is something to do */
CLIP_X();
if (x1<x0)
return;
CLIP_Y();
if (y1<y0)
return;
/* Call driver to draw */
LCDDEV_L0_FillRect(x0,y0,x1,y1);
}
/*************************************************************************************************************
* Universal draw Bitmap routine--常規(guī)通用繪制位圖
*************************************************************************************************************/
void LCD_DrawBitmap (int x0, int y0,
int xsize, int ysize,
int xMul, int yMul,
int BitsPerPixel,
int BytesPerLine,
const U8* pPixel,
const LCD_LOGPALETTE* pLogPal)
{
U8 Data;
int x1, y1;
const LCD_PIXELINDEX* pTrans;
/* Handle the optional Y-magnification */
y1 = y0+ysize-1;
x1 = x0+xsize-1;
/* Handle color translation */
if ((pLogPal) && (pLogPal->pPalEntries))
{
if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL)
{
return;
}
}
else
{
pTrans = (BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
}
/* Handle BITMAP without magnification */
if ((xMul==1) && (yMul==1))
{
int Diff;
/* Clip Y */
if (y0 < GUI_Context.ClipRect.y0)
{
Diff = GUI_Context.ClipRect.y0 -y0;
y0 = GUI_Context.ClipRect.y0;
pPixel += Diff*BytesPerLine;
ysize -= Diff;
}
if (y1 > GUI_Context.ClipRect.y1)
{
int Diff = y1-GUI_Context.ClipRect.y1;
ysize -= Diff;
}
if (ysize <=0)
return;
/* Clip right side */
if (x1 > GUI_Context.ClipRect.x1)
{
int Diff = x1-GUI_Context.ClipRect.x1;
xsize -= Diff;
}
/* Clip left side ... (The difficult side ...) */
Diff =0;
if (x0 < GUI_Context.ClipRect.x0)
{
Diff = GUI_Context.ClipRect.x0-x0;
xsize-=Diff;
switch (BitsPerPixel)
{
case 1:
pPixel+= (Diff>>3); x0 += (Diff>>3)<<3; Diff &=7;
break;
case 2:
pPixel+= (Diff>>2); x0 += (Diff>>2)<<2; Diff &=3;
break;
case 4:
pPixel+= (Diff>>1); x0 += (Diff>>1)<<1; Diff &=1;
break;
case 8:
pPixel+= Diff; x0 += Diff; Diff=0;
break;
case 16:
pPixel+= (Diff<<1); x0 += Diff; Diff=0;
break;
}
}
if (xsize <=0)
return;
LCDDEV_L0_DrawBitmap (x0,y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans);
}
else
{
/**** Handle BITMAP with magnification ***/
int x,y;
int yi;
int Shift = 8-BitsPerPixel;
for (y=y0, yi=0; yi<ysize; yi++, y+= yMul, pPixel+=BytesPerLine)
{
int yMax = y+yMul-1;
/* Draw if within clip area (Optimization ... "if" is not required !) */
if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1))
{
int BitsLeft =0;
int xi;
const U8* pDataLine = pPixel;
for (x=x0, xi=0; xi<xsize; xi++, x+=xMul)
{
U8 Index;
if (!BitsLeft)
{
Data = *pDataLine++;
BitsLeft =8;
}
Index = Data>>Shift;
Data <<= BitsPerPixel;
BitsLeft -= BitsPerPixel;
if (Index | ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) ==0))
{
LCD_PIXELINDEX OldColor = LCD_COLORINDEX;
if (pTrans)
{
LCD_COLORINDEX = *(pTrans+Index);
}
else
{
LCD_COLORINDEX = Index;
}
LCD_FillRect(x,y, x+xMul-1, yMax);
LCD_COLORINDEX = OldColor;
}
}
}
}
}
}
/*************************************************************************************************************
* Set Max Clip Rect--設置最大剪輯矩形
*************************************************************************************************************/
void LCD_SetClipRectMax(void)
{
LCDDEV_L0_GetRect(&GUI_Context.ClipRect);
}
/*************************************************************************************************************
* LCD_Init : Init the display--初始化顯示
*************************************************************************************************************/
int LCD_Init(void)
{
int r;
GUI_DEBUG_LOG("\nLCD_Init...");
LCD_SetClipRectMax();
if ((r = LCD_L0_Init()) != 0)
return r;
#if LCD_NUM_DISPLAYS > 1
if ((r = LCD_L0_1_Init()) != 0)
return r;
#endif
LCD_InitLUT();
/* Clear video memory */
LCD_SetDrawMode(GUI_DRAWMODE_REV);
LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX);
LCD_SetDrawMode(0);
/* Switch LCD on */
LCD_On();
return 0;
}
/*************************************************************************************************************
* LCD_Index2Color
* LCD_Color2Index
*************************************************************************************************************/
int LCD_Color2Index (LCD_COLOR Color)
{
return LCDDEV_L0_Color2Index(Color);
}
LCD_COLOR LCD_Index2Color (int Index)
{
return LCDDEV_L0_Index2Color(Index);
}
/*************************************************************************************************************
* LCD_SetBkColor
* LCD_SetColor
Purpose: Assign color/index to foreground/ background --指定顏色/指數(shù)前景/背景
*************************************************************************************************************/
void LCD_SetBkColor(GUI_COLOR color)
{
LCD_SetBkColorIndex(LCD_Color2Index(color));
}
void LCD_SetColor(GUI_COLOR color)
{
LCD_SetColorIndex(LCD_Color2Index(color));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -