Пример #1
0
//划线函数(有符号)
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;
              }
            }
       
      }
   }
}
Пример #2
0
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 */