void draw_harmonics(t_scope *x, t_object *view, t_rect *rect) { int pathLength = 0; t_pt beginCoord; t_jpath* posHarmPath = NULL; t_jpath* negHarmPath = NULL; t_jmatrix transform; t_jrgba shadcolor = {0.4, 0.4, 0.4, 0.9}; double alphaShadow = 1.; long posPathLen, negPathLen; long precIndex = 0; double factor; posPathLen = negPathLen = 0; t_jgraphics *g = jbox_start_layer((t_object *)x, view, gensym("harmonics_layer"), rect->width, rect->height); if (alphaShadow > x->f_colorPositif.alpha ) alphaShadow = x->f_colorPositif.alpha; if (alphaShadow > x->f_colorNegatif.alpha ) alphaShadow = x->f_colorNegatif.alpha; alphaShadow -= 0.5; if (alphaShadow < 0.) alphaShadow = 0; shadcolor.alpha = alphaShadow; if (g) { jgraphics_set_line_join(g, JGRAPHICS_LINE_JOIN_ROUND); jgraphics_set_line_cap(g, JGRAPHICS_LINE_CAP_ROUND); jgraphics_set_line_width(g, 1); if(x->f_viewer->getBiggestContribution() > 0.) { factor = (x->f_rayonGlobal * 5. / 6.); if (x->f_viewer->getBiggestContribution() > 1) factor /= x->f_viewer->getBiggestContribution(); Tools::clip(&factor, 0., (x->f_rayonGlobal * 5. / 6.)); // positiv harmonics for(int i = 0; i < NUMBEROFCIRCLEPOINTS_UI; i++) { precIndex = i-1; if (precIndex < 0) precIndex += NUMBEROFCIRCLEPOINTS_UI; if (i == NUMBEROFCIRCLEPOINTS_UI-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_viewer->getColor(i) == 1 || x->f_viewer->getColor(i) == 0) { if (pathLength == 0) { beginCoord.x = x->f_viewer->getAbscisseValue(i) * factor; beginCoord.y = x->f_viewer->getOrdinateValue(i) * factor; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_viewer->getColor(precIndex) != 1) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_viewer->getAbscisseValue(i) * factor, x->f_viewer->getOrdinateValue(i) * factor); } else { jgraphics_line_to(g, x->f_viewer->getAbscisseValue(i) * factor, x->f_viewer->getOrdinateValue(i) * factor); } } } if (pathLength) { //jgraphics_close_path(g); posHarmPath = jgraphics_copy_path(g); } posPathLen = pathLength; pathLength = 0; jgraphics_new_path(g); for(int i = 0; i < NUMBEROFCIRCLEPOINTS_UI; i++) { precIndex = i-1; if (precIndex < 0) precIndex += NUMBEROFCIRCLEPOINTS_UI; if (i == NUMBEROFCIRCLEPOINTS_UI-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_viewer->getColor(i) == -1 || x->f_viewer->getColor(i) == 0) { if (!pathLength) { beginCoord.x = x->f_viewer->getAbscisseValue(i) * factor; beginCoord.y = x->f_viewer->getOrdinateValue(i) * factor; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_viewer->getColor(precIndex) != -1) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_viewer->getAbscisseValue(i) * factor, x->f_viewer->getOrdinateValue(i) * factor); } else { jgraphics_line_to(g, x->f_viewer->getAbscisseValue(i) * factor, x->f_viewer->getOrdinateValue(i) * factor); } } } if (pathLength) { //jgraphics_close_path(g); negHarmPath = jgraphics_copy_path(g); } negPathLen = pathLength; // draw harmonics : if (posPathLen || negPathLen) { jgraphics_new_path(g); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center.x, x->f_center.y); jgraphics_set_matrix(g, &transform); // shadows if (posPathLen) jgraphics_append_path(g, posHarmPath); //if (negPathLen) jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &shadcolor); jgraphics_stroke(g); jgraphics_translate(g, 1, 1); // harmocolor if (posPathLen) jgraphics_append_path(g, posHarmPath); jgraphics_set_source_jrgba(g, &x->f_colorPositif); jgraphics_stroke(g); if (negPathLen) jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &x->f_colorNegatif); jgraphics_stroke(g); } } jbox_end_layer((t_object*)x, view, gensym("harmonics_layer")); } jbox_paint_layer((t_object *)x, view, gensym("harmonics_layer"), 0., 0.); }
void draw_harmonics(t_hoa_scope *x, t_object *view, t_rect *rect) { int pathLength = 0; t_pt beginCoord; t_jpath* posHarmPath = NULL; t_jpath* negHarmPath = NULL; t_jmatrix transform; t_jrgba shadcolor = {0.4, 0.4, 0.4, 1.}; long posPathLen = 0, negPathLen = 0, precIndex = 0; t_jgraphics *g = jbox_start_layer((t_object *)x, view, hoa_sym_harmonics_layer, rect->width, rect->height); if(shadcolor.alpha > x->f_color_nh.alpha) shadcolor.alpha = x->f_color_ph.alpha; if(shadcolor.alpha > x->f_color_nh.alpha) shadcolor.alpha = x->f_color_nh.alpha; shadcolor.alpha -= 0.5; if(shadcolor.alpha < 0.) shadcolor.alpha = 0; if (g) { jgraphics_rotate(g, HOA_PI); jgraphics_set_line_join(g, JGRAPHICS_LINE_JOIN_ROUND); jgraphics_set_line_cap(g, JGRAPHICS_LINE_CAP_ROUND); jgraphics_set_line_width(g, 1); // positiv harmonics for(int i = 0; i < x->f_scope->getNumberOfPoints(); i++) { precIndex = i-1; if(precIndex < 0) precIndex += x->f_scope->getNumberOfPoints(); if(i == x->f_scope->getNumberOfPoints()-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_scope->getValue(i) >= 0) { if (pathLength == 0) { beginCoord.x = x->f_scope->getAbscissa(i) * x->f_radius; beginCoord.y = x->f_scope->getOrdinate(i) * x->f_radius; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_scope->getValue(i) < 0) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } else { jgraphics_line_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } } } if (pathLength) { posHarmPath = jgraphics_copy_path(g); } posPathLen = pathLength; pathLength = 0; jgraphics_new_path(g); for(int i = 0; i < x->f_scope->getNumberOfPoints(); i++) { precIndex = i-1; if (precIndex < 0) precIndex += x->f_scope->getNumberOfPoints(); if (i == x->f_scope->getNumberOfPoints()-1) { jgraphics_line_to(g, beginCoord.x, beginCoord.y ); } else if(x->f_scope->getValue(i) < 0) { if (!pathLength) { beginCoord.x = x->f_scope->getAbscissa(i) * x->f_radius; beginCoord.y = x->f_scope->getOrdinate(i) * x->f_radius; jgraphics_move_to(g, beginCoord.x, beginCoord.y ); pathLength++; } else if(x->f_scope->getValue(precIndex) >= 0) { jgraphics_line_to(g, 0, 0); jgraphics_move_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } else { jgraphics_line_to(g, x->f_scope->getAbscissa(i) * x->f_radius, x->f_scope->getOrdinate(i) * x->f_radius); } } } if(pathLength) { negHarmPath = jgraphics_copy_path(g); } negPathLen = pathLength; // draw harmonics : if(posPathLen || negPathLen) { jgraphics_new_path(g); jgraphics_matrix_init(&transform, 1, 0, 0, -1, x->f_center, x->f_center); jgraphics_set_matrix(g, &transform); // shadows jgraphics_translate(g, 1, 1); // decalage de l'ombre if (posPathLen) jgraphics_append_path(g, posHarmPath); if (negPathLen) jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &shadcolor); jgraphics_stroke(g); jgraphics_translate(g, -1, -1); // annulation du decalage // harmocolor if(posPathLen) { jgraphics_append_path(g, posHarmPath); jgraphics_set_source_jrgba(g, &x->f_color_ph); jgraphics_stroke(g); } if(negPathLen) { jgraphics_append_path(g, negHarmPath); jgraphics_set_source_jrgba(g, &x->f_color_nh); jgraphics_stroke(g); } } jbox_end_layer((t_object*)x, view, hoa_sym_harmonics_layer); } jbox_paint_layer((t_object *)x, view, hoa_sym_harmonics_layer, 0., 0.); }