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