static void sun_layer_update(Layer *layer, GContext *ctx) { if (data_loaded) { const GRect entire_screen = GRect(0, 0, 180, 180); const GRect sun_outline_rect = GRect(70, 70, 40, 40); const GRect sun_rect = GRect(72, 72, 36, 36); draw_circle(ctx, entire_screen, GColorVividCerulean, 90, 360); graphics_context_set_stroke_color(ctx, GColorChromeYellow); graphics_context_set_stroke_width(ctx, 2); int i; for (i = 0; i < 360; i += 12) { const GPoint in = gpoint_from_polar( sun_outline_rect, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(i) ); const GPoint out = gpoint_from_polar( entire_screen, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(i) ); graphics_draw_line(ctx, out, in); } draw_circle(ctx, sun_outline_rect, GColorWindsorTan, 20, 360); draw_circle(ctx, sun_rect, GColorOrange, 18, 360); } }
static void prv_draw_seconds_hand(GContext *ctx, const GRect *layer_bounds, const GPoint *center) { const SprinklesConfiguration *configuration = sprinkles_configuration_get_configuration(); const int32_t seconds_angle = s_app_data->current_seconds * TRIG_MAX_ANGLE / 60; graphics_context_set_stroke_color(ctx, configuration->seconds_hand_color); // Draw the thinner front part of the seconds hand const uint8_t seconds_forward_stroke_width = 1; graphics_context_set_stroke_width(ctx, seconds_forward_stroke_width); const GRect seconds_forward_rect = prv_get_seconds_forward_rect(layer_bounds); // Interpolate the seconds forward rect so that the seconds hand grows out to pierce the donut const int16_t inset = (int16_t)prv_interpolate_int64_linear(seconds_forward_rect.size.w / 2, 0, s_app_data->intro_animation_progress); const GRect interpolated_seconds_forward_rect = grect_inset(seconds_forward_rect, GEdgeInsets(inset)); const GPoint seconds_forward_point = gpoint_from_polar(interpolated_seconds_forward_rect, GOvalScaleModeFitCircle, seconds_angle); graphics_draw_line(ctx, (*center), seconds_forward_point); // Draw the thicker back part of the seconds hand const uint8_t seconds_backward_stroke_width = 2; graphics_context_set_stroke_width(ctx, seconds_backward_stroke_width); const GRect seconds_backward_rect = grect_inset( *layer_bounds, GEdgeInsets(seconds_forward_rect.size.w * 43 / 100)); const GPoint seconds_backward_point = gpoint_from_polar(seconds_backward_rect, GOvalScaleModeFitCircle, seconds_angle - (TRIG_MAX_ANGLE / 2)); graphics_draw_line(ctx, (*center), seconds_backward_point); }
//draw dots static void layer_update_proc(Layer *layer, GContext *ctx) { GRect bounds = layer_get_bounds(layer); GRect frame = grect_inset(bounds, GEdgeInsets(3)); // Adjust geometry variables for inner ring frame = grect_inset(frame, GEdgeInsets(3 * DOTS_RADIUS)); // For loop that determines dot placement, color and prints dots for(int i = 0; i < vDOTS; i++) { int dot_angle = get_angle_for_dots(i); GPoint pos = gpoint_from_polar(frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(dot_angle)); if (dot_angle <= 60){ graphics_context_set_fill_color(ctx, DOTS_COLOR1); } else if (dot_angle <= 120){ graphics_context_set_fill_color(ctx, DOTS_COLOR2); } else if (dot_angle <= 180){ graphics_context_set_fill_color(ctx, DOTS_COLOR3); } else if (dot_angle <= 240){ graphics_context_set_fill_color(ctx, DOTS_COLOR4); } else if (dot_angle <= 300){ graphics_context_set_fill_color(ctx, DOTS_COLOR5); } else { graphics_context_set_fill_color(ctx, DOTS_COLOR6); } graphics_fill_circle(ctx, pos, DOTS_RADIUS); } }
// Draw the vertically stacked spots that indicate how many devices there are and which one is selected static void spots_draw(Layer *layer, GContext *ctx) { GRect rect = layer_get_frame(layer); graphics_context_set_stroke_color(ctx, GColorWhite); graphics_context_set_fill_color(ctx, GColorWhite); for (int y = 0; y < g_device_count; y++) { #ifdef PBL_ROUND GPoint spot = gpoint_from_polar(GRect(rect.origin.x+((rect.size.w-DEV_LAYER_WIDTH)/4), rect.origin.y+((rect.size.h-DEV_LAYER_HEIGHT)/4), rect.size.w-((rect.size.w-DEV_LAYER_WIDTH)/2), rect.size.h-((rect.size.h-DEV_LAYER_HEIGHT)/2)), GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(270+ ((((SPOT_RADIUS*2)*g_device_count)+(SPOT_SPACING*(g_device_count-1)))/2) - (y*((SPOT_RADIUS*2)+SPOT_SPACING)+3))); #else GPoint spot = GPoint((rect.size.w/2), (rect.size.h/2)-((((SPOT_RADIUS*2)*g_device_count)+(SPOT_SPACING*(g_device_count-1)))/2) + (y*((SPOT_RADIUS*2)+SPOT_SPACING)+3)); #endif if (g_device_selected == y) graphics_fill_circle(ctx, spot, SPOT_RADIUS); else graphics_draw_circle(ctx, spot, SPOT_RADIUS); } }
static void my_hand_draw(Layer *layer, GContext *ctx) { GRect bounds = layer_get_bounds(layer); time_t temp = time(NULL); struct tm *tick_time = localtime(&temp); int bhour = tick_time->tm_hour; int bmin = tick_time->tm_min; float angle = 30 * ((float)(bhour % 12) + ((float)bmin / 60)); if (debug) angle = 12 * tick_time->tm_sec; ; graphics_context_set_stroke_width(ctx, 2); graphics_context_set_stroke_color(ctx, GColorRed); graphics_draw_line(ctx, gpoint_from_polar(grect_crop(bounds, 60), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)), gpoint_from_polar(bounds, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle+180))); //GPoint textLocation = gpoint_from_polar(grect_crop(bounds, 50), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)); // layer_set_frame((Layer *)s_battery_layer, // GRect(textLocation.x-10, textLocation.y-10, 20, 200)); }
static void show_round_meter(GContext *ctx, GRect *bounds) { // radial GRect frame = grect_inset((*bounds), GEdgeInsets(0)); int minute_angle = (int)(360.0 * s_meter_time.minutes / 60.0); int32_t start_break = minute_angle + 360 * (CONCENTRATION_TIME) / 60 / 60; // 150 == 360 * 25 / 60 int32_t end_break = start_break + 360 * (REST_TIME) / 60 / 60; // 30 == 360 * 5 / 60 graphics_context_set_fill_color(ctx, CONCENTRATION_COLOR); graphics_fill_radial(ctx, frame, GOvalScaleModeFitCircle, METER_THICKNESS, DEG_TO_TRIGANGLE(minute_angle), DEG_TO_TRIGANGLE(start_break)); graphics_context_set_fill_color(ctx, REST_COLOR); graphics_fill_radial(ctx, frame, GOvalScaleModeFitCircle, METER_THICKNESS, DEG_TO_TRIGANGLE(start_break), DEG_TO_TRIGANGLE(end_break)); // hour dots static int s_hour_dot_radius = 2; frame = grect_inset(frame, GEdgeInsets(5 * s_hour_dot_radius)); for(int i = 0; i < 12; i++) { int hour_angle = i * 360 / 12; GPoint pos = gpoint_from_polar(frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(hour_angle)); graphics_context_set_fill_color(ctx, GColorWhite); graphics_fill_circle(ctx, pos, s_hour_dot_radius); } }
static void tick_handler(struct tm *tick_time, TimeUnits units_changed) { update_time(); layer_mark_dirty(s_hand_layer); int bhour = tick_time->tm_hour; int bmin = tick_time->tm_min; float angle = 30 * ((float)(bhour % 12) + ((float)bmin / 60)); if (debug) angle = 12 * tick_time->tm_sec; GRect frame = layer_get_frame(s_face_layer); GRect frame2 = layer_get_frame(s_hand_layer); float size = (frame.size.w + frame2.size.w) / 2; GPoint origin = gpoint_from_polar(grect_inset(frame2, GEdgeInsets(-150)), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle + 180)); frame.origin = origin; frame.origin.x -= frame.size.w / 2; frame.origin.y -= frame.size.w / 2; layer_set_frame(s_face_layer, frame); }
static void clock_layer_update(ClockLayer *clock_layer, GContext *ctx) { GRect bounds = layer_get_bounds(clock_layer); GPoint center = grect_center_point(&bounds); // Get the current time time_t now = time(NULL); struct tm *t = localtime(&now); const int hand_stroke_width = 2; graphics_context_set_stroke_color(ctx, GColorBlack); graphics_context_set_stroke_width(ctx, hand_stroke_width); int hour_angle = (TRIG_MAX_ANGLE * (((t->tm_hour % 12) * 6) + (t->tm_min / 10))) / (12 * 6); int minute_angle = TRIG_MAX_ANGLE * t->tm_min / 60; hand_update_radius(hour_angle, bounds, 2, &HOUR_HAND); hand_update_radius(minute_angle, bounds, 1, &MINUTE_HAND); // Draw hour hand gpath_rotate_to(s_hour_hand, hour_angle); gpath_draw_outline(ctx, s_hour_hand); // Draw minute hand gpath_rotate_to(s_minute_hand, minute_angle); gpath_draw_outline(ctx, s_minute_hand); const int hand_fill_width = 6; graphics_context_set_stroke_width(ctx, hand_fill_width); GPoint minute_hand_fill = gpoint_from_polar(GRect((bounds.size.w / 2) - 8, (bounds.size.h / 2) - 8, 17, 17), GOvalScaleModeFitCircle, TRIG_MAX_ANGLE * t->tm_min / 60); graphics_draw_line(ctx, center, minute_hand_fill); GPoint hour_hand_fill = gpoint_from_polar(GRect((bounds.size.w / 2) - 8, (bounds.size.h / 2) - 8, 17, 17), GOvalScaleModeFitCircle, (TRIG_MAX_ANGLE * (((t->tm_hour % 12) * 6) + (t->tm_min / 10))) / (12 * 6)); graphics_draw_line(ctx, center, hour_hand_fill); // Draw large ticks for (int c = 0; c < 4; c++) { #if defined(PBL_BW) graphics_context_set_stroke_color(ctx, GColorBlack); #elif defined(PBL_COLOR) graphics_context_set_stroke_color(ctx, GColorBlack); #endif gpath_rotate_to(s_large_ticks, ((TRIG_MAX_ANGLE/4) * c ) + (TRIG_MAX_ANGLE/2)); gpath_draw_outline(ctx, s_large_ticks); } // Draw small ticks for (int c = 1; c < 12; c++) { #if defined(PBL_BW) graphics_context_set_fill_color(ctx, GColorBlack); graphics_context_set_stroke_color(ctx, GColorBlack); #elif defined(PBL_COLOR) graphics_context_set_fill_color(ctx, GColorBlack); graphics_context_set_stroke_color(ctx, GColorBlack); #endif if((c != 3) || (c != 6) || (c != 6)) { gpath_rotate_to(s_small_ticks, ((TRIG_MAX_ANGLE/12) * c ) + (TRIG_MAX_ANGLE/2)); gpath_draw_outline(ctx, s_small_ticks); } } // graphics_fill_radial(ctx, GRect((bounds.size.w / 2) - 3, (bounds.size.h / 2) - 3, 5, 5), GOvalScaleModeFitCircle, 5, 0, TRIG_MAX_ANGLE); }
static void bg_update_proc(Layer *layer, GContext *ctx) { GRect bounds = layer_get_bounds(layer); GRect frame = grect_inset(bounds, GEdgeInsets(4 * INSET)); GRect inner_hour_frame = grect_inset(bounds, GEdgeInsets((4 * INSET) + 8)); GRect inner_minute_frame = grect_inset(bounds, GEdgeInsets((4 * INSET) + 6)); graphics_context_set_stroke_color(ctx, gcolor_hour_marks); graphics_context_set_stroke_width(ctx, 3); // Hours marks for(int i = 0; i < 12; i++) { int hour_angle = get_angle_for_hour(i); GPoint p0 = gpoint_from_polar(frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(hour_angle)); GPoint p1 = gpoint_from_polar(inner_hour_frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(hour_angle)); graphics_draw_line(ctx, p0, p1); } // Minute Marks graphics_context_set_stroke_color(ctx, gcolor_minute_marks); graphics_context_set_stroke_width(ctx, 1); for(int i = 0; i < 60; i++) { if (i % 5) { int minute_angle = get_angle_for_minute(i); GPoint p0 = gpoint_from_polar(frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(minute_angle)); GPoint p1 = gpoint_from_polar(inner_minute_frame, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(minute_angle)); graphics_draw_line(ctx, p0, p1); } } // numbers if (b_show_numbers) { graphics_context_set_text_color(ctx, gcolor_numbers); #ifdef PBL_RECT graphics_draw_text(ctx, "12", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(63, 18, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentCenter, NULL); graphics_draw_text(ctx, "1", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(85, 23, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "2", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(104, 43, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "3", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(112, 68, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "4", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(104, 93, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "5", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(85, 110, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "6", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(62, 118, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentCenter, NULL); graphics_draw_text(ctx, "7", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(39, 110, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "8", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(20, 93, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "9", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(14, 68, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "10", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(20, 43, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "11", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(39, 23, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); #else graphics_draw_text(ctx, "12", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(80, 10, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentCenter, NULL); graphics_draw_text(ctx, "1", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(107, 20, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "2", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(130, 43, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "3", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(140, 74, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "4", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(130, 106, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "5", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(107, 126, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); graphics_draw_text(ctx, "6", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(81, 136, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentCenter, NULL); graphics_draw_text(ctx, "7", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(53, 124, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "8", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(29, 106, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "9", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(20, 74, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "10", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(28, 42, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); graphics_draw_text(ctx, "11", fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), GRect(50, 22, 20, 20), GTextOverflowModeWordWrap, GTextAlignmentLeft, NULL); #endif } }
static void my_face_draw(Layer *layer, GContext *ctx) { GRect bounds = layer_get_bounds(layer); // Draw a white filled circle a radius of half the layer height graphics_context_set_fill_color(ctx, GColorWhite); const int16_t half_h = bounds.size.h / 2; graphics_draw_circle (ctx, GPoint(half_h, half_h), 90); graphics_context_set_stroke_width(ctx, 2); graphics_context_set_text_color(ctx, GColorBlack); GPoint center = grect_center_point(&bounds); for(int i=0; i<12; i++) { int angle = i * 30; static char buf[] = "000"; /* <-- implicit NUL-terminator at the end here */ snprintf(buf, sizeof(buf), "%02d", i==0?12:i); int ascender = 8; GPoint text_point = gpoint_from_polar(grect_crop(bounds, 50), GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle)); GRect text_rect = GRect(text_point.x - 24, text_point.y - 24, 48, 48); GSize size = graphics_text_layout_get_content_size(buf, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), text_rect, GTextOverflowModeWordWrap, GTextAlignmentLeft); ///graphics_draw_bitmap_in_rect(ctx, image, layer_get_bounds(layer)); text_rect.size = size; text_rect.size.h -= ascender; text_rect.origin = GPoint(text_point.x - size.w/2, text_point.y -size.h/2); graphics_draw_text(ctx, buf, fonts_get_system_font(FONT_KEY_GOTHIC_24_BOLD), grect_inset(text_rect, GEdgeInsets4(-8, 0, 0, 0)), GTextOverflowModeWordWrap, GTextAlignmentRight, NULL); //graphics_draw_rect(ctx, text_rect); // Draw hour graphics_context_set_stroke_color(ctx, GColorBlack); graphics_context_set_stroke_width(ctx, 2); graphics_draw_line(ctx, gpoint_from_polar(grect_crop(bounds, 30), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)), gpoint_from_polar(bounds, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle))); angle += 15; // Draw half hour graphics_context_set_stroke_color(ctx, GColorDarkGray); graphics_context_set_stroke_width(ctx, 2); graphics_draw_line(ctx, gpoint_from_polar(grect_crop(bounds, 10), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)), gpoint_from_polar(bounds, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle))); angle += 7.5; // Draw quarter hours graphics_context_set_stroke_color(ctx, GColorDarkGray); graphics_context_set_stroke_width(ctx, 2); graphics_draw_line(ctx, gpoint_from_polar(grect_crop(bounds, 10), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)), gpoint_from_polar(bounds, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle))); angle -= 15; graphics_draw_line(ctx, gpoint_from_polar(grect_crop(bounds, 10), GOvalScaleModeFitCircle , DEG_TO_TRIGANGLE(angle)), gpoint_from_polar(bounds, GOvalScaleModeFitCircle, DEG_TO_TRIGANGLE(angle))); } }