--- apps/plugins/clock.old 2006-12-06 07:01:12.000000000 +0200 +++ apps/plugins/clock.c 2007-01-28 15:13:38.000000000 +0200 @@ -298,21 +298,10 @@ /************************************************************** * Used for hands to define lengths at a give time - FULLSCREEN *************************************************************/ -unsigned int xminute_full[61] = { -56,58,61,65,69,74,79,84,91,100,110,110,110,110,110,110,110,110,110,110,110,100, -91,84,79,74,69,65,61,58,56,54,51,47,43,38,33,28,21,12,1,1,1,1,1,1,1,1,1,1,1,12, -21,28,33,38,43,47,51,54 }; -unsigned int yminute_full[61] = { -62,62,62,62,62,62,62,62,62,62,62,53,45,40,36,32,28,24,19,11,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,11,19,24,28,32,36,40,45,53,62,62,62,62,62,62,62,62,62,62 }; -unsigned int xhour_full[61] = { -56,58,60,63,66,69,73,78,84,91,100,100,100,100,100,100,100,100,100,100,100,91,84, -78,73,69,66,63,60,58,56,54,52,49,46,43,39,34,28,21,12,12,12,12,12,12,12,12,12, -12,12,21,28,34,39,43,46,49,52,54 }; -unsigned int yhour_full[61] = { -52,52,52,52,52,52,52,52,52,52,52,46,41,37,34,32,30,27,23,18,12,12,12,12,12,12, -12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,18,23,27,30,32,34,37,41,46,52,52, -52,52,52,52,52,52,52,52 }; +unsigned int xminute_full[61]; +unsigned int yminute_full[61]; +unsigned int xhour_full[61]; +unsigned int yhour_full[61]; /**************************** * BITMAPS @@ -987,7 +976,7 @@ #define ANALOG_YCENTER (LCD_HEIGHT/2) #define ANALOG_XCENTER (LCD_WIDTH/2) #define ANALOG_MIN_RADIUS MIN(LCD_HEIGHT/2 -10, LCD_WIDTH/2 -10) - #define ANALOG_HR_RADIUS (ANALOG_MIN_RADIUS-8) + #define ANALOG_HR_RADIUS ((2 * ANALOG_MIN_RADIUS)/3) #define PI 3.141592 int i; @@ -1004,45 +993,57 @@ else if(settings.general[general_backlight] == 2) rb->backlight_set_timeout(1); + /* sin is fixed point 18.14 so adjust result. It was a divide by 16384, + I've changed it to right shift 14 bits - ok the optimiser might have + done that anway but it seems more correct to me */ for(i=0; i> 14) + ANALOG_XCENTER; + yminute[i] = ((sin(360*i/ ANALOG_VALUES-90) + * ANALOG_MIN_RADIUS) >> 14) + ANALOG_YCENTER; + xhour[i] = ((sin(360 * i / ANALOG_VALUES) + * ANALOG_HR_RADIUS) >> 14) + ANALOG_XCENTER; + yhour[i] = ((sin(360 * i / ANALOG_VALUES-90) + * ANALOG_HR_RADIUS) >> 14) + ANALOG_YCENTER; /* Fullscreen initialization */ if(i==0) { - xminute_full[i]=LCD_WIDTH/2; - yminute_full[i]=1; + xminute_full[i] = LCD_WIDTH/2; + xhour_full[i] = LCD_WIDTH/2; + yminute_full[i] = 1; + yhour_full[i] = LCD_HEIGHT/6; } else if(i<10 || (i>50 && i <60) ) { xminute_full[i] = xminute_full[i-1]+LCD_WIDTH/20; + xhour_full[i] = xhour_full[i-1]+(LCD_WIDTH/30); yminute_full[i] = 1; + yhour_full[i] = LCD_HEIGHT/6; } else if (i>=10 && i < 20) { xminute_full[i] = LCD_WIDTH-2; - yminute_full[i] = (i-10)*LCD_HEIGHT/10; + xhour_full[i] = (5*LCD_WIDTH)/6; + yminute_full[i] = ((i-10)*LCD_HEIGHT)/10; + yhour_full[i] = (LCD_HEIGHT/6)+((i-10)*(LCD_HEIGHT))/15; } else if(i>=20&&i<40) { - xminute_full[i] = (40-i)*LCD_WIDTH/20; - yminute_full[i] = LCD_HEIGHT- 2; - + xminute_full[i] = ((40-i)*LCD_WIDTH)/20; + xhour_full[i] = (LCD_WIDTH/6)+((40-i)*(LCD_WIDTH))/30; + yminute_full[i] = LCD_HEIGHT-2; + yhour_full[i] = (5*LCD_HEIGHT)/6; } else { xminute_full[i] = 1; - yminute_full[i] = (50-i)*LCD_HEIGHT/10; + xhour_full[i] = LCD_WIDTH/6; + yminute_full[i] = ((50-i)*LCD_HEIGHT)/10; + yhour_full[i] = LCD_HEIGHT/6 + ((50-i)*LCD_HEIGHT)/15; } } } @@ -1057,48 +1058,56 @@ /* Second hand */ if(settings.analog[analog_secondhand]) { - pos = 90-second; - if(pos >= 60) - pos -= 60; - rb->lcd_drawline((LCDWIDTH/2), (LCDHEIGHT/2), - xminute[pos], yminute[pos]); + xminute[second], yminute[second]); } - pos = 90-minute; - if(pos >= 60) - pos -= 60; - - /* Minute hand, thicker than the second hand */ - rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2, - xminute[pos], yminute[pos]); + /* Minute hand, thicker than the second hand + +++ We don't actually draw from the centre but 8 surrounding pixels + +x+ + +++ */ rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2-1, - xminute[pos], yminute[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, - xminute[pos], yminute[pos]); - rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, - xminute[pos], yminute[pos]); + xminute[minute], yminute[minute]); + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2-1, + xminute[minute], yminute[minute]); rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, - xminute[pos], yminute[pos]); + xminute[minute], yminute[minute]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2, + xminute[minute], yminute[minute]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2, + xminute[minute], yminute[minute]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, + xminute[minute], yminute[minute]); + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2+1, + xminute[minute], yminute[minute]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, + xminute[minute], yminute[minute]); if(hour > 12) hour -= 12; - hour = (hour*5) + (minute/12); - pos = 90-hour; - if(pos >= 60) - pos -= 60; + pos = (hour*5) + (minute/12); /* Hour hand, thick as the minute hand but shorter */ - rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2, - xhour[pos], yhour[pos]); rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2-1, xhour[pos], yhour[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2-1, + xhour[pos], yhour[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, + xhour[pos], yhour[pos]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2, xhour[pos], yhour[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2, + xhour[pos], yhour[pos]); + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, xhour[pos], yhour[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2+1, + xhour[pos], yhour[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, xhour[pos], yhour[pos]); /* Draw the circle */ @@ -1397,43 +1406,56 @@ /* Second hand */ if(settings.fullscreen[fullscreen_secondhand]) { - pos = second; - rb->lcd_drawline((LCDWIDTH/2), (LCDHEIGHT/2), - xminute_full[pos], yminute_full[pos]); + xminute_full[second], yminute_full[second]); } - pos = minute; - - /* Minute hand, thicker than the second hand */ - rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2, - xminute_full[pos], yminute_full[pos]); + /* Minute hand, thicker than the second hand + +++ We don't actually draw from the centre but 8 surrounding pixels + +x+ + +++ */ rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2-1, - xminute_full[pos], yminute_full[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, - xminute_full[pos], yminute_full[pos]); - rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, - xminute_full[pos], yminute_full[pos]); + xminute_full[minute], yminute_full[minute]); + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2-1, + xminute_full[minute], yminute_full[minute]); rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, - xminute_full[pos], yminute_full[pos]); + xminute_full[minute], yminute_full[minute]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2, + xminute_full[minute], yminute_full[minute]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2, + xminute_full[minute], yminute_full[minute]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, + xminute_full[minute], yminute_full[minute]); + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2+1, + xminute_full[minute], yminute_full[minute]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, + xminute_full[minute], yminute_full[minute]); + if(hour > 12) hour -= 12; - - hour = hour*5 + minute/12; - pos = 90-hour; - if(pos >= 60) - pos -= 60; + pos = hour*5 + minute/12; /* Hour hand, thick as the minute hand but shorter */ - rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2, xhour_full[pos], yhour_full[pos]); rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2-1, xhour_full[pos], yhour_full[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2-1, + xhour_full[pos], yhour_full[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, + xhour_full[pos], yhour_full[pos]); + + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2, xhour_full[pos], yhour_full[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2, + xhour_full[pos], yhour_full[pos]); + rb->lcd_drawline(LCDWIDTH/2-1, LCDHEIGHT/2+1, xhour_full[pos], yhour_full[pos]); - rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2-1, + rb->lcd_drawline(LCDWIDTH/2, LCDHEIGHT/2+1, + xhour_full[pos], yhour_full[pos]); + rb->lcd_drawline(LCDWIDTH/2+1, LCDHEIGHT/2+1, xhour_full[pos], yhour_full[pos]); /* Draw the cover over the center */