|
@@ -517,6 +517,8 @@ void TextRenderer::renderText( int x, int y, const char *txt, Bild &zRObj, std::
|
|
|
{
|
|
|
if( !s )
|
|
|
return;
|
|
|
+ if( fbeg == -1 )
|
|
|
+ fbeg = cpos;
|
|
|
int zRObjBr = zRObj.getBreite();
|
|
|
int zRObjHi = zRObj.getHeight();
|
|
|
int beginX = x;
|
|
@@ -605,6 +607,8 @@ void TextRenderer::renderChar( int &x, int y, char c, Bild &zRObj, bool selected
|
|
|
if( !s )
|
|
|
return;
|
|
|
Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ if( !a )
|
|
|
+ return;
|
|
|
Buchstabe *b = a->zBuchstabe( c );
|
|
|
if( b )
|
|
|
{
|
|
@@ -767,6 +771,8 @@ int TextRenderer::getCharWidth( const char c ) const
|
|
|
if( !s )
|
|
|
return 0;
|
|
|
Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ if( !a )
|
|
|
+ return 0;
|
|
|
Buchstabe *b = a->zBuchstabe( c );
|
|
|
if( b )
|
|
|
return (int)( ( (double)b->getBreite() / (double)b->getSchriftSize() ) * (double)schriftSize + 0.5 );
|
|
@@ -780,6 +786,8 @@ int TextRenderer::getCharHeight( const char c ) const
|
|
|
if( !s )
|
|
|
return 0;
|
|
|
Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ if( !a )
|
|
|
+ return 0;
|
|
|
Buchstabe *b = a->zBuchstabe( c );
|
|
|
if( b )
|
|
|
return (int)( ( (double)b->getHeight() / (double)b->getSchriftSize() ) * (double)schriftSize + 0.5 );
|
|
@@ -844,6 +852,122 @@ TextRenderer *TextRenderer::getThis()
|
|
|
}
|
|
|
|
|
|
TextRenderer *TextRenderer::release()
|
|
|
+{
|
|
|
+ if( !--ref )
|
|
|
+ delete this;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+GravurTextRenderer::GravurTextRenderer()
|
|
|
+ : GravurTextRenderer( 0 )
|
|
|
+{}
|
|
|
+
|
|
|
+GravurTextRenderer::GravurTextRenderer( Schrift *schrift )
|
|
|
+ : TextRenderer( schrift )
|
|
|
+{}
|
|
|
+
|
|
|
+GravurTextRenderer::~GravurTextRenderer()
|
|
|
+{}
|
|
|
+
|
|
|
+// Zeichnet einen Bestimmten Buchstaben mit einfärbung auf ein Bild
|
|
|
+// Nutze (setPosition) und (setDrawSchriftGröße) um die Position und die Größe zu verändern
|
|
|
+// x: x position des ersten zeichens
|
|
|
+// y: y position des ersten zeichens
|
|
|
+// txt: Der Text, der gezeichnet werden soll
|
|
|
+// zRObj: Das Bild, auf das gezeichnet werden soll
|
|
|
+// selected: 1, falls das zeichen eingefärbt sein soll
|
|
|
+// ff: Die Hintergrund Farbe des eingefärbten Textes
|
|
|
+// f: Die Farbe, in der der Text gezeichnet werden soll
|
|
|
+void GravurTextRenderer::renderChar( int &x, int y, char c, Bild &zRObj, bool selected, int ff, int f )
|
|
|
+{
|
|
|
+ if( !s )
|
|
|
+ return;
|
|
|
+ Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ Buchstabe *b = a->zBuchstabe( c );
|
|
|
+ if( b )
|
|
|
+ {
|
|
|
+ if( x >= zRObj.getBreite() )
|
|
|
+ return;
|
|
|
+ if( zRObj.isAreaDrawable( x, y, getCharWidth( c ), getCharHeight( c ) ) )
|
|
|
+ {
|
|
|
+ if( selected )
|
|
|
+ {
|
|
|
+ int br = getCharWidth( c ) + zeichenAbstand;
|
|
|
+ zRObj.alphaRegion( x, y, br, getZeilenHeight(), ff );
|
|
|
+ }
|
|
|
+ if( b->getBuff() )
|
|
|
+ {
|
|
|
+ const Punkt &zRObjGr = zRObj.getDrawGr();
|
|
|
+ const Punkt &zRObjPos = zRObj.getDrawPos();
|
|
|
+ const Punkt &zRObjOff = zRObj.getDrawOff();
|
|
|
+ int xp = x + zRObjOff.x, yp = y + zRObjOff.y;
|
|
|
+ int xs = xp < zRObjPos.x ? ( zRObjPos.x - xp ) : 0, ys = yp < zRObjPos.y ? ( zRObjPos.y - yp ) : 0;
|
|
|
+ int br = b->getBreite(), h = b->getHeight();
|
|
|
+ f &= 0x00FFFFFF;
|
|
|
+ double xoff = (double)b->getSchriftSize() / ( schriftSize * 2.0 ),
|
|
|
+ yoff = (double)b->getSchriftSize() / ( schriftSize * 2.0 );
|
|
|
+ double x = xs * xoff, y = ys * yoff;
|
|
|
+ int maxX = getCharWidth( c ), maxY = getCharHeight( c );
|
|
|
+ maxX = ( xp + maxX ) >= zRObjGr.x ? ( zRObjGr.x - xp ) : maxX;
|
|
|
+ maxY = ( yp + maxY ) >= zRObjGr.y ? ( zRObjGr.y - yp ) : maxY;
|
|
|
+ int dx, ygr, ygr2;
|
|
|
+ for( int dy = ys; dy < maxY; ++dy )
|
|
|
+ {
|
|
|
+ ygr2 = ( yp + dy ) * zRObj.getBreite();
|
|
|
+ ygr = (int)y * br;
|
|
|
+ for( dx = xs; dx < maxX; ++dx )
|
|
|
+ {
|
|
|
+ int f = 0;
|
|
|
+ if( b->getBuff()[ (int)x + ygr ] )
|
|
|
+ f = 0x20000000;
|
|
|
+ else if( ( (int)( x + xoff ) < br && b->getBuff()[ (int)( x + xoff ) + ygr ] ) || ( (int)( y - yoff ) < h && b->getBuff()[ (int)x + (int)( y - yoff ) * br ] > 0xF0 ) )
|
|
|
+ f = 0x70000000;
|
|
|
+ else if( ( (int)( x - xoff ) < br && b->getBuff()[ (int)( x - xoff ) + ygr ] ) || ( (int)( y + yoff ) < h && b->getBuff()[ (int)x + (int)( y + yoff ) * br ] > 0xF0 ) )
|
|
|
+ {
|
|
|
+ f = 0x70FFFFFF;
|
|
|
+ }
|
|
|
+ zRObj.alphaPixel( xp + dx + ygr2, f );
|
|
|
+ x += xoff;
|
|
|
+ }
|
|
|
+ x = xs;
|
|
|
+ y += yoff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ x += getCharWidth( c ) + zeichenAbstand;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Buchstaben vollständig darzustellen
|
|
|
+// c: Der Buchstabe, von dem die Breite in Pixeln ermitelt werden soll
|
|
|
+int GravurTextRenderer::getCharWidth( const char c ) const
|
|
|
+{
|
|
|
+ if( !s )
|
|
|
+ return 0;
|
|
|
+ Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ Buchstabe *b = a->zBuchstabe( c );
|
|
|
+ if( b )
|
|
|
+ return (int)( ( (double)b->getBreite() / (double)b->getSchriftSize() ) * (double)schriftSize * 2 + 0.5 );
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+// Ermittelt, wie viele Pixel benötigt werden, um einen Bestimmten Text vollständig darzustellen
|
|
|
+// c: Der Buchstabe, von dem die Höhe in Pixeln ermitelt werden soll
|
|
|
+int GravurTextRenderer::getCharHeight( const char c ) const
|
|
|
+{
|
|
|
+ if( !s )
|
|
|
+ return 0;
|
|
|
+ Alphabet *a = s->zAlphabet( schriftSize );
|
|
|
+ Buchstabe *b = a->zBuchstabe( c );
|
|
|
+ if( b )
|
|
|
+ return (int)( ( (double)b->getHeight() / (double)b->getSchriftSize() ) * (double)schriftSize * 2 + 0.5 );
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+// Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
|
|
|
+// return: 0.
|
|
|
+TextRenderer *GravurTextRenderer::release()
|
|
|
{
|
|
|
if( !--ref )
|
|
|
delete this;
|