如何解决gtkmm + cairo + 大尺寸图像
我在 Gtk::DrawingArea 上绘制了一个 4k 图像,使用 cairo 并添加了一些通过鼠标移动该图像的功能。我看到滞后......我做错了什么吗?或 cairo 不适合显示大图片。
class CanvasArea : public Gtk::DrawingArea {
CanvasArea() {
image = Gdk::Pixbuf::create_from_file("cat4k.png");
redrawThread = new std::thread([this] {
doRedrawing();
});
refreshDrawingDispatcher.connect(sigc::mem_fun(*this,&CanvasArea::refreshDrawing));
}
virtual ~CanvasArea() {
keepReDrawing = false;
redrawThread->join();
delete redrawThread;
}
protected:
bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override;
bool on_scroll_event(GdkEventScroll* event) override;
bool on_button_press_event(GdkEventButton* event) override;
private:
void doRedrawing() {
using namespace std::chrono_literals;
while (keepReDrawing) {
refreshDrawingDispatcher.emit();
std::this_thread::sleep_for(50ms);
}
}
void refreshDrawing() {
queue_draw();
}
private:
bool keepReDrawing{true};
std::thread* redrawThread;
Glib::Dispatcher refreshDrawingDispatcher;
Glib::RefPtr<Gdk::Pixbuf> image;
};
UPD:我忘记补充一点,我在 CanvasArea::on_draw 中通过鼠标滚轮缩放 cairo 矩阵
Cairo::Matrix matrix(1.0,0.0,1.0,0.0);
matrix.scale(mScale,mScale);
matrix.translate(mShift.x/mScale,mShift.y/mScale);
cr->transform(matrix);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。