- exported DrawChar and DrawText.

This commit is contained in:
Christoph Oelckers 2017-02-05 16:47:33 +01:00
parent 52bec33c0d
commit 9e038b75fa
4 changed files with 109 additions and 30 deletions

View File

@ -142,7 +142,7 @@ void DCanvas::DrawTexture (FTexture *img, double x, double y, int tags_first, ..
DrawTextureParms(img, parms); DrawTextureParms(img, parms);
} }
static int ListGetInt(VMVa_List &tags); int ListGetInt(VMVa_List &tags);
void DCanvas::DrawTexture(FTexture *img, double x, double y, VMVa_List &args) void DCanvas::DrawTexture(FTexture *img, double x, double y, VMVa_List &args)
{ {
@ -487,7 +487,7 @@ static void ListEnd(VMVa_List &tags)
{ {
} }
static int ListGetInt(VMVa_List &tags) int ListGetInt(VMVa_List &tags)
{ {
if (tags.curindex < tags.numargs && tags.args[tags.curindex].Type == REGT_INT) if (tags.curindex < tags.numargs && tags.args[tags.curindex].Type == REGT_INT)
{ {

View File

@ -47,6 +47,8 @@
#include "doomstat.h" #include "doomstat.h"
#include "templates.h" #include "templates.h"
int ListGetInt(VMVa_List &tags);
//========================================================================== //==========================================================================
// //
// DrawChar // DrawChar
@ -82,6 +84,42 @@ void DCanvas::DrawChar (FFont *font, int normalcolor, double x, double y, int ch
} }
} }
void DCanvas::DrawChar(FFont *font, int normalcolor, double x, double y, int character, VMVa_List &args)
{
if (font == NULL)
return;
if (normalcolor >= NumTextColors)
normalcolor = CR_UNTRANSLATED;
FTexture *pic;
int dummy;
if (NULL != (pic = font->GetChar(character, &dummy)))
{
DrawParms parms;
uint32_t tag = ListGetInt(args);
bool res = ParseDrawTextureTags(pic, x, y, tag, args, &parms, false);
if (!res) return;
parms.remap = font->GetColorTranslation((EColorRange)normalcolor);
DrawTextureParms(pic, parms);
}
}
DEFINE_ACTION_FUNCTION(_Screen, DrawChar)
{
PARAM_PROLOGUE;
PARAM_POINTER(font, FFont);
PARAM_INT(cr);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_INT(chr);
VMVa_List args = { param + 5, 0, numparam - 5 };
screen->DrawChar(font, cr, x, y, chr, args);
return 0;
}
//========================================================================== //==========================================================================
// //
// DrawText // DrawText
@ -90,32 +128,17 @@ void DCanvas::DrawChar (FFont *font, int normalcolor, double x, double y, int ch
// //
//========================================================================== //==========================================================================
void DCanvas::DrawText(FFont *font, int normalcolor, int x, int y, const char *string, int tag_first, ...) void DCanvas::DrawTextCommon(FFont *font, int normalcolor, double x, double y, const char *string, DrawParms &parms)
{ {
int w; int w;
const BYTE *ch; const BYTE *ch;
int c; int c;
int cx; double cx;
int cy; double cy;
int boldcolor; int boldcolor;
FRemapTable *range; FRemapTable *range;
int kerning; int kerning;
FTexture *pic; FTexture *pic;
DrawParms parms;
va_list tags;
if (font == NULL || string == NULL)
return;
va_start(tags, tag_first);
bool res = ParseDrawTextureTags(nullptr, 0, 0, tag_first, tags, &parms, true);
va_end(tags);
if (!res)
{
return;
}
if (parms.celly == 0) parms.celly = font->GetHeight() + 1; if (parms.celly == 0) parms.celly = font->GetHeight() + 1;
parms.celly *= parms.scaley; parms.celly *= parms.scaley;
@ -124,15 +147,15 @@ void DCanvas::DrawText(FFont *font, int normalcolor, int x, int y, const char *s
normalcolor = CR_UNTRANSLATED; normalcolor = CR_UNTRANSLATED;
boldcolor = normalcolor ? normalcolor - 1 : NumTextColors - 1; boldcolor = normalcolor ? normalcolor - 1 : NumTextColors - 1;
range = font->GetColorTranslation ((EColorRange)normalcolor); range = font->GetColorTranslation((EColorRange)normalcolor);
kerning = font->GetDefaultKerning (); kerning = font->GetDefaultKerning();
ch = (const BYTE *)string; ch = (const BYTE *)string;
cx = x; cx = x;
cy = y; cy = y;
while ((const char *)ch - string < parms.maxstrlen) while ((const char *)ch - string < parms.maxstrlen)
{ {
c = *ch++; c = *ch++;
@ -141,14 +164,14 @@ void DCanvas::DrawText(FFont *font, int normalcolor, int x, int y, const char *s
if (c == TEXTCOLOR_ESCAPE) if (c == TEXTCOLOR_ESCAPE)
{ {
EColorRange newcolor = V_ParseFontColor (ch, normalcolor, boldcolor); EColorRange newcolor = V_ParseFontColor(ch, normalcolor, boldcolor);
if (newcolor != CR_UNDEFINED) if (newcolor != CR_UNDEFINED)
{ {
range = font->GetColorTranslation (newcolor); range = font->GetColorTranslation(newcolor);
} }
continue; continue;
} }
if (c == '\n') if (c == '\n')
{ {
cx = x; cx = x;
@ -156,7 +179,7 @@ void DCanvas::DrawText(FFont *font, int normalcolor, int x, int y, const char *s
continue; continue;
} }
if (NULL != (pic = font->GetChar (c, &w))) if (NULL != (pic = font->GetChar(c, &w)))
{ {
parms.remap = range; parms.remap = range;
SetTextureParms(&parms, pic, cx, cy); SetTextureParms(&parms, pic, cx, cy);
@ -172,6 +195,54 @@ void DCanvas::DrawText(FFont *font, int normalcolor, int x, int y, const char *s
} }
} }
void DCanvas::DrawText(FFont *font, int normalcolor, double x, double y, const char *string, int tag_first, ...)
{
va_list tags;
DrawParms parms;
if (font == NULL || string == NULL)
return;
va_start(tags, tag_first);
bool res = ParseDrawTextureTags(nullptr, 0, 0, tag_first, tags, &parms, true);
va_end(tags);
if (!res)
{
return;
}
DrawTextCommon(font, normalcolor, x, y, string, parms);
}
void DCanvas::DrawText(FFont *font, int normalcolor, double x, double y, const char *string, VMVa_List &args)
{
DrawParms parms;
if (font == NULL || string == NULL)
return;
uint32_t tag = ListGetInt(args);
bool res = ParseDrawTextureTags(nullptr, 0, 0, tag, args, &parms, true);
if (!res)
{
return;
}
DrawTextCommon(font, normalcolor, x, y, string, parms);
}
DEFINE_ACTION_FUNCTION(_Screen, DrawText)
{
PARAM_PROLOGUE;
PARAM_POINTER(font, FFont);
PARAM_INT(cr);
PARAM_FLOAT(x);
PARAM_FLOAT(y);
PARAM_STRING(chr);
VMVa_List args = { param + 5, 0, numparam - 5 };
screen->DrawText(font, cr, x, y, chr, args);
return 0;
}
//========================================================================== //==========================================================================
// //

View File

@ -269,8 +269,10 @@ public:
#undef DrawText // See WinUser.h for the definition of DrawText as a macro #undef DrawText // See WinUser.h for the definition of DrawText as a macro
#endif #endif
// 2D Text drawing // 2D Text drawing
void DrawText (FFont *font, int normalcolor, int x, int y, const char *string, int tag_first, ...); void DrawText(FFont *font, int normalcolor, double x, double y, const char *string, int tag_first, ...);
void DrawChar (FFont *font, int normalcolor, double x, double y, int character, int tag_first, ...); void DrawText(FFont *font, int normalcolor, double x, double y, const char *string, VMVa_List &args);
void DrawChar(FFont *font, int normalcolor, double x, double y, int character, int tag_first, ...);
void DrawChar(FFont *font, int normalcolor, double x, double y, int character, VMVa_List &args);
protected: protected:
BYTE *Buffer; BYTE *Buffer;
@ -279,6 +281,8 @@ protected:
int Pitch; int Pitch;
int LockCount; int LockCount;
void DrawTextCommon(FFont *font, int normalcolor, double x, double y, const char *string, DrawParms &parms);
bool ClipBox (int &left, int &top, int &width, int &height, const BYTE *&src, const int srcpitch) const; bool ClipBox (int &left, int &top, int &width, int &height, const BYTE *&src, const int srcpitch) const;
void DrawTextureV(FTexture *img, double x, double y, uint32 tag, va_list tags) = delete; void DrawTextureV(FTexture *img, double x, double y, uint32 tag, va_list tags) = delete;
virtual void DrawTextureParms(FTexture *img, DrawParms &parms); virtual void DrawTextureParms(FTexture *img, DrawParms &parms);

View File

@ -66,6 +66,10 @@ struct Screen native
native static int GetWidth(); native static int GetWidth();
native static int GetHeight(); native static int GetHeight();
native static void DrawHUDTexture(TextureID tex, double x, double y); native static void DrawHUDTexture(TextureID tex, double x, double y);
native static vararg void DrawTexture(TextureID tex, bool animate, double x, double y, ...);
native static vararg void DrawChar(Font font, int normalcolor, double x, double y, int character, ...);
native static vararg void DrawText(Font font, int normalcolor, double x, double y, String text, ...);
} }
class BrokenLines : Object native class BrokenLines : Object native
@ -357,7 +361,7 @@ struct StringStruct native
{ {
native void Replace(String pattern, String replacement); native void Replace(String pattern, String replacement);
native static vararg String Format(String fmt, ...); native static vararg String Format(String fmt, ...);
native vararg void AppendFormat(String fmt, ...); native vararg void AppendFormat(String fmt, ...);
} }
class Floor : Thinker native class Floor : Thinker native