hide some stuff that didn't need to be exposed publicly in Graphics.h

This commit is contained in:
UnknownShadow200 2019-10-01 22:14:18 +10:00
parent 1e1e6fc199
commit ca0698c083
2 changed files with 21 additions and 23 deletions

View File

@ -199,10 +199,10 @@ void Gfx_RestoreAlphaState(cc_uint8 draw) {
} }
/* Quoted from http://www.realtimerendering.com/blog/gpus-prefer-premultiplication/ /* Quoted from http://www.realtimerendering.com/blog/gpus-prefer-premultiplication/ */
The short version: if you want your renderer to properly handle textures with alphas when using /* The short version: if you want your renderer to properly handle textures with alphas when using */
bilinear interpolation or mipmapping, you need to premultiply your PNG color data by their (unassociated) alphas. */ /* bilinear interpolation or mipmapping, you need to premultiply your PNG color data by their (unassociated) alphas. */
static BitmapCol Gfx_Average(BitmapCol p1, BitmapCol p2) { static BitmapCol AverageCol(BitmapCol p1, BitmapCol p2) {
cc_uint32 a1, a2, aSum; cc_uint32 a1, a2, aSum;
cc_uint32 b1, g1, r1; cc_uint32 b1, g1, r1;
cc_uint32 b2, g2, r2; cc_uint32 b2, g2, r2;
@ -216,10 +216,10 @@ static BitmapCol Gfx_Average(BitmapCol p1, BitmapCol p2) {
b1 = p1.B * a1; g1 = p1.G * a1; r1 = p1.R * a1; b1 = p1.B * a1; g1 = p1.G * a1; r1 = p1.R * a1;
b2 = p2.B * a2; g2 = p2.G * a2; r2 = p2.R * a2; b2 = p2.B * a2; g2 = p2.G * a2; r2 = p2.R * a2;
/* https://stackoverflow.com/a/347376 /* https://stackoverflow.com/a/347376 */
We need to convert RGB back from the pre-multiplied average into normal form /* We need to convert RGB back from the pre-multiplied average into normal form */
((r1 + r2) / 2) / ((a1 + a2) / 2) /* ((r1 + r2) / 2) / ((a1 + a2) / 2) */
but we just cancel out the / 2*/ /* but we just cancel out the / 2 */
ave.B = (b1 + b2) / aSum; ave.B = (b1 + b2) / aSum;
ave.G = (g1 + g2) / aSum; ave.G = (g1 + g2) / aSum;
ave.R = (r1 + r2) / aSum; ave.R = (r1 + r2) / aSum;
@ -227,7 +227,8 @@ static BitmapCol Gfx_Average(BitmapCol p1, BitmapCol p2) {
return ave; return ave;
} }
void Gfx_GenMipmaps(int width, int height, cc_uint8* lvlScan0, cc_uint8* scan0) { /* Generates the next mipmaps level bitmap for the given bitmap. */
static void GenMipmaps(int width, int height, cc_uint8* lvlScan0, cc_uint8* scan0) {
BitmapCol* baseSrc = (BitmapCol*)scan0; BitmapCol* baseSrc = (BitmapCol*)scan0;
BitmapCol* baseDst = (BitmapCol*)lvlScan0; BitmapCol* baseDst = (BitmapCol*)lvlScan0;
int srcWidth = width << 1; int srcWidth = width << 1;
@ -245,14 +246,15 @@ void Gfx_GenMipmaps(int width, int height, cc_uint8* lvlScan0, cc_uint8* scan0)
BitmapCol src10 = src1[srcX], src11 = src1[srcX + 1]; BitmapCol src10 = src1[srcX], src11 = src1[srcX + 1];
/* bilinear filter this mipmap */ /* bilinear filter this mipmap */
BitmapCol ave0 = Gfx_Average(src00, src01); BitmapCol ave0 = AverageCol(src00, src01);
BitmapCol ave1 = Gfx_Average(src10, src11); BitmapCol ave1 = AverageCol(src10, src11);
dst[x] = Gfx_Average(ave0, ave1); dst[x] = AverageCol(ave0, ave1);
} }
} }
} }
int Gfx_MipmapsLevels(int width, int height) { /* Returns the maximum number of mipmaps levels used for given size. */
static CC_NOINLINE int CalcMipmapsLevels(int width, int height) {
int lvlsWidth = Math_Log2(width), lvlsHeight = Math_Log2(height); int lvlsWidth = Math_Log2(width), lvlsHeight = Math_Log2(height);
if (Gfx.CustomMipmapsLevels) { if (Gfx.CustomMipmapsLevels) {
int lvls = min(lvlsWidth, lvlsHeight); int lvls = min(lvlsWidth, lvlsHeight);
@ -473,7 +475,7 @@ static void D3D9_DoMipmaps(IDirect3DTexture9* texture, int x, int y, Bitmap* bmp
cc_uint8* cur; cc_uint8* cur;
Bitmap mipmap; Bitmap mipmap;
int lvls = Gfx_MipmapsLevels(bmp->Width, bmp->Height); int lvls = CalcMipmapsLevels(bmp->Width, bmp->Height);
int lvl, width = bmp->Width, height = bmp->Height; int lvl, width = bmp->Width, height = bmp->Height;
for (lvl = 1; lvl <= lvls; lvl++) { for (lvl = 1; lvl <= lvls; lvl++) {
@ -482,7 +484,7 @@ static void D3D9_DoMipmaps(IDirect3DTexture9* texture, int x, int y, Bitmap* bmp
if (height > 1) height /= 2; if (height > 1) height /= 2;
cur = (cc_uint8*)Mem_Alloc(width * height, 4, "mipmaps"); cur = (cc_uint8*)Mem_Alloc(width * height, 4, "mipmaps");
Gfx_GenMipmaps(width, height, cur, prev); GenMipmaps(width, height, cur, prev);
Bitmap_Init(mipmap, width, height, cur); Bitmap_Init(mipmap, width, height, cur);
if (partial) { if (partial) {
@ -500,7 +502,7 @@ static void D3D9_DoMipmaps(IDirect3DTexture9* texture, int x, int y, Bitmap* bmp
GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps) { GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps) {
IDirect3DTexture9* tex; IDirect3DTexture9* tex;
ReturnCode res; ReturnCode res;
int mipmapsLevels = Gfx_MipmapsLevels(bmp->Width, bmp->Height); int mipmapsLevels = CalcMipmapsLevels(bmp->Width, bmp->Height);
int levels = 1 + (mipmaps ? mipmapsLevels : 0); int levels = 1 + (mipmaps ? mipmapsLevels : 0);
if (!Math_IsPowOf2(bmp->Width) || !Math_IsPowOf2(bmp->Height)) { if (!Math_IsPowOf2(bmp->Width) || !Math_IsPowOf2(bmp->Height)) {
@ -1042,7 +1044,7 @@ static void Gfx_DoMipmaps(int x, int y, Bitmap* bmp, bool partial) {
cc_uint8* prev = bmp->Scan0; cc_uint8* prev = bmp->Scan0;
cc_uint8* cur; cc_uint8* cur;
int lvls = Gfx_MipmapsLevels(bmp->Width, bmp->Height); int lvls = CalcMipmapsLevels(bmp->Width, bmp->Height);
int lvl, width = bmp->Width, height = bmp->Height; int lvl, width = bmp->Width, height = bmp->Height;
for (lvl = 1; lvl <= lvls; lvl++) { for (lvl = 1; lvl <= lvls; lvl++) {
@ -1051,7 +1053,7 @@ static void Gfx_DoMipmaps(int x, int y, Bitmap* bmp, bool partial) {
if (height > 1) height /= 2; if (height > 1) height /= 2;
cur = (cc_uint8*)Mem_Alloc(width * height, 4, "mipmaps"); cur = (cc_uint8*)Mem_Alloc(width * height, 4, "mipmaps");
Gfx_GenMipmaps(width, height, cur, prev); GenMipmaps(width, height, cur, prev);
if (partial) { if (partial) {
glTexSubImage2D(GL_TEXTURE_2D, lvl, x, y, width, height, PIXEL_FORMAT, GL_UNSIGNED_BYTE, cur); glTexSubImage2D(GL_TEXTURE_2D, lvl, x, y, width, height, PIXEL_FORMAT, GL_UNSIGNED_BYTE, cur);
@ -1079,7 +1081,7 @@ GfxResourceID Gfx_CreateTexture(Bitmap* bmp, bool managedPool, bool mipmaps) {
if (mipmaps) { if (mipmaps) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
if (Gfx.CustomMipmapsLevels) { if (Gfx.CustomMipmapsLevels) {
int lvls = Gfx_MipmapsLevels(bmp->Width, bmp->Height); int lvls = CalcMipmapsLevels(bmp->Width, bmp->Height);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, lvls); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, lvls);
} }
} else { } else {

View File

@ -191,10 +191,6 @@ void Gfx_MakeIndices(cc_uint16* indices, int iCount);
void Gfx_SetupAlphaState(cc_uint8 draw); void Gfx_SetupAlphaState(cc_uint8 draw);
/* Undoes changes to alpha test/blending state by Gfx_SetupAlphaState. */ /* Undoes changes to alpha test/blending state by Gfx_SetupAlphaState. */
void Gfx_RestoreAlphaState(cc_uint8 draw); void Gfx_RestoreAlphaState(cc_uint8 draw);
/* Generates the next mipmaps level bitmap for the given bitmap. */
void Gfx_GenMipmaps(int width, int height, cc_uint8* lvlScan0, cc_uint8* scan0);
/* Returns the maximum number of mipmaps levels used for given size. */
int Gfx_MipmapsLevels(int width, int height);
/* Statically initialises the position and dimensions of this texture */ /* Statically initialises the position and dimensions of this texture */
#define Tex_Rect(x,y, width,height) x,y,width,height #define Tex_Rect(x,y, width,height) x,y,width,height