Blame c++/perspective/src/mainwindow.cpp

Ivan Mahonin 538bb7
#include <iostream>
Ivan Mahonin 538bb7
#include <utility>
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
#include <gdkmm/pixbuf.h>
Ivan Mahonin 538bb7
#include <gtkmm/hvbox.h>
Ivan Mahonin 538bb7
#include <gtkmm/image.h>
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
#include "mainwindow.h"
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
MainWindow::MainWindow():
Ivan Mahonin a1942e
	src_rect0   (new View::Point( Vector2(-1, -1) )),
Ivan Mahonin a1942e
	src_rect1   (new View::Point( Vector2( 1,  1) )),
Ivan Mahonin a1942e
	dst_rect0   (new View::Point( Vector2(-1, -1) )),
Ivan Mahonin a1942e
	dst_rect1   (new View::Point( Vector2( 1, -1) )),
Ivan Mahonin a1942e
	dst_rect2   (new View::Point( Vector2( 1,  1) )),
Ivan Mahonin a1942e
	dst_rect3   (new View::Point( Vector2(-1,  1) )),
Ivan Mahonin a1942e
	dst_bounds0 (new View::Point( Vector2(-2, -2) )),
Ivan Mahonin a1942e
	dst_bounds1 (new View::Point( Vector2( 2,  2) ))
Ivan Mahonin 538bb7
{
Ivan Mahonin a1942e
	std::cout << "generator seed: " << generator.seed() << std::endl;
Ivan Mahonin a1942e
	set_default_size(750, 500);
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	Gtk::HBox *hbox = manage(new Gtk::HBox());
Ivan Mahonin 538bb7
	hbox->set_homogeneous(true);
Ivan Mahonin 538bb7
	
Ivan Mahonin a1942e
	src_view.transform.scale(50, 50);
Ivan Mahonin 538bb7
	src_view.points.push_back(src_rect0);
Ivan Mahonin 538bb7
	src_view.points.push_back(src_rect1);
Ivan Mahonin 538bb7
	src_view.signal_point_motion.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_point_motion) );
Ivan Mahonin 538bb7
	src_view.signal_point_changed.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_point_changed) );
Ivan Mahonin a1942e
	src_view.signal_transform_changed.connect(
Ivan Mahonin a1942e
		sigc::bind(
Ivan Mahonin a1942e
			sigc::mem_fun(*this, &MainWindow::on_view_transform_changed),
Ivan Mahonin a1942e
			&src_view ));
Ivan Mahonin 538bb7
	src_view.signal_draw_view.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_draw_src_view) );
Ivan Mahonin 538bb7
	hbox->add(src_view);
Ivan Mahonin 538bb7
	
Ivan Mahonin a1942e
	dst_view.transform.scale(50, 50);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_rect0);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_rect1);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_rect2);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_rect3);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_bounds0);
Ivan Mahonin 538bb7
	dst_view.points.push_back(dst_bounds1);
Ivan Mahonin 538bb7
	dst_view.signal_point_motion.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_point_motion) );
Ivan Mahonin 538bb7
	dst_view.signal_point_changed.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_point_changed) );
Ivan Mahonin a1942e
	src_view.signal_transform_changed.connect(
Ivan Mahonin a1942e
		sigc::bind(
Ivan Mahonin a1942e
			sigc::mem_fun(*this, &MainWindow::on_view_transform_changed),
Ivan Mahonin a1942e
			&dst_view ));
Ivan Mahonin 538bb7
	dst_view.signal_draw_view.connect(
Ivan Mahonin 538bb7
		sigc::mem_fun(*this, &MainWindow::on_draw_dst_view) );
Ivan Mahonin 538bb7
	hbox->add(dst_view);
Ivan Mahonin 538bb7
	
Ivan Mahonin a1942e
	//hbox->add(*manage(generator_demo()));
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	add(*hbox);
Ivan Mahonin 538bb7
	show_all();
Ivan Mahonin a1942e
	
Ivan Mahonin a1942e
	update_view_surface();
Ivan Mahonin 538bb7
}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
Gtk::Widget*
Ivan Mahonin 538bb7
MainWindow::generator_demo() {
Ivan Mahonin 538bb7
	std::cout << "generator demo: generate" << std::endl;
Ivan Mahonin 538bb7
	DataSurface surface(256, 256);
Ivan Mahonin 538bb7
	generator.generate(surface, Vector2(0, 0), Vector2(16, 16));
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	std::cout << "generator demo: convert" << std::endl;
Ivan Mahonin 538bb7
	Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create(
Ivan Mahonin 538bb7
		Gdk::COLORSPACE_RGB, true, 8, surface.width(), surface.height() );
Ivan Mahonin 538bb7
	guint8 *pixel = pixbuf->get_pixels();
Ivan Mahonin 538bb7
	for(int r = 0; r < surface.height(); ++r) {
Ivan Mahonin 538bb7
		Color *row = surface[r];
Ivan Mahonin 538bb7
		for(int c = 0; c < surface.width(); ++c) {
Ivan Mahonin 538bb7
			const Color &color = row[c];
Ivan Mahonin 538bb7
			*(pixel++) = (guint8)(color.r*255.9);
Ivan Mahonin 538bb7
			*(pixel++) = (guint8)(color.g*255.9);
Ivan Mahonin 538bb7
			*(pixel++) = (guint8)(color.b*255.9);
Ivan Mahonin 538bb7
			*(pixel++) = (guint8)(color.a*255.9);
Ivan Mahonin 538bb7
		}
Ivan Mahonin 538bb7
	}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
	return new Gtk::Image(pixbuf);
Ivan Mahonin 538bb7
}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
void
Ivan Mahonin a1942e
MainWindow::update_view_surface() {
Ivan Mahonin a1942e
	Matrix4 transform = src_view.transform.inverted();
Ivan Mahonin a1942e
	int w = src_view.get_width();
Ivan Mahonin a1942e
	int h = src_view.get_height();
Ivan Mahonin a1942e
	
Ivan Mahonin a1942e
	Vector2 rect0(transform * Vector4(0, 0, 0, 1));
Ivan Mahonin a1942e
	Vector2 rect1(transform * Vector4(w, h, 0, 1));
Ivan Mahonin a1942e
	
Ivan Mahonin a1942e
	if (w <= 0 || h <= 0) {
Ivan Mahonin a1942e
		view_surface.clear();
Ivan Mahonin a1942e
	} else
Ivan Mahonin a1942e
	if ( !view_surface
Ivan Mahonin a1942e
	  || view_surface->get_width() != w
Ivan Mahonin a1942e
	  || view_surface->get_height() != h
Ivan Mahonin a1942e
	  || view_surface_rect0 != rect0
Ivan Mahonin a1942e
	  || view_surface_rect1 != rect1 )
Ivan Mahonin a1942e
	{
Ivan Mahonin a1942e
		DataSurface surface(w, h);
Ivan Mahonin a1942e
		generator.generate(surface, rect0, rect1);
Ivan Mahonin a1942e
		view_surface = surface.to_cairo_surface();
Ivan Mahonin a1942e
		view_surface_rect0 = rect0;
Ivan Mahonin a1942e
		view_surface_rect1 = rect1;
Ivan Mahonin a1942e
	}
Ivan Mahonin a1942e
}
Ivan Mahonin a1942e
Ivan Mahonin a1942e
void
Ivan Mahonin 538bb7
MainWindow::on_point_motion(const View::PointPtr &/*point*/) {
Ivan Mahonin 538bb7
	queue_draw();
Ivan Mahonin 538bb7
}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
void
Ivan Mahonin 538bb7
MainWindow::on_point_changed(const View::PointPtr &/*point*/) {
Ivan Mahonin 538bb7
}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
void
Ivan Mahonin a1942e
MainWindow::on_view_transform_changed(View *view) {
Ivan Mahonin a1942e
	if (view == &src_view) {
Ivan Mahonin a1942e
		update_view_surface();
Ivan Mahonin a1942e
		view->queue_draw();
Ivan Mahonin a1942e
	}
Ivan Mahonin a1942e
}
Ivan Mahonin a1942e
Ivan Mahonin a1942e
void
Ivan Mahonin 538bb7
MainWindow::on_draw_src_view(const Cairo::RefPtr<Cairo::Context> &context) {
Ivan Mahonin 538bb7
	const Real ps = src_view.get_pixel_size();
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
	context->save();
Ivan Mahonin a1942e
Ivan Mahonin a1942e
	if ( !view_surface
Ivan Mahonin a1942e
	  || src_view.get_width() != view_surface->get_width()
Ivan Mahonin a1942e
	  || src_view.get_height() != view_surface->get_height() )
Ivan Mahonin a1942e
		update_view_surface();
Ivan Mahonin a1942e
	if (view_surface) {
Ivan Mahonin a1942e
		context->save();
Ivan Mahonin a1942e
		src_view.back_transform_context(context);
Ivan Mahonin a1942e
		context->set_source(view_surface, 0, 0);
Ivan Mahonin a1942e
		context->paint();
Ivan Mahonin a1942e
		context->restore();
Ivan Mahonin a1942e
	}
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	context->move_to(src_rect0->position.x, src_rect0->position.y);
Ivan Mahonin 538bb7
	context->line_to(src_rect0->position.x, src_rect1->position.y);
Ivan Mahonin 538bb7
	context->line_to(src_rect1->position.x, src_rect1->position.y);
Ivan Mahonin 538bb7
	context->line_to(src_rect1->position.x, src_rect0->position.y);
Ivan Mahonin 538bb7
	context->close_path();
Ivan Mahonin 538bb7
	context->set_line_width(ps);
Ivan Mahonin 538bb7
	context->set_source_rgba(1, 1, 0, 0.5);
Ivan Mahonin 538bb7
	context->stroke();
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	context->restore();
Ivan Mahonin 538bb7
}
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
void
Ivan Mahonin 538bb7
MainWindow::on_draw_dst_view(const Cairo::RefPtr<Cairo::Context> &context) {
Ivan Mahonin 538bb7
	const Real ps = src_view.get_pixel_size();
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
	context->save();
Ivan Mahonin 538bb7
	
Ivan Mahonin 538bb7
	context->move_to(dst_rect0->position.x, dst_rect0->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_rect1->position.x, dst_rect1->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_rect2->position.x, dst_rect2->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_rect3->position.x, dst_rect3->position.y);
Ivan Mahonin 538bb7
	context->close_path();
Ivan Mahonin 538bb7
	context->set_line_width(ps);
Ivan Mahonin 538bb7
	context->set_source_rgba(1, 1, 0, 0.5);
Ivan Mahonin 538bb7
	context->stroke();
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
	context->move_to(dst_bounds0->position.x, dst_bounds0->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_bounds0->position.x, dst_bounds1->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_bounds1->position.x, dst_bounds1->position.y);
Ivan Mahonin 538bb7
	context->line_to(dst_bounds1->position.x, dst_bounds0->position.y);
Ivan Mahonin 538bb7
	context->close_path();
Ivan Mahonin 538bb7
	context->set_line_width(ps);
Ivan Mahonin 538bb7
	context->set_source_rgba(1, 0, 0, 0.5);
Ivan Mahonin 538bb7
	context->stroke();
Ivan Mahonin 538bb7
Ivan Mahonin 538bb7
	context->restore();
Ivan Mahonin 538bb7
}