From c91866acc3011b44b3ed7e91563439b325f8e7bb Mon Sep 17 00:00:00 2001 From: Person Date: Sun, 30 Sep 2018 14:20:02 -0700 Subject: [PATCH] --User changes -Add a button to swap the pre and post affine values for all selected xforms. --Bug fixes -Remove the ability to change spinner values with +=-=, it was conflicting with other things and added no real value. -All file dialog opening in Linux would freeze. No longer using native file dialogs, they are broken. -Set default open path to the desktop if there is no settings file present, which will be the case on the first run. -Amphibole_Supergroup.ugr palette had an invalid character in two of the palette names. --Code changes -Change some table header padding styles to work with new Qt. Qss reload is required. -Ensure the open folder path setting always has a valid string in it before opening a folder. --- .../Installer/FractoriumInstaller.wixproj | 2 +- Builds/MSVC/Installer/Product.wxs | 12 ++-- Builds/MSVC/VS2017/Ember.rc | Bin 4510 -> 4510 bytes Builds/MSVC/VS2017/EmberAnimate.rc | 8 +-- Builds/MSVC/VS2017/EmberCL.rc | Bin 4536 -> 4536 bytes Builds/MSVC/VS2017/EmberGenome.rc | 8 +-- Builds/MSVC/VS2017/EmberRender.rc | 8 +-- Builds/MSVC/VS2017/Fractorium.rc | Bin 4478 -> 4478 bytes Builds/QtCreator/defaults.pri | 2 +- Data/Amphibole_Supergroup.ugr | 8 +-- Data/Version History.txt | 14 +++++ Data/dark_linux.qss | 28 +++++---- Data/dark_mac.qss | 28 +++++---- Data/dark_windows.qss | 14 +++-- Source/Ember/EmberDefines.h | 2 +- Source/Fractorium/AboutDialog.ui | 2 +- Source/Fractorium/DoubleSpinBox.cpp | 14 ++++- Source/Fractorium/Fractorium.cpp | 55 ++++++++++-------- Source/Fractorium/Fractorium.h | 1 + Source/Fractorium/Fractorium.ui | 36 +++++++++--- Source/Fractorium/FractoriumCommon.h | 18 ++++-- Source/Fractorium/FractoriumEmberController.h | 2 + Source/Fractorium/FractoriumSettings.cpp | 13 ++++- Source/Fractorium/FractoriumXformsAffine.cpp | 22 +++++++ Source/Fractorium/OptionsDialog.ui | 9 +++ .../PaletteEditor/PaletteEditor.cpp | 1 + Source/Fractorium/QssDialog.cpp | 3 +- Source/Fractorium/SpinBox.cpp | 12 +++- debian/changelog | 6 ++ makedeps.bat | 2 +- 30 files changed, 237 insertions(+), 93 deletions(-) diff --git a/Builds/MSVC/Installer/FractoriumInstaller.wixproj b/Builds/MSVC/Installer/FractoriumInstaller.wixproj index ac72ce1..780446d 100644 --- a/Builds/MSVC/Installer/FractoriumInstaller.wixproj +++ b/Builds/MSVC/Installer/FractoriumInstaller.wixproj @@ -6,7 +6,7 @@ 3.7 {c8096c47-e358-438c-a520-146d46b0637d} 2.0 - Fractorium_1.0.0.11 + Fractorium_1.0.0.12 Package $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets diff --git a/Builds/MSVC/Installer/Product.wxs b/Builds/MSVC/Installer/Product.wxs index eaadca9..b03ef33 100644 --- a/Builds/MSVC/Installer/Product.wxs +++ b/Builds/MSVC/Installer/Product.wxs @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + - + - + - + - + diff --git a/Builds/MSVC/VS2017/Ember.rc b/Builds/MSVC/VS2017/Ember.rc index 04c5970f65e6eff7942eecc70223c99c1e969a21..c84f4a7860990616d3fb2158c0eccbcccea30e3f 100644 GIT binary patch delta 38 scmbQIJWqMUHx5Rl$=^9F8I3j@avo#?aum76H*@h!Vg!oJ%vNS&bNY8Mr3*bBb7 B4W%vNSq&L@8Mr3*bBb::epsilon()//Apoplugin.h uses -20, but it's more mathematically correct to do it this way. #define ISAAC_SIZE 4 diff --git a/Source/Fractorium/AboutDialog.ui b/Source/Fractorium/AboutDialog.ui index 295c3cc..114b15c 100644 --- a/Source/Fractorium/AboutDialog.ui +++ b/Source/Fractorium/AboutDialog.ui @@ -58,7 +58,7 @@ QFrame::NoFrame - <html><head/><body><p align="center">Fractorium 1.0.0.11</p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com"><span style=" text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html> + <html><head/><body><p align="center">Fractorium 1.0.0.12</p><p align="center"><span style=" font-size:10pt;">A Qt-based fractal flame editor which uses a C++ re-write of the flam3 algorithm named Ember and a GPU capable version named EmberCL which implements a portion of the cuburn algorithm in OpenCL.</span></p><p align="center"><a href="http://fractorium.com"><span style=" text-decoration: underline; color:#0000ff;">fractorium.com</span></a></p></body></html> Qt::RichText diff --git a/Source/Fractorium/DoubleSpinBox.cpp b/Source/Fractorium/DoubleSpinBox.cpp index 027ceed..578a717 100644 --- a/Source/Fractorium/DoubleSpinBox.cpp +++ b/Source/Fractorium/DoubleSpinBox.cpp @@ -245,8 +245,14 @@ bool DoubleSpinBox::eventFilter(QObject* o, QEvent* e) setValue(value() - (ctrl ? m_Step * 10 : m_Step)); } } + + return true; } } + else if (dynamic_cast(e)) + { + return true; + } } return QDoubleSpinBox::eventFilter(o, e); @@ -263,7 +269,7 @@ void DoubleSpinBox::keyPressEvent(QKeyEvent* ke) bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier); bool ctrl = QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier); - if (ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal || ke->key() == Qt::Key_Up) + if (ke->key() == Qt::Key_Up) { if (shift) { @@ -275,8 +281,10 @@ void DoubleSpinBox::keyPressEvent(QKeyEvent* ke) setSingleStep(m_Step); setValue(value() + (ctrl ? m_Step * 10 : m_Step)); } + + ke->accept(); } - else if (ke->key() == Qt::Key_Minus || ke->key() == Qt::Key_Underscore || ke->key() == Qt::Key_Down) + else if (ke->key() == Qt::Key_Down) { if (shift) { @@ -288,6 +296,8 @@ void DoubleSpinBox::keyPressEvent(QKeyEvent* ke) setSingleStep(m_Step); setValue(value() - (ctrl ? m_Step * 10 : m_Step)); } + + ke->accept(); } else QDoubleSpinBox::keyPressEvent(ke); diff --git a/Source/Fractorium/Fractorium.cpp b/Source/Fractorium/Fractorium.cpp index aef020e..8378971 100644 --- a/Source/Fractorium/Fractorium.cpp +++ b/Source/Fractorium/Fractorium.cpp @@ -398,37 +398,42 @@ bool Fractorium::eventFilter(QObject* o, QEvent* e) } else if (o == this) { - unsigned int index = combo->currentIndex(); + auto focusedctrl = dynamic_cast(this->focusWidget()); - if (ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal) + if (!focusedctrl)//Doesn't seem to matter, but just to be safe. { - xfupcount++; + unsigned int index = combo->currentIndex(); - if (xfupcount >= 3) + if (ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal) { - xfupcount = 0; - combo->setCurrentIndex((index + 1) % combo->count()); - //qDebug() << "global arrow plus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); + xfupcount++; + + if (xfupcount >= 3) + { + xfupcount = 0; + combo->setCurrentIndex((index + 1) % combo->count()); + //qDebug() << "global arrow plus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); + } + + return true; } - - return true; - } - else if (ke->key() == Qt::Key_Minus || ke->key() == Qt::Key_Underscore) - { - xfdncount++; - - if (xfdncount >= 3) + else if (ke->key() == Qt::Key_Minus || ke->key() == Qt::Key_Underscore) { - xfdncount = 0; + xfdncount++; - if (index == 0) - index = combo->count(); + if (xfdncount >= 3) + { + xfdncount = 0; - combo->setCurrentIndex((index - 1) % combo->count()); - //qDebug() << "global arrow minus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); + if (index == 0) + index = combo->count(); + + combo->setCurrentIndex((index - 1) % combo->count()); + //qDebug() << "global arrow minus key press: " << ke->key() << " " << o->metaObject()->className() << " " << o->objectName(); + } + + return true; } - - return true; } } } @@ -594,6 +599,7 @@ QStringList Fractorium::SetupOpenXmlDialog() { m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); + m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, true); } QStringList filenames; @@ -642,6 +648,7 @@ QString Fractorium::SetupSaveXmlDialog(const QString& defaultFilename) { m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); + m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, true); } QString filename; @@ -687,6 +694,7 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename) { m_FileDialog = new QFileDialog(this); m_FileDialog->setViewMode(QFileDialog::List); + m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, true); } QString filename; @@ -702,7 +710,6 @@ QString Fractorium::SetupSaveImageDialog(const QString& defaultFilename) m_FileDialog->selectFile(defaultFilename); m_FileDialog->setFileMode(QFileDialog::AnyFile); m_FileDialog->setOption(QFileDialog::ShowDirsOnly, false); - m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, false); #ifdef _WIN32 m_FileDialog->setNameFilter(".bmp;;.jpg;;.png;;.exr"); #else @@ -738,6 +745,7 @@ QString Fractorium::SetupSaveFolderDialog() { m_FolderDialog = new QFileDialog(this); m_FolderDialog->setViewMode(QFileDialog::List); + m_FolderDialog->setOption(QFileDialog::DontUseNativeDialog, true); } QString filename; @@ -893,6 +901,7 @@ void Fractorium::SetTabOrders() w = SetTabOrder(this, w, ui.PreRandomButton); w = SetTabOrder(this, w, ui.ShowPreAffineCurrentRadio); w = SetTabOrder(this, w, ui.ShowPreAffineAllRadio); + w = SetTabOrder(this, w, ui.SwapAffinesButton); w = SetTabOrder(this, w, ui.PostAffineGroupBox); w = SetTabOrder(this, w, m_PostX1Spin); w = SetTabOrder(this, w, m_PostX2Spin); diff --git a/Source/Fractorium/Fractorium.h b/Source/Fractorium/Fractorium.h index a7f4faf..f86f930 100644 --- a/Source/Fractorium/Fractorium.h +++ b/Source/Fractorium/Fractorium.h @@ -286,6 +286,7 @@ public slots: void OnCopyAffineButtonClicked(bool checked); void OnPasteAffineButtonClicked(bool checked); void OnRandomAffineButtonClicked(bool checked); + void OnSwapAffinesButtonClicked(bool checked); void OnAffineGroupBoxToggled(bool on); void OnAffineDrawAllCurrentRadioButtonToggled(bool checked); diff --git a/Source/Fractorium/Fractorium.ui b/Source/Fractorium/Fractorium.ui index 8762e33..05bdc6d 100644 --- a/Source/Fractorium/Fractorium.ui +++ b/Source/Fractorium/Fractorium.ui @@ -466,7 +466,7 @@ Geometry - AlignHCenter|AlignTop + AlignCenter @@ -547,7 +547,7 @@ Iteration - AlignHCenter|AlignTop + AlignCenter @@ -637,7 +637,7 @@ Color - AlignHCenter|AlignTop + AlignCenter @@ -734,7 +734,7 @@ Filter - AlignHCenter|AlignTop + AlignCenter @@ -1624,7 +1624,7 @@ Animation - AlignHCenter|AlignTop + AlignCenter @@ -3040,13 +3040,13 @@ - 58 + 62 24 - 58 + 62 24 @@ -3181,18 +3181,30 @@ Weight + + AlignCenter + Name + + AlignCenter + + + + AlignLeading|AlignVCenter + + + AlignLeading|AlignVCenter @@ -4684,6 +4696,16 @@ + + + + <html><head/><body><p>Swap the values of the pre and post affines</p></body></html> + + + Swap + + + diff --git a/Source/Fractorium/FractoriumCommon.h b/Source/Fractorium/FractoriumCommon.h index 7bcba3c..ce8d84a 100644 --- a/Source/Fractorium/FractoriumCommon.h +++ b/Source/Fractorium/FractoriumCommon.h @@ -517,7 +517,10 @@ static QString BaseStyle() "\tbackground-color: lightgray;\n" "\tborder: none;\n" "\tborder-bottom: 1px solid gray;\n" - "\tpadding: 4px;\n" + "\tpadding-left: 5px;\n" + "\tpadding-right: 0px;\n" + "\tpadding-top: 0px;\n" + "\tpadding-bottom: 0px;\n" "\tfont: 8pt \"MS Shell Dlg 2\";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/\n" "}\n" "\n" @@ -527,7 +530,9 @@ static QString BaseStyle() "\tbackground-color: lightgray;\n" "\tborder: 0px solid darkgray;\n" "\tborder-right: 1px solid gray;\n" - "\tpadding: 4px;\n" + "\tpadding-top: 0px;\n" + "\tpadding-bottom: 0px;\n" + "\tpadding-left: 3px;\n" "\tfont: 8pt \"MS Shell Dlg 2\";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/\n" "}\n" "\n" @@ -537,7 +542,10 @@ static QString BaseStyle() "\tbackground-color: rgb(53, 53, 53);\n" "\tborder: 0px none darkgray;\n" "\tborder-bottom: 1px solid rgb(53, 53, 53);\n" - "\tpadding: 4px;\n" + "\tpadding-left: 5px;\n" + "\tpadding-right: 0px;\n" + "\tpadding-top: 0px;\n" + "\tpadding-bottom: 0px;\n" "\tfont: 8pt \"MS Shell Dlg 2\";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/\n" "}\n" "\n" @@ -547,7 +555,9 @@ static QString BaseStyle() "\tbackground-color: rgb(53, 53, 53);\n" "\tborder: 0px none darkgray;\n" "\tborder-right: 0px solid rgb(53, 53, 53);\n" - "\tpadding: 4px;\n" + "\tpadding-top: 0px;\n" + "\tpadding-bottom: 0px;\n" + "\tpadding-left: 3px;\n" "\tfont: 8pt \"MS Shell Dlg 2\";/*For some reason the font changes if you set any style. Set this to whatever font is the default on your system*/\n" "}\n" ; diff --git a/Source/Fractorium/FractoriumEmberController.h b/Source/Fractorium/FractoriumEmberController.h index e979326..e494818 100644 --- a/Source/Fractorium/FractoriumEmberController.h +++ b/Source/Fractorium/FractoriumEmberController.h @@ -198,6 +198,7 @@ public: virtual void PasteXformsAffine(bool pre) { } virtual void RandomXformsAffine(bool pre) { } virtual void FillBothAffines() { } + virtual void SwapAffines() { } double LockedScale() { return m_LockedScale; } double LockedX() { return m_LockedX; } double LockedY() { return m_LockedY; } @@ -475,6 +476,7 @@ public: virtual void PasteXformsAffine(bool pre) override; virtual void RandomXformsAffine(bool pre) override; virtual void FillBothAffines() override; + virtual void SwapAffines() override; virtual void InitLockedScale() override; void FillAffineWithXform(Xform* xform, bool pre); void ChangeLockedScale(T value); diff --git a/Source/Fractorium/FractoriumSettings.cpp b/Source/Fractorium/FractoriumSettings.cpp index becf893..552733c 100644 --- a/Source/Fractorium/FractoriumSettings.cpp +++ b/Source/Fractorium/FractoriumSettings.cpp @@ -85,9 +85,20 @@ void FractoriumSettings::EnsureDefaults() ) FinalExt("png"); - auto s = SaveFolder(); + auto s = OpenFolder(); QDir dir(s); + if (s.isEmpty() || !dir.exists()) + { + QStringList paths = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation); + + if (!paths.empty()) + OpenFolder(paths[0]); + } + + s = SaveFolder(); + dir = QDir(s); + if (s.isEmpty() || !dir.exists()) { QStringList paths = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation); diff --git a/Source/Fractorium/FractoriumXformsAffine.cpp b/Source/Fractorium/FractoriumXformsAffine.cpp index b4bb07a..6a752c0 100644 --- a/Source/Fractorium/FractoriumXformsAffine.cpp +++ b/Source/Fractorium/FractoriumXformsAffine.cpp @@ -95,6 +95,7 @@ void Fractorium::InitXformsAffineUI() connect(ui.PostRandomButton, SIGNAL(clicked(bool)), this, SLOT(OnRandomAffineButtonClicked(bool)), Qt::QueuedConnection); connect(ui.PreAffineGroupBox, SIGNAL(toggled(bool)), this, SLOT(OnAffineGroupBoxToggled(bool)), Qt::QueuedConnection); connect(ui.PostAffineGroupBox, SIGNAL(toggled(bool)), this, SLOT(OnAffineGroupBoxToggled(bool)), Qt::QueuedConnection); + connect(ui.SwapAffinesButton, SIGNAL(clicked(bool)), this, SLOT(OnSwapAffinesButtonClicked(bool)), Qt::QueuedConnection); connect(ui.ShowPreAffineAllRadio, SIGNAL(toggled(bool)), this, SLOT(OnAffineDrawAllCurrentRadioButtonToggled(bool)), Qt::QueuedConnection); connect(ui.ShowPreAffineCurrentRadio, SIGNAL(toggled(bool)), this, SLOT(OnAffineDrawAllCurrentRadioButtonToggled(bool)), Qt::QueuedConnection); connect(ui.ShowPreAffineSelectedRadio, SIGNAL(toggled(bool)), this, SLOT(OnAffineDrawAllCurrentRadioButtonToggled(bool)), Qt::QueuedConnection); @@ -704,6 +705,27 @@ void Fractorium::OnAffineGroupBoxToggled(bool on) ui.GLDisplay->update(); } +/// +/// Swap the values of the pre and post affines for the selected xforms. +/// +template +void FractoriumEmberController::SwapAffines() +{ + UpdateXform([&](Xform* xform, size_t xfindex, size_t selIndex) + { + auto pre = xform->m_Affine; + auto post = xform->m_Post; + xform->m_Affine = post; + xform->m_Post = pre; + }, eXformUpdate::UPDATE_SELECTED); + FillBothAffines(); +} + +void Fractorium::OnSwapAffinesButtonClicked(bool checked) +{ + m_Controller->SwapAffines(); +} + /// /// Trigger a redraw which will show all, or only the current, circle affine transforms /// based on which radio buttons are selected. diff --git a/Source/Fractorium/OptionsDialog.ui b/Source/Fractorium/OptionsDialog.ui index 9f6d7ce..222d0ce 100644 --- a/Source/Fractorium/OptionsDialog.ui +++ b/Source/Fractorium/OptionsDialog.ui @@ -224,16 +224,25 @@ Use + + AlignCenter + Primary + + AlignCenter + Device + + AlignCenter + diff --git a/Source/Fractorium/PaletteEditor/PaletteEditor.cpp b/Source/Fractorium/PaletteEditor/PaletteEditor.cpp index 0a430d1..4aa8617 100644 --- a/Source/Fractorium/PaletteEditor/PaletteEditor.cpp +++ b/Source/Fractorium/PaletteEditor/PaletteEditor.cpp @@ -510,6 +510,7 @@ QStringList PaletteEditor::SetupOpenImagesDialog() m_FileDialog->setViewMode(QFileDialog::List); m_FileDialog->setFileMode(QFileDialog::ExistingFile); m_FileDialog->setAcceptMode(QFileDialog::AcceptOpen); + m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, true); #ifdef _WIN32 m_FileDialog->setNameFilter("Image Files (*.png *.jpg *.bmp)"); #else diff --git a/Source/Fractorium/QssDialog.cpp b/Source/Fractorium/QssDialog.cpp index 01ba933..57bb08c 100644 --- a/Source/Fractorium/QssDialog.cpp +++ b/Source/Fractorium/QssDialog.cpp @@ -636,8 +636,9 @@ void QssDialog::SetupFileDialog() if (!m_FileDialog) { m_FileDialog = new QFileDialog(this); - m_FileDialog->setDirectory(m_Parent->m_SettingsPath); m_FileDialog->setViewMode(QFileDialog::List); + m_FileDialog->setDirectory(m_Parent->m_SettingsPath); + m_FileDialog->setOption(QFileDialog::DontUseNativeDialog, true); } #endif diff --git a/Source/Fractorium/SpinBox.cpp b/Source/Fractorium/SpinBox.cpp index 838b4ae..90387a8 100644 --- a/Source/Fractorium/SpinBox.cpp +++ b/Source/Fractorium/SpinBox.cpp @@ -242,6 +242,10 @@ bool SpinBox::eventFilter(QObject* o, QEvent* e) } } } + else if (dynamic_cast(e)) + { + return true; + } } } @@ -259,7 +263,7 @@ void SpinBox::keyPressEvent(QKeyEvent* ke) bool shift = QGuiApplication::keyboardModifiers().testFlag(Qt::ShiftModifier); bool ctrl = QGuiApplication::keyboardModifiers().testFlag(Qt::ControlModifier); - if (ke->key() == Qt::Key_Plus || ke->key() == Qt::Key_Equal || ke->key() == Qt::Key_Up) + if (ke->key() == Qt::Key_Up) { if (shift) { @@ -271,8 +275,10 @@ void SpinBox::keyPressEvent(QKeyEvent* ke) setSingleStep(m_Step); setValue(value() + (ctrl ? m_Step * 10 : m_Step)); } + + ke->accept(); } - else if (ke->key() == Qt::Key_Minus || ke->key() == Qt::Key_Underscore || ke->key() == Qt::Key_Down) + else if (ke->key() == Qt::Key_Down) { if (shift) { @@ -284,6 +290,8 @@ void SpinBox::keyPressEvent(QKeyEvent* ke) setSingleStep(m_Step); setValue(value() - (ctrl ? m_Step * 10 : m_Step)); } + + ke->accept(); } else QSpinBox::keyPressEvent(ke); diff --git a/debian/changelog b/debian/changelog index 1ea63ee..d5f46f8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +fractorium (1.0.0.12-0ubuntu1) cosmic; urgency=low + + * release 1.0.0.12 + + -- Matt Feemster Sun, 30 Sep 2018 10:35:26 -0700 + fractorium (1.0.0.11d-0ubuntu1) cosmic; urgency=low * release 1.0.0.11 diff --git a/makedeps.bat b/makedeps.bat index f34090b..f00f3f4 100644 --- a/makedeps.bat +++ b/makedeps.bat @@ -14,7 +14,7 @@ REM libjpeg copy fractorium\Builds\MSVC\WIN32.MAK libjpeg cd libjpeg nmake /f makefile.vc setup-v15 CPU=i386 -nmake nodebug=1 /f makefile.vc all CPU=i386 +nmake nodebug=1 /f makefile.vc libjpeg.lib CPU=i386 copy libjpeg.lib ..\fractorium\Deps cd ..