예제 #1
0
void MeshifyPopup::acquirePreview()
{
	m_viewer->clear();

	// Assign preview input to the viewer
	bool enabled = false;

	::xshPos(m_r, m_c);
	m_cell = TApp::instance()->getCurrentXsheet()->getXsheet()->getCell(m_r, m_c);

	// Redirect mesh case to texture
	TXshSimpleLevel *sl = m_cell.getSimpleLevel();
	if (sl && sl->getType() == MESH_XSHLEVEL) {
		// Mesh image case
		TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
		TStageObject *meshObj = xsh->getStageObject(TStageObjectId::ColumnId(m_c));

		const TStageObjectId &childId = ::firstChildLevelColumn(*xsh, *meshObj);
		if (childId.isColumn())
			// Retrieved the associated texture cell - redirect acquisition there
			m_cell = xsh->getCell(m_r, childId.getIndex());
	}

	if ((sl = m_cell.getSimpleLevel())) {
		// Standard image case
		m_viewer->m_img = sl->getFullsampledFrame(m_cell.getFrameId(), ImageManager::dontPutInCache);

		enabled = true;
	} else if (TXshChildLevel *cl = m_cell.getChildLevel()) {
		// Sub-xsheet case
		TXsheet *xsh = cl->getXsheet();
		int row = m_cell.getFrameId().getNumber() - 1;

		m_viewer->m_xsh = xsh, m_viewer->m_row = row;

		enabled = true;
	}

	m_okBtn->setEnabled(enabled);

	// Update the corresponding processed image in the viewer
	updateMeshPreview();
}
int Vectorizer::doVectorize()
{
	struct {
		Vectorizer *m_this;

		CenterlineConfiguration m_cConf;
		NewOutlineConfiguration m_oConf;

		void updateConfig(double weight)
		{
			if (m_this->m_params.m_isOutline)
				m_oConf = m_this->m_params.getOutlineConfiguration(weight);
			else
				m_cConf = m_this->m_params.getCenterlineConfiguration(weight);
		}

	} locals = {this};

	VectorizerConfiguration &configuration = m_params.m_isOutline ? static_cast<VectorizerConfiguration &>(locals.m_oConf) : static_cast<VectorizerConfiguration &>(locals.m_cConf);

	if (!m_vLevel)
		return 0;

	if (m_dialog->getChoice() == OverwriteDialog::KEEP_OLD && m_dialogShown)
		return m_fids.size();

	TXshSimpleLevel *sl = m_level.getPointer();
	if (!sl)
		return 0;

	int rowCount = sl->getFrameCount();
	if (rowCount <= 0 || sl->isEmpty())
		return 0;

	double frameRange[2] = {static_cast<double>(m_fids.front().getNumber()) - 1, static_cast<double>(m_fids.back().getNumber()) - 1};

	int count = 0;

	std::vector<TFrameId>::const_iterator ft, fEnd = m_fids.end();
	for (ft = m_fids.begin(); ft != fEnd; ++ft) {
		// Retrieve the image to be vectorized
		TImageP img;
		if (sl->getType() == OVL_XSHLEVEL ||
			sl->getType() == TZP_XSHLEVEL ||
			sl->getType() == TZI_XSHLEVEL)
			img = sl->getFullsampledFrame(*ft, ImageManager::dontPutInCache);

		if (!img)
			continue;

		// Build image-toonz coordinate transformation
		TAffine dpiAff = getDpiAffine(sl, *ft, true);
		double factor = norm(dpiAff * TPointD(1, 0));

		TPointD center;
		if (TToonzImageP ti = img)
			center = ti->getRaster()->getCenterD();
		else if (TRasterImageP ri = img)
			center = ri->getRaster()->getCenterD();

		// Build vectorizer configuration
		double weight = (ft->getNumber() - 1 - frameRange[0]) / tmax(frameRange[1] - frameRange[0], 1.0);
		weight = tcrop(weight, 0.0, 1.0);

		locals.updateConfig(weight); // TEMPORARY

		configuration.m_affine = dpiAff * TTranslation(-center);
		configuration.m_thickScale = factor;

		// Build vectorization label to be displayed
		QString labelName = QString::fromStdWString(sl->getShortName());
		labelName.push_back(' ');
		labelName.append(QString::fromStdString(ft->expand(TFrameId::NO_PAD)));

		emit frameName(labelName);

		// Perform vectorization
		if (TVectorImageP vi = doVectorize(img, m_vLevel->getPalette(), configuration)) {
			TFrameId fid = *ft;

			if (fid.getNumber() < 0)
				fid = TFrameId(1, ft->getLetter());

			m_vLevel->setFrame(fid, vi);
			vi->setPalette(m_vLevel->getPalette());

			emit frameDone(++count);
		}

		// Stop if canceled
		if (m_isCanceled)
			break;
	}

	m_dialogShown = false;

	return count;
}