openclonk/src/lib/C4Markup.h

85 lines
2.9 KiB
C
Raw Normal View History

2009-05-08 13:28:41 +00:00
/*
* OpenClonk, http://www.openclonk.org
*
* Copyright (c) 2002-2003 Sven Eberhardt
2013-01-09 23:23:06 +00:00
* Copyright (c) 2011 Günther Brammer
2009-05-08 13:28:41 +00:00
* Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de
*
* Portions might be copyrighted by other authors who have contributed
* to OpenClonk.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
* See isc_license.txt for full license and disclaimer.
*
* "Clonk" is a registered trademark of Matthes Bender.
* See clonk_trademark_license.txt for full license.
*/
// markup tags for fonts
#ifndef INC_STDMARKUP
#define INC_STDMARKUP
// one markup tag
2011-08-27 19:13:15 +00:00
class C4MarkupTag
{
public:
2011-08-27 19:13:15 +00:00
C4MarkupTag *pPrev, *pNext;
2009-05-08 13:28:41 +00:00
2011-08-27 19:13:15 +00:00
C4MarkupTag(): pPrev(0), pNext(0) { }; // ctor
virtual ~C4MarkupTag() { }; // dtor
2009-05-08 13:28:41 +00:00
virtual void Apply(C4BltTransform &rBltTrf, bool fDoClr, DWORD &dwClr)=0; // assign markup
virtual const char *TagName()=0; // get character string for this tag
};
2009-05-08 13:28:41 +00:00
// markup tag for italic text
2011-08-27 19:13:15 +00:00
class C4MarkupTagItalic : public C4MarkupTag
{
public:
2011-08-27 19:13:15 +00:00
C4MarkupTagItalic() : C4MarkupTag() { } // ctor
2009-05-08 13:28:41 +00:00
virtual void Apply(C4BltTransform &rBltTrf, bool fDoClr, DWORD &dwClr); // assign markup
virtual const char *TagName() { return "i"; }
};
2009-05-08 13:28:41 +00:00
// markup tag for colored text
2011-08-27 19:13:15 +00:00
class C4MarkupTagColor : public C4MarkupTag
{
private:
DWORD dwClr; // color
public:
2011-08-27 19:13:15 +00:00
C4MarkupTagColor(DWORD dwClr) : C4MarkupTag(), dwClr(dwClr) { } // ctor
2009-05-08 13:28:41 +00:00
virtual void Apply(C4BltTransform &rBltTrf, bool fDoClr, DWORD &dwClr); // assign markup
virtual const char *TagName() { return "c"; }
};
2009-05-08 13:28:41 +00:00
// markup rendering functionality for text
2011-08-27 19:13:15 +00:00
class C4Markup
{
private:
2011-08-27 19:13:15 +00:00
C4MarkupTag *pTags, *pLast; // tag list; single linked
bool fDoClr; // set if color changes should be made (not in text shadow!)
2009-05-08 13:28:41 +00:00
2011-08-27 19:13:15 +00:00
void Push(C4MarkupTag *pTag)
{ if ((pTag->pPrev=pLast)) pLast->pNext=pTag; else pTags=pTag; pLast=pTag; }
2011-08-27 19:13:15 +00:00
C4MarkupTag *Pop()
{ C4MarkupTag *pL=pLast; if (!pL) return 0; if ((pLast=pL->pPrev)) pLast->pNext=0; else pTags=0; return pL; }
public:
2011-08-27 19:13:15 +00:00
C4Markup(bool fDoClr) { pTags=pLast=0; this->fDoClr=fDoClr; }; // ctor
~C4Markup() // dtor
{ C4MarkupTag *pTag=pTags,*pNext; while (pTag) { pNext=pTag->pNext; delete pTag; pTag=pNext; } }
2009-05-08 13:28:41 +00:00
bool Read(const char **ppText, bool fSkip=false); // get markup from text
bool SkipTags(const char **ppText); // extract markup from text; return whether end is reached
void Apply(C4BltTransform &rBltTrf, DWORD &dwClr) // assign markup to vertices
2011-08-27 19:13:15 +00:00
{ for (C4MarkupTag *pTag=pTags; pTag; pTag=pTag->pNext) pTag->Apply(rBltTrf, fDoClr, dwClr); }
bool Clean() { return !pTags; } // empty?
2009-05-08 13:28:41 +00:00
static bool StripMarkup(char *szText); // strip any markup codes from given text buffer
static bool StripMarkup(class StdStrBuf *sText); // strip any markup codes from given text buffer
};
2009-05-08 13:28:41 +00:00
#endif // INC_STDMARKUP