Browse Source

Experimental code for Images drawn via 2d texture

So much faster than glDrawPixels()!!
gh-pages
falkTX 10 years ago
parent
commit
e916429a67
2 changed files with 73 additions and 6 deletions
  1. +2
    -0
      dgl/Image.hpp
  2. +71
    -6
      dgl/src/Image.cpp

+ 2
- 0
dgl/Image.hpp View File

@@ -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;
};

// -----------------------------------------------------------------------


+ 71
- 6
dgl/src/Image.cpp View File

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


Loading…
Cancel
Save