| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| namespace TScriptBinding { |
| |
| Rasterizer::Rasterizer() |
| : m_colorMapped(false) |
| , m_xres(720) |
| , m_yres(576) |
| , m_dpi(72) |
| , m_antialiasing(true) {} |
| |
| Rasterizer::~Rasterizer() {} |
| |
| QScriptValue Rasterizer::toString() { return "Rasterizer"; } |
| |
| QScriptValue Rasterizer::ctor(QScriptContext *context, QScriptEngine *engine) { |
| return create(engine, new Rasterizer()); |
| } |
| |
| static TToonzImageP vectorToToonzRaster(const TVectorImageP &vi, |
| const TDimension &size, |
| const TAffine &aff, |
| const TPointD &dpi) { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| TToonzImageP ti = ToonzImageUtils::vectorToToonzImage( |
| vi, aff, vi->getPalette(), TPointD(0, 0), size, 0, true); |
| ti->setPalette(vi->getPalette()); |
| return ti; |
| } |
| |
| static TImageP renderVectorImage(TOfflineGL *glContext, |
| const TVectorRenderData &rd, |
| const TPointD &dpi, const TImageP &img, |
| const TPixel32 &color) { |
| glContext->clear(color); |
| glContext->draw(img, rd); |
| TRasterImageP rimg(glContext->getRaster()); |
| rimg->setDpi(dpi.x, dpi.y); |
| return rimg; |
| } |
| |
| static void setFrame(QScriptEngine *engine, QScriptValue &level, |
| const TFrameId &fid, const TImageP &drawing) { |
| QScriptValueList args; |
| args << QString::fromStdString(fid.expand()) |
| << Wrapper::create(engine, new Image(drawing.getPointer())); |
| level.property("setFrame").call(level, args); |
| } |
| |
| Q_INVOKABLE QScriptValue Rasterizer::rasterize(QScriptValue arg) { |
| Image *img = qscriptvalue_cast<Image *>(arg); |
| Level *level = qscriptvalue_cast<Level *>(arg); |
| TPalette *palette = 0; |
| if (img) { |
| if (img->getType() != "Vector") |
| return context()->throwError( |
| tr("Expected a vector image: %1").arg(arg.toString())); |
| palette = !!img->getImg() ? img->getImg()->getPalette() : 0; |
| } else if (level) { |
| if (level->getType() != "Vector") |
| return context()->throwError( |
| tr("Expected a vector level: %1").arg(arg.toString())); |
| palette = |
| level->getSimpleLevel() ? level->getSimpleLevel()->getPalette() : 0; |
| } else { |
| return context()->throwError( |
| tr("Argument must be a vector level or image : ").arg(arg.toString())); |
| } |
| if (!palette) { |
| return context()->throwError(tr("%1 has no palette").arg(arg.toString())); |
| } |
| |
| TDimension res(m_xres, m_yres); |
| TCamera camera; |
| camera.setRes(res); |
| camera.setSize(TDimensionD(m_xres / m_dpi, m_yres / m_dpi)); |
| TPointD dpi = camera.getDpi(); |
| TAffine aff = camera.getStageToCameraRef(); |
| |
| QScriptValue result; |
| int n = 0; |
| TXshSimpleLevel *sl = 0; |
| if (level) { |
| result = create(engine(), new Level()); |
| n = level->getFrameCount(); |
| sl = level->getSimpleLevel(); |
| } |
| |
| if (m_colorMapped) { |
| |
| if (img) { |
| TImageP outImg = vectorToToonzRaster(img->getImg(), res, aff, dpi); |
| result = create(engine(), new Image(outImg)); |
| } else { |
| for (int i = 0; i < n; i++) { |
| TFrameId fid = sl->index2fid(i); |
| TImageP drawing = sl->getFrame(fid, false); |
| TImageP outImg = vectorToToonzRaster(drawing, res, aff, dpi); |
| setFrame(engine(), result, fid, outImg); |
| } |
| } |
| } else { |
| |
| TPixel32 bgColor = TPixel32::White; |
| |
| TOfflineGL *glContext = new TOfflineGL(res); |
| glContext->makeCurrent(); |
| |
| TVectorRenderData rd(TVectorRenderData::ProductionSettings(), aff, TRect(), |
| palette); |
| rd.m_antiAliasing = m_antialiasing; |
| |
| if (img) { |
| TImageP outImg = |
| renderVectorImage(glContext, rd, dpi, img->getImg(), bgColor); |
| result = create(engine(), new Image(outImg)); |
| } else { |
| for (int i = 0; i < n; i++) { |
| TFrameId fid = sl->index2fid(i); |
| TImageP drawing = sl->getFrame(fid, false); |
| glContext->clear(TPixel32::White); |
| TImageP outImg = |
| renderVectorImage(glContext, rd, dpi, drawing, bgColor); |
| setFrame(engine(), result, fid, outImg); |
| } |
| } |
| delete glContext; |
| } |
| |
| return result; |
| } |
| |
| bool Rasterizer::getColorMapped() const { return m_colorMapped; } |
| |
| void Rasterizer::setColorMapped(bool v) { m_colorMapped = v; } |
| |
| int Rasterizer::getXRes() const { return m_xres; } |
| |
| void Rasterizer::setXRes(int v) { m_xres = v; } |
| |
| int Rasterizer::getYRes() const { return m_yres; } |
| |
| void Rasterizer::setYRes(int v) { m_yres = v; } |
| |
| double Rasterizer::getDpi() const { return m_dpi; } |
| |
| void Rasterizer::setDpi(double v) { m_dpi = v; } |
| |
| } |
| |