void DocumentCanvas::zoom(double factor, bool relativezoom, double userCenterX, double userCenterY, unsigned int deviceX, unsigned int deviceY) { LcPainter &painter = cachedPainter(VIEWER_DOCUMENT); if ((_zoomMax <= painter.scale() && factor > 1.) || (_zoomMin >= painter.scale() && factor < 1.)) { return; } if (relativezoom) { factor = factor * painter.scale(); } // Calculate reference device offset at device location painter.save(); double refX = deviceX; double refY = deviceY; painter.reset_transformations(); painter.scale(factor); painter.device_to_user(&refX, &refY); painter.restore(); // Set translation for (auto i = _cachedPainters.begin(); i != _cachedPainters.end(); i++) { LcPainter *p = i->second; p->reset_transformations(); p->scale(factor); p->translate(refX - userCenterX,-refY + userCenterY); } }
LcPainter& DocumentCanvas::cachedPainter(PainterCacheType cacheType) { double s = 1.; double x = 0.; double y = 0.; if (_cachedPainters.size() != 0) { LcPainter* p = _cachedPainters.begin()->second; s = p->scale(); p->getTranslate(&x, &y); } if (_cachedPainters.count(cacheType) == 0) { _cachedPainters[cacheType] = _createPainterFunctor(_deviceWidth, _deviceHeight); _cachedPainters[cacheType]->scale(s); _cachedPainters[cacheType]->translate(x, y); } return *_cachedPainters[cacheType]; }
void DocumentCanvas::newDeviceSize(unsigned int width, unsigned int height) { if (_deviceWidth!=width && _deviceHeight!=height) { _deviceWidth = width; _deviceHeight = height; double s = 1.; double x = 0.; double y = 0.; if (_cachedPainters.size() != 0) { LcPainter* p = _cachedPainters.begin()->second; s = p->scale(); p->getTranslate(&x, &y); } for (auto i = _cachedPainters.begin(); i != _cachedPainters.end(); i++) { _deletePainterFunctor(i->second); _cachedPainters[i->first] = _createPainterFunctor(_deviceWidth, _deviceHeight); _cachedPainters[i->first]->scale(s); _cachedPainters[i->first]->translate(x, y); } } }