image_win.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /********************************************************************** <BR>
  2. This file is part of Crack dot Com's free source code release of
  3. Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
  4. information about compiling & licensing issues visit this URL</a>
  5. <PRE> If that doesn't help, contact Jonathan Clark at
  6. golgotha_source@usa.net (Subject should have "GOLG" in it)
  7. ***********************************************************************/
  8. #include "gui/image_win.hh"
  9. #include "window/window.hh"
  10. #include "window/win_evt.hh"
  11. #include "image/image.hh"
  12. void i4_image_window_class::reparent(i4_image_class *draw_area, i4_parent_window_class *parent)
  13. {
  14. if (draw_area)
  15. {
  16. if (darken_im)
  17. delete darken_im;
  18. if (darken && im)
  19. {
  20. int x,y, w=im->width(), h=im->height();
  21. i4_image_class *d=i4_create_image(w, h, draw_area->get_pal());
  22. for (y=0; y<h; y++)
  23. for (x=0; x<w; x++)
  24. {
  25. i4_color c=im->get_pixel(x,y);
  26. int r= (((c>>16)&0xff)*3/4)<<16;
  27. int g= (((c>>8)&0xff)*3/4)<<8;
  28. int b= (((c>>0)&0xff)*3/4)<<0;
  29. d->put_pixel(x,y, r|g|b);
  30. }
  31. darken_im=d;
  32. }
  33. else darken_im=0;
  34. }
  35. i4_parent_window_class::reparent(draw_area, parent);
  36. }
  37. void i4_image_window_class::change_image(i4_image_class *new_im)
  38. {
  39. if (del && im)
  40. delete im;
  41. im = new_im;
  42. reparent(local_image, parent);
  43. }
  44. i4_image_window_class::i4_image_window_class(i4_image_class *im,
  45. i4_bool delete_on_destructor,
  46. i4_bool dark_when_not_active)
  47. : i4_parent_window_class(im->width(),im->height()),
  48. im(im),
  49. del(delete_on_destructor),
  50. darken(dark_when_not_active)
  51. {
  52. active=i4_F;
  53. darken_im=0;
  54. }
  55. void i4_image_window_class::parent_draw(i4_draw_context_class &context)
  56. {
  57. if (darken && !active && darken_im)
  58. darken_im->put_image(local_image, 0,0, context);
  59. else
  60. {
  61. i4_rect_list_class child_clip(&context.clip,0,0);
  62. child_clip.intersect_list(&undrawn_area);
  63. child_clip.swap(&context.clip);
  64. for (i4_rect_list_class::area_iter c=context.clip.list.begin();c!=context.clip.list.end();++c)
  65. im->put_part(local_image, c->x1, c->y1, c->x1, c->y1, c->x2, c->y2, context);
  66. child_clip.swap(&context.clip);
  67. i4_parent_window_class::parent_draw(context);
  68. }
  69. }
  70. void i4_image_window_class::receive_event(i4_event *ev)
  71. {
  72. CAST_PTR(wev, i4_window_message_class, ev);
  73. if (ev->type()==i4_event::WINDOW_MESSAGE &&
  74. wev->sub_type==i4_window_message_class::GOT_MOUSE_FOCUS)
  75. {
  76. active=i4_T;
  77. if (darken && darken_im)
  78. request_redraw(i4_F);
  79. }
  80. else if (ev->type()==i4_event::WINDOW_MESSAGE &&
  81. wev->sub_type==i4_window_message_class::LOST_MOUSE_FOCUS)
  82. {
  83. active=i4_F;
  84. if (darken && darken_im)
  85. request_redraw(i4_F);
  86. }
  87. i4_parent_window_class::receive_event(ev);
  88. }
  89. i4_image_window_class::~i4_image_window_class()
  90. {
  91. if (del && im)
  92. delete im;
  93. if (darken_im)
  94. delete darken_im;
  95. }