Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/planeviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/imageutils.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/stage.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
#include "tvectorgl.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Toshihiro Shimizu 890ddd
#include <qwheelevent></qwheelevent>
Toshihiro Shimizu 890ddd
#include <qresizeevent></qresizeevent>
Toshihiro Shimizu 890ddd
#include <qhideevent></qhideevent>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#define PRINT_AFF
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace  stuff
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct PlaneViewerZoomer : public ImageUtils::ShortcutZoomer {
Toshihiro Shimizu 890ddd
	PlaneViewerZoomer(PlaneViewer *planeViewer)
Toshihiro Shimizu 890ddd
		: ShortcutZoomer(planeViewer) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	virtual bool zoom(bool zoomin, bool resetZoom);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool PlaneViewerZoomer::zoom(bool zoomin, bool resetZoom)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	PlaneViewer &planeViewer = static_cast<planeviewer &="">(*getWidget());</planeviewer>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	resetZoom ? planeViewer.resetView() : zoomin ? planeViewer.zoomIn() : planeViewer.zoomOut();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PlaneViewer::PlaneViewer(QWidget *parent)
Toshihiro Shimizu 890ddd
	: QGLWidget(parent), m_firstResize(true), m_xpos(0), m_ypos(0), m_aff() // initialized at the first resize
Toshihiro Shimizu 890ddd
	  ,
Toshihiro Shimizu 890ddd
	  m_chessSize(40.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_zoomRange[0] = 1e-3, m_zoomRange[1] = 1024.0;
Toshihiro Shimizu 890ddd
	setBgColor(TPixel32(235, 235, 235), TPixel32(235, 235, 235));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::setZoomRange(double zoomMin, double zoomMax)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_zoomRange[0] = zoomMin, m_zoomRange[1] = zoomMax;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::setBgColor(const TPixel32 &color1, const TPixel32 &color2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_bgColorF[0] = color1.r / 255.0, m_bgColorF[1] = color1.g / 255.0, m_bgColorF[2] = color1.b / 255.0;
Toshihiro Shimizu 890ddd
	m_bgColorF[3] = color2.r / 255.0, m_bgColorF[4] = color2.g / 255.0, m_bgColorF[5] = color2.b / 255.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::getBgColor(TPixel32 &color1, TPixel32 &color2) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	color1.r = m_bgColorF[0] * 255.0, color1.g = m_bgColorF[1] * 255.0, color1.b = m_bgColorF[2] * 255.0;
Toshihiro Shimizu 890ddd
	color2.r = m_bgColorF[3] * 255.0, color2.g = m_bgColorF[4] * 255.0, color2.b = m_bgColorF[5] * 255.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::drawBackground()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glClearColor(m_bgColorF[0], m_bgColorF[1], m_bgColorF[2], 1.0);
Toshihiro Shimizu 890ddd
	glClear(GL_COLOR_BUFFER_BIT);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_bgColorF[0] != m_bgColorF[3] ||
Toshihiro Shimizu 890ddd
		m_bgColorF[1] != m_bgColorF[4] ||
Toshihiro Shimizu 890ddd
		m_bgColorF[2] != m_bgColorF[5]) {
Toshihiro Shimizu 890ddd
		//Cast the widget rect to world rect
Toshihiro Shimizu 890ddd
		TRectD rect(winToWorld(0, 0), winToWorld(width(), height()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//Deduce chess geometry
Toshihiro Shimizu 890ddd
		TRect chessRect(
Toshihiro Shimizu 890ddd
			tfloor(rect.x0 / m_chessSize), tfloor(rect.y0 / m_chessSize),
Toshihiro Shimizu 890ddd
			tceil(rect.x1 / m_chessSize), tceil(rect.y1 / m_chessSize));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//Draw chess squares
Toshihiro Shimizu 890ddd
		glColor3f(m_bgColorF[3], m_bgColorF[4], m_bgColorF[5]);
Toshihiro Shimizu 890ddd
		glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int x, y;
Toshihiro Shimizu 890ddd
		TPointD pos;
Toshihiro Shimizu 890ddd
		double chessSize2 = 2.0 * m_chessSize;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (y = chessRect.y0; y < chessRect.y1; ++y) {
Toshihiro Shimizu 890ddd
			pos.y = y * m_chessSize;
Toshihiro Shimizu 890ddd
			for (x = chessRect.x0 + ((chessRect.x0 + y) % 2), pos.x = x * m_chessSize;
Toshihiro Shimizu 890ddd
				 x < chessRect.x1;
Toshihiro Shimizu 890ddd
				 x += 2, pos.x += chessSize2) {
Toshihiro Shimizu 890ddd
				glVertex2d(pos.x, pos.y);
Toshihiro Shimizu 890ddd
				glVertex2d(pos.x + m_chessSize, pos.y);
Toshihiro Shimizu 890ddd
				glVertex2d(pos.x + m_chessSize, pos.y + m_chessSize);
Toshihiro Shimizu 890ddd
				glVertex2d(pos.x, pos.y + m_chessSize);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! The initMatrix() function is used to match the identity matrix with the widget reference,
Toshihiro Shimizu 890ddd
//! during widget size initialization.
Toshihiro Shimizu 890ddd
void PlaneViewer::initMatrix()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	makeCurrent();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glViewport(0, 0, width(), height());
Toshihiro Shimizu 890ddd
	glMatrixMode(GL_PROJECTION);
Toshihiro Shimizu 890ddd
	glLoadIdentity();
Toshihiro Shimizu 890ddd
	gluOrtho2D(0, width(), 0, height());
Toshihiro Shimizu 890ddd
	glMatrixMode(GL_MODELVIEW);
Toshihiro Shimizu 890ddd
	glLoadIdentity();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	doneCurrent();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::resizeEvent(QResizeEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	initMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const QSize &oldSize = event->oldSize(), &size = event->size();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_firstResize) {
Toshihiro Shimizu 890ddd
		m_firstResize = false;
Toshihiro Shimizu 890ddd
		m_aff = TTranslation(0.5 * size.width(), 0.5 * size.height());
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		TPointD oldCenter(oldSize.width() * 0.5, oldSize.height() * 0.5);
Toshihiro Shimizu 890ddd
		TPointD newCenter(size.width() * 0.5, size.height() * 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_aff = m_aff.place(m_aff.inv() * oldCenter, newCenter);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::mouseMoveEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (event->buttons() & Qt::MidButton)
Toshihiro Shimizu 890ddd
		moveView(event->x() - m_xpos, height() - event->y() - m_ypos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_xpos = event->x(), m_ypos = height() - event->y();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::mousePressEvent(QMouseEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_xpos = event->x(), m_ypos = height() - event->y();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::wheelEvent(QWheelEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD pos(event->x(), height() - event->y());
Toshihiro Shimizu 890ddd
	double zoom_par = 1 + event->delta() * 0.001;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	zoomView(pos.x, pos.y, zoom_par);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::keyPressEvent(QKeyEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (PlaneViewerZoomer(this).exec(event))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QGLWidget::keyPressEvent(event);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Disposes of the auxiliary internal rasterBuffer().
Toshihiro Shimizu 890ddd
void PlaneViewer::hideEvent(QHideEvent *event)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_rasterBuffer = TRaster32P();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::resetView()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_aff = TTranslation(0.5 * width(), 0.5 * height());
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::setViewPos(double x, double y)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_aff.a13 = x, m_aff.a23 = y;
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef PRINT_AFF
Toshihiro Shimizu 890ddd
	qDebug("zoom = %.4f;  pos = %.4f, %.4f", m_aff.a11, m_aff.a13, m_aff.a23);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::setViewZoom(double x, double y, double zoom)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	zoom = tcrop(zoom, m_zoomRange[0], m_zoomRange[1]);
Toshihiro Shimizu 890ddd
	double delta = zoom / m_aff.a11;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_aff.a13 = x + delta * (m_aff.a13 - x);
Toshihiro Shimizu 890ddd
	m_aff.a23 = y + delta * (m_aff.a23 - y);
Toshihiro Shimizu 890ddd
	m_aff.a11 = m_aff.a22 = zoom;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef PRINT_AFF
Toshihiro Shimizu 890ddd
	qDebug("zoom = %.4f;  pos = %.4f, %.4f", m_aff.a11, m_aff.a13, m_aff.a23);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::zoomIn()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setViewZoom(ImageUtils::getQuantizedZoomFactor(m_aff.a11, true));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::zoomOut()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setViewZoom(ImageUtils::getQuantizedZoomFactor(m_aff.a11, false));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::pushGLWorldCoordinates()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_matrix[0] = m_aff.a11;
Toshihiro Shimizu 890ddd
	m_matrix[4] = m_aff.a12;
Toshihiro Shimizu 890ddd
	m_matrix[12] = m_aff.a13;
Toshihiro Shimizu 890ddd
	m_matrix[1] = m_aff.a21;
Toshihiro Shimizu 890ddd
	m_matrix[5] = m_aff.a22;
Toshihiro Shimizu 890ddd
	m_matrix[13] = m_aff.a23;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_matrix[2] = m_matrix[3] = m_matrix[6] = m_matrix[7] = m_matrix[8] = m_matrix[9] =
Toshihiro Shimizu 890ddd
		m_matrix[10] = m_matrix[11] = m_matrix[14] = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_matrix[15] = 1.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glLoadMatrixd(m_matrix); //(GLdouble*) &m_matrix
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::pushGLWinCoordinates()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glLoadIdentity();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::popGLCoordinates()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TRaster32P PlaneViewer::rasterBuffer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_rasterBuffer || m_rasterBuffer->getLx() != width() || m_rasterBuffer->getLy() != height())
Toshihiro Shimizu 890ddd
		m_rasterBuffer = TRaster32P(width(), height());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return m_rasterBuffer;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::flushRasterBuffer()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_rasterBuffer);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
Toshihiro Shimizu 890ddd
	glRasterPos2d(0, 0);
Toshihiro Shimizu 890ddd
	glDrawPixels(width(), height(),
Toshihiro Shimizu 890ddd
				 TGL_FMT, TGL_TYPE, m_rasterBuffer->getRawData());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::draw(TRasterP ras, double dpiX, double dpiY, TPalette *pal)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD rasCenter(ras->getCenterD());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P aux(rasterBuffer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	aux->lock();
Toshihiro Shimizu 890ddd
	ras->lock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glGetDoublev(GL_MODELVIEW_MATRIX, m_matrix);
Toshihiro Shimizu 890ddd
	TAffine viewAff(
Toshihiro Shimizu 890ddd
		m_matrix[0], m_matrix[4], m_matrix[12],
Toshihiro Shimizu 890ddd
		m_matrix[1], m_matrix[5], m_matrix[13]);
Toshihiro Shimizu 890ddd
	viewAff = viewAff * TScale(Stage::inch / dpiX, Stage::inch / dpiY) * TTranslation(-rasCenter);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	pushGLWinCoordinates();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	aux->clear();
Toshihiro Shimizu 890ddd
	if (pal)
Toshihiro Shimizu 890ddd
		TRop::quickPut(aux, (TRasterCM32P)ras, pal, viewAff);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		TRop::quickPut(aux, ras, viewAff);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flushRasterBuffer();
Toshihiro Shimizu 890ddd
	popGLCoordinates();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*NOTE:
Toshihiro Shimizu 890ddd
    glRasterPos2d could be used, along glBitmap and glPixelZoom...
Toshihiro Shimizu 890ddd
    however, i've never been able to use them effectively...
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::draw(TRasterImageP ri)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double dpiX, dpiY;
Toshihiro Shimizu 890ddd
	ri->getDpi(dpiX, dpiY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (dpiX == 0.0 || dpiY == 0.0)
Toshihiro Shimizu 890ddd
		dpiX = dpiY = Stage::inch;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	draw(ri->getRaster(), dpiX, dpiY);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::draw(TToonzImageP ti)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double dpiX, dpiY;
Toshihiro Shimizu 890ddd
	ti->getDpi(dpiX, dpiY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (dpiX == 0.0 || dpiY == 0.0)
Toshihiro Shimizu 890ddd
		dpiX = dpiY = Stage::inch;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	draw(ti->getRaster(), dpiX, dpiY, ti->getPalette());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::draw(TVectorImageP vi)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(vi->getBBox());
Toshihiro Shimizu 890ddd
	TRect bboxI(tfloor(bbox.x0), tfloor(bbox.y0), tceil(bbox.x1) - 1, tceil(bbox.y1) - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TVectorRenderData rd(TAffine(), bboxI, vi->getPalette(), 0, true, true);
Toshihiro Shimizu 890ddd
	tglDraw(rd, vi.getPointer());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void PlaneViewer::draw(TImageP img)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRasterImageP ri(img);
Toshihiro Shimizu 890ddd
		if (ri) {
Toshihiro Shimizu 890ddd
			draw(ri);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TToonzImageP ti(img);
Toshihiro Shimizu 890ddd
		if (ti) {
Toshihiro Shimizu 890ddd
			draw(ti);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TVectorImageP vi(img);
Toshihiro Shimizu 890ddd
		if (vi) {
Toshihiro Shimizu 890ddd
			draw(vi);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}