1
0

FractalWidgetUtils.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #ifndef FRACTALWIDGETUTILS_H
  2. #define FRACTALWIDGETUTILS_H
  3. #include "EscapeTimeVisualWidget.h"
  4. #include "Mandel.h"
  5. #include "Bitmap.h"
  6. #include <unordered_map>
  7. #include <QMetaType>
  8. #include <QObject>
  9. #include <QRunnable>
  10. #include <utility>
  11. class SliceGrid;
  12. class FractalZoomWidget;
  13. using GridIndex = mnd::Integer;
  14. Q_DECLARE_METATYPE(GridIndex)
  15. Q_DECLARE_METATYPE(mnd::Real)
  16. class CellImage
  17. {
  18. public:
  19. CellImage(void) = default;
  20. CellImage(CellImage&& b) = default;
  21. CellImage(const CellImage& b) = delete;
  22. virtual ~CellImage(void);
  23. virtual void drawRect(float x, float y, float width, float height) = 0;
  24. virtual std::shared_ptr<CellImage> clip(short i, short j) = 0;
  25. virtual int getRecalcPriority(void) const = 0;
  26. };
  27. class ImageClip :
  28. public CellImage
  29. {
  30. std::shared_ptr<ETVImage> etvImage;
  31. float tx, ty, tw, th;
  32. public:
  33. ImageClip(std::shared_ptr<ETVImage> tex,
  34. float tx, float ty, float tw, float th);
  35. inline ImageClip(std::shared_ptr<ETVImage> tex) :
  36. ImageClip{ tex, 0.0f, 0.0f, 1.0f, 1.0f }
  37. {}
  38. ImageClip(ImageClip&&) = default;
  39. ImageClip(const ImageClip&) = delete;
  40. virtual ~ImageClip(void);
  41. void drawRect(float x, float y, float width, float height) override;
  42. ImageClip clip(float x, float y, float w, float h);
  43. std::shared_ptr<CellImage> clip(short i, short j) override;
  44. int getRecalcPriority(void) const override;
  45. };
  46. class QuadImage :
  47. public CellImage
  48. {
  49. std::shared_ptr<CellImage> cells[2][2];
  50. public:
  51. QuadImage(std::shared_ptr<CellImage> i00,
  52. std::shared_ptr<CellImage> i01,
  53. std::shared_ptr<CellImage> i10,
  54. std::shared_ptr<CellImage> i11);
  55. QuadImage(QuadImage&&) = default;
  56. QuadImage(const QuadImage&) = delete;
  57. virtual ~QuadImage(void);
  58. void drawRect(float x, float y, float width, float height) override;
  59. std::shared_ptr<CellImage> clip(short i, short j) override;
  60. int getRecalcPriority(void) const override;
  61. };
  62. struct GridElement
  63. {
  64. bool enoughResolution;
  65. std::shared_ptr<CellImage> img;
  66. inline GridElement(bool enoughResolution, std::shared_ptr<CellImage> img) :
  67. enoughResolution{ enoughResolution },
  68. img{ std::move(img) }
  69. {}
  70. };
  71. class CalcJob : public QObject, public QRunnable
  72. {
  73. Q_OBJECT
  74. public:
  75. FractalZoomWidget& owner;
  76. mnd::MandelGenerator* generator;
  77. SliceGrid* grid;
  78. int level;
  79. GridIndex i, j;
  80. long calcState = 0;
  81. inline CalcJob(FractalZoomWidget& owner,
  82. mnd::MandelGenerator* generator,
  83. SliceGrid* grid, int level,
  84. GridIndex i, GridIndex j,
  85. long calcState) :
  86. owner{ owner },
  87. generator{ generator },
  88. grid{ grid },
  89. level{ level },
  90. i{ i }, j{ j },
  91. calcState{ calcState }
  92. {}
  93. void run() override;
  94. signals:
  95. void done(int level, GridIndex i, GridIndex j, Bitmap<float>* bmp);
  96. void failed(int level, GridIndex i, GridIndex j, QString err);
  97. };
  98. struct IndexPairHash
  99. {
  100. size_t operator()(const std::pair<GridIndex, GridIndex>& p) const;
  101. };
  102. struct IndexTripleHash
  103. {
  104. size_t operator()(const std::tuple<int, GridIndex, GridIndex>& p) const;
  105. };
  106. #endif // FRACTALWIDGETUTILS_H