void twin_path_arc (twin_path_t *path, twin_fixed_t x, twin_fixed_t y, twin_fixed_t x_radius, twin_fixed_t y_radius, twin_angle_t start, twin_angle_t extent) { twin_matrix_t save = twin_path_current_matrix (path); twin_fixed_t max_radius; int32_t sides; int32_t n; twin_angle_t a; twin_angle_t first, last, step, inc; twin_angle_t epsilon; twin_path_translate (path, x, y); twin_path_scale (path, x_radius, y_radius); max_radius = _twin_matrix_max_radius (&path->state.matrix); sides = max_radius / twin_sfixed_to_fixed (TWIN_SFIXED_TOLERANCE); if (sides > 1024) sides = 1024; n = 2; while ((1 << n) < sides) n++; sides = (1 << n); step = TWIN_ANGLE_360 >> n; inc = step; epsilon = 1; if (extent < 0) { inc = -inc; epsilon = -1; } first = (start + inc - epsilon) & ~(step - 1); last = (start + extent - inc + epsilon) & ~(step - 1); if (first != start) twin_path_draw (path, twin_cos(start), twin_sin(start)); for (a = first; a != last; a += inc) twin_path_draw (path, twin_cos (a), twin_sin (a)); if (last != start + extent) twin_path_draw (path, twin_cos (start+extent), twin_sin(start+extent)); twin_path_set_matrix (path, save); }
static void twin_clock_set_transform (twin_clock_t *clock, twin_path_t *path) { twin_fixed_t scale; scale = (TWIN_FIXED_ONE - TWIN_CLOCK_BORDER_WIDTH * 3) / 2; twin_path_scale (path, _twin_widget_width (clock) * scale, _twin_widget_height (clock) * scale); twin_path_translate (path, TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3, TWIN_FIXED_ONE + TWIN_CLOCK_BORDER_WIDTH * 3); twin_path_rotate (path, -TWIN_ANGLE_90); }
void twin_demo_start (twin_screen_t *screen, const char *name, int x, int y, int w, int h) { #if 0 twin_circletext_start (screen, x, y, w, h); #endif twin_line_start (screen, x += 20, y += 20, w, h); #if 0 twin_quickbrown_start (screen, x += 20, y += 20, w, h); twin_ascii_start (screen, x += 20, y += 20, w, h); twin_jelly_start (screen, x += 20, y += 20, w, h); #endif #if 0 #if 0 path = twin_path_create (); twin_path_rotate (path, -TWIN_ANGLE_45); twin_path_translate (path, D(10), D(2)); for (s = 0; s < 40; s++) { twin_path_rotate (path, TWIN_ANGLE_11_25 / 16); twin_path_scale (path, D(1.125), D(1.125)); twin_path_move (path, D(0), D(0)); twin_path_draw (path, D(1), D(0)); twin_path_draw (path, D(1), D(1)); twin_path_draw (path, D(0), D(1)); } twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, path); source.source_kind = TWIN_SOLID; source.u.argb = 0xffff0000; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, w, h); #endif #if 0 path = twin_path_create (); stroke = twin_path_create (); twin_path_translate (stroke, D(62), D(62)); twin_path_scale (stroke,D(60),D(60)); for (s = 0; s < 60; s++) { twin_state_t save = twin_path_save (stroke); twin_angle_t a = s * TWIN_ANGLE_90 / 15; twin_path_rotate (stroke, a); twin_path_move (stroke, D(1), 0); if (s % 5 == 0) twin_path_draw (stroke, D(0.85), 0); else twin_path_draw (stroke, D(.98), 0); twin_path_restore (stroke, &save); } twin_path_convolve (path, stroke, pen); twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, path); source.source_kind = TWIN_SOLID; source.u.argb = 0xffff0000; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, w, h); #endif #if 0 path = twin_path_create (); stroke = twin_path_create (); twin_path_translate (stroke, D(100), D(100)); twin_path_scale (stroke, D(10), D(10)); twin_path_move (stroke, D(0), D(0)); twin_path_draw (stroke, D(10), D(0)); twin_path_convolve (path, stroke, pen); twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, path); source.source_kind = TWIN_SOLID; source.u.argb = 0xffff0000; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (red, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, w, h); #endif #if 1 path = twin_path_create (); stroke = twin_path_create (); twin_path_move (stroke, D (10), D (40)); twin_path_draw (stroke, D (40), D (40)); twin_path_draw (stroke, D (10), D (10)); twin_path_move (stroke, D (10), D (50)); twin_path_draw (stroke, D (40), D (50)); twin_path_convolve (path, stroke, pen); twin_path_destroy (stroke); twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, path, 0, 0); source.source_kind = TWIN_SOLID; source.u.argb = 0xff00ff00; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, 100, 100); twin_path_destroy (path); path = twin_path_create (); stroke = twin_path_create (); twin_path_move (stroke, D (50), D (50)); twin_path_curve (stroke, D (70), D (70), D (80), D (70), D (100), D (50)); twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, stroke, 0, 0); source.source_kind = TWIN_SOLID; source.u.argb = 0xffff0000; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, 100, 100); twin_path_convolve (path, stroke, pen); twin_fill (alpha, 0x00000000, TWIN_SOURCE, 0, 0, w, h); twin_fill_path (alpha, path, 0, 0); source.source_kind = TWIN_SOLID; source.u.argb = 0xff0000ff; mask.source_kind = TWIN_PIXMAP; mask.u.pixmap = alpha; twin_composite (blue, 0, 0, &source, 0, 0, &mask, 0, 0, TWIN_OVER, 100, 100); #endif twin_window_show (redw); twin_window_show (bluew); #endif }