From 6c5075bc99ba07f46562f7f10db14e153d7a93ec Mon Sep 17 00:00:00 2001 From: jhansen Date: Mon, 26 Apr 2010 21:49:44 +0000 Subject: git-svn-id: https://mindboards.svn.sourceforge.net/svnroot/mindboards/lms_nbcnxc_128/trunk@6 c9361245-7fe8-9947-84e8-057757c4e366 --- AT91SAM7S256/Source/c_display.c | 237 ++++++++++++++++++++++++++++------------ 1 file changed, 166 insertions(+), 71 deletions(-) (limited to 'AT91SAM7S256/Source/c_display.c') diff --git a/AT91SAM7S256/Source/c_display.c b/AT91SAM7S256/Source/c_display.c index 6b15495..0c6f1b2 100644 --- a/AT91SAM7S256/Source/c_display.c +++ b/AT91SAM7S256/Source/c_display.c @@ -98,6 +98,14 @@ void cDisplayClrPixel(UBYTE X,UBYTE Y) } } +void cDisplayXorPixel(UBYTE X,UBYTE Y) +{ + if ((X < DISPLAY_WIDTH) && (Y < DISPLAY_HEIGHT)) + { + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] ^= (1 << (Y % 8)); + } +} + void cDisplayChar(FONT *pFont,UBYTE On,UBYTE X,UBYTE Y,UBYTE Char) { @@ -316,34 +324,85 @@ void cDisplayUpdateIcon(ICON *pIcons,UBYTE Index,SCREEN_CORDINATE *pCord) } -void cDisplayLineX(UBYTE X1,UBYTE X2,UBYTE Y) +void cDisplayLineX(UBYTE X1, UBYTE X2, UBYTE Y, UBYTE PixelMode) { UBYTE X; UBYTE M; + UBYTE t; + if (Y > DISPLAY_HEIGHT) return; + if (X1 > X2) {t = X1; X1 = X2; X2 = t;} + if (X2 > (DISPLAY_WIDTH-1)) X2 = (DISPLAY_WIDTH-1); + M = 1 << (Y % 8); Y >>= 3; - for (X = X1;X < X2;X++) + + for (X=X1; X<=X2; X++) { - IOMapDisplay.Display[Y * DISPLAY_WIDTH + X] |= M; + switch (PixelMode) + { + case DRAW_PIXELS_INVERT: + IOMapDisplay.Display[Y * DISPLAY_WIDTH + X] ^= M; + break; + case DRAW_PIXELS_CLEAR: + IOMapDisplay.Display[Y * DISPLAY_WIDTH + X] &= ~M; + break; + case DRAW_PIXELS_SET: + default: + IOMapDisplay.Display[Y * DISPLAY_WIDTH + X] |= M; + break; + } } } -void cDisplayLineY(UBYTE X,UBYTE Y1,UBYTE Y2) +static UBYTE Masks[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; + +void cDisplayLineY(UBYTE X,UBYTE Y1,UBYTE Y2,UBYTE PixelMode) { UBYTE Y; - - for (Y = Y1;Y < Y2;Y++) + UBYTE M; + UBYTE t; + + if (X > DISPLAY_WIDTH) return; + if (Y1 > Y2) {t = Y1; Y1 = Y2; Y2 = t;} + if (Y2 > (DISPLAY_HEIGHT-1)) Y2 = (DISPLAY_HEIGHT-1); + + // starting point of Y is the byte containing Y1 + Y = (Y1 / 8) * 8; + + while (Y <= Y2) { - IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] |= (1 << (Y % 8)); + M = 0xff; + if (Y < Y1) + M &= ~Masks[Y1 % 8]; + if ((Y2-Y) < 8) + M &= Masks[(Y2 % 8) + 1]; + switch (PixelMode) + { + case DRAW_PIXELS_INVERT: + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] ^= M; + break; + case DRAW_PIXELS_CLEAR: + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] &= ~M; + break; + case DRAW_PIXELS_SET: + default: + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] |= M; + break; + } + Y += 8; } + } -void cDisplayFrame(SCREEN_CORDINATE *pCord) +void cDisplayFrame(SCREEN_CORDINATE *pCord, UBYTE PixelMode) { - cDisplayLineX(pCord->StartX,pCord->StartX + pCord->PixelsX - 1,pCord->StartY); - cDisplayLineY(pCord->StartX,pCord->StartY,pCord->StartY + pCord->PixelsY - 1); - cDisplayLineY(pCord->StartX + pCord->PixelsX - 1,pCord->StartY,pCord->StartY + pCord->PixelsY - 1); + cDisplayLineX(pCord->StartX, pCord->StartX + pCord->PixelsX-1, pCord->StartY, PixelMode); + if (pCord->PixelsY > 1) + { + cDisplayLineY(pCord->StartX, pCord->StartY + 1, pCord->StartY + pCord->PixelsY - 1, PixelMode); + cDisplayLineY(pCord->StartX + pCord->PixelsX - 1, pCord->StartY + 1, pCord->StartY + pCord->PixelsY - 1, PixelMode); + } } @@ -358,30 +417,54 @@ void cDisplayErase(void) memset(&IOMapDisplay.Display[0], 0x00, DISPLAY_WIDTH*DISPLAY_HEIGHT/8); } - -void cDisplayEraseScreen(SCREEN_CORDINATE *pCord) +void cDisplayFillScreen(SCREEN_CORDINATE *pCord, UBYTE PixelMode) { - UBYTE *pDestination; - UBYTE Line; - UBYTE Lines; - - if (((pCord->StartY & 0x07) == 0) && ((pCord->PixelsY & 0x07) == 0)) + UBYTE X1, Y1; + UBYTE X2, Y2; + UBYTE X, Y; + UBYTE M; + + X1 = pCord->StartX; + Y1 = pCord->StartY; + X2 = pCord->StartX + pCord->PixelsX - 1; + Y2 = pCord->StartY + pCord->PixelsY - 1; + + if (X2 > (DISPLAY_WIDTH-1)) X2 = (DISPLAY_WIDTH-1); + if (Y2 > (DISPLAY_HEIGHT-1)) Y2 = (DISPLAY_HEIGHT-1); + + Y = (Y1 / 8) * 8; + + while (Y <= Y2) { - Line = pCord->StartY / 8; - Lines = Line + pCord->PixelsY / 8; - - while (Line < Lines) + M = 0xff; + if (Y < Y1) + M &= ~Masks[Y1 % 8]; + if ((Y2-Y) < 8) + M &= Masks[(Y2 % 8) + 1]; + switch (PixelMode) { - pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pCord->StartX]; - memset(pDestination,0,(size_t)pCord->PixelsX); - Line++; + case DRAW_PIXELS_INVERT: + for (X=X1; X<=X2; X++) + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] ^= M; + break; + case DRAW_PIXELS_CLEAR: + for (X=X1; X<=X2; X++) + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] &= ~M; + break; + case DRAW_PIXELS_SET: + default: + for (X=X1; X<=X2; X++) + IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] |= M; + break; } + Y += 8; } } - -void cDisplayDraw(UBYTE Cmd,UBYTE On,UBYTE X1,UBYTE Y1,UBYTE X2,UBYTE Y2) +void cDisplayDraw(UBYTE Cmd,UBYTE PixelMode,UBYTE X1,UBYTE Y1,UBYTE X2,UBYTE Y2) { + SCREEN_CORDINATE Coord; + switch (Cmd) { case DISPLAY_ERASE_ALL : @@ -392,52 +475,63 @@ void cDisplayDraw(UBYTE Cmd,UBYTE On,UBYTE X1,UBYTE Y1,UBYTE X2,UBYTE Y2) case DISPLAY_PIXEL : { - if (On == TRUE) - { - cDisplaySetPixel(X1,Y1); - } - else + switch (PixelMode) { - cDisplayClrPixel(X1,Y1); + case DRAW_PIXELS_INVERT: + cDisplayXorPixel(X1,Y1); + break; + case DRAW_PIXELS_CLEAR: + cDisplayClrPixel(X1,Y1); + break; + case DRAW_PIXELS_SET: + default: + cDisplaySetPixel(X1,Y1); + break; } } break; - case DISPLAY_HORISONTAL_LINE : + case DISPLAY_HORIZONTAL_LINE : { - if (On == TRUE) - { - if (X1 > X2) - { - cDisplayLineX(X2,X1,Y1); - } - else - { - cDisplayLineX(X1,X2,Y1); - } - } + cDisplayLineX(X1,X2,Y1,PixelMode); } break; case DISPLAY_VERTICAL_LINE : { - if (On == TRUE) - { - if (Y1 > Y2) - { - cDisplayLineY(X1,Y2,Y1); - } - else - { - cDisplayLineY(X1,Y1,Y2); - } - } + cDisplayLineY(X1,Y1,Y2,PixelMode); } break; case DISPLAY_CHAR : { - cDisplayChar(IOMapDisplay.pFont,On,X1,Y1,X2); + cDisplayChar(IOMapDisplay.pFont,PixelMode,X1,Y1,X2); + } + break; + + case DISPLAY_ERASE_LINE : + { + cDisplayEraseLine(X1); + } + break; + + case DISPLAY_FILL_REGION : + { + Coord.StartX = X1; + Coord.StartY = Y1; + Coord.PixelsX = X2; + Coord.PixelsY = Y2; + cDisplayFillScreen(&Coord, PixelMode); + } + break; + + case DISPLAY_FRAME : + { + Coord.StartX = X1; + Coord.StartY = Y1; + Coord.PixelsX = X2; + Coord.PixelsY = Y2; + cDisplayFrame(&Coord, PixelMode); } break; @@ -454,6 +548,7 @@ void cDisplayInit(void* pHeader) IOMapDisplay.UpdateMask = 0; IOMapDisplay.TextLinesCenterFlags = 0; IOMapDisplay.Flags = DISPLAY_REFRESH | DISPLAY_ON; + IOMapDisplay.Contrast = 0x5A; // 90 VarsDisplay.ErasePointer = 0; VarsDisplay.UpdatePointer = 0; } @@ -514,7 +609,7 @@ void cDisplayCtrl(void) } if (Tmp < MENUICONS) { - cDisplayEraseScreen((SCREEN_CORDINATE*)&MENUICON_CORDINATES[Tmp]); + cDisplayFillScreen((SCREEN_CORDINATE*)&MENUICON_CORDINATES[Tmp], DRAW_PIXELS_CLEAR); } } else @@ -528,7 +623,7 @@ void cDisplayCtrl(void) } if (Tmp < STATUSICONS) { - cDisplayEraseScreen((SCREEN_CORDINATE*)&STATUSICON_CORDINATES[Tmp]); + cDisplayFillScreen((SCREEN_CORDINATE*)&STATUSICON_CORDINATES[Tmp], DRAW_PIXELS_CLEAR); } } else @@ -542,13 +637,13 @@ void cDisplayCtrl(void) } if (Tmp < SCREENS) { - cDisplayEraseScreen((SCREEN_CORDINATE*)&SCREEN_CORDINATES[Tmp]); + cDisplayFillScreen((SCREEN_CORDINATE*)&SCREEN_CORDINATES[Tmp], DRAW_PIXELS_CLEAR); } if ((TmpMask & SCREEN_BIT(SCREEN_LARGE))) { if ((IOMapDisplay.UpdateMask & SPECIAL_BIT(TOPLINE))) { - cDisplayLineX(0,DISPLAY_WIDTH - 1,9); + cDisplayLineX(0,DISPLAY_WIDTH - 1, 9, DRAW_PIXELS_SET); IOMapDisplay.UpdateMask &= ~SPECIAL_BIT(TOPLINE); } } @@ -568,7 +663,7 @@ void cDisplayCtrl(void) Cordinate.StartY = VarsDisplay.pOldBitmaps[Tmp]->StartY; Cordinate.PixelsX = VarsDisplay.pOldBitmaps[Tmp]->PixelsX; Cordinate.PixelsY = VarsDisplay.pOldBitmaps[Tmp]->PixelsY; - cDisplayEraseScreen(&Cordinate); + cDisplayFillScreen(&Cordinate, DRAW_PIXELS_CLEAR); } } else @@ -622,7 +717,7 @@ void cDisplayCtrl(void) } if (Tmp < STEPICONS) { - cDisplayEraseScreen((SCREEN_CORDINATE*)&STEPICON_CORDINATES[Tmp]); + cDisplayFillScreen((SCREEN_CORDINATE*)&STEPICON_CORDINATES[Tmp], DRAW_PIXELS_CLEAR); } } } @@ -740,7 +835,7 @@ void cDisplayCtrl(void) { case FRAME_SELECT : { - cDisplayFrame((SCREEN_CORDINATE*)&SELECT_FRAME_CORDINATES); + cDisplayFrame((SCREEN_CORDINATE*)&SELECT_FRAME_CORDINATES,DRAW_PIXELS_SET); } break; @@ -758,16 +853,16 @@ void cDisplayCtrl(void) case STEPLINE : { - cDisplayLineX(22,28,20); - cDisplayLineX(39,45,20); - cDisplayLineX(56,62,20); - cDisplayLineX(73,79,20); + cDisplayLineX(22,28,20,DRAW_PIXELS_SET); + cDisplayLineX(39,45,20,DRAW_PIXELS_SET); + cDisplayLineX(56,62,20,DRAW_PIXELS_SET); + cDisplayLineX(73,79,20,DRAW_PIXELS_SET); } break; case TOPLINE : { - cDisplayLineX(0,DISPLAY_WIDTH - 1,9); + cDisplayLineX(0,DISPLAY_WIDTH - 1,9,DRAW_PIXELS_SET); } break; @@ -808,11 +903,11 @@ void cDisplayCtrl(void) { if ((IOMapDisplay.Flags & DISPLAY_ON)) { - dDisplayOn(TRUE); + dDisplayOn(TRUE, IOMapDisplay.Contrast); } else { - dDisplayOn(FALSE); + dDisplayOn(FALSE, IOMapDisplay.Contrast); } if (!(dDisplayUpdate(DISPLAY_HEIGHT,DISPLAY_WIDTH,(UBYTE*)IOMapDisplay.Normal))) { -- cgit v1.2.3