0.9.5 branch: port r3120 (Lua: fix gui.gdoverlay)
This commit is contained in:
parent
cf280bbbe6
commit
4a874696b0
|
@ -3217,15 +3217,17 @@ DEFINE_LUA_FUNCTION(gui_gdoverlay, "[x=0,y=0,]gdimage[,alphamul]")
|
||||||
|
|
||||||
// GD format header for truecolor image (11 bytes)
|
// GD format header for truecolor image (11 bytes)
|
||||||
ptr++;
|
ptr++;
|
||||||
ptr++;
|
bool trueColor = (*ptr++ == 254);
|
||||||
|
if (!trueColor) {
|
||||||
|
luaL_error(L, "indexed images are not supported");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int width = *ptr++ << 8;
|
int width = *ptr++ << 8;
|
||||||
width |= *ptr++;
|
width |= *ptr++;
|
||||||
int height = *ptr++ << 8;
|
int height = *ptr++ << 8;
|
||||||
height |= *ptr++;
|
height |= *ptr++;
|
||||||
ptr += 5;
|
ptr += 5;
|
||||||
|
|
||||||
u8* Dst = (u8*)curGuiData.data;
|
|
||||||
|
|
||||||
LuaContextInfo& info = GetCurrentInfo();
|
LuaContextInfo& info = GetCurrentInfo();
|
||||||
int alphaMul = info.transparencyModifier;
|
int alphaMul = info.transparencyModifier;
|
||||||
if(lua_isnumber(L, index))
|
if(lua_isnumber(L, index))
|
||||||
|
@ -3234,6 +3236,7 @@ DEFINE_LUA_FUNCTION(gui_gdoverlay, "[x=0,y=0,]gdimage[,alphamul]")
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
prepare_drawing();
|
prepare_drawing();
|
||||||
|
u8* Dst = (u8*)curGuiData.data;
|
||||||
gui_adjust_coord(xStart,yStart);
|
gui_adjust_coord(xStart,yStart);
|
||||||
|
|
||||||
int xMin = curGuiData.xMin;
|
int xMin = curGuiData.xMin;
|
||||||
|
@ -3245,14 +3248,16 @@ DEFINE_LUA_FUNCTION(gui_gdoverlay, "[x=0,y=0,]gdimage[,alphamul]")
|
||||||
// since there aren't that many possible opacity levels,
|
// since there aren't that many possible opacity levels,
|
||||||
// do the opacity modification calculations beforehand instead of per pixel
|
// do the opacity modification calculations beforehand instead of per pixel
|
||||||
int opacMap[256];
|
int opacMap[256];
|
||||||
for(int i = 0; i < 256; i++)
|
for(int i = 0; i < 128; i++)
|
||||||
{
|
{
|
||||||
int opac = 255 - (i << 1); // not sure why, but gdstr seems to divide each alpha value by 2
|
int opac = 255 - ((i << 1) | (i & 1)); // gdAlphaMax = 127, not 255
|
||||||
opac = (opac * alphaMul) / 255;
|
opac = (opac * alphaMul) / 255;
|
||||||
if(opac < 0) opac = 0;
|
if(opac < 0) opac = 0;
|
||||||
if(opac > 255) opac = 255;
|
if(opac > 255) opac = 255;
|
||||||
opacMap[i] = 255 - opac;
|
opacMap[i] = opac;
|
||||||
}
|
}
|
||||||
|
for(int i = 128; i < 256; i++)
|
||||||
|
opacMap[i] = 0; // what should we do for them, actually?
|
||||||
|
|
||||||
Dst += yStart * strideBytes;
|
Dst += yStart * strideBytes;
|
||||||
for(int y = yStart; y < height+yStart && y < yMax; y++, Dst += strideBytes)
|
for(int y = yStart; y < height+yStart && y < yMax; y++, Dst += strideBytes)
|
||||||
|
|
Loading…
Reference in New Issue