| |
| |
| #include "toonz/dpiscale.h" |
| #include "toonz/levelproperties.h" |
| #include "toonz/toonzscene.h" |
| #include "toonz/txsheet.h" |
| #include "toonz/txshcell.h" |
| #include "toonz/txshsimplelevel.h" |
| #include "toonz/tcamera.h" |
| #include "toonz/txshleveltypes.h" |
| #include "toonz/stage.h" |
| |
| #include "timagecache.h" |
| #include "trasterimage.h" |
| #include "ttoonzimage.h" |
| |
| |
| |
| TAffine getDpiAffine(TXshSimpleLevel *level, |
| const TFrameId &fid, |
| bool forceFullSampling) |
| { |
| const double factor = Stage::inch; |
| |
| if (level->getType() == PLI_XSHLEVEL) |
| return TAffine(); |
| LevelProperties *prop = level->getProperties(); |
| TAffine aff; |
| |
| string imageId = level->getImageId(fid); |
| int frameStatus = level->getFrameStatus(fid); |
| if (frameStatus & TXshSimpleLevel::CleanupPreview) { |
| TRasterImageP ri = TImageCache::instance()->get(imageId, false); |
| if (ri) { |
| double dpix = 0, dpiy = 0; |
| ri->getDpi(dpix, dpiy); |
| if (dpix != 0.0 && dpiy != 0.0) |
| return TScale(factor / dpix, factor / dpiy); |
| } |
| } |
| |
| int subs = prop->getSubsampling(); |
| if (level->getType() != PLI_XSHLEVEL) { |
| TPointD dpi = level->getDpi(fid); |
| if (dpi.x != 0 && dpi.y != 0) |
| aff = TScale(factor / dpi.x, factor / dpi.y); |
| |
| if (!forceFullSampling) |
| TImageCache::instance()->getSubsampling(imageId, subs); |
| } |
| |
| if (subs != 1 && !forceFullSampling) |
| aff = TScale(subs) * aff; |
| |
| return aff; |
| } |
| |
| |
| |
| TAffine getDpiAffine(TCamera *camera) |
| { |
| const double factor = Stage::inch; |
| |
| TDimensionD size = camera->getSize(); |
| TDimension res = camera->getRes(); |
| double sx = factor * size.lx / res.lx; |
| double sy = factor * size.ly / res.ly; |
| return TScale(sx, sy); |
| } |
| |
| |
| |
| TPointD getCurrentDpiScale(TXshSimpleLevel *sl, const TFrameId &fid) |
| { |
| TAffine aff = getDpiAffine(sl, fid); |
| if ((sl->getType() == TZP_XSHLEVEL || sl->getType() == OVL_XSHLEVEL) && sl->getProperties()->getSubsampling() > 1) { |
| int subs = sl->getProperties()->getSubsampling(); |
| TImageP img = TImageCache::instance()->get(sl->getImageId(fid), false); |
| TToonzImageP ti(img); |
| TRasterImageP ri(img); |
| if (ti) |
| subs = ti->getSubsampling(); |
| else if (ri) |
| subs = ri->getSubsampling(); |
| double f = 1.0 / subs; |
| return aff * TPointD(f, f); |
| } else |
| return aff * TPointD(1, 1); |
| } |
| |
| |
| |
| |
| |
| |
| #ifdef FORSE_OBSOLETO |
| |
| double getCurrentCameraStandDpi() |
| { |
| const double defaultDpi = 100; |
| TApplication *app = TApplication::instance(); |
| if (app->isEditingLevelFrame()) { |
| TXshSimpleLevel *sl = app->getCurrentLevel() ? app->getCurrentLevel()->getSimpleLevel() : 0; |
| if (sl) { |
| double dpi = sl->getDpi().x; |
| return dpi > 0.0 ? dpi : defaultDpi; |
| return sl->getDpi().x; |
| } else |
| return defaultDpi; |
| } else { |
| ToonzScene *scene = app->getCurrentScene(); |
| TCamera *camera = scene->getCurrentCamera(); |
| |
| TDimensionD size = camera->getSize(); |
| TDimension res = camera->getRes(); |
| assert(size.lx > 0); |
| if (size.lx > 0) |
| return res.lx / size.lx; |
| else |
| return defaultDpi; |
| } |
| } |
| |
| #endif |
| |