Blame synfig-studio/src/gui/waypointrenderer.cpp

Rodolfo Ribeiro Gomes 1cd07c
/* === S Y N F I G ========================================================= */
Rodolfo Ribeiro Gomes 1cd07c
/*!	\file waypointrenderer.cpp
Rodolfo Ribeiro Gomes 1cd07c
**
Rodolfo Ribeiro Gomes 1cd07c
**	$Id$
Rodolfo Ribeiro Gomes 1cd07c
**
Rodolfo Ribeiro Gomes 1cd07c
**	\legal
Rodolfo Ribeiro Gomes 1cd07c
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Rodolfo Ribeiro Gomes 1cd07c
**  ......... ... 2019 Rodolfo R. Gomes
Rodolfo Ribeiro Gomes 1cd07c
**
Rodolfo Ribeiro Gomes 1cd07c
**	This package is free software; you can redistribute it and/or
Rodolfo Ribeiro Gomes 1cd07c
**	modify it under the terms of the GNU General Public License as
Rodolfo Ribeiro Gomes 1cd07c
**	published by the Free Software Foundation; either version 2 of
Rodolfo Ribeiro Gomes 1cd07c
**	the License, or (at your option) any later version.
Rodolfo Ribeiro Gomes 1cd07c
**
Rodolfo Ribeiro Gomes 1cd07c
**	This package is distributed in the hope that it will be useful,
Rodolfo Ribeiro Gomes 1cd07c
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Rodolfo Ribeiro Gomes 1cd07c
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Rodolfo Ribeiro Gomes 1cd07c
**	General Public License for more details.
Rodolfo Ribeiro Gomes 1cd07c
**	\endlegal
Rodolfo Ribeiro Gomes 1cd07c
*/
Rodolfo Ribeiro Gomes 1cd07c
/* ========================================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === H E A D E R S ======================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
#ifdef USING_PCH
Rodolfo Ribeiro Gomes 1cd07c
#	include "pch.h"
Rodolfo Ribeiro Gomes 1cd07c
#else
Rodolfo Ribeiro Gomes 1cd07c
# ifdef HAVE_CONFIG_H
Rodolfo Ribeiro Gomes 1cd07c
#  include <config.h></config.h>
Rodolfo Ribeiro Gomes 1cd07c
# endif
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
#include "waypointrenderer.h"
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
#include <gdkmm rgba.h=""></gdkmm>
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
#include <synfig interpolation.h=""></synfig>
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes c89a4c
#include <synfig layer_pastecanvas.h="" layers=""></synfig>
Rodolfo Ribeiro Gomes c89a4c
#include <synfig valuenode_dynamiclist.h="" valuenodes=""></synfig>
Rodolfo Ribeiro Gomes 1cd07c
#endif
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === U S I N G =========================================================== */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
using namespace synfig;
Rodolfo Ribeiro Gomes c89a4c
using namespace synfigapp;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === M A C R O S ========================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === G L O B A L S ======================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === P R O C E D U R E S ================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/* === C L A S S E S ======================================================= */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
namespace studio {
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
static Gdk::RGBA
Rodolfo Ribeiro Gomes 1cd07c
get_interp_color(Interpolation x)
Rodolfo Ribeiro Gomes 1cd07c
{
Rodolfo Ribeiro Gomes 1cd07c
	switch(x) {
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_TCB:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#73d216");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_LINEAR:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#edd400");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CONSTANT:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#cc0000");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_HALT:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#3465a4");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_MANUAL:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#75507b");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CLAMPED:
Rodolfo Ribeiro Gomes 1cd07c
		return Gdk::RGBA("#c17d11");
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_UNDEFINED:
Rodolfo Ribeiro Gomes 1cd07c
	default:
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
	}
Rodolfo Ribeiro Gomes 1cd07c
	return Gdk::RGBA("#555753");
Rodolfo Ribeiro Gomes 1cd07c
}
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
static Gdk::RGBA
Rodolfo Ribeiro Gomes 1cd07c
color_darken(Gdk::RGBA x, float amount)
Rodolfo Ribeiro Gomes 1cd07c
{
Rodolfo Ribeiro Gomes 1cd07c
	x.set_red(x.get_red() * amount);
Rodolfo Ribeiro Gomes 1cd07c
	x.set_green(x.get_green() * amount);
Rodolfo Ribeiro Gomes 1cd07c
	x.set_blue(x.get_blue() * amount);
Rodolfo Ribeiro Gomes 1cd07c
	return x;
Rodolfo Ribeiro Gomes 1cd07c
}
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes d4f2ba
static Gdk::RGBA
Rodolfo Ribeiro Gomes d4f2ba
color_shift(Gdk::RGBA x, double amount)
Rodolfo Ribeiro Gomes d4f2ba
{
Rodolfo Ribeiro Gomes d4f2ba
	x.set_red(x.get_red() + amount);
Rodolfo Ribeiro Gomes d4f2ba
	x.set_green(x.get_green() + amount);
Rodolfo Ribeiro Gomes d4f2ba
	x.set_blue(x.get_blue() + amount);
Rodolfo Ribeiro Gomes d4f2ba
	return x;
Rodolfo Ribeiro Gomes d4f2ba
}
Rodolfo Ribeiro Gomes d4f2ba
Rodolfo Ribeiro Gomes d4f2ba
static Gdk::RGBA
Rodolfo Ribeiro Gomes d4f2ba
get_black(bool hover)
Rodolfo Ribeiro Gomes d4f2ba
{
Rodolfo Ribeiro Gomes d4f2ba
	if (!hover)
Rodolfo Ribeiro Gomes d4f2ba
		return Gdk::RGBA("#2e3436"); // it's black, trust me
Rodolfo Ribeiro Gomes d4f2ba
	return Gdk::RGBA("#4e5456");
Rodolfo Ribeiro Gomes d4f2ba
}
Rodolfo Ribeiro Gomes d4f2ba
Rodolfo Ribeiro Gomes 1cd07c
void
Rodolfo Ribeiro Gomes 1cd07c
WaypointRenderer::render_time_point_to_window(
Rodolfo Ribeiro Gomes 1cd07c
	const Cairo::RefPtr<cairo::context> &cr,</cairo::context>
Rodolfo Ribeiro Gomes 1cd07c
	const Gdk::Rectangle& area,
Rodolfo Ribeiro Gomes 1cd07c
	const TimePoint &tp,
Rodolfo Ribeiro Gomes d4f2ba
	bool selected,
Rodolfo Ribeiro Gomes d4f2ba
	bool hover)
Rodolfo Ribeiro Gomes 1cd07c
{
Rodolfo Ribeiro Gomes d4f2ba
	const Gdk::RGBA black = get_black(hover);
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	if(selected)
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_line_width(2.0);
Rodolfo Ribeiro Gomes 1cd07c
	else
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_line_width(1.0);
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	Gdk::RGBA color;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/*-	BEFORE ------------------------------------- */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	color=get_interp_color(tp.get_before());
Rodolfo Ribeiro Gomes 1cd07c
	color=color_darken(color,1.0f);
Rodolfo Ribeiro Gomes 1cd07c
	if(selected)color=color_darken(color,1.3f);
Rodolfo Ribeiro Gomes d4f2ba
	if(hover) color = color_shift(color, 0.2);
Rodolfo Ribeiro Gomes 1cd07c
	cr->set_source_rgb(color.get_red(),color.get_green(),color.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	switch(tp.get_before())
Rodolfo Ribeiro Gomes 1cd07c
	{
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_TCB:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->translate(area.get_x(), area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->scale(area.get_width(), area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(0.5, 1);
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.5, 0.5, 90*M_PI/180.0, 270*M_PI/180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_HALT:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->translate(area.get_x(), area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->scale(area.get_width(), area.get_height()*2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(0.5, 0.5);
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.5, 0.5, 180*M_PI/180.0, 270*M_PI/180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill();
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.5, 0.5, 180*M_PI/180.0, 270*M_PI/180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x(),area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_LINEAR:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CONSTANT:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/4,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/4,area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CLAMPED:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	default:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/3,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height()/3);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x(),area.get_y()+area.get_height()-area.get_height()/3);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/3,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
	}
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
/*-	AFTER -------------------------------------- */
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	color=get_interp_color(tp.get_after());
Rodolfo Ribeiro Gomes 1cd07c
	color=color_darken(color,0.8f);
Rodolfo Ribeiro Gomes 1cd07c
	if(selected)color=color_darken(color,1.3f);
Rodolfo Ribeiro Gomes d4f2ba
	if(hover) color = color_shift(color, 0.2);
Rodolfo Ribeiro Gomes 1cd07c
	cr->set_source_rgb(color.get_red(),color.get_green(),color.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	switch(tp.get_after())
Rodolfo Ribeiro Gomes 1cd07c
	{
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_TCB:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->translate(area.get_x(), area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->scale(area.get_width(), area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.5, 0.5, -90*M_PI/180.0, 90*M_PI/180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_HALT:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->translate(area.get_x(), area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->scale(area.get_width(), area.get_height()*2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(0.5, 0.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.0, 0.5, 0*M_PI/180.0, 90*M_PI/180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill();
Rodolfo Ribeiro Gomes 1cd07c
		cr->arc(0.5, 0.0, 0.5, 0*M_PI / 180.0, 90*M_PI / 180.0);
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_LINEAR:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CONSTANT:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->move_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()-area.get_width()/4,area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()-area.get_width()/4,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	case INTERPOLATION_CLAMPED:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y()+area.get_height()/2);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
	default:
Rodolfo Ribeiro Gomes 1cd07c
		cr->save();
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()-area.get_width()/3,area.get_y());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y()+area.get_height()/3);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width(),area.get_y()+area.get_height()-area.get_height()/3);
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()-area.get_width()/3,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->line_to(area.get_x()+area.get_width()/2,area.get_y()+area.get_height());
Rodolfo Ribeiro Gomes 1cd07c
		cr->fill_preserve();
Rodolfo Ribeiro Gomes 1cd07c
		cr->set_source_rgb(black.get_red(),black.get_green(),black.get_blue());
Rodolfo Ribeiro Gomes 1cd07c
		cr->stroke();
Rodolfo Ribeiro Gomes 1cd07c
		cr->restore();
Rodolfo Ribeiro Gomes 1cd07c
		break;
Rodolfo Ribeiro Gomes 1cd07c
	}
Rodolfo Ribeiro Gomes 1cd07c
}
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes 1cd07c
Rodolfo Ribeiro Gomes c89a4c
static Time
Rodolfo Ribeiro Gomes c89a4c
get_time_offset_from_vdesc(const ValueDesc &v)
Rodolfo Ribeiro Gomes c89a4c
{
Rodolfo Ribeiro Gomes c89a4c
#ifdef ADJUST_WAYPOINTS_FOR_TIME_OFFSET
Rodolfo Ribeiro Gomes c89a4c
	if (v.get_value_type() != type_canvas || getenv("SYNFIG_SHOW_CANVAS_PARAM_WAYPOINTS"))
Rodolfo Ribeiro Gomes c89a4c
		return Time::zero();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!v.get_value().get(Canvas::Handle()))
Rodolfo Ribeiro Gomes c89a4c
		return Time::zero();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!v.parent_is_layer())
Rodolfo Ribeiro Gomes c89a4c
		return Time::zero();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	synfig::Layer::Handle layer = v.get_layer();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!etl::handle<layer_pastecanvas>::cast_dynamic(layer))</layer_pastecanvas>
Rodolfo Ribeiro Gomes c89a4c
		return Time::zero();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	return layer->get_param("time_offset").get(Time());
Rodolfo Ribeiro Gomes c89a4c
#else // ADJUST_WAYPOINTS_FOR_TIME_OFFSET
Rodolfo Ribeiro Gomes c89a4c
	return synfig::Time::zero();
Rodolfo Ribeiro Gomes c89a4c
#endif
Rodolfo Ribeiro Gomes c89a4c
}
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
static Time
Rodolfo Ribeiro Gomes c89a4c
get_time_dilation_from_vdesc(const ValueDesc &v)
Rodolfo Ribeiro Gomes c89a4c
{
Rodolfo Ribeiro Gomes c89a4c
#ifdef ADJUST_WAYPOINTS_FOR_TIME_OFFSET
Rodolfo Ribeiro Gomes c89a4c
	if (v.get_value_type() != type_canvas || getenv("SYNFIG_SHOW_CANVAS_PARAM_WAYPOINTS"))
Rodolfo Ribeiro Gomes c89a4c
		return Time(1.0);
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!v.get_value().get(Canvas::Handle()))
Rodolfo Ribeiro Gomes c89a4c
		return Time(1.0);
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!v.parent_is_layer())
Rodolfo Ribeiro Gomes c89a4c
		return Time(1.0);
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	Layer::Handle layer = v.get_layer();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (!etl::handle<layer_pastecanvas>::cast_dynamic(layer))</layer_pastecanvas>
Rodolfo Ribeiro Gomes c89a4c
		return Time(1.0);
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	return layer->get_param("time_dilation").get(Time());
Rodolfo Ribeiro Gomes c89a4c
#else // ADJUST_WAYPOINTS_FOR_TIME_OFFSET
Rodolfo Ribeiro Gomes c89a4c
	return Time(1.0);
Rodolfo Ribeiro Gomes c89a4c
#endif
Rodolfo Ribeiro Gomes c89a4c
}
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes 472bc8
static const Node::time_set empty_time_set {};
Rodolfo Ribeiro Gomes 7879dc
Rodolfo Ribeiro Gomes 7879dc
const Node::time_set&
Rodolfo Ribeiro Gomes 7879dc
WaypointRenderer::get_times_from_valuedesc(const ValueDesc &v)
Rodolfo Ribeiro Gomes c89a4c
{
Rodolfo Ribeiro Gomes c89a4c
	if (v.get_value_type() == type_canvas && !getenv("SYNFIG_SHOW_CANVAS_PARAM_WAYPOINTS"))
Rodolfo Ribeiro Gomes c89a4c
		if(Canvas::Handle canvasparam = v.get_value().get(Canvas::Handle()))
Rodolfo Ribeiro Gomes 7879dc
			return canvasparam->get_times();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	//we want a dynamic list entry to override the normal...
Rodolfo Ribeiro Gomes c89a4c
	if (v.parent_is_value_node())
Rodolfo Ribeiro Gomes c89a4c
		if (ValueNode_DynamicList *parent_value_node = dynamic_cast<valuenode_dynamiclist *="">(v.get_parent_value_node().get()))</valuenode_dynamiclist>
Rodolfo Ribeiro Gomes 7879dc
			return parent_value_node->list[v.get_index()].get_times();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
	if (ValueNode *base_value = v.get_value_node().get()) //don't render stuff if it's just animated...
Rodolfo Ribeiro Gomes 7879dc
		return base_value->get_times();
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes 7879dc
	return empty_time_set;
Rodolfo Ribeiro Gomes c89a4c
}
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes c89a4c
void
Rodolfo Ribeiro Gomes c89a4c
WaypointRenderer::foreach_visible_waypoint(const synfigapp::ValueDesc &value_desc,
Rodolfo Ribeiro Gomes c89a4c
		const studio::TimePlotData &time_plot_data,
Rodolfo Ribeiro Gomes c89a4c
		std::function<foreachcallback> foreach_callback,</foreachcallback>
Rodolfo Ribeiro Gomes c89a4c
		void* data)
Rodolfo Ribeiro Gomes c89a4c
{
Rodolfo Ribeiro Gomes 7879dc
	const Node::time_set & tset = get_times_from_valuedesc(value_desc);
Rodolfo Ribeiro Gomes 7879dc
	if (!tset.empty()) {
Rodolfo Ribeiro Gomes c89a4c
		const Time time_offset = get_time_offset_from_vdesc(value_desc);
Rodolfo Ribeiro Gomes c89a4c
		const Time time_dilation = get_time_dilation_from_vdesc(value_desc);
Rodolfo Ribeiro Gomes c89a4c
		const double time_k = time_dilation == Time::zero() ? 1.0 : 1.0/(double)time_dilation;
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes 7879dc
		for (const auto & timepoint : tset) {
Rodolfo Ribeiro Gomes 7879dc
			Time t = (timepoint.get_time() - time_offset)*time_k;
Rodolfo Ribeiro Gomes c89a4c
			if (time_plot_data.is_time_visible_extra(t)) {
Rodolfo Ribeiro Gomes 7879dc
				if (foreach_callback(timepoint, t, data))
Rodolfo Ribeiro Gomes c89a4c
					break;
Rodolfo Ribeiro Gomes c89a4c
			}
Rodolfo Ribeiro Gomes c89a4c
		}
Rodolfo Ribeiro Gomes c89a4c
	}
Rodolfo Ribeiro Gomes c89a4c
}
Rodolfo Ribeiro Gomes c89a4c
Rodolfo Ribeiro Gomes 1cd07c
}