egami
C++ Image Processing program
/homes/esi30/DCS339/coursework/src/display_unit.cpp
Go to the documentation of this file.
00001 #include <fstream>
00002 #include <string>
00003 
00004 #include <cairomm/context.h>
00005 #include <cairomm/enums.h>
00006 #include <cairomm/refptr.h>
00007 #include <cairomm/surface.h>
00008 #include <gtkmm/drawingarea.h>
00009 #include <gtkmm/textbuffer.h>
00010 #include <gdkmm/general.h>
00011 
00012 #include "display_page.hpp"
00013 #include "display_unit.hpp"
00014 
00015 Image_unit::Image_unit(const std::string &filepath, bool mod): Image(filepath),
00016     page(nullptr),
00017     image_surface(Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, true_width(), true_height())),
00018     image_context(Cairo::Context::create(image_surface)),
00019     is_modifiable(mod), filepath(filepath){
00020     
00021     set_size_request(true_width(), true_height());
00022     Gdk::Cairo::set_source_pixbuf(image_context, data, 0.0, 0.0); 
00023     image_context->paint();
00024 }
00025 
00026 Image_unit::Image_unit(const Image_unit *from, unsigned h, unsigned w, bool mod): Image(h, w),
00027     page(from->page),
00028     image_surface(Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, true_width(), true_height())),
00029     image_context(Cairo::Context::create(image_surface)),
00030     is_modifiable(mod){
00031     
00032     set_size_request(true_width(), true_height());
00033     Gdk::Cairo::set_source_pixbuf(image_context, data, 0.0, 0.0); 
00034     image_context->paint();
00035 }
00036 
00037 Image_unit::Image_unit(const Image_unit &other): Image(other), Gtk::DrawingArea(),
00038     page(other.page),
00039     image_surface(Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, true_width(), true_height())),
00040     image_context(Cairo::Context::create(image_surface)),
00041     is_modifiable(other.is_modifiable), filepath(other.filepath){
00042 
00043     set_size_request(true_width(), true_height());
00044     Gdk::Cairo::set_source_pixbuf(image_context, data, 0.0, 0.0); 
00045     image_context->paint();
00046 }
00047 
00048 Image_unit::Image_unit(Image_unit &&other) noexcept {
00049     swap(*this, other);
00050 }
00051 
00052 Image_unit& Image_unit::operator=(Image_unit other) noexcept {
00053     swap(*this, other);
00054     return *this;
00055 }
00056 
00057 void swap(Image_unit &lhs, Image_unit &rhs) noexcept {
00058     using std::swap; // Enable ADL
00059 
00060     swap(static_cast<Image&>(lhs), static_cast<Image&>(rhs));
00061     swap(lhs.father, rhs.father);
00062     swap(lhs.filepath, rhs.filepath);
00063     swap(lhs.image_surface, rhs.image_surface);
00064     swap(lhs.image_context, rhs.image_context);
00065     swap(lhs.is_modifiable, rhs.is_modifiable);
00066 }
00067 
00068 void Image_unit::redraw(){
00069     image_surface = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24, true_width(), true_height());
00070     image_context = Cairo::Context::create (image_surface);
00071     Gdk::Cairo::set_source_pixbuf(image_context, data, 0.0, 0.0);
00072     image_context->paint();
00073 }
00074 
00075 bool Image_unit::on_draw(const Cairo::RefPtr<Cairo::Context>& context){
00076     context->set_source(image_surface, 0.0, 0.0);
00077     context->paint();
00078     return true;
00079 }
00080 
00081 bool Image_unit::modifiable() const {
00082     return is_modifiable;
00083 }
00084 
00085 bool Image_unit::save() const {
00086     if(filepath!="")
00087         try{
00088             save_img(filepath);
00089         } catch(...){
00090             filepath="";
00091             throw;
00092         }
00093     else
00094         return false;
00095     return true;
00096 }
00097 
00098 void Image_unit::save_as(const std::string &fp) const {
00099     filepath=fp;
00100     try{
00101         save_img(fp);
00102     } catch(...){
00103         filepath="";
00104         throw;
00105     }
00106 }
00107 
00108 std::string Image_unit::get_path() const {
00109     return filepath;
00110 }
00111 
00112 void Image_unit::set_page(const Display_page *dp){
00113     page=dp;
00114 }
00115 
00116 std::tuple<int,int,int,int> Image_unit::selection() const {
00117     return page->selection();
00118 }
00119 
00120 Info_unit::Info_unit(const std::string &text): text_buffer(Gtk::TextBuffer::create()) {
00121     text_buffer->set_text(text);
00122     set_buffer(text_buffer);
00123     show_all_children();
00124     set_editable(false);
00125 }
00126 
00127 bool Info_unit::modifiable() const {
00128     return false;
00129 }
00130 
00131 bool Info_unit::save() const {
00132     return true;
00133 }
00134 
00135 void Info_unit::save_as(const std::string &arg) const {
00136     std::ofstream file(arg.c_str());
00137     if(!file)
00138         throw std::runtime_error("Can not open file");
00139     file << text_buffer->get_text();
00140 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends