Blame synfig-studio/src/gui/widgets/widget_color.cpp

Nikita Kitaev 254e11
/* === S Y N F I G ========================================================= */
Nikita Kitaev 254e11
/*!	\file widget_color.cpp
Nikita Kitaev 254e11
**	\brief Template File
Nikita Kitaev 254e11
**
Nikita Kitaev 254e11
**	$Id$
Nikita Kitaev 254e11
**
Nikita Kitaev 254e11
**	\legal
Nikita Kitaev 254e11
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Nikita Kitaev 254e11
**
Nikita Kitaev 254e11
**	This package is free software; you can redistribute it and/or
Nikita Kitaev 254e11
**	modify it under the terms of the GNU General Public License as
Nikita Kitaev 254e11
**	published by the Free Software Foundation; either version 2 of
Nikita Kitaev 254e11
**	the License, or (at your option) any later version.
Nikita Kitaev 254e11
**
Nikita Kitaev 254e11
**	This package is distributed in the hope that it will be useful,
Nikita Kitaev 254e11
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Nikita Kitaev 254e11
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Nikita Kitaev 254e11
**	General Public License for more details.
Nikita Kitaev 254e11
**	\endlegal
Nikita Kitaev 254e11
*/
Nikita Kitaev 254e11
/* ========================================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === H E A D E R S ======================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
#ifdef USING_PCH
Nikita Kitaev 254e11
#	include "pch.h"
Nikita Kitaev 254e11
#else
Nikita Kitaev 254e11
#ifdef HAVE_CONFIG_H
Nikita Kitaev 254e11
#	include <config.h></config.h>
Nikita Kitaev 254e11
#endif
Nikita Kitaev 254e11
Nikita Kitaev 254e11
#include <cmath></cmath>
a4bbdd
Nikita Kitaev 254e11
#include <gtkmm drawingarea.h=""></gtkmm>
Nikita Kitaev 254e11
a4bbdd
#include <synfig general.h=""></synfig>
a4bbdd
a4bbdd
#include <gui app.h=""></gui>
a4bbdd
#include <gui canvasview.h=""></gui>
a4bbdd
a4bbdd
#include "widget_color.h"
a4bbdd
abdbf2
#include <gui localization.h=""></gui>
Nikita Kitaev 254e11
Nikita Kitaev 254e11
#endif
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === U S I N G =========================================================== */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
using namespace std;
Nikita Kitaev 254e11
using namespace etl;
Nikita Kitaev 254e11
using namespace synfig;
Nikita Kitaev 254e11
using namespace studio;
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === M A C R O S ========================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === G L O B A L S ======================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === P R O C E D U R E S ================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
void
796dd4
studio::render_color_to_window(const Cairo::RefPtr<cairo::context> &cr, const Gdk::Rectangle &ca, const synfig::Color &color)</cairo::context>
Nikita Kitaev 254e11
{
Nikita Kitaev 254e11
	const int height(ca.get_height());
Nikita Kitaev 254e11
	const int width(ca.get_width());
Nikita Kitaev 254e11
Nikita Kitaev 254e11
	const int square_size(height/2);
Nikita Kitaev 254e11
a4bbdd
	Gamma gamma = App::get_selected_canvas_gamma().get_inverted();
a4bbdd
	
Nikita Kitaev 254e11
	if(color.get_alpha()!=1.0)
Nikita Kitaev 254e11
	{
Nikita Kitaev 254e11
		// In this case we need to render the alpha squares
Nikita Kitaev 254e11
a4bbdd
		const Color bg1 = gamma.apply(
a4bbdd
			Color::blend(color,Color(0.75, 0.75, 0.75),1.0).clamped() );
a4bbdd
		const Color bg2 = gamma.apply(
a4bbdd
			Color::blend(color,Color(0.5, 0.5, 0.5),1.0).clamped() );
Nikita Kitaev 254e11
Nikita Kitaev 254e11
		bool toggle(false);
Nikita Kitaev 254e11
		for(int i=0;i
Nikita Kitaev 254e11
		{
Nikita Kitaev 254e11
			const int square_width(min(square_size,width-i));
Nikita Kitaev 254e11
Nikita Kitaev 254e11
			if(toggle)
Nikita Kitaev 254e11
			{
796dd4
		        cr->set_source_rgb(bg1.get_r(), bg1.get_g(), bg1.get_b());
796dd4
		        cr->rectangle(ca.get_x()+i, ca.get_y(), square_width, square_size);
796dd4
		        cr->fill();
Nikita Kitaev 254e11
796dd4
		        cr->set_source_rgb(bg2.get_r(), bg2.get_g(), bg2.get_b());
796dd4
		        cr->rectangle(ca.get_x()+i, ca.get_y()+square_size, square_width, square_size);
796dd4
		        cr->fill();
Nikita Kitaev 254e11
				toggle=false;
Nikita Kitaev 254e11
			}
Nikita Kitaev 254e11
			else
Nikita Kitaev 254e11
			{
796dd4
		        cr->set_source_rgb(bg2.get_r(), bg2.get_g(), bg2.get_b());
796dd4
		        cr->rectangle(ca.get_x()+i, ca.get_y(), square_width, square_size);
796dd4
		        cr->fill();
Nikita Kitaev 254e11
796dd4
		        cr->set_source_rgb(bg1.get_r(), bg1.get_g(), bg1.get_b());
796dd4
		        cr->rectangle(ca.get_x()+i, ca.get_y()+square_size, square_width, square_size);
796dd4
		        cr->fill();
Nikita Kitaev 254e11
				toggle=true;
Nikita Kitaev 254e11
			}
Nikita Kitaev 254e11
		}
Nikita Kitaev 254e11
	}
Nikita Kitaev 254e11
	else
Nikita Kitaev 254e11
	{
a4bbdd
		synfig::Color c = gamma.apply(color.clamped());
706048
        cr->set_source_rgb(c.get_r(), c.get_g(), c.get_b());
796dd4
        cr->rectangle(ca.get_x(), ca.get_y(), width-1, height-1);
796dd4
        cr->fill();
Nikita Kitaev 254e11
	}
796dd4
796dd4
	cr->set_source_rgb(1.0, 1.0, 1.0);
796dd4
    cr->rectangle(ca.get_x()+1, ca.get_y()+1, width-3, height-3);
796dd4
    cr->stroke();
796dd4
796dd4
    cr->set_source_rgb(0.0, 0.0, 0.0);
796dd4
    cr->rectangle(ca.get_x(), ca.get_y(), width-1, height-1);
796dd4
    cr->stroke();
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === C L A S S E S ======================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
Nikita Kitaev 254e11
/* === M E T H O D S ======================================================= */
Nikita Kitaev 254e11
Nikita Kitaev 254e11
Widget_Color::Widget_Color()
Nikita Kitaev 254e11
{
Nikita Kitaev 254e11
	color=Color(0,0,0,0);
Nikita Kitaev 254e11
	set_size_request(-1,16);
Nikita Kitaev 254e11
	add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK);
a4bbdd
	App::signal_canvas_view_focus().connect(
a4bbdd
		sigc::hide(sigc::mem_fun(*this,&studio::Widget_Color::queue_draw)) );
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
Widget_Color::~Widget_Color()
Nikita Kitaev 254e11
{
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
void
a4bbdd
Widget_Color::set_value(const synfig::Color &x)
Nikita Kitaev 254e11
{
a4bbdd
	assert(x.is_valid());
a4bbdd
	color=x;
Nikita Kitaev 254e11
	queue_draw();
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
const synfig::Color &
a4bbdd
Widget_Color::get_value() const
Nikita Kitaev 254e11
{
Nikita Kitaev 254e11
	assert(color.is_valid());
Nikita Kitaev 254e11
	return color;
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
bool
Nikita Kitaev 254e11
Widget_Color::on_event(GdkEvent *event)
Nikita Kitaev 254e11
{
Nikita Kitaev 254e11
	switch(event->type)
Nikita Kitaev 254e11
	{
Nikita Kitaev 254e11
	case GDK_BUTTON_PRESS:
Nikita Kitaev 254e11
		if(event->button.button==1)
Nikita Kitaev 254e11
		{
Nikita Kitaev 254e11
			signal_activate_();
Nikita Kitaev 254e11
			return true;
Nikita Kitaev 254e11
		}
Nikita Kitaev 254e11
		if(event->button.button==2)
Nikita Kitaev 254e11
		{
Nikita Kitaev 254e11
			signal_middle_click_();
Nikita Kitaev 254e11
			return true;
Nikita Kitaev 254e11
		}
Nikita Kitaev 254e11
		if(event->button.button==3)
Nikita Kitaev 254e11
		{
Nikita Kitaev 254e11
			signal_right_click_();
Nikita Kitaev 254e11
			return true;
Nikita Kitaev 254e11
		}
Nikita Kitaev 254e11
		break;
Nikita Kitaev 254e11
Nikita Kitaev 254e11
	default:
Nikita Kitaev 254e11
		break;
Nikita Kitaev 254e11
	}
Nikita Kitaev 254e11
	return false;
Nikita Kitaev 254e11
}
Nikita Kitaev 254e11
Nikita Kitaev 254e11
bool
796dd4
Widget_Color::on_draw(const Cairo::RefPtr<cairo::context> &cr)</cairo::context>
Nikita Kitaev 254e11
{
796dd4
	render_color_to_window(cr, Gdk::Rectangle(0,0,get_width(),get_height()), color);
Nikita Kitaev 254e11
	return true;
Nikita Kitaev 254e11
}