| 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 | 
 } |