home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / include / k3d / k3dsdk / bitmap_modifier.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-07-18  |  3.8 KB  |  135 lines

  1. #ifndef K3DSDK_BITMAP_MODIFIER_H
  2. #define K3DSDK_BITMAP_MODIFIER_H
  3.  
  4. // K-3D
  5. // Copyright (c) 1995-2006, Timothy M. Shead
  6. //
  7. // Contact: tshead@k-3d.com
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17. // General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public
  20. // License along with this program; if not, write to the Free Software
  21. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  
  23. #include "bitmap.h"
  24. #include "data.h"
  25. #include "hints.h"
  26. #include "ibitmap_sink.h"
  27. #include "ibitmap_source.h"
  28. #include "ipipeline_profiler.h"
  29. #include "k3d-i18n-config.h"
  30. #include "pointer_demand_storage.h"
  31.  
  32. namespace k3d
  33. {
  34.  
  35. template<typename derived_t>
  36. class bitmap_modifier :
  37.     public ibitmap_source,
  38.     public ibitmap_sink
  39. {
  40. public:
  41.     iproperty& bitmap_source_output()
  42.     {
  43.         return m_output_bitmap;
  44.     }
  45.  
  46.     iproperty& bitmap_sink_input()
  47.     {
  48.         return m_input_bitmap;
  49.     }
  50.  
  51.     sigc::slot<void, ihint*> make_update_bitmap_slot()
  52.     {
  53.         return m_output_bitmap.make_slot();
  54.     }
  55.  
  56. protected:
  57.     bitmap_modifier() :
  58.         m_input_bitmap(
  59.             init_owner(owner())
  60.             + init_name("input_bitmap")
  61.             + init_label(_("Input Bitmap"))
  62.             + init_description(_("Input bitmap"))
  63.             + init_value<bitmap*>(0)),
  64.         m_output_bitmap(
  65.             init_owner(owner())
  66.             + init_name("output_bitmap")
  67.             + init_label(_("Output Bitmap"))
  68.             + init_description(_("Output bitmap")))
  69.     {
  70.         m_output_bitmap.set_update_slot(sigc::mem_fun(*this, &bitmap_modifier<derived_t>::execute));
  71.  
  72.         m_input_bitmap.changed_signal().connect(hint::converter<
  73.             hint::convert<hint::bitmap_dimensions_changed, hint::unchanged,
  74.             hint::convert<hint::bitmap_pixels_changed, hint::unchanged,
  75.             hint::convert<hint::any, hint::none> > > >(m_output_bitmap.make_slot()));
  76.     }
  77.  
  78.     k3d_data(bitmap*, immutable_name, change_signal, no_undo, local_storage, no_constraint, read_only_property, no_serialization) m_input_bitmap;
  79.     k3d_data(bitmap*, immutable_name, change_signal, no_undo, pointer_demand_storage, no_constraint, read_only_property, no_serialization) m_output_bitmap;
  80.  
  81. private:
  82.     inline derived_t& owner()
  83.     {
  84.         return *static_cast<derived_t*>(this);
  85.     }
  86.  
  87.     void execute(const std::vector<ihint*>& Hints, bitmap& Bitmap)
  88.     {
  89.         if(const bitmap* const input = m_input_bitmap.pipeline_value())
  90.         {
  91.             bool resize_bitmap = false;
  92.             bool assign_pixels = false;
  93.  
  94.             for(int i = 0; i != Hints.size(); ++i)
  95.             {
  96.                 // Input pixels changed, so all we have to do is reassign ours ...
  97.                 if(dynamic_cast<hint::bitmap_pixels_changed*>(Hints[i]))
  98.                 {
  99.                     assign_pixels = true;
  100.                 }
  101.                 // In every other case (bitmap_dimensions_changed, unknown hint, or no hint),
  102.                 // we must assume the worst and recreate everything from scratch ...
  103.                 else
  104.                 {
  105.                     resize_bitmap = true;
  106.                     assign_pixels = true;
  107.                     break;
  108.                 }
  109.             }
  110.  
  111.             if(resize_bitmap)
  112.             {
  113.                 owner().document().pipeline_profiler().start_execution(owner(), "Resize Bitmap");
  114.                 on_resize_bitmap(*input, Bitmap);
  115.                 owner().document().pipeline_profiler().finish_execution(owner(), "Resize Bitmap");
  116.             }
  117.  
  118.             if(assign_pixels)
  119.             {
  120.                 owner().document().pipeline_profiler().start_execution(owner(), "Assign Pixels");
  121.                 on_assign_pixels(*input, Bitmap);
  122.                 owner().document().pipeline_profiler().finish_execution(owner(), "Assign Pixels");
  123.             }
  124.         }
  125.     }
  126.  
  127.     virtual void on_resize_bitmap(const bitmap& Input, bitmap& Output) = 0;
  128.     virtual void on_assign_pixels(const bitmap& Input, bitmap& Output) = 0;
  129. };
  130.  
  131. } // namespace k3d
  132.  
  133. #endif // !K3DSDK_BITMAP_MODIFIER_H
  134.  
  135.