X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Frenderer_canvas.cpp;h=960807997e4ddeb2cd94360073f5e351732ec88c;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=d533fbd4e9dd4b369d9ddb8f78cb123ce5c5c014;hpb=ce408de81ca266b1f334ee9bc6c8fb7ba1492ed4;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/renderer_canvas.cpp b/synfig-studio/trunk/src/gtkmm/renderer_canvas.cpp index d533fbd..9608079 100644 --- a/synfig-studio/trunk/src/gtkmm/renderer_canvas.cpp +++ b/synfig-studio/trunk/src/gtkmm/renderer_canvas.cpp @@ -1,11 +1,12 @@ /* === S Y N F I G ========================================================= */ -/*! \file template.cpp +/*! \file renderer_canvas.cpp ** \brief Template File ** -** $Id: renderer_canvas.cpp,v 1.1.1.1 2005/01/07 03:34:36 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -33,6 +34,8 @@ #include "workarea.h" #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -91,22 +94,22 @@ Renderer_Canvas::get_rendering()const void Renderer_Canvas::render_vfunc( const Glib::RefPtr& drawable, - const Gdk::Rectangle& expose_area + const Gdk::Rectangle& /*expose_area*/ ) { assert(get_work_area()); if(!get_work_area()) return; - + // const synfig::RendDesc &rend_desc(get_work_area()->get_canvas()->rend_desc()); - + const synfig::Vector focus_point(get_work_area()->get_focus_point()); std::vector< std::pair,int> >& tile_book(get_tile_book()); - + int drawable_w,drawable_h; drawable->get_size(drawable_w,drawable_h); - + // Calculate the window coordinates of the top-left // corner of the canvas. const synfig::Vector::value_type @@ -125,84 +128,87 @@ Renderer_Canvas::render_vfunc( const int w(get_w()), h(get_h()); - + Glib::RefPtr gc(Gdk::GC::create(drawable)); - + if(!tile_book.empty()) - if(get_full_frame()) { - if(tile_book[0].first) + if(get_full_frame()) { - drawable->draw_pixbuf( - gc, //GC - tile_book[0].first, //pixbuf - 0, 0, // Source X and Y - round_to_int(x),round_to_int(y), // Dest X and Y - -1,-1, // Width and Height - Gdk::RGB_DITHER_MAX, // RgbDither - 2, 2 // Dither offset X and Y - ); + if(tile_book[0].first) + { + drawable->draw_pixbuf( + gc, //GC + tile_book[0].first, //pixbuf + 0, 0, // Source X and Y + round_to_int(x),round_to_int(y), // Dest X and Y + -1,-1, // Width and Height + Gdk::RGB_DITHER_MAX, // RgbDither + 2, 2 // Dither offset X and Y + ); + } + if(tile_book[0].second!=get_refreshes() && get_canceled()==false && get_rendering()==false && get_queued()==false) + get_work_area()->async_update_preview(); } - if(tile_book[0].second!=get_refreshes() && get_canceled()==false && get_rendering()==false && get_queued()==false) - get_work_area()->async_update_preview(); - } - else - { - const int width_in_tiles(w/tile_w+(w%tile_w?1:0)); - const int height_in_tiles(h/tile_h+(h%tile_h?1:0)); - - int u(0),v(0),tx,ty; - int u1(0),v1(0),u2(width_in_tiles), v2(height_in_tiles); - - bool needs_refresh(false); - - u1=int(-x/tile_w); - v1=int(-y/tile_h); - u2=int((-x+drawable_w)/tile_w+1); - v2=int((-y+drawable_h)/tile_h+1); - if(u2>width_in_tiles)u2=width_in_tiles; - if(v2>height_in_tiles)v2=height_in_tiles; - if(u1<0)u1=0; - if(v1<0)v1=0; - - for(v=v1;vget_low_res_pixel_size(); + const int width_in_tiles(w/tile_w+(((get_work_area()->get_low_resolution_flag())?((w/div)%(tile_w/div)):(w%tile_w))?1:0)); + const int height_in_tiles(h/tile_h+(h%tile_h?1:0)); + + int u(0),v(0),tx,ty; + int u1(0),v1(0),u2(width_in_tiles), v2(height_in_tiles); + + bool needs_refresh(false); + + u1=int(-x/tile_w); + v1=int(-y/tile_h); + u2=int((-x+drawable_w)/tile_w+1); + v2=int((-y+drawable_h)/tile_h+1); + if(u2>width_in_tiles)u2=width_in_tiles; + if(v2>height_in_tiles)v2=height_in_tiles; + if(u1<0)u1=0; + if(v1<0)v1=0; + + for(v=v1;vindex && tile_book[index].first) + for(u=u1;udraw_pixbuf( - gc, //GC - tile_book[index].first, //pixbuf - 0, 0, // Source X and Y - round_to_int(x)+tx,round_to_int(y)+ty, // Dest X and Y - -1,-1, // Width and Height - Gdk::RGB_DITHER_MAX, // RgbDither - 2, 2 // Dither offset X and Y - ); + int index=v*width_in_tiles+u; + if(int(tile_book.size())>index && tile_book[index].first) + { + tx=u*tile_w; + ty=v*tile_w; + + drawable->draw_pixbuf( + gc, //GC + tile_book[index].first, //pixbuf + 0, 0, // Source X and Y + round_to_int(x)+tx,round_to_int(y)+ty, // Dest X and Y + -1,-1, // Width and Height + Gdk::RGB_DITHER_MAX, // RgbDither + 2, 2 // Dither offset X and Y + ); + } + if(tile_book[index].second!=get_refreshes()) + needs_refresh=true; } - if(tile_book[index].second!=get_refreshes()) - needs_refresh=true; } - } - if(needs_refresh==true && get_canceled()==false && get_rendering()==false && get_queued()==false) - { - //queue_render_preview(); - get_work_area()->async_update_preview(); - //update_preview(); - //return true; - } + if(needs_refresh==true && get_canceled()==false && get_rendering()==false && get_queued()==false) + { + //queue_render_preview(); + get_work_area()->async_update_preview(); + //update_preview(); + //return true; + } + } } // Draw the border around the rendered region { gc->set_rgb_fg_color(Gdk::Color("#000000")); - gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER); + gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER); drawable->draw_rectangle( gc, false, // Fill?