Layer.hh 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #ifndef LAYER_HH
  2. #define LAYER_HH
  3. namespace openmsx {
  4. class OutputSurface;
  5. class LayerListener;
  6. /** Interface for display layers.
  7. */
  8. class Layer
  9. {
  10. public:
  11. /** Determines stacking order of layers:
  12. * layers with higher Z-indices are closer to the viewer.
  13. */
  14. enum ZIndex {
  15. Z_DUMMY = -1,
  16. Z_BACKGROUND = 0,
  17. Z_MSX_PASSIVE = 30,
  18. Z_MSX_ACTIVE = 40,
  19. Z_OSDGUI = 50,
  20. Z_CONSOLE = 100
  21. };
  22. /** Describes how much of the screen is currently covered by a particular
  23. * layer.
  24. */
  25. enum Coverage {
  26. /** Layer fully covers the screen: any underlying layers are invisible.
  27. */
  28. COVER_FULL,
  29. /** Layer partially covers the screen: it may cover only part of the
  30. * screen area, or it may be (semi-)transparent in places.
  31. */
  32. COVER_PARTIAL,
  33. /** Layer is not visible, that is completely transparent.
  34. */
  35. COVER_NONE
  36. };
  37. virtual ~Layer() = default;
  38. /** Paint this layer.
  39. */
  40. virtual void paint(OutputSurface& output) = 0;
  41. /** Query the Z-index of this layer.
  42. */
  43. ZIndex getZ() const { return z; }
  44. /** Query the coverage of this layer.
  45. */
  46. Coverage getCoverage() const { return coverage; }
  47. /** Store pointer to Display.
  48. * Will be called by Display::addLayer().
  49. */
  50. void setDisplay(LayerListener& display_) { display = &display_; }
  51. protected:
  52. /** Construct a layer. */
  53. explicit Layer(Coverage coverage_ = COVER_NONE, ZIndex z_ = Z_DUMMY)
  54. : coverage(coverage_), z(z_)
  55. {
  56. }
  57. /** Changes the current coverage of this layer.
  58. */
  59. void setCoverage(Coverage coverage_) { coverage = coverage_; }
  60. /** Changes the current Z-index of this layer.
  61. */
  62. void setZ(ZIndex z);
  63. private:
  64. /** The display this layer is part of. */
  65. LayerListener* display = nullptr;
  66. /** Inspected by Display to determine which layers to paint. */
  67. Coverage coverage;
  68. /** Inspected by Display to determine the order in which layers are
  69. * painted.
  70. */
  71. ZIndex z;
  72. friend class ScopedLayerHider; // for setCoverage()
  73. };
  74. class ScopedLayerHider
  75. {
  76. public:
  77. explicit ScopedLayerHider(Layer& layer);
  78. ~ScopedLayerHider();
  79. private:
  80. Layer& layer;
  81. Layer::Coverage originalCoverage;
  82. };
  83. } // namespace openmsx
  84. #endif