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:
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;