- did some preparations to ParseDrawTextureTags to allow using the same code for parsing tag lists generated by the VM.

- removed the fixed point alpha tag from DrawTexture and replaced all uses with the floating point version.
This commit is contained in:
Christoph Oelckers 2017-02-04 13:11:12 +01:00
commit d3ed83942f
14 changed files with 139 additions and 113 deletions

View file

@ -431,6 +431,37 @@ bool DCanvas::SetTextureParms(DrawParms *parms, FTexture *img, double xx, double
return false;
}
static void ListEnd(va_list &tags)
{
va_end(tags);
}
static int ListGetInt(va_list &tags)
{
return va_arg(tags, int);
}
static inline double ListGetDouble(va_list &tags)
{
return va_arg(tags, double);
}
static inline FRemapTable* ListGetTranslation(va_list &tags)
{
return va_arg(tags, FRemapTable*);
}
// These two options are only being used by the D3D version of the HUD weapon drawer, they serve no purpose anywhere else.
static inline FSpecialColormap * ListGetSpecialColormap(va_list &tags)
{
return va_arg(tags, FSpecialColormap *);
}
static inline FColormapStyle * ListGetColormapStyle(va_list &tags)
{
return va_arg(tags, FColormapStyle *);
}
bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag, va_list tags, DrawParms *parms, bool fortext) const
{
INTBOOL boolval;
@ -442,7 +473,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
{
if (img == NULL || img->UseType == FTexture::TEX_Null)
{
va_end(tags);
ListEnd(tags);
return false;
}
}
@ -450,7 +481,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
// Do some sanity checks on the coordinates.
if (x < -16383 || x > 16383 || y < -16383 || y > 16383)
{
va_end(tags);
ListEnd(tags);
return false;
}
@ -497,39 +528,39 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
switch (tag)
{
default:
data = va_arg(tags, DWORD);
ListGetInt(tags);
break;
case DTA_DestWidth:
assert(fortext == false);
if (fortext) return false;
parms->cleanmode = DTA_Base;
parms->destwidth = va_arg(tags, int);
parms->destwidth = ListGetInt(tags);
break;
case DTA_DestWidthF:
assert(fortext == false);
if (fortext) return false;
parms->cleanmode = DTA_Base;
parms->destwidth = va_arg(tags, double);
parms->destwidth = ListGetDouble(tags);
break;
case DTA_DestHeight:
assert(fortext == false);
if (fortext) return false;
parms->cleanmode = DTA_Base;
parms->destheight = va_arg(tags, int);
parms->destheight = ListGetInt(tags);
break;
case DTA_DestHeightF:
assert(fortext == false);
if (fortext) return false;
parms->cleanmode = DTA_Base;
parms->destheight = va_arg(tags, double);
parms->destheight = ListGetDouble(tags);
break;
case DTA_Clean:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->scalex = 1;
@ -539,7 +570,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_CleanNoMove:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->scalex = CleanXfac;
@ -549,7 +580,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_CleanNoMove_1:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->scalex = CleanXfac_1;
@ -559,7 +590,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_320x200:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->cleanmode = DTA_Base;
@ -571,7 +602,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_Bottom320x200:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->cleanmode = DTA_Base;
@ -584,32 +615,32 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_HUDRules:
intval = va_arg(tags, int);
intval = ListGetInt(tags);
parms->cleanmode = intval == HUD_HorizCenter ? DTA_HUDRulesC : DTA_HUDRules;
break;
case DTA_VirtualWidth:
parms->cleanmode = DTA_Base;
parms->virtWidth = va_arg(tags, int);
parms->virtWidth = ListGetInt(tags);
break;
case DTA_VirtualWidthF:
parms->cleanmode = DTA_Base;
parms->virtWidth = va_arg(tags, double);
parms->virtWidth = ListGetDouble(tags);
break;
case DTA_VirtualHeight:
parms->cleanmode = DTA_Base;
parms->virtHeight = va_arg(tags, int);
parms->virtHeight = ListGetInt(tags);
break;
case DTA_VirtualHeightF:
parms->cleanmode = DTA_Base;
parms->virtHeight = va_arg(tags, double);
parms->virtHeight = ListGetDouble(tags);
break;
case DTA_Fullscreen:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
assert(fortext == false);
@ -621,24 +652,20 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_Alpha:
parms->Alpha = FIXED2FLOAT(MIN<fixed_t>(OPAQUE, va_arg (tags, fixed_t)));
break;
case DTA_AlphaF:
parms->Alpha = (float)(MIN<double>(1., va_arg(tags, double)));
parms->Alpha = (float)(MIN<double>(1., ListGetDouble(tags)));
break;
case DTA_AlphaChannel:
parms->alphaChannel = va_arg(tags, INTBOOL);
parms->alphaChannel = ListGetInt(tags);
break;
case DTA_FillColor:
parms->fillcolor = va_arg(tags, uint32);
parms->fillcolor = ListGetInt(tags);
fillcolorset = true;
break;
case DTA_Translation:
parms->remap = va_arg(tags, FRemapTable *);
parms->remap = ListGetTranslation(tags);
if (parms->remap != NULL && parms->remap->Inactive)
{ // If it's inactive, pretend we were passed NULL instead.
parms->remap = NULL;
@ -646,41 +673,41 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_ColorOverlay:
parms->colorOverlay = va_arg(tags, DWORD);
parms->colorOverlay = ListGetInt(tags);
break;
case DTA_FlipX:
parms->flipX = va_arg(tags, INTBOOL);
parms->flipX = ListGetInt(tags);
break;
case DTA_TopOffset:
assert(fortext == false);
if (fortext) return false;
parms->top = va_arg(tags, int);
parms->top = ListGetInt(tags);
break;
case DTA_TopOffsetF:
assert(fortext == false);
if (fortext) return false;
parms->top = va_arg(tags, double);
parms->top = ListGetDouble(tags);
break;
case DTA_LeftOffset:
assert(fortext == false);
if (fortext) return false;
parms->left = va_arg(tags, int);
parms->left = ListGetInt(tags);
break;
case DTA_LeftOffsetF:
assert(fortext == false);
if (fortext) return false;
parms->left = va_arg(tags, double);
parms->left = ListGetDouble(tags);
break;
case DTA_CenterOffset:
assert(fortext == false);
if (fortext) return false;
if (va_arg(tags, int))
if (ListGetInt(tags))
{
parms->left = img->GetScaledWidthDouble() * 0.5;
parms->top = img->GetScaledHeightDouble() * 0.5;
@ -690,7 +717,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
case DTA_CenterBottomOffset:
assert(fortext == false);
if (fortext) return false;
if (va_arg(tags, int))
if (ListGetInt(tags))
{
parms->left = img->GetScaledWidthDouble() * 0.5;
parms->top = img->GetScaledHeightDouble();
@ -700,29 +727,29 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
case DTA_WindowLeft:
assert(fortext == false);
if (fortext) return false;
parms->windowleft = va_arg(tags, int);
parms->windowleft = ListGetInt(tags);
break;
case DTA_WindowLeftF:
assert(fortext == false);
if (fortext) return false;
parms->windowleft = va_arg(tags, double);
parms->windowleft = ListGetDouble(tags);
break;
case DTA_WindowRight:
assert(fortext == false);
if (fortext) return false;
parms->windowright = va_arg(tags, int);
parms->windowright = ListGetInt(tags);
break;
case DTA_WindowRightF:
assert(fortext == false);
if (fortext) return false;
parms->windowright = va_arg(tags, double);
parms->windowright = ListGetDouble(tags);
break;
case DTA_ClipTop:
parms->uclip = va_arg(tags, int);
parms->uclip = ListGetInt(tags);
if (parms->uclip < 0)
{
parms->uclip = 0;
@ -730,7 +757,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_ClipBottom:
parms->dclip = va_arg(tags, int);
parms->dclip = ListGetInt(tags);
if (parms->dclip > this->GetHeight())
{
parms->dclip = this->GetHeight();
@ -738,7 +765,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_ClipLeft:
parms->lclip = va_arg(tags, int);
parms->lclip = ListGetInt(tags);
if (parms->lclip < 0)
{
parms->lclip = 0;
@ -746,7 +773,7 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_ClipRight:
parms->rclip = va_arg(tags, int);
parms->rclip = ListGetInt(tags);
if (parms->rclip > this->GetWidth())
{
parms->rclip = this->GetWidth();
@ -754,18 +781,18 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_ShadowAlpha:
parms->shadowAlpha = MIN<fixed_t>(OPAQUE, va_arg (tags, fixed_t));
parms->shadowAlpha = (float)MIN(1., ListGetDouble(tags));
break;
case DTA_ShadowColor:
parms->shadowColor = va_arg(tags, int);
parms->shadowColor = ListGetInt(tags);
break;
case DTA_Shadow:
boolval = va_arg(tags, INTBOOL);
boolval = ListGetInt(tags);
if (boolval)
{
parms->shadowAlpha = FRACUNIT/2;
parms->shadowAlpha = 0.5;
parms->shadowColor = 0;
}
else
@ -775,45 +802,45 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
break;
case DTA_Masked:
parms->masked = va_arg(tags, INTBOOL);
parms->masked = ListGetInt(tags);
break;
case DTA_BilinearFilter:
parms->bilinear = va_arg(tags, INTBOOL);
parms->bilinear = ListGetInt(tags);
break;
case DTA_KeepRatio:
// I think this is a terribly misleading name, since it actually turns
// *off* aspect ratio correction.
parms->keepratio = va_arg(tags, INTBOOL);
parms->keepratio = ListGetInt(tags);
break;
case DTA_RenderStyle:
parms->style.AsDWORD = va_arg(tags, DWORD);
parms->style.AsDWORD = ListGetInt(tags);
break;
case DTA_SpecialColormap:
parms->specialcolormap = va_arg(tags, FSpecialColormap *);
parms->specialcolormap = ListGetSpecialColormap(tags);
break;
case DTA_ColormapStyle:
parms->colormapstyle = va_arg(tags, FColormapStyle *);
parms->colormapstyle = ListGetColormapStyle(tags);
break;
case DTA_TextLen:
parms->maxstrlen = va_arg(tags, int);
parms->maxstrlen = ListGetInt(tags);
break;
case DTA_CellX:
parms->cellx = va_arg(tags, int);
parms->cellx = ListGetInt(tags);
break;
case DTA_CellY:
parms->celly = va_arg(tags, int);
parms->celly = ListGetInt(tags);
break;
}
tag = va_arg(tags, DWORD);
tag = ListGetInt(tags);
}
va_end (tags);