egami
C++ Image Processing program
|
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 }