📄 directdisplay.c
字号:
#include "../ucos-ii/includes.h"
#include "../inc/sys/loadfile.h"
#include "../inc/macro.h"
#include "../src/fs/OSFile.h"
#include <math.h>
#include "DirectDisplay.h"
#if USE_MINIGUI==0
void Direct_DrawSBresenham_Line(PDC pdc, int x1, int y1,int x2, int y2);
U32* pDirectLCDBuffer=(U32*)0xc000000;
#if DIRECT_DISPLAY==1
//#ifdef COLORDEPTH_GRAY
void Direct_SetPixel(PDC pdc, int x, int y, COLORREF color)
{
U32 temp=0x00000000;
U32* p;
x*=LCDWIDTH;
x/=pdc->DrawRangex;
y*=LCDHEIGHT;
y/=pdc->DrawRangey;
x+=pdc->DrawOrgx+pdc->WndOrgx;
y+=pdc->DrawOrgy+pdc->WndOrgy;
#if COLORDEPTH_GRAY==1
if(x%8==0){
p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8-1;
temp=color;
}
else {
p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
temp=color<<(8-x%8)*4;
}
if(IsInRect(&pdc->DrawRect, x, y)){
switch(pdc->PenMode){
case GRAPH_MODE_NORMAL:
if(color>0x00000000)
*p=*p|temp;
else if(color==0x00000000){
switch(x%8){
case 0:
temp=temp+0xfffffff0;
break;
case 1:
temp=temp+0x0fffffff;
break;
case 2:
temp=temp+0xf0ffffff;
break;
case 3:
temp=temp+0xff0fffff;
break;
case 4:
temp=temp+0xfff0ffff;
break;
case 5:
temp=temp+0xffff0fff;
break;
case 6:
temp=temp+0xfffff0ff;
break;
case 7:
temp=temp+0xffffff0f;
break;
}
*p=*p&temp;
}
break;
case GRAPH_MODE_OR:
*p=*p|temp;
break;
case GRAPH_MODE_AND:
switch(x%8){
case 0:
temp=temp+0xfffffff0;
break;
case 1:
temp=temp+0x0fffffff;
break;
case 2:
temp=temp+0xf0ffffff;
break;
case 3:
temp=temp+0xff0fffff;
break;
case 4:
temp=temp+0xfff0ffff;
break;
case 5:
temp=temp+0xffff0fff;
break;
case 6:
temp=temp+0xfffff0ff;
break;
case 7:
temp=temp+0xffffff0f;
break;
}
*p=*p&temp;
break;
case GRAPH_MODE_XOR:
*p=*p^temp;
break;
case GRAPH_MODE_NOR:
switch(x%8){
case 0:
temp=temp+0x0000000f;
break;
case 1:
temp=temp+0xf0000000;
break;
case 2:
temp=temp+0x0f000000;
break;
case 3:
temp=temp+0x00f00000;
break;
case 4:
temp=temp+0x000f0000;
break;
case 5:
temp=temp+0x0000f000;
break;
case 6:
temp=temp+0x00000f00;
break;
case 7:
temp=temp+0x000000f0;
break;
}
*p=*p^temp;
break;
}
}
#endif
#if COLORDEPTH_GRAY ==0 //单色模式
if(IsInRect(&pdc->DrawRect, x, y)){
if(x%32==0){////x位于32的整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
if(color==0){///无色
switch(pdc->PenMode){
case GRAPH_MODE_NORMAL:
*p=*p&0xfffffffe;
break;
case GRAPH_MODE_OR:
*p=*p|0x00000000;
break;
case GRAPH_MODE_AND:
*p=*p&0xfffffffe;
break;
case GRAPH_MODE_XOR:
*p=*p^0x00000000;
break;
case GRAPH_MODE_NOR:
*p=*p^0x00000000;
break;
}
}
else{
switch(pdc->PenMode){
case GRAPH_MODE_NORMAL:
*p=*p|0x00000001;
break;
case GRAPH_MODE_OR:
*p=*p|0x00000001;
break;
case GRAPH_MODE_AND:
*p=*p;
break;
case GRAPH_MODE_XOR:
*p=*p^0x00000001;
break;
case GRAPH_MODE_NOR:
*p=*p^0x00000001;
break;
}
}
}
else {////x位于32的非整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;
if(color==0){
temp=~(0x00000001<<(32-x%32));
switch(pdc->PenMode){
case GRAPH_MODE_NORMAL:
*p=*p&temp;
break;
case GRAPH_MODE_OR:
*p=*p|0x00000000;
break;
case GRAPH_MODE_AND:
*p=*p&temp;
break;
case GRAPH_MODE_XOR:
*p=*p^0x00000000;
break;
case GRAPH_MODE_NOR:
*p=*p^0x00000000;
break;
}
}
else{
temp=0x00000001<<(32-x%32);
switch(pdc->PenMode){
case GRAPH_MODE_NORMAL:
*p=*p|temp;
break;
case GRAPH_MODE_OR:
*p=*p|temp;
break;
case GRAPH_MODE_AND:
*p=*p;
break;
case GRAPH_MODE_XOR:
*p=*p^temp;
break;
case GRAPH_MODE_NOR:
*p=*p^temp;
break;
}
}
}
}
#endif
}
void Direct_ClearScreen()
{
#if COLORDEPTH_GRAY ==1
memset(pDirectLCDBuffer,0,LCDWIDTH*LCDHEIGHT/2);
#endif
#if COLORDEPTH_GRAY ==0
memset(pDirectLCDBuffer,0,LCDWIDTH*LCDHEIGHT/8);
#endif
}
void Direct_SetPixelOR(PDC pdc, int x, int y, COLORREF color)
{
U32 temp=0x00000000;
U32* p;
x*=LCDWIDTH;
x/=pdc->DrawRangex;
y*=LCDHEIGHT;
y/=pdc->DrawRangey;
x+=pdc->DrawOrgx+pdc->WndOrgx;
y+=pdc->DrawOrgy+pdc->WndOrgy;
#if COLORDEPTH_GRAY ==1 //灰度模式
p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
temp=color<<(8-x%8)*4;
*p=*p|temp;
#endif
#if COLORDEPTH_GRAY ==0 //单色模式
if(x%32==0){////x位于32的整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
if(color==0)///无色
*p=*p|0x00000000;
else
*p=*p|0x00000001;
}
else {////x位于32的非整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;
if(color==0)
*p=*p|0x00000000;
else{
temp=0x00000001<<(32-x%32);
*p=*p|temp;
}
}
#endif
}
void Direct_SetPixelAND(PDC pdc, int x, int y, COLORREF color)
{
U32 temp=0x00000000;
U32* p;
x*=LCDWIDTH;
x/=pdc->DrawRangex;
y*=LCDHEIGHT;
y/=pdc->DrawRangey;
x+=pdc->DrawOrgx+pdc->WndOrgx;
y+=pdc->DrawOrgy+pdc->WndOrgy;
#if COLORDEPTH_GRAY ==1 //灰度模式
p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
temp=color<<(8-x%8)*4;
switch(x%8){
case 0:
temp=temp+0xfffffff0;
break;
case 1:
temp=temp+0x0fffffff;
break;
case 2:
temp=temp+0xf0ffffff;
break;
case 3:
temp=temp+0xff0fffff;
break;
case 4:
temp=temp+0xfff0ffff;
break;
case 5:
temp=temp+0xffff0fff;
break;
case 6:
temp=temp+0xfffff0ff;
break;
case 7:
temp=temp+0xffffff0f;
break;
}
*p=*p&temp;
#endif
#if COLORDEPTH_GRAY ==0 //单色模式
if(x%32==0){////x位于32的整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
if(color==0)///无色
*p=*p&0xfffffffe;
else
*p=*p;
}
else {////x位于32的非整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;
if(color==0){
temp=~(0x00000001<<(32-x%32));
*p=*p&temp;
}
else{
temp=0x00000001<<(32-x%32);
*p=*p;
}
}
#endif
}
void Direct_SetPixelXOR(PDC pdc, int x, int y, COLORREF color)
{
U32 temp=0x00000000;
U32* p;
x*=LCDWIDTH;
x/=pdc->DrawRangex;
y*=LCDHEIGHT;
y/=pdc->DrawRangey;
x+=pdc->DrawOrgx+pdc->WndOrgx;
y+=pdc->DrawOrgy+pdc->WndOrgy;
#if COLORDEPTH_GRAY ==1 //灰度模式
p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
temp=color<<(8-x%8)*4;
*p=*p^temp;
#endif
#if COLORDEPTH_GRAY ==0 //单色模式
if(x%32==0){////x位于32的整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
if(color==0)///无色
*p=*p^0x00000000;
else
*p=*p^0x00000001;
}
else {////x位于32的非整数倍位置
p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;
if(color==0){
temp=~(0x00000001<<(32-x%32));
*p=*p&temp;
}
else{
temp=0x00000001<<(32-x%32);
*p=*p^temp;
}
}
#endif
}
void Direct_MoveTo(PDC pdc, int x, int y)
{
pdc->DrawPointx=x;
pdc->DrawPointy=y;
}
void Direct_LineTo(PDC pdc, int x, int y)
{
int i,j;
int x1,x2,y1,y2;
INT8U err;
// OSSemPend(Lcd_Disp_Sem,0, &err);
if(pdc->DrawPointx==x){ //画垂直线
if(pdc->DrawPointy<y){
for(i=pdc->DrawPointy-(pdc->PenWidth-1)/2;i<=y+pdc->PenWidth/2;i++){
for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
Direct_SetPixel(pdc,x+j,i,pdc->PenColor);
}
}
}
else{
for(i=pdc->DrawPointy+pdc->PenWidth/2;i>=y-(pdc->PenWidth-1)/2;i--){
for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
Direct_SetPixel(pdc,x+j,i,pdc->PenColor);
}
}
}
pdc->DrawPointy=y;
return;
}
if(pdc->DrawPointy==y){ //画水平线
if(pdc->DrawPointx<x){
for(i=pdc->DrawPointx-(pdc->PenWidth-1)/2;i<=x+pdc->PenWidth/2;i++){
for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
Direct_SetPixel(pdc,i,y+j,pdc->PenColor);
}
}
}
else{
for(i=pdc->DrawPointx+pdc->PenWidth/2;i>=x-(pdc->PenWidth-1)/2;i--){
for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
Direct_SetPixel(pdc,i,y+j,pdc->PenColor);
}
}
}
pdc->DrawPointx=x;
return;
}
for(i=-(pdc->PenWidth-1)/2;i<=pdc->PenWidth/2;i++){
x1=pdc->DrawPointx+(i+1)/2;
x2=x+(i+1)/2;
y1=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+pdc->DrawPointy;
y2=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+y;
Direct_DrawSBresenham_Line(pdc,x1,y1,x2,y2);
}
pdc->DrawPointx=x;
pdc->DrawPointy=y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -