Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzFarm includes
Toshihiro Shimizu 890ddd
#include "tfarmcontroller.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/tpalettehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/levelproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/levelupdater.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzfolders.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshchildlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/tproject.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcleanupper.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcell.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/tlog.h"
Toshihiro Shimizu 890ddd
#include "toonz/imagestyles.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tcli.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "tstopwatch.h"
Toshihiro Shimizu 890ddd
#include "tthread.h"
Toshihiro Shimizu 890ddd
#include "tthreadmessage.h"
Toshihiro Shimizu 890ddd
#include "timagecache.h"
Toshihiro Shimizu 890ddd
#include "tiio_std.h"
Toshihiro Shimizu 890ddd
#include "tnzimage.h"
Toshihiro Shimizu 890ddd
#include "tmsgcore.h"
Toshihiro Shimizu 890ddd
#include "tpluginmanager.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "tsimplecolorstyles.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace TCli;
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline ostream &operator<<(ostream &out, const wstring &w)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << toString(w);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline ostream &operator<<(ostream &out, const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return out << fp.getWideString();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const char *applicationName = "OpenToonz";
Toshihiro Shimizu 890ddd
const char *applicationVersion = "1.0";
Toshihiro Shimizu 890ddd
const char *applicationFullName = "OpenToonz 1.0";
Toshihiro Shimizu 890ddd
const char *rootVarName = "TOONZROOT";
Toshihiro Shimizu 890ddd
const char *systemVarPrefix = "TOONZ";
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
CleanupParameters GlobalParameters;
Toshihiro Shimizu 890ddd
TFilePath CurrentSettingsFile = TFilePath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void loadSettings(const TFilePath &settingsFile, CleanupParameters *cp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (CurrentSettingsFile == TFilePath()) //the parameters were global ...I store them
Toshihiro Shimizu 890ddd
		GlobalParameters.assign(cp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CurrentSettingsFile = settingsFile;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TIStream *is = new TIStream(settingsFile);
Toshihiro Shimizu 890ddd
	int minor, major;
Toshihiro Shimizu 890ddd
	string tagName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Extract file version if any
Toshihiro Shimizu 890ddd
	is->matchTag(tagName);
Toshihiro Shimizu 890ddd
	if (tagName == "version") {
Toshihiro Shimizu 890ddd
		*is >> major >> minor;
Toshihiro Shimizu 890ddd
		is->matchEndTag();
Toshihiro Shimizu 890ddd
		is->setVersion(VersionNumber(major, minor));
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		delete is;
Toshihiro Shimizu 890ddd
		is = new TIStream(settingsFile);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	cp->loadData(*is, true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete is;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void restoreGlobalSettings(CleanupParameters *cp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (CurrentSettingsFile == TFilePath())
Toshihiro Shimizu 890ddd
		return; //already global!
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	cp->assign(&GlobalParameters);
Toshihiro Shimizu 890ddd
	CurrentSettingsFile = TFilePath();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} //namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// fatalError
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void fatalError(string msg)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
	msg = "Application can't start:\n" + msg;
Toshihiro Shimizu 890ddd
	DVGui::MsgBox(CRITICAL, QString::fromStdString(msg));
Toshihiro Shimizu 890ddd
	//MessageBox(0,msg.c_str(),"Fatal error",MB_ICONERROR);
Toshihiro Shimizu 890ddd
	exit(1);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	// TODO: Come si fa ad aggiungere un messaggio di errore qui?
Toshihiro Shimizu 890ddd
	std::cout << msg << std::endl;
Toshihiro Shimizu 890ddd
	abort();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool isBlank(char c)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return c == ' ' || c == '\t' || c == '\n';
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
// setToonzFolder
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Ritorna il path della variabile passata come secondo argomento
Toshihiro Shimizu 890ddd
// entrambe vengono lette da un file di testo (filename).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath setToonzFolder(const TFilePath &filename, std::string toonzVar)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	Tifstream is(filename);
Toshihiro Shimizu 890ddd
	if (!is)
Toshihiro Shimizu 890ddd
		return TFilePath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	char buffer[1024];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (is.getline(buffer, sizeof(buffer))) {
Toshihiro Shimizu 890ddd
		// le righe dentro toonzenv.txt sono del tipo
Toshihiro Shimizu 890ddd
		// export set TOONZPROJECT="....."
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// devo trovare la linea che contiene toonzVar
Toshihiro Shimizu 890ddd
		char *s = buffer;
Toshihiro Shimizu 890ddd
		while (isBlank(*s))
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		// Se la riga  vuota, o inizia per # o ! salto alla prossima
Toshihiro Shimizu 890ddd
		if (*s == '\0' || *s == '#' || *s == '!')
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		if (*s == '=')
Toshihiro Shimizu 890ddd
			continue; // errore: nome variabile non c'
Toshihiro Shimizu 890ddd
		char *t = s;
Toshihiro Shimizu 890ddd
		// Mi prendo la sottoStringa fino all'=
Toshihiro Shimizu 890ddd
		while (*t && *t != '=')
Toshihiro Shimizu 890ddd
			t++;
Toshihiro Shimizu 890ddd
		if (*t != '=')
Toshihiro Shimizu 890ddd
			continue; // errore: manca '='
Toshihiro Shimizu 890ddd
		char *q = t;
Toshihiro Shimizu 890ddd
		// Torno indietro fino al primo blank
Toshihiro Shimizu 890ddd
		while (q > s && !isBlank(*(q - 1)))
Toshihiro Shimizu 890ddd
			q--;
Toshihiro Shimizu 890ddd
		if (q == s)
Toshihiro Shimizu 890ddd
			continue; // non dovrebbe mai succedere: prima di '=' tutti blanks
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		string toonzVarString(q, t);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Confronto la stringa trovata con toonzVar, se   lei vado avanti.
Toshihiro Shimizu 890ddd
		if (toonzVar != toonzVarString)
Toshihiro Shimizu 890ddd
			continue; // errore: stringhe diverse
Toshihiro Shimizu 890ddd
		s = t + 1;
Toshihiro Shimizu 890ddd
		// Salto gli spazi
Toshihiro Shimizu 890ddd
		while (isBlank(*s))
Toshihiro Shimizu 890ddd
			s++;
Toshihiro Shimizu 890ddd
		if (*s == '\0')
Toshihiro Shimizu 890ddd
			continue; //errore: dst vuoto
Toshihiro Shimizu 890ddd
		t = s;
Toshihiro Shimizu 890ddd
		while (*t)
Toshihiro Shimizu 890ddd
			t++;
Toshihiro Shimizu 890ddd
		while (t > s && isBlank(*(t - 1)))
Toshihiro Shimizu 890ddd
			t--;
Toshihiro Shimizu 890ddd
		if (t == s)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		// ATTENZIONE : tolgo le virgolette !!
Toshihiro Shimizu 890ddd
		string pathName(s + 1, t - s - 2);
Toshihiro Shimizu 890ddd
		return TFilePath(pathName);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return TFilePath();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void prepareToCleanup(TXshSimpleLevel *xl, TPalette *cleanupPalette)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(xl->getScene());
Toshihiro Shimizu 890ddd
	if (xl->getProperties()->getSubsampling() != 1) {
Toshihiro Shimizu 890ddd
		xl->getProperties()->setSubsampling(1);
Toshihiro Shimizu 890ddd
		xl->invalidateFrames();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* int ltype = xl->getType();
Toshihiro Shimizu 890ddd
    if(ltype != TZP_XSHLEVEL) 
Toshihiro Shimizu 890ddd
    xl->makeTlv(xl->getScene()->getDefaultParentDir(TZP_XSHLEVEL));
Toshihiro Shimizu 890ddd
  if(xl->getPalette()==0)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    //PaletteController* pc = TApp::instance()->getPaletteController();
Toshihiro Shimizu 890ddd
		xl->setPalette(cleanupPalette);
Toshihiro Shimizu 890ddd
		//if(xl == TApp::instance()->getCurrentLevel()->getLevel())
Toshihiro Shimizu 890ddd
		//	pc->getCurrentLevelPalette()->setPalette(xl->getPalette());
Toshihiro Shimizu 890ddd
    }*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
TStopWatch Sw1;
Toshihiro Shimizu 890ddd
TStopWatch Sw2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool UseRenderFarm = false;
Toshihiro Shimizu 890ddd
string FarmControllerName;
Toshihiro Shimizu 890ddd
int FarmControllerPort;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFarmController *FarmController = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string TaskId;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// searchLevelsToCleanup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Restituisce l'elenco (ordinato per ordine alfabetico di nome)
Toshihiro Shimizu 890ddd
// dei livelli TLV(con scannedPath)/TZI/OVL presenti nell'xsheet (o nei sottoxsheet)
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// se selectedOnly = true salta i livelli presenti nelle colonne senza "occhietto"
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void searchLevelsToCleanup(
Toshihiro Shimizu 890ddd
	std::vector<std::pair<txshsimplelevel *,="" std::set<tframeid="">>> &levels,</std::pair<txshsimplelevel>
Toshihiro Shimizu 890ddd
	TXsheet *xsh,
Toshihiro Shimizu 890ddd
	bool selectedOnly)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	std::map<wstring, *="" txshsimplelevel=""> levelTable;</wstring,>
Toshihiro Shimizu 890ddd
	std::map<wstring, std::set<tframeid="">> framesTable;</wstring,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::set<txsheet *=""> visited;</txsheet>
Toshihiro Shimizu 890ddd
	std::vector<txsheet *=""> xsheets;</txsheet>
Toshihiro Shimizu 890ddd
	xsheets.push_back(xsh);
Toshihiro Shimizu 890ddd
	visited.insert(xsh);
Toshihiro Shimizu 890ddd
	while (!xsheets.empty()) {
Toshihiro Shimizu 890ddd
		TXsheet *xsh = xsheets.back();
Toshihiro Shimizu 890ddd
		xsheets.pop_back();
Toshihiro Shimizu 890ddd
		for (int c = 0; c < xsh->getColumnCount(); c++) {
Toshihiro Shimizu 890ddd
			TXshColumn *column = xsh->getColumn(c);
Toshihiro Shimizu 890ddd
			if (!column || column->isEmpty())
Toshihiro Shimizu 890ddd
				continue;
Toshihiro Shimizu 890ddd
			//if(selectedOnly && !column->isPreviewVisible()) continue;
Toshihiro Shimizu 890ddd
			int r0 = 0, r1 = -1;
Toshihiro Shimizu 890ddd
			xsh->getCellRange(c, r0, r1);
Toshihiro Shimizu 890ddd
			for (int r = r0; r <= r1; r++) {
Toshihiro Shimizu 890ddd
				TXshCell cell = xsh->getCell(r, c);
Toshihiro Shimizu 890ddd
				if (cell.isEmpty())
Toshihiro Shimizu 890ddd
					continue;
Toshihiro Shimizu 890ddd
				if (TXshSimpleLevel *sl = cell.m_level->getSimpleLevel()) {
Toshihiro Shimizu 890ddd
					if (selectedOnly && !column->isPreviewVisible()) //pezza: se questo "if" veniva fatto sopra(riga commentata)
Toshihiro Shimizu 890ddd
																	 // quando si fa save della Scene alla fine della cleanuppata,
Toshihiro Shimizu 890ddd
																	 //venivano backuppate le tif non processate e cancellati gli originali!
Toshihiro Shimizu 890ddd
																	 //Deliri del levelUPdater; evito di mettere le mani in quel pattume. vinz
Toshihiro Shimizu 890ddd
					{
Toshihiro Shimizu 890ddd
						sl->setDirtyFlag(false);
Toshihiro Shimizu 890ddd
						continue;
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
					int ltype = sl->getType();
Toshihiro Shimizu 890ddd
					if (ltype == TZP_XSHLEVEL && sl->getScannedPath() != TFilePath() || ltype == OVL_XSHLEVEL || ltype == TZI_XSHLEVEL) {
Toshihiro Shimizu 890ddd
						wstring levelName = sl->getName();
Toshihiro Shimizu 890ddd
						levelTable[levelName] = sl;
Toshihiro Shimizu 890ddd
						framesTable[levelName].insert(cell.m_frameId);
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				} else if (TXshChildLevel *cl = cell.m_level->getChildLevel()) {
Toshihiro Shimizu 890ddd
					TXsheet *subXsh = cl->getXsheet();
Toshihiro Shimizu 890ddd
					if (visited.count(subXsh) == 0) {
Toshihiro Shimizu 890ddd
						visited.insert(subXsh);
Toshihiro Shimizu 890ddd
						xsheets.push_back(subXsh);
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	assert(levelTable.size() == framesTable.size());
Toshihiro Shimizu 890ddd
	std::map<wstring, *="" txshsimplelevel="">::iterator it1 = levelTable.begin();</wstring,>
Toshihiro Shimizu 890ddd
	std::map<wstring, std::set<tframeid="">>::iterator it2 = framesTable.begin();</wstring,>
Toshihiro Shimizu 890ddd
	for (it1; it1 != levelTable.end(); ++it1, ++it2)
Toshihiro Shimizu 890ddd
		levels.push_back(std::make_pair(it1->second, it2->second));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*- CleanupDefaultパレットを追加する -*/
Toshihiro Shimizu 890ddd
void addCleanupDefaultPalette(TXshSimpleLevel *sl)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*- 元となるパレットはStudioPaletteフォルダに置く -*/
Toshihiro Shimizu 890ddd
	TFilePath palettePath = ToonzFolder::getStudioPaletteFolder() + "cleanup_default.tpl";
Toshihiro Shimizu 890ddd
	TFileStatus pfs(palettePath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!pfs.doesExist() || !pfs.isReadable()) {
Toshihiro Shimizu 890ddd
		wcout << L"CleanupDefaultPalette file: " << palettePath.getWideString() << L" is not found!" << endl;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TIStream is(palettePath);
Toshihiro Shimizu 890ddd
	if (!is) {
Toshihiro Shimizu 890ddd
		cout << "CleanupDefaultPalette file: failed to get TIStream" << endl;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string tagName;
Toshihiro Shimizu 890ddd
	if (!is.matchTag(tagName) || tagName != "palette") {
Toshihiro Shimizu 890ddd
		cout << "CleanupDefaultPalette file: This is not palette file" << endl;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string gname;
Toshihiro Shimizu 890ddd
	is.getTagParam("name", gname);
Toshihiro Shimizu 890ddd
	TPalette *defaultPalette = new TPalette();
Toshihiro Shimizu 890ddd
	defaultPalette->loadData(is);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	sl->getPalette()->setIsCleanupPalette(false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPalette::Page *dstPage = sl->getPalette()->getPage(0);
Toshihiro Shimizu 890ddd
	TPalette::Page *srcPage = defaultPalette->getPage(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int srcIndexInPage = 0; srcIndexInPage < srcPage->getStyleCount(); srcIndexInPage++) {
Toshihiro Shimizu 890ddd
		int id = srcPage->getStyleId(srcIndexInPage);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool isUsedInCleanupPalette;
Toshihiro Shimizu 890ddd
		isUsedInCleanupPalette = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int dstIndexInPage = 0; dstIndexInPage < dstPage->getStyleCount(); dstIndexInPage++) {
Toshihiro Shimizu 890ddd
			if (dstPage->getStyleId(dstIndexInPage) == id) {
Toshihiro Shimizu 890ddd
				isUsedInCleanupPalette = true;
Toshihiro Shimizu 890ddd
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (isUsedInCleanupPalette)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			int addedId = sl->getPalette()->addStyle(srcPage->getStyle(srcIndexInPage)->clone());
Toshihiro Shimizu 890ddd
			dstPage->addStyle(addedId);
Toshihiro Shimizu 890ddd
			/*- StudioPalette由来のDefaultPaletteの場合、GrobalNameを消去する -*/
Toshihiro Shimizu 890ddd
			sl->getPalette()->getStyle(addedId)->setGlobalName(L"");
Toshihiro Shimizu 890ddd
			sl->getPalette()->getStyle(addedId)->setOriginalName(L"");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete defaultPalette;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// cleanupLevel
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// effettua il cleanup del livello. Se il livello e' un fullcolor
Toshihiro Shimizu 890ddd
// modifica tipo e parametri e crea la palette
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// se overwrite == false non fa il cleanup dei frames gia' cleanuppati
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void cleanupLevel(TXshSimpleLevel *xl, std::set<tframeid> fidsInXsheet,</tframeid>
Toshihiro Shimizu 890ddd
				  ToonzScene *scene, bool overwrite, TUserLogAppend &m_userLog)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	prepareToCleanup(xl, scene->getProperties()->getCleanupParameters()->m_cleanupPalette.getPointer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TCleanupper *cl = TCleanupper::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = scene->decodeFilePath(xl->getPath());
Toshihiro Shimizu 890ddd
	TSystem::touchParentDir(fp);
Toshihiro Shimizu 890ddd
	cout << "cleanupping " << xl->getName() << " path=" << fp << endl;
Toshihiro Shimizu 890ddd
	string info = "cleanupping " + toString(xl->getPath());
Toshihiro Shimizu 890ddd
	LevelUpdater updater(xl);
Toshihiro Shimizu 890ddd
	m_userLog.info(info);
Toshihiro Shimizu 890ddd
	DVGui::MsgBox(INFORMATION, QString::fromStdString(info));
Toshihiro Shimizu 890ddd
	bool firstImage = true;
Toshihiro Shimizu 890ddd
	std::set<tframeid>::iterator it = fidsInXsheet.begin();</tframeid>
Toshihiro Shimizu 890ddd
	for (it; it != fidsInXsheet.end(); it++) {
Toshihiro Shimizu 890ddd
		TFrameId fid = *it;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		cout << "  " << fid << endl;
Toshihiro Shimizu 890ddd
		info = "  " + fid.expand();
Toshihiro Shimizu 890ddd
		m_userLog.info(info);
Toshihiro Shimizu 890ddd
		int status = xl->getFrameStatus(fid);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (0 != (status & TXshSimpleLevel::Cleanupped) && !overwrite) {
Toshihiro Shimizu 890ddd
			cout << "  skipped" << endl;
Toshihiro Shimizu 890ddd
			m_userLog.info("  skipped");
Toshihiro Shimizu 890ddd
			DVGui::MsgBox(INFORMATION, QString("--skipped frame ") + QString::fromStdString(fid.expand()));
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TRasterImageP original = xl->getFrameToCleanup(fid);
Toshihiro Shimizu 890ddd
		if (!original) {
Toshihiro Shimizu 890ddd
			string err = "    *error* missed frame";
Toshihiro Shimizu 890ddd
			m_userLog.error(err);
Toshihiro Shimizu 890ddd
			cout << err << endl;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CleanupParameters *params = scene->getProperties()->getCleanupParameters();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (params->m_lineProcessingMode == lpNone) {
Toshihiro Shimizu 890ddd
			TRasterImageP ri;
Toshihiro Shimizu 890ddd
			if (params->m_autocenterType == CleanupTypes::AUTOCENTER_NONE)
Toshihiro Shimizu 890ddd
				ri = original;
Toshihiro Shimizu 890ddd
			else {
Toshihiro Shimizu 890ddd
				bool autocentered;
Toshihiro Shimizu 890ddd
				ri = cl->autocenterOnly(original, false, autocentered);
Toshihiro Shimizu 890ddd
				if (!autocentered) {
Toshihiro Shimizu 890ddd
					m_userLog.error("The autocentering failed on the current drawing.");
Toshihiro Shimizu 890ddd
					cout << "The autocentering failed on the current drawing." << endl;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			updater.update(fid, ri);
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		double dpix, dpiy;
Toshihiro Shimizu 890ddd
		original->getDpi(dpix, dpiy);
Toshihiro Shimizu 890ddd
		cl->setCustomDpi((dpix == 0 && dpiy == 0) ? xl->getProperties()->getDpi() : TPointD());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CleanupPreprocessedImage *cpi;
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TRasterImageP resampledImage;
Toshihiro Shimizu 890ddd
			cpi = cl->process(original, firstImage, resampledImage);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TToonzImageP timage = cl->finalize(cpi, true);
Toshihiro Shimizu 890ddd
		TPointD dpi(0, 0);
Toshihiro Shimizu 890ddd
		timage->getDpi(dpi.x, dpi.y);
Toshihiro Shimizu 890ddd
		if (dpi.x != 0 && dpi.y != 0)
Toshihiro Shimizu 890ddd
			xl->getProperties()->setDpi(dpi);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (firstImage)
Toshihiro Shimizu 890ddd
			addCleanupDefaultPalette(xl);
Toshihiro Shimizu 890ddd
		firstImage = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		timage->setPalette(xl->getPalette());
Toshihiro Shimizu 890ddd
		xl->setFrameStatus(fid, status | TXshSimpleLevel::Cleanupped);
Toshihiro Shimizu 890ddd
		xl->setFrame(fid, timage);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		updater.update(fid, timage);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- 1フレーム終わったら、そのフレームのキャッシュは消す -*/
Toshihiro Shimizu 890ddd
		xl->invalidateFrame(fid);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		delete cpi;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// main
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// usage: tcleanup filename.tnz [-selected][-overwrite]
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int main(int argc, char *argv[])
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QApplication app(argc, argv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// questo definisce la registry root e inizializza TEnv
Toshihiro Shimizu 890ddd
	TEnv::setApplication(applicationName, applicationVersion);
Toshihiro Shimizu 890ddd
	TEnv::setApplicationFullName(applicationFullName);
Toshihiro Shimizu 890ddd
	TEnv::setRootVarName(rootVarName);
Toshihiro Shimizu 890ddd
	TEnv::setSystemVarPrefix(systemVarPrefix);
Toshihiro Shimizu 890ddd
	TSystem::hasMainLoop(false);
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < argc; i++) //tmsg must be set as soon as it's possible
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		QString str = argv[i];
Toshihiro Shimizu 890ddd
		if (str == "-tmsg")
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TMsgCore::instance()->connectTo(argv[i + 1]);
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (i == argc)
Toshihiro Shimizu 890ddd
		TMsgCore::instance()->connectTo("");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//TThread::init();  //For the ImageManager construction
Toshihiro Shimizu 890ddd
// controllo se la xxxroot e' definita e corrisponde ad un file esistente
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// StuffDir
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QFileInfo infoStuff(QString("Toonz 7.1 stuff"));
Toshihiro Shimizu 890ddd
	TFilePath stuffDirPath(infoStuff.absoluteFilePath().toStdString());
Toshihiro Shimizu 890ddd
	TEnv::setStuffDir(stuffDirPath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  #ifdef BRAVO
Toshihiro Shimizu 890ddd
    TFilePath stuffDir("/Applications/Toonz 7.1 Bravo/Toonz 7.1 Bravo stuff");
Toshihiro Shimizu 890ddd
  #else
Toshihiro Shimizu 890ddd
    TFilePath  stuffDir("/Applications/Toonz 7.1/Toonz 7.1 stuff");
Toshihiro Shimizu 890ddd
  #endif
Toshihiro Shimizu 890ddd
	
Toshihiro Shimizu 890ddd
  TEnv::setStuffDir(stuffDir);
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fproot = TEnv::getStuffDir();
Toshihiro Shimizu 890ddd
	if (fproot == TFilePath())
Toshihiro Shimizu 890ddd
		fatalError(string("Undefined: \"") + toString(TEnv::getRootVarPath().getWideString()) + "\"");
Toshihiro Shimizu 890ddd
	if (!TFileStatus(fproot).isDirectory())
Toshihiro Shimizu 890ddd
		fatalError(string("Directory \"") + toString(fproot.getWideString()) + "\" not found or not readable");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath lRootDir = TEnv::getStuffDir() + "toonzfarm";
Toshihiro Shimizu 890ddd
	TFilePath logFilePath = lRootDir + "tcleanup.log";
Toshihiro Shimizu 890ddd
	TUserLogAppend m_userLog(logFilePath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePathSet fps = ToonzFolder::getProjectsFolders();
Toshihiro Shimizu 890ddd
	TFilePathSet::iterator fpIt;
Toshihiro Shimizu 890ddd
	for (fpIt = fps.begin(); fpIt != fps.end(); ++fpIt)
Toshihiro Shimizu 890ddd
		TProjectManager::instance()->addProjectsRoot(*fpIt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath libraryFolder = ToonzFolder::getLibraryFolder();
Toshihiro Shimizu 890ddd
	TRasterImagePatternStrokeStyle::setRootDir(libraryFolder);
Toshihiro Shimizu 890ddd
	TVectorImagePatternStrokeStyle::setRootDir(libraryFolder);
Toshihiro Shimizu 890ddd
	TPalette::setRootDir(libraryFolder);
Toshihiro Shimizu 890ddd
	TImageStyle::setLibraryDir(libraryFolder);
Toshihiro Shimizu 890ddd
	TFilePath cacheRoot = ToonzFolder::getCacheRootFolder();
Toshihiro Shimizu 890ddd
	if (cacheRoot.isEmpty())
Toshihiro Shimizu 890ddd
		cacheRoot = TEnv::getStuffDir() + "cache";
Toshihiro Shimizu 890ddd
	TImageCache::instance()->setRootDir(cacheRoot);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FilePathArgument srcName("tnzFile", "Scene file");
Toshihiro Shimizu 890ddd
	SimpleQualifier selectedOnlyOption("-onlyvisible", "Selected column only");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SimpleQualifier overwriteAllOption("-overwriteAll", "Overwrite all already cleanupped frames");
Toshihiro Shimizu 890ddd
	SimpleQualifier overwriteNoPaintOption("-overwriteNoPaint", "Overwrite only no-paint levels of already cleanupped frames");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	StringQualifier farmData("-farm data", "TFarm Controller");
Toshihiro Shimizu 890ddd
	StringQualifier idq("-id n", "id");
Toshihiro Shimizu 890ddd
	StringQualifier tmsg("-tmsg n", "Internal use only");
Toshihiro Shimizu 890ddd
	Usage usage(argv[0]);
Toshihiro Shimizu 890ddd
	usage.add(srcName + selectedOnlyOption + overwriteAllOption + overwriteNoPaintOption + farmData + idq + tmsg);
Toshihiro Shimizu 890ddd
	if (!usage.parse(argc, argv))
Toshihiro Shimizu 890ddd
		exit(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TaskId = idq.getValue();
Toshihiro Shimizu 890ddd
	string fdata = farmData.getValue();
Toshihiro Shimizu 890ddd
	if (fdata.empty())
Toshihiro Shimizu 890ddd
		UseRenderFarm = false;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		UseRenderFarm = true;
Toshihiro Shimizu 890ddd
		string::size_type pos = fdata.find('@');
Toshihiro Shimizu 890ddd
		if (pos == string::npos)
Toshihiro Shimizu 890ddd
			UseRenderFarm = false;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			FarmControllerPort = toInt(fdata.substr(0, pos));
Toshihiro Shimizu 890ddd
			FarmControllerName = fdata.substr(pos + 1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (UseRenderFarm) {
Toshihiro Shimizu 890ddd
		TFarmControllerFactory factory;
Toshihiro Shimizu 890ddd
		factory.create(QString::fromStdString(FarmControllerName), FarmControllerPort, &FarmController);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- 画像Read/Writeの関数を登録 -*/
Toshihiro Shimizu 890ddd
	initImageIo();
Toshihiro Shimizu 890ddd
	Tiio::defineStd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- プロジェクトのロード -*/
Toshihiro Shimizu 890ddd
	TProjectManager *pm = TProjectManager::instance();
Toshihiro Shimizu 890ddd
	TProjectP project = pm->loadSceneProject(srcName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!project) {
Toshihiro Shimizu 890ddd
		string err = "Couldn't find the project" + project->getName().getName();
Toshihiro Shimizu 890ddd
		m_userLog.error(err);
Toshihiro Shimizu 890ddd
		cerr << err << endl;
Toshihiro Shimizu 890ddd
		return -2;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	cout << "project:" << project->getName() << endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath fp = srcName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- CLNファイルを直接指定した場合 -*/
Toshihiro Shimizu 890ddd
	bool sourceFileIsCleanupSetting = (fp.getType() == "cln");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool selectedOnly = selectedOnlyOption;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ToonzScene *scene = new ToonzScene();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageStyle::setCurrentScene(scene);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- シーンファイルパスを入力した場合 -*/
Toshihiro Shimizu 890ddd
	if (!sourceFileIsCleanupSetting) {
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			scene->loadNoResources(fp);
Toshihiro Shimizu 890ddd
		} catch (...) {
Toshihiro Shimizu 890ddd
			string err = "can't read " + fp.getName();
Toshihiro Shimizu 890ddd
			m_userLog.error(err);
Toshihiro Shimizu 890ddd
			cerr << "can't read " << fp << endl;
Toshihiro Shimizu 890ddd
			TImageCache::instance()->clear(true);
Toshihiro Shimizu 890ddd
			return -3;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	/*-- CleanupSettingsファイルパスを直接入力した場合 --*/
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			/*- CleanupSettingsファイルに対応するTIFファイルが有るかチェック -*/
Toshihiro Shimizu 890ddd
			TFilePath tifImagePath = fp.withType("tif");
Toshihiro Shimizu 890ddd
			std::wcout << L"tifImagePath : " << tifImagePath.getWideString() << std::endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/*- 無ければ、連番画像がソースである可能性がある。tifImagePathを連番に差し替える -*/
Toshihiro Shimizu 890ddd
			if (!TFileStatus(tifImagePath).doesExist()) {
Toshihiro Shimizu 890ddd
				tifImagePath = tifImagePath.getParentDir() + (tifImagePath.getName() + "..tif");
Toshihiro Shimizu 890ddd
				std::wcout << "change the source path to : " << tifImagePath.getWideString() << std::endl;
Toshihiro Shimizu 890ddd
			} else
Toshihiro Shimizu 890ddd
				std::cout << "tif single image found" << std::endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/*- シーンファイルに対象のTIFファイルをロード -*/
Toshihiro Shimizu 890ddd
			TXshLevel *xl = scene->loadLevel(tifImagePath);
Toshihiro Shimizu 890ddd
			if (!xl) {
Toshihiro Shimizu 890ddd
				std::cout << "failed to load level" << std::endl;
Toshihiro Shimizu 890ddd
				throw TException("Failed to load level.");
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			std::vector<tframeid> dummy;</tframeid>
Toshihiro Shimizu 890ddd
			int frameLength = scene->getXsheet()->exposeLevel(0, 0, xl, dummy);
Toshihiro Shimizu 890ddd
			std::cout << "expose done. frameLength : " << frameLength << std::endl;
Toshihiro Shimizu 890ddd
		} catch (...) {
Toshihiro Shimizu 890ddd
			cerr << "can't read Cleanup Settings file " << fp << endl;
Toshihiro Shimizu 890ddd
			TImageCache::instance()->clear(true);
Toshihiro Shimizu 890ddd
			return -3;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Levels contiene i livelli e i rispettivi frames prsenti nell'xsheet.
Toshihiro Shimizu 890ddd
	std::vector<std::pair<txshsimplelevel *,="" std::set<tframeid="">>> levels;</std::pair<txshsimplelevel>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- XsheetからCleanupするLevelのリストを得る -*/
Toshihiro Shimizu 890ddd
	searchLevelsToCleanup(levels, scene->getXsheet(), selectedOnly);
Toshihiro Shimizu 890ddd
	TSceneProperties *sprop = scene->getProperties();
Toshihiro Shimizu 890ddd
	CleanupParameters *params = scene->getProperties()->getCleanupParameters();
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)levels.size(); i++) {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool overwrite = overwriteAllOption;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TXshSimpleLevel *xl = levels[i].first->getSimpleLevel();
Toshihiro Shimizu 890ddd
		if (!xl)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- CLNファイルパスを取得 -*/
Toshihiro Shimizu 890ddd
		TFilePath settingsFile = xl->getScannedPath().isEmpty() ? xl->getPath() : xl->getScannedPath();
Toshihiro Shimizu 890ddd
		settingsFile = scene->decodeFilePath(settingsFile).withNoFrame().withType("cln");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- CLNファイルがあればそれを用いる。無ければGlobal設定を読み込む -*/
Toshihiro Shimizu 890ddd
		//TFilePath settingsFile = scene->decodeFilePath(xl->getPath()).withNoFrame().withType("cln");
Toshihiro Shimizu 890ddd
		if (TFileStatus(settingsFile).doesExist())
Toshihiro Shimizu 890ddd
			loadSettings(settingsFile, params);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			restoreGlobalSettings(params);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TCleanupper::instance()->setParameters(params);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool lineProcessing = (params->m_lineProcessingMode != lpNone);
Toshihiro Shimizu 890ddd
		TFilePath tmp = params->getPath(scene);
Toshihiro Shimizu 890ddd
		int ltype = xl->getType();
Toshihiro Shimizu 890ddd
		assert(ltype == TZP_XSHLEVEL || ltype == TZI_XSHLEVEL || ltype == OVL_XSHLEVEL);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// target path
Toshihiro Shimizu 890ddd
		TFilePath targetPath = xl->getPath();
Toshihiro Shimizu 890ddd
		if (ltype != TZP_XSHLEVEL) {
Toshihiro Shimizu 890ddd
			if (lineProcessing)
Toshihiro Shimizu 890ddd
				targetPath =
Toshihiro Shimizu 890ddd
					targetPath
Toshihiro Shimizu 890ddd
						.withParentDir(params->getPath(scene)) // scene->getDefaultParentDir(TZP_XSHLEVEL))
Toshihiro Shimizu 890ddd
						.withNoFrame()
Toshihiro Shimizu 890ddd
						.withType("tlv");
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				targetPath =
Toshihiro Shimizu 890ddd
					targetPath
Toshihiro Shimizu 890ddd
						.withParentDir(params->getPath(scene)); // scene->getDefaultParentDir(TZP_XSHLEVEL));
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			targetPath =
Toshihiro Shimizu 890ddd
				targetPath
Toshihiro Shimizu 890ddd
					.withParentDir(params->getPath(scene)); // scene->getDefaultParentDir(TZP_XSHLEVEL));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- NoPaintを作る設定のとき、NoPaintの方だけにOverwriteするようにする -*/
Toshihiro Shimizu 890ddd
		bool isReCleanup;
Toshihiro Shimizu 890ddd
		isReCleanup = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- 再Cleanupのときにパスを元に戻すために用いる -*/
Toshihiro Shimizu 890ddd
		TFilePath originalLevelPath = TFilePath();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TFilePath actualTargetPath = scene->decodeFilePath(targetPath);
Toshihiro Shimizu 890ddd
		/*- すでにLevelがある場合 -*/
Toshihiro Shimizu 890ddd
		if (TSystem::doesExistFileOrLevel(actualTargetPath) && Preferences::instance()->isSaveUnpaintedInCleanupEnable() && overwriteNoPaintOption) {
Toshihiro Shimizu 890ddd
			overwrite = true;
Toshihiro Shimizu 890ddd
			originalLevelPath = scene->codeFilePath(targetPath);
Toshihiro Shimizu 890ddd
			/*- パスを書き換え、再Cleanupのフラグを立てる -*/
Toshihiro Shimizu 890ddd
			isReCleanup = true;
Toshihiro Shimizu 890ddd
			/*- nopaintフォルダの作成 -*/
Toshihiro Shimizu 890ddd
			TFilePath nopaintDir = targetPath.getParentDir() + "nopaint";
Toshihiro Shimizu 890ddd
			if (!TFileStatus(nopaintDir).doesExist()) {
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					TSystem::mkDir(nopaintDir);
Toshihiro Shimizu 890ddd
				} catch (...) {
Toshihiro Shimizu 890ddd
					return 0;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			/*- 保存先のパスをnopaintの方にする -*/
Toshihiro Shimizu 890ddd
			targetPath = targetPath.getParentDir() + "nopaint\\" + TFilePath(targetPath.getName() + "_np." + targetPath.getType());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		std::wcout << L"targetPath = " << targetPath.getWideString() << std::endl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (lineProcessing) {
Toshihiro Shimizu 890ddd
			if (ltype != TZP_XSHLEVEL) {
Toshihiro Shimizu 890ddd
				xl->makeTlv(targetPath);
Toshihiro Shimizu 890ddd
			} else if (targetPath != xl->getPath()) {
Toshihiro Shimizu 890ddd
				xl->setPath(targetPath, false);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			xl->setPalette(TCleanupper::instance()->createToonzPaletteFromCleanupPalette());
Toshihiro Shimizu 890ddd
		} else if (!params->getPath(scene).isEmpty()) {
Toshihiro Shimizu 890ddd
			xl->setScannedPath(xl->getPath());
Toshihiro Shimizu 890ddd
			xl->setPath(scene->codeFilePath(targetPath), false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		std::set<tframeid> fidsInXsheet = levels[i].second;</tframeid>
Toshihiro Shimizu 890ddd
		assert(fidsInXsheet.size() > 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		xl->load();
Toshihiro Shimizu 890ddd
		cleanupLevel(xl, fidsInXsheet, scene, overwrite, m_userLog);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*- Cleanup完了後、Nopaintをnopaintフォルダに保存する -*/
Toshihiro Shimizu 890ddd
		if (Preferences::instance()->isSaveUnpaintedInCleanupEnable() && !isReCleanup) /*-- 再Cleanupのときはnopaintを作らない --*/
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			/*- nopaintフォルダの作成 -*/
Toshihiro Shimizu 890ddd
			TFilePath nopaintDir = actualTargetPath.getParentDir() + "nopaint";
Toshihiro Shimizu 890ddd
			if (!TFileStatus(nopaintDir).doesExist()) {
Toshihiro Shimizu 890ddd
				try {
Toshihiro Shimizu 890ddd
					TSystem::mkDir(nopaintDir);
Toshihiro Shimizu 890ddd
				} catch (...) {
Toshihiro Shimizu 890ddd
					string err = "Can't make directory  " + nopaintDir.getName();
Toshihiro Shimizu 890ddd
					m_userLog.error(err);
Toshihiro Shimizu 890ddd
					cerr << "Can't make directory" << endl;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			//Se sono nell'ultimo frame del livello salvo il livello cleanuppato
Toshihiro Shimizu 890ddd
			//in un file chiamato nome-unpainted (file di backup del cleanup).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/*- 保存先 -*/
Toshihiro Shimizu 890ddd
			TFilePath unpaintedLevelPath = actualTargetPath.getParentDir() + "nopaint\\" + TFilePath(targetPath.getName() + "_np." + targetPath.getType());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (TFileStatus(actualTargetPath).doesExist() && (!TFileStatus(unpaintedLevelPath).doesExist() || overwriteAllOption) /*- 全て上書きなら既存のNoPaintに上書きする -*/
Toshihiro Shimizu 890ddd
				&& xl) {
Toshihiro Shimizu 890ddd
				/*- GUI上でCleanupするときと同様に、Cleanup結果をコピーして作る -*/
Toshihiro Shimizu 890ddd
				TSystem::copyFile(unpaintedLevelPath, actualTargetPath);
Toshihiro Shimizu 890ddd
				/*- パレットのコピー -*/
Toshihiro Shimizu 890ddd
				TFilePath levelPalettePath = actualTargetPath.getParentDir() + TFilePath(actualTargetPath.getName() + ".tpl");
Toshihiro Shimizu 890ddd
				TFilePath unpaintedLevelPalettePath = levelPalettePath.getParentDir() + "nopaint\\" + TFilePath(levelPalettePath.getName() + "_np." + levelPalettePath.getType());
Toshihiro Shimizu 890ddd
				TSystem::copyFile(unpaintedLevelPalettePath, levelPalettePath);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		/*-- 再Cleanupの場合はXsheet上のパスをオリジナルのもの(NoPaintでないもの)に戻す --*/
Toshihiro Shimizu 890ddd
		else if (isReCleanup) {
Toshihiro Shimizu 890ddd
			xl->setPath(originalLevelPath);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- CleanupParamをGrobalに戻す -*/
Toshihiro Shimizu 890ddd
	restoreGlobalSettings(params);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*- CleanupSettingsからCleanupを行った場合はシーンの保存は行わない -*/
Toshihiro Shimizu 890ddd
	if (sourceFileIsCleanupSetting) {
Toshihiro Shimizu 890ddd
		std::cout << "Cleanup from Setting file completed" << std::endl;
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring wInfo = L"updating scene " + scene->getSceneName();
Toshihiro Shimizu 890ddd
	QString qInfo_ = QString::fromStdWString(wInfo);
Toshihiro Shimizu 890ddd
	string info = qInfo_.toStdString();
Toshihiro Shimizu 890ddd
	m_userLog.info(info);
Toshihiro Shimizu 890ddd
	cout << "updating scene " << scene->getSceneName() << endl;
Toshihiro Shimizu 890ddd
	/*- シーンを上書き保存 -*/
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		scene->save(fp);
Toshihiro Shimizu 890ddd
		TImageCache::instance()->clear(true);
Toshihiro Shimizu 890ddd
	} catch (...) {
Toshihiro Shimizu 890ddd
		wstring wErr = L"Can't save scene  " + fp.getWideName();
Toshihiro Shimizu 890ddd
		QString qErr = QString::fromStdWString(wErr);
Toshihiro Shimizu 890ddd
		string err = qErr.toStdString();
Toshihiro Shimizu 890ddd
		m_userLog.error(err);
Toshihiro Shimizu 890ddd
		cerr << "Can't save scene" << endl;
Toshihiro Shimizu 890ddd
		TImageCache::instance()->clear(true);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DVGui::MsgBox(INFORMATION, "Cleanup Done.");
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifdef BRAVO
Toshihiro Shimizu 890ddd
#ifdef BRAVODEMO
Toshihiro Shimizu 890ddd
const char *toonzVersion = "Bravo 7.1 (demo)";
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
const char *toonzVersion = "Bravo 7.1";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
const char *toonzVersion = "Toonz 7.1";
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
string getToonzVersion()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return toonzVersion;
Toshihiro Shimizu 890ddd
}