⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fl_cartesian.cpp

📁 MSP430FG437 SPO2 Source code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}

/////////////////////////////// Ca_Canvas  ////////////////////////////////////////////

Ca_Canvas *Ca_Canvas::current_=0;

void Ca_Canvas::draw(){
    
    uchar damage_= damage();
   // int _b=border_/2;
   // int _x=x()+_b;
   // int _y=y()+_b;
   // int _w=w()-2*_b;
   // int _h=h()-2*_b;
    int replot=0;

    Ca_Axis_ *axis = last_axis_;

/// something similar will go in the future into the lauout layer...
    while (axis){
        replot |= axis->update();
        axis=axis->previous_axis_;
    }
///
	if(damage_!=CA_DAMAGE_ADD)
		draw_box();
	fl_clip(x()+Fl::box_dx(box()),y()+Fl::box_dy(box()),w()-Fl::box_dw(box()),h()-Fl::box_dh(box()));
    if((damage_!=CA_DAMAGE_ADD)||replot){
        last_plotted_=0;
        axis=last_axis_;
		while(axis){
			if(!(axis->grid_visible()&CA_FRONT)&&(axis->visible()||(axis->grid_visible()&CA_ALWAYS_VISIBLE)))
				axis->draw_grid();
			axis=axis->previous_axis_;
        }
    }
            
    if (last_plotted_)
        last_plotted_=last_plotted_->next;
    else
        last_plotted_=first_object_;
    while(last_plotted_){
        last_plotted_->object->draw();
        last_plotted_=last_plotted_->next;
    }
    last_plotted_=last_object_; 
	axis=last_axis_;        
    while(axis){
		if((axis->grid_visible()&CA_FRONT)&&(axis->visible()||(axis->grid_visible()&CA_ALWAYS_VISIBLE)))
			axis->draw_grid();
		axis=axis->previous_axis_;
    }

    fl_pop_clip();
    if (damage_&FL_DAMAGE_ALL)
        draw_label();
};
    


void Ca_Canvas::add_object(Ca_Object_ * object){
    last_object_=last_object_->next=new Ca_ObjectChain();
    last_object_->object=object;
};

void Ca_Canvas::clear(){
    while(first_object_)
        delete first_object_->object;
    damage(CA_DAMAGE_ALL);
};

Ca_Canvas::Ca_Canvas(int x, int y, int w, int h, const char *label)
	:Fl_Box(x,y,w,h,label),
	last_axis_(0),border_(CANVAS_BORDER), current_x_(0), current_y_(0),
    first_object_(0),last_object_(0),last_plotted_(0)
{
	
    current(this);
};

void Ca_Canvas::border(int border){
    border_=border;
    damage(CA_DAMAGE_ALL);
    Ca_Axis_ *axis=last_axis_;
    while(axis){
        axis->damage(CA_DAMAGE_ALL);
        axis=axis->previous_axis_;
    }
};

Ca_Canvas::~Ca_Canvas(){
    clear();
    Ca_Axis_ *axis=last_axis_;
    while(axis){
        last_axis_=axis->previous_axis_;
        axis->canvas_=0;
        axis = last_axis_;
    }
};
        




////////////////////////  Ca_Object //////////////////////

Ca_Object_::Ca_Object_(Ca_Canvas * canvas)
	:canvas_(canvas)
{
    if(!canvas_)
        canvas_=Ca_Canvas::current();
    Ca_ObjectChain *objectchain=new(Ca_ObjectChain);
    objectchain->object=this;
    objectchain->next=0;
    if(canvas_->last_object_)
        canvas_->last_object_=canvas_->last_object_->next=objectchain;
    else
        canvas_->last_object_=canvas_->first_object_=objectchain;
    x_axis_=canvas_->current_x();
    y_axis_=canvas_->current_y();
    canvas_->damage(CA_DAMAGE_ADD);
};


Ca_Object_::~Ca_Object_(){
    Ca_ObjectChain * objectchain=canvas_->first_object_;
    Ca_ObjectChain * previouschain=0;
    while(objectchain->object!=this){
        previouschain=objectchain;
        objectchain=objectchain->next;
    }
    if(previouschain)
        previouschain->next=objectchain->next;
    else
        canvas_->first_object_=objectchain->next;
    if(canvas_->last_object_==objectchain)
        canvas_->last_object_=previouschain;
    delete objectchain;
    canvas_->last_plotted_=0;
    canvas_->damage(CA_DAMAGE_ALL);
};



/////////////////////////   Ca_Point    //////////////////////////////////////////////////////

void Ca_Point::draw(){
    fl_color(color);
    double s,t;
    double _x=x_axis_->position(x);
    double _y=y_axis_->position(y);
    switch(style & CA_POINT_STYLE){
	case CA_NO_POINT:
		break;
    case CA_SIMPLE:
        ca_point(_x,_y);
        break;
    case CA_ROUND:
		ca_filled_circle(_x,_y,size);
        //ca_pie(_x-size,_y-size,2*size,2*size,0,360);
        if (style & CA_BORDER){
			fl_color(border_color);
            fl_line_style(0,border_width);
			fl_begin_loop();
            fl_circle(_x,_y,size);
			fl_end_loop();
            fl_line_style(0,0);
        }
        break;
    case CA_SQUARE:
        ca_rectf(_x-size,_y-size,2*size,2*size);
        if (style & CA_BORDER){
            fl_color(border_color);
            fl_line_style(0,border_width);
            ca_rect(_x-size,_y-size,2*size,2*size);
			fl_line_style(0,0);
        }
        break;
    case CA_UP_TRIANGLE:
        s=(int)(1.12*size+0.5);
        t=_y+size/3;
        ca_polygon(_x,t-2*size,_x-s,t,_x+s,t);
        if (style & CA_BORDER){
            fl_color(border_color);
            fl_line_style(0,border_width);
            ca_loop(_x,t-2*size,_x-s,t,_x+s,t);
			fl_line_style(0,0);
        }
        break;
    case CA_DOWN_TRIANGLE:
        s=(int)(1.12*size+0.5);
        t=_y-size/3;
        ca_polygon(_x,t+2*size,_x-s,t,_x+s,t);
        if (style & CA_BORDER){
            fl_color(border_color);
            fl_line_style(0,border_width);
            ca_loop(_x,t+2*size,_x-s,t,_x+s,t);
			fl_line_style(0,0);
        }
        break;
    case CA_DIAMOND:
        s=(int)(1.3*size+0.5);
        ca_polygon(_x,_y-s,_x-s,_y,_x,_y+s,_x+s,_y);
        if (style & CA_BORDER){
            fl_color(border_color);
            fl_line_style(0,border_width);
            ca_loop(_x,_y-s,_x-s,_y,_x,_y+s,_x+s,_y);
			fl_line_style(0,0);
        }
        break;
    }
};

Ca_Point::Ca_Point(double _x, double _y, Fl_Color _color, int _style, int _size, Fl_Color _border_color, int _border_width)
	:Ca_Object_(0),
	x(_x),
    y(_y),
    style(_style),
	size(_size),
    color(_color),
    border_color(_border_color),
	border_width(_border_width)

{
};

////////////////////////////  Ca_LinePoint  ////////////////////////////////////////////////////////

void Ca_LinePoint::draw(){
    Ca_Point::draw();
    if(previous){
        fl_color(color);
        fl_line_style(0,line_width);
		fl_begin_line();
        fl_vertex(previous->x_axis_->position(previous->x),previous->y_axis_->position(previous->y));
		fl_vertex(x_axis_->position(x),y_axis_->position(y));
		fl_end_line();
		fl_line_style(0,0);
    }
    
};

Ca_LinePoint::Ca_LinePoint( Ca_LinePoint *_previous, double _x, double _y,int _line_width, Fl_Color color, int style, int size, Fl_Color border_color, int _border_width):Ca_Point(_x, _y, color, style, size, border_color, _border_width){
    previous=_previous;
	line_width=_line_width;
};

Ca_LinePoint::Ca_LinePoint(Ca_LinePoint *_previous, double _x, double _y)
	:Ca_Point(_x, _y, previous->color, previous->style, previous->size,previous->border_color, previous->border_width),
	previous(_previous)
{
	if(_previous)
		line_width=_previous->line_width;
	else
		line_width=0;
};


////////////////////////////  Ca_PolyLine  ////////////////////////////////////////////////////////


Ca_PolyLine::Ca_PolyLine(Ca_PolyLine *_previous, double _x, double _y,int _line_style, int _line_width, Fl_Color color, int style, int size, Fl_Color border_color,int _border_width)
	:Ca_LinePoint(_previous, _x, _y, _line_width, color,  style, size, border_color, _border_width),
	line_style(_line_style)	
{
	next=0;
	if(_previous) _previous->next=this;
	canvas_->damage(CA_DAMAGE_ALL);
};

Ca_PolyLine::Ca_PolyLine(Ca_PolyLine *_previous, double _x, double _y):Ca_LinePoint(_previous,x,y){
	next=0;
	if(_previous){
		line_style=_previous->line_style;
		_previous->next=this;
	}
	canvas_->damage(CA_DAMAGE_ALL);
};

void Ca_PolyLine::draw(){
	Ca_Point::draw();
	if(next) return;
	Ca_PolyLine * temp;
	int c=color;
	int style=line_style;
	int size=line_width;
	fl_color(c);
	fl_line_style(style,size);
	fl_begin_line();
	fl_vertex(x_axis_->position(x),y_axis_->position(y));
	temp=(Ca_PolyLine *)previous;
	while(temp){
		fl_vertex(temp->x_axis_->position(temp->x),temp->y_axis_->position(temp->y));
		if((temp->line_style != style)||(temp->color!=c)||(temp->line_width!=size)){
			fl_end_line();
			c=temp->color;
			style=temp->line_style;
			size=temp->line_width;
			fl_color(c);
			fl_line_style(style,size);
			fl_begin_line();
			fl_vertex(temp->x_axis_->position(x),temp->y_axis_->position(y));
		}
		temp=(Ca_PolyLine *)(temp->previous);
	}
	fl_end_line();
	fl_line_style(0,0);
};

Ca_Line::Ca_Line(int _n, double *_data, double *_data_2, int _line_style, int _line_width, Fl_Color color,  int style, int size, Fl_Color border_color, int border_width)
	:Ca_Point(0, 0, color, style, size, border_color, border_width),
	line_style(_line_style),
	line_width(_line_width),
	n(_n),
	data(_data),
	data_2(_data_2)
{
};

Ca_Line::Ca_Line(int _n, double *_data, int _line_style, int _line_width, Fl_Color color, int style, int size, Fl_Color border_color, int border_width)
	:Ca_Point(0, 0, color, style, size, border_color, border_width),
	line_style(_line_style),
	line_width(_line_width),
	n(_n),
	data(_data),
	data_2(0)
{
};

void Ca_Line::draw(){
	fl_color(color);
	fl_line_style(line_style,line_width);
	fl_begin_line();
	int i;
	if(data_2){
		for(i=0;i<n;i++)
			fl_vertex(x_axis_->position(data[i]),y_axis_->position(data_2[i]));
		fl_end_line();
		fl_line_style(0,0);
		for(i=0;i<n;i++){
			x=data[i];
			y=data_2[i];
			Ca_Point::draw();
		}
	}else{
		for(i=0;i<n;i++)
			fl_vertex(x_axis_->position(data[2*i]),y_axis_->position(data[2*i+1]));
		fl_end_line();
		for(i=0;i<n;i++){
			x=data[2*i];
			y=data[2*i+1];
			Ca_Point::draw();
		}
		fl_line_style(0,0);
	}
	
};

void Ca_Text::draw(){
	uchar align_=align;
	double X,Y,W,H;
	double X1,Y1;

	X = x_axis_->position(x1);
	X1 = x_axis_->position(x2);
	if(X1>X)
		W=X1-X;
	else{
		W=X-X1;
		X=X1;
	}
	Y = y_axis_->position(y1);
	Y1 = y_axis_->position(y2);
	if(Y1>Y)
		H = Y1-Y;
	else{
		H = Y-Y1;
		Y = Y1;
	}
	fl_color(label_color);
	fl_font(label_font,label_size);
	ca_text(label,X,Y,W,H,(Fl_Align)align_);
};


Ca_Text::Ca_Text(double _x1, double _x2, double _y1, double _y2, char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
	:Ca_Object_(0),
	x1(_x1), x2(_x2), y1(_y1), y2(_y2),
	label(_label),
	align(_align),
	label_color(_label_color),
	label_font(_label_font),
	label_size(_label_size)
{};

Ca_Text::Ca_Text(double x, double y,char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
	:Ca_Object_(0),
	x1(x), x2(x), y1(y), y2(y),
	label(_label),
	align(_align),
	label_color(_label_color),
	label_font(_label_font),
	label_size(_label_size)
{};




void Ca_Bar::draw(){
	uchar align_=align;
	double X,Y,W,H;
	double X1,Y1;

	X = x_axis_->position(x1);
	X1 = x_axis_->position(x2);
	if(X1>X)
		W=X1-X;
	else{
		W=X-X1;
		X=X1;
	}
	Y = y_axis_->position(y1);
	Y1 = y_axis_->position(y2);
	if(Y1>Y)
		H = Y1-Y;
	else{
		H = Y-Y1;
		Y = Y1;
	}

	fl_color(color);
	ca_rectf(X,Y,W,H);
	if(border_width>=0){
		fl_color(border_color);
		fl_line_style(FL_SOLID|FL_CAP_SQUARE, border_width);
		ca_rect(X,Y,W,H);
	}
	fl_line_style(0,0);

	if(!(align_&15)||(align_&FL_ALIGN_INSIDE)){
		X += border_width/2;
		W -= border_width;
		Y += border_width/2;
		H -= border_width;
	}else{
		X -= border_width/2;
		W += border_width;
		Y -= border_width/2;
		H += border_width;
		if (align_ & FL_ALIGN_TOP){
			align_ ^= (FL_ALIGN_BOTTOM|FL_ALIGN_TOP);
			H=Y;
			Y=canvas_->y()+Fl::box_dy(canvas_->box());
			H-=Y;
		}else if(align_ & FL_ALIGN_BOTTOM){
			align_^=(FL_ALIGN_BOTTOM|FL_ALIGN_TOP);
			Y=Y+H;
			H=canvas_->y()+canvas_->h()+Fl::box_dy(canvas_->box())-Fl::box_dh(canvas_->box())-Y;
		}else if(align_ & FL_ALIGN_LEFT){
			align_^=(FL_ALIGN_LEFT|FL_ALIGN_RIGHT);
			W=X;
			X=canvas_->x()+Fl::box_dx(canvas_->box());
			W=W-X-3;
		}else if(align_ & FL_ALIGN_RIGHT){
			align_ ^=(FL_ALIGN_LEFT|FL_ALIGN_RIGHT);
			X=X+W+3;
			W=canvas_->x()+Fl::box_dx(canvas_->box())+canvas_->w()-Fl::box_dw(canvas_->box())-X;
		}
	}
	fl_color(label_color);
	fl_font(label_font,label_size);
	ca_text(label,X,Y,W,H,(Fl_Align)align_);
};







Ca_Bar::Ca_Bar(double _x1, double _x2, double _y1, double _y2, Fl_Color _color,  Fl_Color _border_color, int _border_width,  char *_label, uchar _align, Fl_Font _label_font, int _label_size, Fl_Color _label_color)
		:Ca_Text(_x1, _x2, _y1, _y2, _label, _align, _label_font, _label_size, _label_color),
		color(_color),
		border_color(_border_color),
		border_width(_border_width)
		{
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -