/********************************************************************* * Function: WORD PutImage(SHORT left, SHORT top, void* bitmap, BYTE stretch) * * PreCondition: none * * Input: left,top - left top image corner, * bitmap - image pointer, * stretch - image stretch factor * * Output: For NON-Blocking configuration: * - Returns 0 when device is busy and the image is not yet completely drawn. * - Returns 1 when the image is completely drawn. * For Blocking configuration: * - Always return 1. * * Side Effects: none * * Overview: outputs image starting from left,top coordinates * * Note: image must be located in flash * ********************************************************************/ WORD PutImage(SHORT left, SHORT top, void *bitmap, BYTE stretch) { FLASH_BYTE *flashAddress; BYTE colorDepth; WORD colorTemp; #ifndef USE_NONBLOCKING_CONFIG while(IsDeviceBusy() != 0); /* Ready */ #else if(IsDeviceBusy() != 0) return (0); #endif // Save current color colorTemp = _color; switch(*((SHORT *)bitmap)) { #ifdef USE_BITMAP_FLASH case FLASH: // Image address flashAddress = ((BITMAP_FLASH *)bitmap)->address; // Read color depth colorDepth = *(flashAddress + 1); // Draw picture switch(colorDepth) { case 1: PutImage1BPP(left, top, flashAddress, stretch); break; case 4: PutImage4BPP(left, top, flashAddress, stretch); break; case 8: PutImage8BPP(left, top, flashAddress, stretch); break; case 16: PutImage16BPP(left, top, flashAddress, stretch); break; } break; #endif #ifdef USE_BITMAP_EXTERNAL case EXTERNAL: // Get color depth ExternalMemoryCallback(bitmap, 1, 1, &colorDepth); // Draw picture switch(colorDepth) { case 1: PutImage1BPPExt(left, top, bitmap, stretch); break; case 4: PutImage4BPPExt(left, top, bitmap, stretch); break; case 8: PutImage8BPPExt(left, top, bitmap, stretch); break; case 16: PutImage16BPPExt(left, top, bitmap, stretch); break; default: break; } break; #endif default: break; } // Restore current color _color = colorTemp; return (1); }
/********************************************************************* * Function: WORD AcDraw(ANALOGCLOCK *pAc) * * * Notes: This is the state machine to draw the clock. * ********************************************************************/ WORD AcDraw(void *pObj) { typedef enum { REMOVE, BEVEL_DRAW, TICK } AC_DRAW_STATES; static AC_DRAW_STATES state = REMOVE; static SHORT width, height, radius; static GFX_COLOR faceClr, handClr; ANALOGCLOCK *pAc; pAc = (ANALOGCLOCK *)pObj; if(IsDeviceBusy()) return (0); switch(state) { case REMOVE: if(IsDeviceBusy()) return (0); if(GetState(pAc, AC_HIDE)) // Hide the button (remove from screen) { SetColor(pAc->hdr.pGolScheme->CommonBkColor); if(!Bar(pAc->hdr.left, pAc->hdr.top, pAc->hdr.right, pAc->hdr.bottom)) { return (0); } } if(GetState(pAc, AC_TICK)) { state = TICK; return(1); //buthave to do goto erase //goto erase_current_pos; } if(GetState(pAc, UPDATE_HOUR)) { AcHandsDraw(pAc, HOUR, THICKNESS_SECOND+4, handClr, pAc->pBitmap); state = TICK; return(1); //buthave to do goto erase //goto erase_current_pos; } if(GetState(pAc, UPDATE_MINUTE)) { AcHandsDraw(pAc, MINUTE, THICKNESS_SECOND+4, handClr, pAc->pBitmap); state = TICK; return(1); //buthave to do goto erase //goto erase_current_pos; } if(GetState(pAc, UPDATE_SECOND)) { AcHandsDraw(pAc, SECOND, THICKNESS_SECOND+4, handClr, pAc->pBitmap); state = TICK; return(1); //buthave to do goto erase //goto erase_current_pos; } radius = pAc->radius; // get radius width = (pAc->hdr.right - pAc->hdr.left) - (radius * 2); // get width height = (pAc->hdr.bottom - pAc->hdr.top) - (radius * 2); // get height state = BEVEL_DRAW; case BEVEL_DRAW: faceClr = pAc->hdr.pGolScheme->Color0; handClr = pAc->hdr.pGolScheme->Color1; SetLineThickness(NORMAL_LINE); SetLineType(SOLID_LINE); SetColor(faceClr); FillCircle(pAc->centerx,pAc->centery, radius); //Draw Face of Analog Clock SetColor(handClr); FillCircle(pAc->centerx,pAc->centery, 8); //Draw Middle of Analog Clock AcHandsDraw(pAc, SECOND, THICKNESS_SECOND, handClr, pAc->pBitmap); AcHandsDraw(pAc, HOUR, THICKNESS_SECOND+4, handClr, pAc->pBitmap); AcHandsDraw(pAc, MINUTE, THICKNESS_SECOND+4, handClr, pAc->pBitmap); state = REMOVE; break; case TICK: AcHandsDraw(pAc, SECOND, THICKNESS_SECOND, handClr, pAc->pBitmap); if(pAc->valueS++ == 60) { pAc->valueS = 1; if(pAc->valueM++ == 60) { pAc->valueM = 1; } if(pAc->valueM%12 == 0) { pAc->valueH++; if(pAc->valueH == 60) pAc->valueH = 0; AcHandsDraw(pAc, HOUR, THICKNESS_SECOND+4, handClr, pAc->pBitmap); } AcHandsDraw(pAc, MINUTE, THICKNESS_SECOND+4, handClr, pAc->pBitmap); } if( ((pAc->valueS - pAc->valueM)<4 && (pAc->valueS - pAc->valueM)>=0) || ((pAc->valueS - pAc->valueM)<-56 && (pAc->valueS - pAc->valueM)>-59) ) AcHandsDraw(pAc, MINUTE, THICKNESS_SECOND+4, handClr, pAc->pBitmap); if( ((pAc->valueS - pAc->valueH)<4 && (pAc->valueS - pAc->valueH)>=0) || ((pAc->valueS - pAc->valueH)<-56 && (pAc->valueS - pAc->valueH)>-59) ) AcHandsDraw(pAc, HOUR, THICKNESS_SECOND+4, handClr, pAc->pBitmap); if(pAc->valueS-1 == pAc->valueM) AcHandsDraw(pAc, MINUTE, THICKNESS_SECOND+4, handClr, pAc->pBitmap); if(pAc->valueS-1 == pAc->valueH) AcHandsDraw(pAc, HOUR, THICKNESS_SECOND+4, handClr, pAc->pBitmap); state = REMOVE; return (1); } return (1); }
/********************************************************************* * Function: WORD PictDraw(void *pObj) * * Output: returns the status of the drawing * 0 - not completed * 1 - done * * Overview: draws picture * ********************************************************************/ WORD PictDraw(void *pObj) { typedef enum { REMOVE, DRAW_IMAGE, DRAW_BACKGROUND1, DRAW_BACKGROUND2, DRAW_BACKGROUND3, DRAW_BACKGROUND4, DRAW_FRAME } PICT_DRAW_STATES; static PICT_DRAW_STATES state = REMOVE; static SHORT posleft; static SHORT postop; static SHORT posright; static SHORT posbottom; PICTURE *pPict; pPict = (PICTURE *)pObj; if(IsDeviceBusy()) return (0); switch(state) { case REMOVE: if(GetState(pPict, PICT_HIDE)) { SetColor(pPict->hdr.pGolScheme->CommonBkColor); if(!Bar(pPict->hdr.left, pPict->hdr.top, pPict->hdr.right, pPict->hdr.bottom)) return (0); return (1); } posleft = (pPict->hdr.left + 1 + pPict->hdr.right - pPict->scale * GetImageWidth(pPict->pBitmap)) >> 1; postop = (pPict->hdr.top + 1 + pPict->hdr.bottom - pPict->scale * GetImageHeight(pPict->pBitmap)) >> 1; posright = (pPict->hdr.right + pPict->hdr.left + pPict->scale * GetImageWidth(pPict->pBitmap)) >> 1; posbottom = (pPict->hdr.bottom + pPict->hdr.top + pPict->scale * GetImageHeight(pPict->pBitmap)) >> 1; state = DRAW_IMAGE; case DRAW_IMAGE: if(pPict->pBitmap != NULL) { if(IsDeviceBusy()) return (0); if(!PutImage(posleft, postop, pPict->pBitmap, pPict->scale)) return (0); } SetColor(pPict->hdr.pGolScheme->CommonBkColor); state = DRAW_BACKGROUND1; case DRAW_BACKGROUND1: if(!Bar(pPict->hdr.left + 1, pPict->hdr.top + 1, pPict->hdr.right - 1, postop - 1)) return (0); state = DRAW_BACKGROUND2; case DRAW_BACKGROUND2: if(!Bar(pPict->hdr.left + 1, posbottom, pPict->hdr.right - 1, pPict->hdr.bottom - 1)) return (0); state = DRAW_BACKGROUND3; case DRAW_BACKGROUND3: if(!Bar(pPict->hdr.left + 1, postop, posleft - 1, posbottom)) return (0); state = DRAW_BACKGROUND4; case DRAW_BACKGROUND4: if(!Bar(posright, postop, pPict->hdr.right - 1, posbottom)) return (0); state = DRAW_FRAME; case DRAW_FRAME: if(GetState(pPict, PICT_FRAME)) { SetLineType(SOLID_LINE); SetColor(pPict->hdr.pGolScheme->TextColor0); if(!Rectangle(pPict->hdr.left, pPict->hdr.top, pPict->hdr.right, pPict->hdr.bottom)) return (0); } state = REMOVE; return (1); } return (1); }