| 1 | #include "BGImagePageFinal.h" | 
 
 
 
 
 | 2 | #include "ui_BGImagePageFinal.h" | 
 
 
 
 
 | 3 |  | 
 
 
 
 
 | 4 | BGImagePageFinal::BGImagePageFinal(QString appDir, Logger *myLogger, QString bgImagesLocation, QWidget *parent) : | 
 
 
 
 
 | 5 | QWizardPage(parent), | 
 
 
 
 
 | 6 | ui(new Ui::BGImagePageFinal) | 
 
 
 
 
 | 7 | { | 
 
 
 
 
 | 8 | ui->setupUi(this); | 
 
 
 
 
 | 9 | this->appDir = appDir; | 
 
 
 
 
 | 10 | this->myLogger = myLogger; | 
 
 
 
 
 | 11 | this->bgImagesLocation = bgImagesLocation; | 
 
 
 
 
 | 12 | this->oniSplitCommands = new QStringList(); | 
 
 
 
 
 | 13 | this->myOniSplitConverter = new Converter(this->appDir, this->myLogger, this->oniSplitCommands); | 
 
 
 
 
 | 14 |  | 
 
 
 
 
 | 15 | ui->lbComplete->setText("<html>The wizard is now complete. The images have been created. " | 
 
 
 
 
 | 16 | "You can view all created files clicking <a href=' '>here.</a><br />" | 
 
 
 
 
 | 17 | "<br />Click restart to create more background images from the wizard beggining, " | 
 
 
 
 
 | 18 | "otherwise click finish.</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code | 
 
 
 
 
 | 19 |  | 
 
 
 
 
 | 20 | connectSlots(); | 
 
 
 
 
 | 21 | } | 
 
 
 
 
 | 22 |  | 
 
 
 
 
 | 23 | void BGImagePageFinal::initializePage(){ | 
 
 
 
 
 | 24 | startProcessing(); | 
 
 
 
 
 | 25 | } | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | void BGImagePageFinal::startProcessing(){ | 
 
 
 
 
 | 28 | // page 1 | 
 
 
 
 
 | 29 | QString imagePath; | 
 
 
 
 
 | 30 | QString imageType; | 
 
 
 
 
 | 31 | // page 2 | 
 
 
 
 
 | 32 | bool createTXMB; | 
 
 
 
 
 | 33 | bool createTXMP; | 
 
 
 
 
 | 34 | QString imageCustomName; | 
 
 
 
 
 | 35 | QString txmbName; | 
 
 
 
 
 | 36 | QString levelId; | 
 
 
 
 
 | 37 |  | 
 
 
 
 
 | 38 | imagePath = field("leImageFullPath").toString(); | 
 
 
 
 
 | 39 | imageType = field("lbImageType").toString(); | 
 
 
 
 
 | 40 | createTXMB = field("cbCreateTXMB").toBool(); | 
 
 
 
 
 | 41 | createTXMP = field("cbCreateTXMP").toBool(); | 
 
 
 
 
 | 42 | imageCustomName = field("leImageName").toString(); | 
 
 
 
 
 | 43 | txmbName = field("leTXMBName").toString(); | 
 
 
 
 
 | 44 | levelId = field("leLevelId").toString(); | 
 
 
 
 
 | 45 |  | 
 
 
 
 
 | 46 |  | 
 
 
 
 
 | 47 | QImage sourceImage(imagePath); | 
 
 
 
 
 | 48 | QList<QString> imagesSplitted; | 
 
 
 
 
 | 49 |  | 
 
 
 
 
 | 50 | // Check if images folder exists and create it if necessary | 
 
 
 
 
 | 51 | QDir saveDir(this->bgImagesLocation); | 
 
 
 
 
 | 52 |  | 
 
 
 
 
 | 53 | if(!saveDir.exists()) | 
 
 
 
 
 | 54 | { | 
 
 
 
 
 | 55 | saveDir.mkpath("."); // http://stackoverflow.com/questions/2241808/checking-if-a-folder-exists-and-creating-folders-in-qt-c thanks Petrucio | 
 
 
 
 
 | 56 | } | 
 
 
 
 
 | 57 |  | 
 
 
 
 
 | 58 | imagesSplitted = splitIntoMultipleImages(sourceImage, imageCustomName, imageType); | 
 
 
 
 
 | 59 |  | 
 
 
 
 
 | 60 | // Image divided with sucess | 
 
 
 
 
 | 61 | if(imagesSplitted.size() > 0 && createTXMP){ | 
 
 
 
 
 | 62 |  | 
 
 
 
 
 | 63 | // call creations of TXMP files (oni split command) | 
 
 
 
 
 | 64 | this->oniSplitCommands->clear(); | 
 
 
 
 
 | 65 |  | 
 
 
 
 
 | 66 | for(const QString ¤tFile : imagesSplitted){ | 
 
 
 
 
 | 67 | this->oniSplitCommands->append("-create:txmp " + Util::insertQuotes(this->bgImagesLocation) + " -format:bgr32 " + Util::insertQuotes(currentFile)); | 
 
 
 
 
 | 68 | } | 
 
 
 
 
 | 69 |  | 
 
 
 
 
 | 70 | this->myOniSplitConverter->start(); // finally process the onisplit commands | 
 
 
 
 
 | 71 | this->myOniSplitConverter->wait(); // wait for it to complete | 
 
 
 
 
 | 72 |  | 
 
 
 
 
 | 73 | if(createTXMB){ | 
 
 
 
 
 | 74 |  | 
 
 
 
 
 | 75 | QString txmbXmlFile = createTxmbXmlFile(imagesSplitted, txmbName, sourceImage.size(), levelId); | 
 
 
 
 
 | 76 |  | 
 
 
 
 
 | 77 | if(txmbXmlFile.isEmpty()) | 
 
 
 
 
 | 78 | { | 
 
 
 
 
 | 79 | UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't create TXMB xml file!"); | 
 
 
 
 
 | 80 | return; | 
 
 
 
 
 | 81 | } | 
 
 
 
 
 | 82 |  | 
 
 
 
 
 | 83 | // Create TXMB oni files | 
 
 
 
 
 | 84 | this->oniSplitCommands->clear(); | 
 
 
 
 
 | 85 | this->oniSplitCommands->append("-create " + Util::insertQuotes(this->bgImagesLocation) + " " + Util::insertQuotes(txmbXmlFile)); | 
 
 
 
 
 | 86 | this->myOniSplitConverter->start(); | 
 
 
 
 
 | 87 | this->myOniSplitConverter->wait(); | 
 
 
 
 
 | 88 | } | 
 
 
 
 
 | 89 | } | 
 
 
 
 
 | 90 | } | 
 
 
 
 
 | 91 |  | 
 
 
 
 
 | 92 | QString BGImagePageFinal::createTxmbXmlFile(QList<QString> imagesSplitted, QString fileName, const QSize &imageSize, QString levelId){ | 
 
 
 
 
 | 93 | QString filePath = this->bgImagesLocation + "/" + fileName + ".xml"; | 
 
 
 
 
 | 94 |  | 
 
 
 
 
 | 95 | // If it's empty assume zero | 
 
 
 
 
 | 96 | if(levelId.trimmed().isEmpty()){ | 
 
 
 
 
 | 97 | levelId = "0"; | 
 
 
 
 
 | 98 | } | 
 
 
 
 
 | 99 |  | 
 
 
 
 
 | 100 | pugi::xml_document doc; | 
 
 
 
 
 | 101 |  | 
 
 
 
 
 | 102 | pugi::xml_node rootNode = doc.append_child("Oni"); | 
 
 
 
 
 | 103 | pugi::xml_node txmbNode = rootNode.append_child("TXMB"); | 
 
 
 
 
 | 104 | txmbNode.append_child("Width").append_child(pugi::xml_node_type::node_pcdata).set_value(QString::number(imageSize.width()).toLatin1().data()); | 
 
 
 
 
 | 105 | txmbNode.append_child("Height").append_child(pugi::xml_node_type::node_pcdata).set_value(QString::number(imageSize.height()).toLatin1().data()); | 
 
 
 
 
 | 106 | pugi::xml_node texturesNode = txmbNode.append_child("Textures"); | 
 
 
 
 
 | 107 |  | 
 
 
 
 
 | 108 | for(const QString &currSplittedImage : imagesSplitted) | 
 
 
 
 
 | 109 | { | 
 
 
 
 
 | 110 | QFileInfo currImageFile(currSplittedImage); | 
 
 
 
 
 | 111 | texturesNode.append_child("Link").append_child(pugi::xml_node_type::node_pcdata).set_value(Util::qStrToCstr(currImageFile.baseName())); | 
 
 
 
 
 | 112 | } | 
 
 
 
 
 | 113 |  | 
 
 
 
 
 | 114 | txmbNode.append_attribute("id").set_value(Util::qStrToCstr(levelId)); | 
 
 
 
 
 | 115 |  | 
 
 
 
 
 | 116 | if(!doc.save_file(Util::qStrToCstr(filePath))){ | 
 
 
 
 
 | 117 | return ""; | 
 
 
 
 
 | 118 | } | 
 
 
 
 
 | 119 |  | 
 
 
 
 
 | 120 | return filePath; | 
 
 
 
 
 | 121 | } | 
 
 
 
 
 | 122 |  | 
 
 
 
 
 | 123 | // returns number of images created from the split | 
 
 
 
 
 | 124 | QList<QString> BGImagePageFinal::splitIntoMultipleImages(QImage sourceImage, QString imageName, QString imageType){ | 
 
 
 
 
 | 125 |  | 
 
 
 
 
 | 126 | QList<QString> splittedImages; | 
 
 
 
 
 | 127 |  | 
 
 
 
 
 | 128 | QVector<int> horizontalSideSizes = getSplitSizes(sourceImage.width()); | 
 
 
 
 
 | 129 |  | 
 
 
 
 
 | 130 | QVector<int> verticalSideSizes = getSplitSizes(sourceImage.height()); | 
 
 
 
 
 | 131 |  | 
 
 
 
 
 | 132 | int currentVerticalPosition = 0; | 
 
 
 
 
 | 133 | int currentHorizontalPosition = 0; | 
 
 
 
 
 | 134 |  | 
 
 
 
 
 | 135 | for(const int currentVerticalSize : verticalSideSizes){ | 
 
 
 
 
 | 136 |  | 
 
 
 
 
 | 137 | for(const int currentHorizontalSize : horizontalSideSizes){ | 
 
 
 
 
 | 138 |  | 
 
 
 
 
 | 139 | QImage dividedImage = sourceImage.copy(currentHorizontalPosition,currentVerticalPosition,currentHorizontalSize,currentVerticalSize); | 
 
 
 
 
 | 140 | QString currentImageId = QString::number(splittedImages.size()+1); | 
 
 
 
 
 | 141 |  | 
 
 
 
 
 | 142 | // Not used. It added 0 when the number was less than 10 | 
 
 
 
 
 | 143 | //            if(currentImageId.length() == 1){ | 
 
 
 
 
 | 144 | //                currentImageId = "0" + currentImageId; | 
 
 
 
 
 | 145 | //            } | 
 
 
 
 
 | 146 |  | 
 
 
 
 
 | 147 | QString imageDestinationPath = this->bgImagesLocation + "/" + imageName + currentImageId + "." + imageType; | 
 
 
 
 
 | 148 |  | 
 
 
 
 
 | 149 | if(!dividedImage.save(imageDestinationPath)){ | 
 
 
 
 
 | 150 | UtilVago::showAndLogErrorPopUp(this->myLogger, "Couldn't save image " + imageDestinationPath + "! Files weren't created correctly."); | 
 
 
 
 
 | 151 | return QList<QString>(); | 
 
 
 
 
 | 152 | } | 
 
 
 
 
 | 153 |  | 
 
 
 
 
 | 154 | currentHorizontalPosition += currentHorizontalSize; | 
 
 
 
 
 | 155 |  | 
 
 
 
 
 | 156 | splittedImages.append(imageDestinationPath); | 
 
 
 
 
 | 157 | } | 
 
 
 
 
 | 158 |  | 
 
 
 
 
 | 159 | currentHorizontalPosition = 0; | 
 
 
 
 
 | 160 | currentVerticalPosition += currentVerticalSize; | 
 
 
 
 
 | 161 | } | 
 
 
 
 
 | 162 |  | 
 
 
 
 
 | 163 | return splittedImages; | 
 
 
 
 
 | 164 | } | 
 
 
 
 
 | 165 |  | 
 
 
 
 
 | 166 | QVector<int> BGImagePageFinal::getSplitSizes(int imageSideSize) | 
 
 
 
 
 | 167 | { | 
 
 
 
 
 | 168 | int remainingSideSize = imageSideSize; | 
 
 
 
 
 | 169 | constexpr int regularSize = 256; | 
 
 
 
 
 | 170 |  | 
 
 
 
 
 | 171 | QVector<int> splitSizes; | 
 
 
 
 
 | 172 |  | 
 
 
 
 
 | 173 | while(remainingSideSize > 0){ | 
 
 
 
 
 | 174 |  | 
 
 
 
 
 | 175 | if(remainingSideSize-regularSize < 0){ | 
 
 
 
 
 | 176 | splitSizes.append(remainingSideSize); | 
 
 
 
 
 | 177 | remainingSideSize -= remainingSideSize; | 
 
 
 
 
 | 178 | break; | 
 
 
 
 
 | 179 | } | 
 
 
 
 
 | 180 |  | 
 
 
 
 
 | 181 | splitSizes.append(regularSize); | 
 
 
 
 
 | 182 |  | 
 
 
 
 
 | 183 | remainingSideSize -= regularSize; | 
 
 
 
 
 | 184 |  | 
 
 
 
 
 | 185 | } | 
 
 
 
 
 | 186 |  | 
 
 
 
 
 | 187 | if(remainingSideSize != 0) | 
 
 
 
 
 | 188 | { | 
 
 
 
 
 | 189 | splitSizes.clear(); | 
 
 
 
 
 | 190 | } | 
 
 
 
 
 | 191 |  | 
 
 
 
 
 | 192 | return splitSizes; | 
 
 
 
 
 | 193 | } | 
 
 
 
 
 | 194 |  | 
 
 
 
 
 | 195 | void BGImagePageFinal::openBGImagesFolder(){ | 
 
 
 
 
 | 196 | QDesktopServices::openUrl(QUrl("file:///"+this->bgImagesLocation)); | 
 
 
 
 
 | 197 | } | 
 
 
 
 
 | 198 |  | 
 
 
 
 
 | 199 | void BGImagePageFinal::catchOniSplitProcessingErrors(QString result, int numErrors){ | 
 
 
 
 
 | 200 |  | 
 
 
 
 
 | 201 | if(numErrors!=0){ | 
 
 
 
 
 | 202 | QString sNumErrors=QString::number(numErrors); | 
 
 
 
 
 | 203 | bool isWarning = false; | 
 
 
 
 
 | 204 |  | 
 
 
 
 
 | 205 |  | 
 
 
 
 
 | 206 | if(result.startsWith("Warning: Texture")){ | 
 
 
 
 
 | 207 | isWarning = true; | 
 
 
 
 
 | 208 | } | 
 
 
 
 
 | 209 |  | 
 
 
 
 
 | 210 | if(numErrors>1){ | 
 
 
 
 
 | 211 |  | 
 
 
 
 
 | 212 | result = result+"\n This is the last of " + sNumErrors; | 
 
 
 
 
 | 213 |  | 
 
 
 
 
 | 214 | if(!isWarning){ | 
 
 
 
 
 | 215 | result += " errors."; | 
 
 
 
 
 | 216 | } | 
 
 
 
 
 | 217 | else{ | 
 
 
 
 
 | 218 | result += " messages."; | 
 
 
 
 
 | 219 | } | 
 
 
 
 
 | 220 | } | 
 
 
 
 
 | 221 |  | 
 
 
 
 
 | 222 | if(isWarning){ | 
 
 
 
 
 | 223 | UtilVago::showWarningPopUpLogButton(result); | 
 
 
 
 
 | 224 | } | 
 
 
 
 
 | 225 | else{ | 
 
 
 
 
 | 226 | UtilVago::showErrorPopUpLogButton(result); | 
 
 
 
 
 | 227 | } | 
 
 
 
 
 | 228 | } | 
 
 
 
 
 | 229 | } | 
 
 
 
 
 | 230 |  | 
 
 
 
 
 | 231 | void BGImagePageFinal::connectSlots(){ | 
 
 
 
 
 | 232 | connect(this->myOniSplitConverter, SIGNAL(resultConversion(QString, int)), this, SLOT(catchOniSplitProcessingErrors(QString, int))); | 
 
 
 
 
 | 233 | connect(ui->lbComplete, SIGNAL(linkActivated(const QString & )), this, SLOT(openBGImagesFolder())); | 
 
 
 
 
 | 234 | } | 
 
 
 
 
 | 235 |  | 
 
 
 
 
 | 236 | BGImagePageFinal::~BGImagePageFinal() | 
 
 
 
 
 | 237 | { | 
 
 
 
 
 | 238 | delete ui; | 
 
 
 
 
 | 239 | } |