//划线函数(有符号) void Line( unsigned int y1, unsigned char x1, unsigned int y2, unsigned char x2, uint8 Mode) { unsigned char x,y,z; float k,b; if(x1==x2) y_line(y1,x1, y2, Mode); else if(y1==y2) x_line(y1,x1, x2, Mode); else { z=0; { signed int y_f,x_f; y_f=(signed int)y2-(signed int)y1; x_f=(signed int)x2-(signed int)x1; if( abs(y_f)< abs(x_f) ) // |k|<=1 z=1; } if( z==1 ) // |k|<=1 { { signed int y_f,x_f; y_f=(signed int)y2-(signed int)y1; x_f=(signed int)x2-(signed int)x1; k=(float)(y_f) / (float)(x_f) ; b=(float)y1-k*(float)x1; } if( x1 < x2 ) { z=y1; for(x=x1+1;x<x2;x++) { y=(unsigned char)(k*(float)x+b); Pixel(y, x, Mode); y_line(y, x, z, Mode); z=y; } } else { z=y2; for(x=x2+1;x<x1;x++) { y=(unsigned char)(k*(float)x+b); Pixel(y, x, Mode); y_line(y, x, z, Mode); z=y; } } } else // abs(y1-y2) < abs(x1-x2) |K|>1 { { signed int y_f,x_f; y_f=(signed int)y2-(signed int)y1; x_f=(signed int)x2-(signed int)x1; k=(float)x_f / (float)y_f ; b=(float)x1-k*(float)y1; } if( y1 <= y2 ) { z=x1; for(y=y1+1;y<y2;y++) { x=(unsigned char)(k*(float)y+b); Pixel( y , x,Mode ); x_line(y, x, z, Mode); z=x; } } else { z=x2; for(y=y2+1;y<y1;y++) { x=(unsigned char)(k*(float)y+b); Pixel( y, x,Mode ); x_line(y, x, z,Mode); z=x; } } } } }
static void render_spect_border (cairo_surface_t * surface, const char * filename, double left, double width, double seconds, double top, double height, double min_freq, double max_freq, bool log_freq) { char text [512] ; cairo_t * cr ; cairo_text_extents_t extents ; cairo_matrix_t matrix ; TICKS ticks ; int k, tick_count ; cr = cairo_create (surface) ; cairo_set_source_rgb (cr, 1.0, 1.0, 1.0) ; cairo_set_line_width (cr, BORDER_LINE_WIDTH) ; /* Print title. */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL) ; cairo_set_font_size (cr, 1.0 * TITLE_FONT_SIZE) ; snprintf (text, sizeof (text), "Spectrogram: %s", filename) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + 2, top - extents.height / 2) ; cairo_show_text (cr, text) ; /* Print labels. */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL) ; cairo_set_font_size (cr, 1.0 * NORMAL_FONT_SIZE) ; /* Border around actual spectrogram. */ cairo_rectangle (cr, left, top, width, height) ; /* Put ticks on Time axis */ tick_count = calculate_ticks (0.0, seconds, width, false, &ticks) ; for (k = 0 ; k < tick_count ; k++) { y_line (cr, left + ticks.distance [k], top + height, TICK_LEN) ; if (JUST_A_TICK (ticks, k)) continue ; str_print_value (text, sizeof (text), ticks.value [k], ticks.decimal_places_to_print) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + ticks.distance [k] - extents.width / 2, top + height + 8 + extents.height) ; cairo_show_text (cr, text) ; } ; /* Put ticks on Frequency axis */ tick_count = calculate_ticks (min_freq, max_freq, height, log_freq, &ticks) ; for (k = 0 ; k < tick_count ; k++) { x_line (cr, left + width, top + height - ticks.distance [k], TICK_LEN) ; if (JUST_A_TICK (ticks, k)) continue ; str_print_value (text, sizeof (text), ticks.value [k], ticks.decimal_places_to_print) ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + width + 12, top + height - ticks.distance [k] + extents.height / 4.5) ; cairo_show_text (cr, text) ; } ; cairo_set_font_size (cr, 1.0 * NORMAL_FONT_SIZE) ; /* Label X axis. */ snprintf (text, sizeof (text), "Time (secs)") ; cairo_text_extents (cr, text, &extents) ; cairo_move_to (cr, left + (width - extents.width) / 2, cairo_image_surface_get_height (surface) - 8) ; cairo_show_text (cr, text) ; /* Label Y axis (rotated). */ snprintf (text, sizeof (text), "Frequency (Hz)") ; cairo_text_extents (cr, text, &extents) ; cairo_get_font_matrix (cr, &matrix) ; cairo_matrix_rotate (&matrix, -0.5 * M_PI) ; cairo_set_font_matrix (cr, &matrix) ; cairo_move_to (cr, cairo_image_surface_get_width (surface) - 12, top + (height + extents.width) / 2) ; cairo_show_text (cr, text) ; cairo_destroy (cr) ; } /* render_spect_border */