dx5_mouse.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 "video/win32/dx5_util.hh"
  9. #include "video/win32/dx5_mouse.hh"
  10. #include "image/context.hh"
  11. #include "video/win32/dx5_error.hh"
  12. #include <ddraw.h>
  13. dx5_mouse_class::dx5_mouse_class(i4_bool page_flipped)
  14. : page_flipped(page_flipped)
  15. {
  16. cursor.pict=0;
  17. }
  18. void dx5_mouse_class::set_cursor(i4_cursor_class *c)
  19. {
  20. if (cursor.pict)
  21. {
  22. delete cursor.pict;
  23. cursor.pict=0;
  24. }
  25. if (c && c->pict)
  26. {
  27. int cw=c->pict->width(), ch=c->pict->height();
  28. i4_draw_context_class context(0,0, cw-1, ch-1);
  29. i4_dx5_image_class *dx5_image = new i4_dx5_image_class(cw, ch, DX5_VRAM | DX5_CLEAR);
  30. //setup the color-key value for the mouse (black)
  31. DDCOLORKEY colorkey;
  32. memset(&colorkey,0,sizeof(DDCOLORKEY));
  33. //i4_color converted_transparent = c->pict->pal.pal->convert(c->trans,&dx5_common.i4_fmt_565);
  34. colorkey.dwColorSpaceLowValue = 0;//converted_transparent;
  35. colorkey.dwColorSpaceHighValue = 0;//converted_transparent;
  36. dx5_image->surface->SetColorKey(DDCKEY_SRCBLT,&colorkey);
  37. cursor = *c;
  38. cursor.pict = dx5_image;
  39. dx5_image->lock();
  40. c->pict->put_image_trans(cursor.pict, 0,0, c->trans, context);
  41. dx5_image->unlock();
  42. }
  43. }
  44. dx5_mouse_class::~dx5_mouse_class()
  45. {
  46. if (cursor.pict)
  47. {
  48. delete cursor.pict;
  49. cursor.pict=0;
  50. }
  51. }
  52. void dx5_mouse_class::save_and_draw(int x, int y)
  53. {
  54. if (!cursor.pict) return ;
  55. if (!current.save_buffer ||
  56. current.save_buffer->width() != cursor.pict->width() ||
  57. current.save_buffer->height() != cursor.pict->height())
  58. {
  59. if (current.save_buffer)
  60. delete current.save_buffer;
  61. current.save_buffer=new i4_dx5_image_class(cursor.pict->width(), cursor.pict->height(),
  62. DX5_VRAM);
  63. }
  64. current.x=x - cursor.hot_x; current.y=y - cursor.hot_y;
  65. if (current.x<0) current.x=0;
  66. if (current.y<0) current.y=0;
  67. RECT src;
  68. src.left = current.x;
  69. src.right = current.x + cursor.pict->width();
  70. src.top = current.y;
  71. src.bottom = current.y + cursor.pict->height();
  72. i4_dx5_check(current.save_buffer->surface->BltFast(0,0, dx5_common.back_surface, &src,DDBLTFAST_NOCOLORKEY));
  73. i4_dx5_check(dx5_common.back_surface->BltFast(current.x, current.y,
  74. ((i4_dx5_image_class *)cursor.pict)->surface,0 ,
  75. DDBLTFAST_SRCCOLORKEY));
  76. if (page_flipped)
  77. {
  78. save_struct tmp=current;
  79. current=last;
  80. last=tmp;
  81. tmp.save_buffer=0;
  82. }
  83. }
  84. void dx5_mouse_class::restore()
  85. {
  86. if (current.save_buffer)
  87. {
  88. RECT src;
  89. src.left = 0;
  90. src.right = cursor.pict->width();
  91. src.top = 0;
  92. src.bottom = cursor.pict->height();
  93. dx5_common.back_surface->BltFast(current.x, current.y, current.save_buffer->surface, &src,
  94. DDBLTFAST_NOCOLORKEY);
  95. }
  96. }