Working scale and zoom
This commit is contained in:
+110
-8
@@ -6,6 +6,25 @@
|
||||
#include <QOpenGLPixelTransferOptions>
|
||||
#include <QGridLayout>
|
||||
|
||||
void setScrollRange(QScrollBar *scrollBar, int newRange)
|
||||
{
|
||||
int page = scrollBar->pageStep();
|
||||
int pos = scrollBar->value() + page/2;
|
||||
int range = scrollBar->maximum() + page;
|
||||
float relPos = (float)pos/(float)range;
|
||||
|
||||
scrollBar->setRange(0, newRange - page);
|
||||
scrollBar->setValue(relPos*newRange - page/2);
|
||||
}
|
||||
|
||||
void setRelativePos(QScrollBar *scrollBar, float relPos)
|
||||
{
|
||||
int page = scrollBar->pageStep();
|
||||
int pos = scrollBar->value()+page/2;
|
||||
int range = scrollBar->maximum()+page;
|
||||
scrollBar->setValue(pos);
|
||||
}
|
||||
|
||||
ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
|
||||
{
|
||||
setFocusPolicy(Qt::ClickFocus);
|
||||
@@ -13,6 +32,8 @@ ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
|
||||
m_low = 0;
|
||||
m_high = 1;
|
||||
m_dx = m_dy = 0;
|
||||
m_scale = 1.0f;
|
||||
m_blockRepaint = false;
|
||||
}
|
||||
|
||||
ImageWidget::~ImageWidget()
|
||||
@@ -60,32 +81,64 @@ void ImageWidget::setImage(const QPixmap &pixmap)
|
||||
repaint();
|
||||
}
|
||||
|
||||
void ImageWidget::setScale(float scale)
|
||||
{
|
||||
m_scale = scale;
|
||||
update();
|
||||
}
|
||||
|
||||
void ImageWidget::blockRepaint(bool block)
|
||||
{
|
||||
m_blockRepaint = block;
|
||||
if(!block)update();
|
||||
}
|
||||
|
||||
void ImageWidget::setLow(int low)
|
||||
{
|
||||
m_low = low/m_range;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void ImageWidget::setHigh(int high)
|
||||
{
|
||||
m_high = high/m_range;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void ImageWidget::setStrech(int stretch)
|
||||
{
|
||||
m_stretch = stretch;
|
||||
update();
|
||||
}
|
||||
|
||||
void ImageWidget::setOffset(int dx, int dy)
|
||||
{
|
||||
m_dx = dx;
|
||||
m_dy = dy;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void ImageWidget::paintGL()
|
||||
{
|
||||
if(m_blockRepaint)return;
|
||||
qDebug() << "PAINT";
|
||||
|
||||
float dx = m_dx;
|
||||
float dy = m_dy;
|
||||
qDebug() << "dxy" << dx << dy;
|
||||
if(width() > m_image->width()*m_scale)
|
||||
dx = -width()*0.5f + m_image->width()*m_scale*0.5f;
|
||||
if(height() > m_image->height()*m_scale)
|
||||
dy = -height()*0.5f + m_image->height()*m_scale*0.5f;
|
||||
|
||||
float s = 1.0f/(m_high-m_low);
|
||||
m_program->bind();
|
||||
m_program->setUniformValue("scale", s, -m_low*s);
|
||||
m_program->setUniformValue("viewport", (float)width(), (float)height());
|
||||
m_program->setUniformValue("offset", m_dx, m_dy);
|
||||
m_program->setUniformValue("offset", dx, dy);
|
||||
m_program->setUniformValue("stretch", m_stretch);
|
||||
m_program->setUniformValue("a", 0.1f);
|
||||
m_program->setUniformValue("zoom", 1.0f/m_scale);
|
||||
|
||||
m_image->bind(0);
|
||||
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
@@ -149,7 +202,8 @@ void ImageWidget::initializeGL()
|
||||
m_program->setUniformValue("qt_Texture0", (GLuint)0);
|
||||
m_program->setUniformValue("scale", 1.0f, 0.0f);
|
||||
|
||||
m_image = std::unique_ptr<QOpenGLTexture>(new QOpenGLTexture(QImage("/home/nou/Obrázky/1p6yap.jpg")));
|
||||
m_image = std::unique_ptr<QOpenGLTexture>(new QOpenGLTexture(QOpenGLTexture::Target2D));
|
||||
m_image->allocateStorage();
|
||||
m_image->bind(0);
|
||||
m_image->setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
|
||||
m_image->setMagnificationFilter(QOpenGLTexture::Linear);
|
||||
@@ -167,6 +221,7 @@ ImageScrollAreaGL::ImageScrollAreaGL(QWidget *parent)
|
||||
|
||||
m_verticalScrollBar = new QScrollBar(Qt::Vertical, this);
|
||||
m_horizontalScrollBar = new QScrollBar(Qt::Horizontal, this);
|
||||
m_scale = 1.0f;
|
||||
|
||||
layout->setSpacing(0);
|
||||
layout->addWidget(m_imageWidget, 0, 0);
|
||||
@@ -203,10 +258,18 @@ ImageWidget *ImageScrollAreaGL::imageWidget()
|
||||
return m_imageWidget;
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::updateScrollbars()
|
||||
void ImageScrollAreaGL::updateScrollbars(bool zoom)
|
||||
{
|
||||
m_verticalScrollBar->setRange(0, m_imgHeight-m_verticalScrollBar->pageStep());
|
||||
m_horizontalScrollBar->setRange(0, m_imgWidth-m_horizontalScrollBar->pageStep());
|
||||
if(zoom)
|
||||
{
|
||||
setScrollRange(m_verticalScrollBar, m_imgHeight*m_scale);
|
||||
setScrollRange(m_horizontalScrollBar, m_imgWidth*m_scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_verticalScrollBar->setRange(0, m_imgHeight*m_scale - m_verticalScrollBar->pageStep());
|
||||
m_horizontalScrollBar->setRange(0, m_imgWidth*m_scale - m_horizontalScrollBar->pageStep());
|
||||
}
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::resizeEvent(QResizeEvent *event)
|
||||
@@ -231,6 +294,45 @@ void ImageScrollAreaGL::mousePressEvent(QMouseEvent *event)
|
||||
m_lastPos = event->pos();
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
if(event->angleDelta().y() > 0)
|
||||
zoomIn();
|
||||
else
|
||||
zoomOut();
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::zoomIn()
|
||||
{
|
||||
if(m_scale >= 8.0f)return;
|
||||
m_scale += 0.1f;
|
||||
m_imageWidget->blockRepaint(true);
|
||||
m_imageWidget->setScale(m_scale);
|
||||
updateScrollbars(true);
|
||||
m_imageWidget->blockRepaint(false);
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::zoomOut()
|
||||
{
|
||||
if(m_scale <= 0.1f)return;
|
||||
m_scale -= 0.1f;
|
||||
m_imageWidget->blockRepaint(true);
|
||||
m_imageWidget->setScale(m_scale);
|
||||
updateScrollbars(true);
|
||||
m_imageWidget->blockRepaint(false);
|
||||
//m_imageWidget->repaint();
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::bestFit()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::oneToOne()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ImageScrollAreaGL::scrollEvent()
|
||||
{
|
||||
qDebug() << m_horizontalScrollBar->value() << m_verticalScrollBar->value();
|
||||
|
||||
Reference in New Issue
Block a user