📄 directdisplay.c
字号:
#include "..\ucos-ii\includes.h"
#include "..\inc\drv\loadfile.h"
#include "..\inc\maro.h"
#include "..\inc\drv\OSFile.h"
#include <math.h>
#include "../inc/drv/DirectDisplay.h"
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;
}
void Direct_DrawSBresenham_Line(PDC pdc, int x1, int y1,int x2, int y2)
{
int x, y,dx,dy;
int e,i;
dx=x2-x1;
dy=y2-y1;
x=x1; y=y1;
if ( ABS(dx) >= ABS(dy) ){
if ( dx >= 0 && dy>=0 ){
e = -dx;
for ( i = 0; i <= dx; i++ ) {
Direct_SetPixel(pdc,x++,y,pdc->PenColor);
e += 2 * dy;
if (e >= 0) {
y = y + 1;
e -= 2 * dx;
}
}
}
else if( dx < 0 && dy<0 ){
e = -dx;
for ( i = 0; i >= dx; i-- ){
Direct_SetPixel(pdc,x--,y,pdc->PenColor);
e += 2 * dy;
if (e <= 0) {
y = y - 1;
e -= 2 * dx;
}
}
}
else if(dx>=0 && dy<=0){
e = dx;
for ( i = 0; i <= dx; i++ ){
Direct_SetPixel(pdc,x++,y,pdc->PenColor);
e += 2 * dy;
if (e <= 0) {
y = y - 1;
e += 2 * dx;
}
}
}
else{ //dx<0 && dy>0
e = dx;
for ( i = 0; i >= dx; i-- ){
Direct_SetPixel(pdc,x--,y,pdc->PenColor);
e += 2 * dy;
if (e >= 0) {
y = y + 1;
e += 2 * dx;
}
}
}
}
else{
if ( dx >= 0 && dy>=0 ){
e = -dy;
for ( i = 0; i <= dy; i++ ) {
Direct_SetPixel(pdc,x,y++,pdc->PenColor);
e += 2 * dx;
if (e >= 0) {
x = x + 1;
e -= 2 * dy;
}
}
}
else if( dx < 0 && dy<0 ){
e = -dy;
for ( i = 0; i >= dy; i-- ){
Direct_SetPixel(pdc,x,y--,pdc->PenColor);
e += 2 * dx;
if (e <= 0) {
x = x - 1;
e -= 2 * dy;
}
}
}
else if(dx<=0 && dy>=0){
e = dy;
for ( i = 0; i <= dy; i++ ){
Direct_SetPixel(pdc,x,y++,pdc->PenColor);
e += 2 * dx;
if (e <= 0) {
x = x - 1;
e += 2 * dy;
}
}
}
else{ //dx>0 && dy<0
e = dy;
for ( i = 0; i >= dy; i-- ){
Direct_SetPixel(pdc,x,y--,pdc->PenColor);
e += 2 * dx;
if (e >= 0) {
x = x + 1;
e += 2 * dy;
}
}
}
}
}
void Direct_FillRect(PDC pdc, int left,int top ,int right, int bottom,U32 DrawMode, U32 color)
{
int i=0;
int j=0;
int temp_left=0;
int temp_right=0;
U32 temp_color=0x00000000;
U32* p;
pdc->PenMode=DrawMode;
i=left;
#if COLORDEPTH_GRAY==1
while(i%8!=0&&i<=right){
for( j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
i++;
}
if(i==right+1)
return;
for( j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
temp_left=i;
i=right;
while(i%8!=0){
for(j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
i--;
}
temp_right=i;
if(temp_left==temp_right)
return;
temp_color=color|color<<4|color<<8|color<<12
|color<<16|color<<20|color<<24|color<<28;
p=pDirectLCDBuffer+LCDWIDTH/8*top+temp_left/8;
for(i=0;i<(temp_right-temp_left)/8;i++){
for(j=0;j<=(bottom-top);j++){
switch(DrawMode){
case GRAPH_MODE_NORMAL:
if(color>0x00000000)
*(p+LCDWIDTH/8*j+i)|=temp_color;
else if(color==0x00000000)
*(p+LCDWIDTH/8*j+i)&=temp_color;
break;
case GRAPH_MODE_OR:
*(p+LCDWIDTH/8*j+i)|=temp_color;
break;
case GRAPH_MODE_AND:
*(p+LCDWIDTH/8*j+i)&=temp_color;
break;
case GRAPH_MODE_XOR:
*(p+LCDWIDTH/8*j+i)^=temp_color;
break;
case GRAPH_MODE_NOR:
*(p+LCDWIDTH/8*j+i)=~*(p+LCDWIDTH/8*j+i);
break;
}
}
}
#endif
#if COLORDEPTH_GRAY==0
while(i%32!=0&&i<=right){
for( j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
i++;
}
if(i==right+1)
return;
for( j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
temp_left=i;
i=right;
while(i%32!=0){
for(j=top;j<=bottom;j++)
Direct_SetPixel(pdc, i, j, color);
i--;
}
temp_right=i;
if(temp_left==temp_right)
return;
// temp_color=color|color<<4|color<<8|color<<12
// |color<<16|color<<20|color<<24|color<<28;
if(color>0)
temp_color=0xffffffff;
p=pDirectLCDBuffer+LCDWIDTH/32*top+temp_left/32;
for(i=0;i<(temp_right-temp_left)/32;i++){
for(j=0;j<=(bottom-top);j++){
switch(DrawMode){
case GRAPH_MODE_NORMAL:
if(color>0x00000000)
*(p+LCDWIDTH/32*j+i)|=temp_color;
else if(color==0x00000000)
*(p+LCDWIDTH/32*j+i)&=temp_color;
break;
case GRAPH_MODE_OR:
*(p+LCDWIDTH/32*j+i)|=temp_color;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -