1
0

exportdialogs.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "exportdialogs.h"
  2. #include <QIntValidator>
  3. #include <QFileDialog>
  4. #include <QMessageBox>
  5. #include "Mandel.h"
  6. #include "VideoStream.h"
  7. static bool exportVideo(const ExportVideoInfo& evi);
  8. ExportImageDialog::ExportImageDialog(QWidget* parent) :
  9. QDialog{ parent }
  10. {
  11. eid.setupUi(this);
  12. eid.maxIterations->setValidator(new QIntValidator(1, 1000000000, this));
  13. eid.imgWidth->setValidator(new QIntValidator(1, 10000000, this));
  14. eid.imgHeight->setValidator(new QIntValidator(1, 10000000, this));
  15. }
  16. int ExportImageDialog::getMaxIterations(void) const
  17. {
  18. return std::stoi(eid.maxIterations->text().toStdString());
  19. }
  20. int ExportImageDialog::getWidth(void) const
  21. {
  22. return std::stoi(eid.imgWidth->text().toStdString());
  23. }
  24. int ExportImageDialog::getHeight(void) const
  25. {
  26. return std::stoi(eid.imgHeight->text().toStdString());
  27. }
  28. QString ExportImageDialog::getPath(void) const
  29. {
  30. return eid.savePath->text();
  31. }
  32. void ExportImageDialog::on_pushButton_clicked()
  33. {
  34. QString saveAs = QFileDialog::getSaveFileName(this,
  35. tr("Save exported image"), "",
  36. tr("PNG image (*.png);;JPEG image (*.jpg);;All Files (*)"));
  37. eid.savePath->setText(saveAs);
  38. this->repaint();
  39. }
  40. void ExportImageDialog::on_buttonBox_accepted()
  41. {
  42. if (eid.savePath->text() == "") {
  43. QMessageBox msgBox;
  44. msgBox.setText("Please specify a path.");
  45. msgBox.show();
  46. msgBox.exec();
  47. reject();
  48. }
  49. }
  50. ExportVideoDialog::ExportVideoDialog(QWidget* parent, const ExportVideoInfo& evi) :
  51. QDialog{ parent },
  52. evi{ evi }
  53. {
  54. evd.setupUi(this);
  55. evd.maxIterations->setValidator(new QIntValidator(1, 1000000000, this));
  56. evd.vidWidth->setValidator(new QIntValidator(1, 10000000, this));
  57. evd.vidHeight->setValidator(new QIntValidator(1, 10000000, this));
  58. evd.startX->setText(QString::number(evi.start.x));
  59. evd.startY->setText(QString::number(evi.start.y));
  60. evd.startW->setText(QString::number(evi.start.width));
  61. evd.startH->setText(QString::number(evi.start.height));
  62. evd.endX->setText(QString::number(evi.end.x));
  63. evd.endY->setText(QString::number(evi.end.y));
  64. evd.endW->setText(QString::number(evi.end.width));
  65. evd.endH->setText(QString::number(evi.end.height));
  66. }
  67. const ExportVideoInfo& ExportVideoDialog::getExportVideoInfo(void) const
  68. {
  69. return evi;
  70. }
  71. void ExportVideoDialog::on_buttonBox_accepted()
  72. {
  73. if (evd.savePath->text() == "") {
  74. QMessageBox* msgBox = new QMessageBox;
  75. msgBox->setText("Please specify a path.");
  76. msgBox->exec();
  77. emit reject();
  78. }
  79. evi.path = evd.savePath->text().toStdString();
  80. evi.width = evd.vidWidth->text().toInt();
  81. evi.height = evd.vidHeight->text().toInt();
  82. evi.maxIterations = evd.maxIterations->text().toInt();
  83. /*evi.start = mnd::MandelViewport {
  84. evd.startX->text().toDouble(),
  85. evd.startY->text().toDouble(),
  86. evd.startW->text().toDouble(),
  87. evd.startH->text().toDouble(),
  88. };
  89. evi.end = mnd::MandelViewport {
  90. evd.endX->text().toDouble(),
  91. evd.endY->text().toDouble(),
  92. evd.endW->text().toDouble(),
  93. evd.endH->text().toDouble(),
  94. };*/
  95. evi.start.adjustAspectRatio(evi.width, evi.height);
  96. evi.end.adjustAspectRatio(evi.width, evi.height);
  97. MandelVideoGenerator mvg(evi);
  98. mvg.generate();
  99. //if (exportVideo(evi)) {
  100. QMessageBox* msgBox = new QMessageBox;
  101. msgBox->setText("Video successfully exported.");
  102. msgBox->exec();
  103. //}
  104. }
  105. void ExportVideoDialog::on_pushButton_clicked()
  106. {
  107. QString saveAs = QFileDialog::getSaveFileName(this,
  108. tr("Save exported image"), "",
  109. tr("H264 video (*.h264);;All Files (*)"));
  110. evd.savePath->setText(saveAs);
  111. this->repaint();
  112. }
  113. bool exportVideo(const ExportVideoInfo& evi)
  114. {
  115. auto lerp = [] (double a, double b, double v) {
  116. return a * (1 - v) + b * v;
  117. };
  118. mnd::MandelContext ctxt = mnd::initializeContext();
  119. mnd::Generator& gen = *ctxt.getDevices()[0].getGeneratorFloat();
  120. mnd::MandelInfo mi;
  121. mi.bWidth = evi.width;
  122. mi.bHeight = evi.height;
  123. mi.maxIter = evi.maxIterations;
  124. VideoStream vs(evi.width, evi.height, evi.path);
  125. double x = evi.end.x + evi.end.width / 2;
  126. double y = evi.end.y + evi.end.height / 2;
  127. double w = evi.start.width;
  128. double h = evi.start.height;
  129. while(w > evi.end.width || h > evi.end.height) {
  130. mi.view = mnd::MandelViewport{ x - w/2, y - h/2, w, h };
  131. Bitmap<float> raw{ evi.width, evi.height };
  132. gen.generate(mi, raw.pixels.get());
  133. vs.addFrame(raw.map<RGBColor>([] (float x) { return
  134. RGBColor{ uint8_t(::sin(x / 100) * 127 + 127), uint8_t(::sin(x / 213) * 127 + 127), uint8_t(::cos(x / 173) * 127 + 127) };
  135. }));
  136. w *= 0.975;
  137. h *= 0.975;
  138. }
  139. return true;
  140. }