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); } } }
void DocumentCanvas::pan(double move_x, double move_y) { double pan_x=0.; double pan_y=0.; if (_cachedPainters.size() != 0) { LcPainter* p = _cachedPainters.begin()->second; p->getTranslate(&pan_x, &pan_y); } /* FIXME 100.0 should be dynamically calculated, depends on the drawing speed */ if (std::abs(pan_x-move_x) > 100.0 || std::abs(pan_y - move_y) > 100.0 || pan_x == 0.0 || pan_y == 0.0) { pan_x = move_x; pan_y = move_y; } for (auto i = _cachedPainters.begin(); i != _cachedPainters.end(); i++) { LcPainter* p = i->second; p->translate(move_x - pan_x, move_y - pan_y); } pan_x = move_x; pan_y = move_y; }