mirror of
https://github.com/leozide/leocad
synced 2024-12-28 22:23:35 +01:00
137 lines
2.5 KiB
C++
137 lines
2.5 KiB
C++
#include "lc_global.h"
|
|
#include "image.h"
|
|
#include "opengl.h"
|
|
|
|
Image::Image()
|
|
{
|
|
mData = NULL;
|
|
mWidth = 0;
|
|
mHeight = 0;
|
|
mFormat = LC_PIXEL_FORMAT_INVALID;
|
|
}
|
|
|
|
Image::~Image()
|
|
{
|
|
FreeData();
|
|
}
|
|
|
|
int Image::GetBPP() const
|
|
{
|
|
switch (mFormat)
|
|
{
|
|
case LC_PIXEL_FORMAT_INVALID:
|
|
return 0;
|
|
case LC_PIXEL_FORMAT_A8:
|
|
return 1;
|
|
case LC_PIXEL_FORMAT_L8A8:
|
|
return 2;
|
|
case LC_PIXEL_FORMAT_R8G8B8:
|
|
return 3;
|
|
case LC_PIXEL_FORMAT_R8G8B8A8:
|
|
return 4;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
bool Image::HasAlpha() const
|
|
{
|
|
switch (mFormat)
|
|
{
|
|
case LC_PIXEL_FORMAT_INVALID:
|
|
return false;
|
|
case LC_PIXEL_FORMAT_A8:
|
|
return true;
|
|
case LC_PIXEL_FORMAT_L8A8:
|
|
return true;
|
|
case LC_PIXEL_FORMAT_R8G8B8:
|
|
return false;
|
|
case LC_PIXEL_FORMAT_R8G8B8A8:
|
|
return true;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void Image::FreeData()
|
|
{
|
|
free(mData);
|
|
mData = NULL;
|
|
mWidth = 0;
|
|
mHeight = 0;
|
|
mFormat = LC_PIXEL_FORMAT_INVALID;
|
|
}
|
|
|
|
void Image::Allocate(int Width, int Height, lcPixelFormat Format)
|
|
{
|
|
FreeData();
|
|
|
|
mWidth = Width;
|
|
mHeight = Height;
|
|
mFormat = Format;
|
|
mData = (unsigned char*)malloc(mWidth * mHeight * GetBPP());
|
|
}
|
|
|
|
void Image::ResizePow2()
|
|
{
|
|
int i, shifted_x, shifted_y;
|
|
|
|
shifted_x = mWidth;
|
|
for (i = 0; ((i < 16) && (shifted_x != 0)); i++)
|
|
shifted_x = shifted_x >> 1;
|
|
shifted_x = (i != 0) ? 1 << (i-1) : 1;
|
|
|
|
shifted_y = mHeight;
|
|
for (i = 0; ((i < 16) && (shifted_y != 0)); i++)
|
|
shifted_y = shifted_y >> 1;
|
|
shifted_y = (i != 0) ? 1 << (i-1) : 1;
|
|
|
|
if ((shifted_x != mWidth) || (shifted_y != mHeight))
|
|
Resize (shifted_x, shifted_y);
|
|
}
|
|
|
|
void Image::Resize(int width, int height)
|
|
{
|
|
int i, j, k, components, stx, sty;
|
|
float accumx, accumy;
|
|
unsigned char* bits;
|
|
|
|
components = GetBPP();
|
|
|
|
bits = (unsigned char*)malloc(width * height * components);
|
|
|
|
for (j = 0; j < mHeight; j++)
|
|
{
|
|
accumy = (float)height*j/(float)mHeight;
|
|
sty = (int)floor(accumy);
|
|
|
|
for (i = 0; i < mWidth; i++)
|
|
{
|
|
accumx = (float)width*i/(float)mWidth;
|
|
stx = (int)floor(accumx);
|
|
|
|
for (k = 0; k < components; k++)
|
|
bits[(stx+sty*width)*components+k] = mData[(i+j*mWidth)*components+k];
|
|
}
|
|
}
|
|
|
|
free (mData);
|
|
mData = bits;
|
|
mWidth = width;
|
|
mHeight = height;
|
|
}
|
|
|
|
void Image::FromOpenGL(int Width, int Height)
|
|
{
|
|
Allocate(Width, Height, LC_PIXEL_FORMAT_R8G8B8A8);
|
|
|
|
lcuint8* Buffer = (lcuint8*)malloc(Width * Height * 4);
|
|
|
|
glPixelStorei (GL_PACK_ALIGNMENT, 1);
|
|
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, Buffer);
|
|
|
|
for (int Row = 0; Row < Height; Row++)
|
|
memcpy(mData + (Row * Width * 4), Buffer + ((Height - Row - 1) * Width * 4), Width * 4);
|
|
|
|
free(Buffer);
|
|
}
|