static void point_double(struct point *r, struct point *p) { u8 s[20], t[20]; struct point pp; u8 *px, *py, *rx, *ry; pp = *p; px = pp.x; py = pp.y; rx = r->x; ry = r->y; if (elt_is_zero(py)) { point_zero(r); return; } elt_square(t, px); // t = px*px elt_add(s, t, t); // s = 2*px*px elt_add(s, s, t); // s = 3*px*px elt_add(s, s, ec_a); // s = 3*px*px + a elt_add(t, py, py); // t = 2*py elt_inv(t, t); // t = 1/(2*py) elt_mul(s, s, t); // s = (3*px*px+a)/(2*py) elt_square(rx, s); // rx = s*s elt_add(t, px, px); // t = 2*px elt_sub(rx, rx, t); // rx = s*s - 2*px elt_sub(t, px, rx); // t = -(rx-px) elt_mul(ry, s, t); // ry = -s*(rx-px) elt_sub(ry, ry, py); // ry = -s*(rx-px) - py }
static void point_add(struct point *r, struct point *p, struct point *q) { u8 s[20], t[20], u[20]; u8 *px, *py, *qx, *qy, *rx, *ry; struct point pp, qq; pp = *p; qq = *q; px = pp.x; py = pp.y; qx = qq.x; qy = qq.y; rx = r->x; ry = r->y; if (point_is_zero(&pp)) { elt_copy(rx, qx); elt_copy(ry, qy); return; } if (point_is_zero(&qq)) { elt_copy(rx, px); elt_copy(ry, py); return; } elt_sub(u, qx, px); if (elt_is_zero(u)) { elt_sub(u, qy, py); if (elt_is_zero(u)) point_double(r, &pp); else point_zero(r); return; } elt_inv(t, u); // t = 1/(qx-px) elt_sub(u, qy, py); // u = qy-py elt_mul(s, t, u); // s = (qy-py)/(qx-px) elt_square(rx, s); // rx = s*s elt_add(t, px, qx); // t = px+qx elt_sub(rx, rx, t); // rx = s*s - (px+qx) elt_sub(t, px, rx); // t = -(rx-px) elt_mul(ry, s, t); // ry = -s*(rx-px) elt_sub(ry, ry, py); // ry = -s*(rx-px) - py }
static void point_mul(struct point *d, u8 *a, struct point *b) // a is bignum { u32 i; u8 mask; point_zero(d); for (i = 0; i < 21; i++) for (mask = 0x80; mask != 0; mask >>= 1) { point_double(d, d); if ((a[i] & mask) != 0) point_add(d, d, b); } }
//funktion zum berechnen der normalen void polygon::calculateNormal( vertex p_vector1, vertex p_vector2 ) { //anwendung des Kreuzproduktes: this->normal.wx = (p_vector1.wy * p_vector2.wz) - (p_vector1.wz * p_vector2.wy); this->normal.wy = (p_vector1.wz * p_vector2.wx) - (p_vector1.wx * p_vector2.wz); this->normal.wz = (p_vector1.wx * p_vector2.wy) - (p_vector1.wy * p_vector2.wx); VectNormalize( this->normal ); vertex point_light( 10.0f, 0.0f, -1.0f); vertex point_zero( 0,0,0 ); vertex vector_light = VectCreate( point_zero, point_light ); this->helligkeit = VectScalarProduct( this->normal, vector_light ); }
static View* create_title_view(Window* window) { if (!window) return NULL; Rect title_view_frame = rect_make(point_make(0, 0), size_make(window->frame.size.width, WINDOW_TITLE_VIEW_HEIGHT)); View* title_view = create_view(title_view_frame); title_view->background_color = window->border_color; Button* close_button = create_button(rect_make(point_zero(), size_make(CHAR_WIDTH * 2, title_view->frame.size.height)), "X"); close_button->mousedown_handler = (event_handler)&close_button_clicked; add_button(title_view, close_button); Button* minimize_button = create_button(rect_make(point_make(rect_max_x(close_button->frame), 0), size_make(CHAR_WIDTH * 2, title_view->frame.size.height)), "-"); minimize_button->mousedown_handler = (event_handler)&minimize_button_clicked; add_button(title_view, minimize_button); //add title label to title view int label_length = 20 * CHAR_WIDTH; Rect label_frame = rect_make(point_make(rect_max_x(minimize_button->frame) + 15, title_view_frame.size.height / 2 - (CHAR_HEIGHT / 2)), size_make(label_length, CHAR_HEIGHT)); Label* title_label = create_label(label_frame, window->title); title_label->text_color = color_black(); add_sublabel(title_view, title_label); Bmp* dots = create_bmp(title_view_frame, create_layer(title_view_frame.size)); uint8_t* ref = dots->layer->raw; for (int y = 0; y < dots->frame.size.height; y++) { for (int x = 0; x < dots->frame.size.width; x++) { if (!((x + y) % 2)) { *ref++ = 50; *ref++ = 50; *ref++ = 50; } else { *ref++ = 200; *ref++ = 160; *ref++ = 90; } } } add_bmp(title_view, dots); return title_view; }
void draw_view(View* view) { if (!view) return; //inform subviews that we're being redrawn //dirtied = 1; //fill view with its background color draw_rect(view->layer, rect_make(point_zero(), view->frame.size), view->background_color, THICKNESS_FILLED); //draw any bmps this view has for (int i = 0; i < view->bmps->size; i++) { Bmp* bmp = (Bmp*)array_m_lookup(view->bmps, i); if (bmp) { draw_bmp(view->layer, bmp); } } //draw any labels this view has for (int i = 0; i < view->labels->size; i++) { Label* label = (Label*)array_m_lookup(view->labels, i); draw_label(view->layer, label); } //draw buttons for (int i = 0; i < view->buttons->size; i++) { Button* button = (Button*)array_m_lookup(view->buttons, i); if (button) { draw_button(view->layer, button); } } //draw each subview of this view for (int i = 0; i < view->subviews->size; i++) { View* subview = (View*)array_m_lookup(view->subviews, i); draw_view(subview); blit_layer(view->layer, subview->layer, rect_make(subview->frame.origin, subview->layer->size), rect_make(point_zero(), subview->layer->size)); } view->needs_redraw = 0; }
bool draw_window(Window* window) { if (window->user_backed) { return true; } //blit_layer(window->layer, window->content_view->layer, rect_make(window->content_view->frame.origin, window->layer->size), rect_make(point_zero(), window->content_view->frame.size)); //return; //if window is invisible, don't bother drawing if (!window->layer->alpha) return false; //if window has a redraw handler, call it if (window->redraw_handler) { //draw_rect(window->content_view->layer, rect_make(point_zero(), window->content_view->frame.size), window->content_view->background_color, THICKNESS_FILLED); event_handler redraw = window->redraw_handler; redraw(window, NULL); blit_layer(window->layer, window->content_view->layer, rect_make(window->content_view->frame.origin, window->layer->size), rect_make(point_zero(), window->content_view->frame.size)); window->last_draw_timestamp = time(); return true; } //if window doesn't need to be redrawn, no work to do if (window->layer->alpha == 1.0 && !window->needs_redraw) { return false; } //dirtied = 1; //paint window draw_rect(window->layer, rect_make(point_zero(), window->frame.size), window->border_color, window->border_width); //only draw a title bar if title_view exists if (window->title_view) { //update title label of window Label* title_label = (Label*)array_m_lookup(window->title_view->labels, 0); title_label->text = window->title; draw_view(window->title_view); blit_layer(window->layer, window->title_view->layer, rect_make(point_zero(), window->layer->size), window->title_view->frame); draw_rect(window->layer, window->title_view->frame, color_gray(), 2); } //only draw the content view if content_view exists if (window->content_view) { draw_view(window->content_view); //if there's a redraw callback, call it if (window->redraw_handler) { event_handler redraw = window->redraw_handler; redraw(window, NULL); } blit_layer(window->layer, window->content_view->layer, rect_make(window->content_view->frame.origin, window->layer->size), rect_make(point_zero(), window->content_view->frame.size)); //draw dividing border between window border and other content if (window->border_width) { //inner border draw_rect(window->content_view->layer, rect_make(point_zero(), window->content_view->frame.size), color_gray(), window->border_width); } } //draw window border draw_rect(window->layer, rect_make(point_zero(), window->frame.size), color_black(), 1); window->needs_redraw = 0; window->last_draw_timestamp = time(); return true; }
Rect rect_zero() { return rect_make(point_zero(), size_zero()); }
void calculator_xserv(Point origin) { Size button_size = size_make(60, 60); int result_view_height = 50; int button_spacing = 0; //width is button_size * 4 because 3 rows of # buttons + 1 row of operators Window* calc_win = create_window(rect_make(origin, size_make(button_size.width * 4, WINDOW_TITLE_VIEW_HEIGHT + result_view_height + button_spacing + (button_size.height * 4)))); calc_win->title = "Calculator"; //number display View* label_view = create_view(rect_make(point_zero(), size_make(calc_win->frame.size.width, result_view_height))); result_label = create_label(rect_make(point_make(10, 10), label_view->frame.size), "0"); label_view->background_color = color_white(); add_sublabel(label_view, result_label); add_subview(calc_win->content_view, label_view); View* button_view = create_view(rect_make(point_make(0, rect_max_y(label_view->frame)), size_make(calc_win->frame.size.width, calc_win->frame.size.height - label_view->frame.size.height))); button_view->background_color = color_make(200, 200, 255); add_subview(calc_win->content_view, button_view); //number buttons 1-9 for (int col = 0; col < 3; col++) { for (int row = 2; row >= 0; row--) { int val = ((3 - col) * 3) + row - 2; char title[32]; itoa(val, (char*)&title); Button* b = create_button(rect_make(point_make((row * button_size.width) + button_spacing, (col * button_size.height) + button_spacing), button_size), title); b->mousedown_handler = (event_handler)&calc_num_click; add_button(button_view, b); } } //3 * button spacing to account for above buttons Button* zero = create_button(rect_make(point_make(button_spacing, 3 * button_size.height + button_spacing), size_make(button_size.width * 2, button_size.height)), "0"); zero->mousedown_handler = (event_handler)&calc_num_click; add_button(button_view, zero); Button* equals = create_button(rect_make(point_make(rect_max_x(zero->frame), 3 * button_size.height + button_spacing), size_make(button_size.width, button_size.height)), "="); equals->mousedown_handler = (event_handler)&calc_op_click; add_button(button_view, equals); //operator buttons for (int i = 0; i < 4; i++){ char* title; switch (i) { case 0: title = "/"; break; case 1: title = "X"; break; case 2: title = "-"; break; case 3: default: title = "+"; break; } Button* b = create_button(rect_make(point_make((3 * button_size.width) + button_spacing, button_size.height * i + button_spacing), button_size), title); b->mousedown_handler = (event_handler)&calc_op_click; add_button(button_view, b); } present_window(calc_win); }