Browse Source

ImageKnob updates, get rid of glDrawPixels

gh-pages
falkTX 9 years ago
parent
commit
761d966e72
2 changed files with 44 additions and 62 deletions
  1. +1
    -0
      dgl/ImageKnob.hpp
  2. +43
    -62
      dgl/src/ImageKnob.cpp

+ 1
- 0
dgl/ImageKnob.hpp View File

@@ -92,6 +92,7 @@ private:
int fImgLayerCount;
Rectangle<int> fKnobArea;
GLuint fTextureId;
bool fIsReady;

float _logscale(float value) const;
float _invlogscale(float value) const;


+ 43
- 62
dgl/src/ImageKnob.cpp View File

@@ -44,8 +44,10 @@ ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation
fImgLayerSize(fIsImgVertical ? image.getWidth() : image.getHeight()),
fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerSize : image.getWidth()/fImgLayerSize),
fKnobArea(0, 0, fImgLayerSize, fImgLayerSize),
fTextureId(0)
fTextureId(0),
fIsReady(false)
{
glGenTextures(1, &fTextureId);
setSize(fImgLayerSize, fImgLayerSize);
}

@@ -71,8 +73,10 @@ ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation
fImgLayerSize(fIsImgVertical ? image.getWidth() : image.getHeight()),
fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerSize : image.getWidth()/fImgLayerSize),
fKnobArea(0, 0, fImgLayerSize, fImgLayerSize),
fTextureId(0)
fTextureId(0),
fIsReady(false)
{
glGenTextures(1, &fTextureId);
setSize(fImgLayerSize, fImgLayerSize);
}

@@ -98,22 +102,20 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob)
fImgLayerSize(imageKnob.fImgLayerSize),
fImgLayerCount(imageKnob.fImgLayerCount),
fKnobArea(imageKnob.fKnobArea),
fTextureId(0)
fTextureId(0),
fIsReady(false)
{
glGenTextures(1, &fTextureId);
setSize(fImgLayerSize, fImgLayerSize);

if (fRotationAngle != 0)
{
// force new texture creation
fRotationAngle = 0;
setRotationAngle(imageKnob.fRotationAngle);
}
}

ImageKnob::~ImageKnob()
{
// delete old texture
setRotationAngle(0);
if (fTextureId != 0)
{
glDeleteTextures(1, &fTextureId);
fTextureId = 0;
}
}

int ImageKnob::getId() const noexcept
@@ -185,6 +187,9 @@ void ImageKnob::setValue(float value, bool sendCallback) noexcept
if (fStep == 0.0f)
fValueTmp = value;

if (fRotationAngle == 0)
fIsReady = false;

repaint();

if (sendCallback && fCallback != nullptr)
@@ -218,25 +223,19 @@ void ImageKnob::setRotationAngle(int angle)
if (fRotationAngle == angle)
return;

if (fRotationAngle != 0)
{
// delete old texture
glDeleteTextures(1, &fTextureId);
fTextureId = 0;
}

fRotationAngle = angle;
fIsReady = false;
}

if (angle != 0)
{
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &fTextureId);
glBindTexture(GL_TEXTURE_2D, fTextureId);
void ImageKnob::onDisplay()
{
const float normValue = (fUsingLog ? _invlogscale(fValue) : fValue - fMinimum) / (fMaximum - fMinimum);

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, fImage.getFormat(), fImage.getType(), fImage.getRawData());
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fTextureId);

if (! fIsReady)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
@@ -245,32 +244,24 @@ void ImageKnob::setRotationAngle(int angle)
static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans);

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
}
}

void ImageKnob::onDisplay()
{
const float normValue = (fUsingLog ? _invlogscale(fValue) : fValue - fMinimum) / (fMaximum - fMinimum);

if (fRotationAngle != 0)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fTextureId);

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, fImage.getFormat(), fImage.getType(), fImage.getRawData());

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
int imageDataOffset = 0;

static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f };
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans);
if (fRotationAngle == 0)
{
int layerDataSize = fImgLayerSize * fImgLayerSize * ((fImage.getFormat() == GL_BGRA || fImage.getFormat() == GL_RGBA) ? 4 : 3);
imageDataOffset = layerDataSize * int(normValue * float(fImgLayerCount-1));
}

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, fImage.getFormat(), fImage.getType(), fImage.getRawData() + imageDataOffset);

fIsReady = true;
}

if (fRotationAngle != 0)
{
glPushMatrix();

const GLint w2 = getWidth()/2;
@@ -282,24 +273,14 @@ void ImageKnob::onDisplay()
Rectangle<int>(-w2, -h2, getWidth(), getHeight()).draw();

glPopMatrix();

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
}
else
{
// FIXME - DO NOT USE glDrawPixels!

const int layerDataSize = fImgLayerSize * fImgLayerSize * ((fImage.getFormat() == GL_BGRA || fImage.getFormat() == GL_RGBA) ? 4 : 3);
const int imageDataSize = layerDataSize * fImgLayerCount;
const int imageDataOffset = imageDataSize - layerDataSize - (layerDataSize * int(normValue * float(fImgLayerCount-1)));

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glRasterPos2i(0, getHeight());
//glRasterPos2i(getX(), getY()+getHeight());
glDrawPixels(fImgLayerSize, fImgLayerSize, fImage.getFormat(), fImage.getType(), fImage.getRawData() + imageDataOffset);
Rectangle<int>(0, 0, getWidth(), getHeight()).draw();
}

glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
}

bool ImageKnob::onMouse(const MouseEvent& ev)


Loading…
Cancel
Save