DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit e916429a673a96a3f0ed44e4b1d7e0102a51e352
parent 6b9e3f5a3991477d6decccb4205a026412cde034
Author: falkTX <falktx@gmail.com>
Date:   Tue, 24 Dec 2013 10:08:10 +0000

Experimental code for Images drawn via 2d texture
So much faster than glDrawPixels()!!

Diffstat:
Mdgl/Image.hpp | 2++
Mdgl/src/Image.cpp | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 73 insertions(+), 6 deletions(-)

diff --git a/dgl/Image.hpp b/dgl/Image.hpp @@ -30,6 +30,7 @@ public: Image(const char* rawData, int width, int height, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept; Image(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept; Image(const Image& image) noexcept; + ~Image(); void loadFromMemory(const char* rawData, int width, int height, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept; void loadFromMemory(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept; @@ -57,6 +58,7 @@ private: Size<int> fSize; GLenum fFormat; GLenum fType; + mutable GLuint fTextureId; }; // ----------------------------------------------------------------------- diff --git a/dgl/src/Image.cpp b/dgl/src/Image.cpp @@ -16,6 +16,8 @@ #include "../Image.hpp" +#include <cstdio> + START_NAMESPACE_DGL // ----------------------------------------------------------------------- @@ -24,7 +26,8 @@ Image::Image() noexcept : fRawData(nullptr), fSize(0, 0), fFormat(0), - fType(0) + fType(0), + fTextureId(0) { } @@ -32,7 +35,8 @@ Image::Image(const char* rawData, int width, int height, GLenum format, GLenum t : fRawData(rawData), fSize(width, height), fFormat(format), - fType(type) + fType(type), + fTextureId(0) { } @@ -40,7 +44,8 @@ Image::Image(const char* rawData, const Size<int>& size, GLenum format, GLenum t : fRawData(rawData), fSize(size), fFormat(format), - fType(type) + fType(type), + fTextureId(0) { } @@ -48,10 +53,20 @@ Image::Image(const Image& image) noexcept : fRawData(image.fRawData), fSize(image.fSize), fFormat(image.fFormat), - fType(image.fType) + fType(image.fType), + fTextureId(0) { } +Image::~Image() +{ + if (fTextureId != 0) + { + glDeleteTextures(1, &fTextureId); + fTextureId = 0; + } +} + void Image::loadFromMemory(const char* rawData, int width, int height, GLenum format, GLenum type) noexcept { loadFromMemory(rawData, Size<int>(width, height), format, type); @@ -109,11 +124,59 @@ void Image::draw(int x, int y) const { if (! isValid()) return; + if (fTextureId == 0) + glGenTextures(1, &fTextureId); + if (fTextureId == 0) + { + printf("texture Id still 0\n"); + return; + } + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, fTextureId); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_PACK_ALIGNMENT, 1); - glRasterPos2i(x, fSize.getHeight()+y); - glDrawPixels(fSize.getWidth(), fSize.getHeight(), fFormat, fType, fRawData); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWidth(), getHeight(), 0, fFormat, fType, fRawData); + + 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); + + float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans); + + glPushMatrix(); + + const GLint w2 = getWidth()/2; + const GLint h2 = getHeight()/2; + + glTranslatef(x+w2, y+h2, 0.0f); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 1.0f); + glVertex2i(-w2, -h2); + + glTexCoord2f(1.0f, 1.0f); + glVertex2i(getWidth()-w2, -h2); + + glTexCoord2f(1.0f, 0.0f); + glVertex2i(getWidth()-w2, getHeight()-h2); + + glTexCoord2f(0.0f, 0.0f); + glVertex2i(-w2, getHeight()-h2); + glEnd(); + + glPopMatrix(); + + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + +// glPixelStorei(GL_UNPACK_ALIGNMENT, 1); +// glPixelStorei(GL_PACK_ALIGNMENT, 1); +// glRasterPos2i(x, fSize.getHeight()+y); +// glDrawPixels(fSize.getWidth(), fSize.getHeight(), fFormat, fType, fRawData); } void Image::draw(const Point<int>& pos) const @@ -121,6 +184,8 @@ void Image::draw(const Point<int>& pos) const draw(pos.getX(), pos.getY()); } +// ----------------------------------------------------------------------- + Image& Image::operator=(const Image& image) noexcept { fRawData = image.fRawData;