Browse Source

Gravur Text Renderer hinzugefügt

kolja 5 years ago
parent
commit
a8d315b97f
6 changed files with 219 additions and 9 deletions
  1. 124 0
      Schrift.cpp
  2. 28 1
      Schrift.h
  3. 2 2
      Tabelle.cpp
  4. 50 2
      Text.cpp
  5. 4 0
      Text.h
  6. 11 4
      TextFeld.cpp

+ 124 - 0
Schrift.cpp

@@ -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;

+ 28 - 1
Schrift.h

@@ -300,7 +300,34 @@ namespace Framework
         __declspec( dllexport ) TextRenderer *getThis();
         // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
         //  return: 0.
-        __declspec( dllexport ) TextRenderer *release();
+        __declspec( dllexport ) virtual TextRenderer *release();
+    };
+
+    class GravurTextRenderer : public TextRenderer
+    {
+    public:
+        __declspec( dllexport ) GravurTextRenderer();
+        __declspec( dllexport ) GravurTextRenderer( Schrift *schrift );
+        __declspec( dllexport ) virtual ~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
+        __declspec( dllexport ) virtual void renderChar( int &x, int y, char c, Bild &zRObj, bool selected, int ff, int f );
+        // 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
+        __declspec( dllexport ) virtual int getCharWidth( const char c ) const;
+        // 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
+        __declspec( dllexport ) virtual int getCharHeight( const char c ) const;
+        // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Objekt automatisch gelöscht.
+        //  return: 0.
+        __declspec( dllexport ) virtual TextRenderer *release();
     };
 }
 

+ 2 - 2
Tabelle.cpp

@@ -1104,7 +1104,7 @@ void ObjTabelle::render( Bild &zRObj ) // zeichnet nach zRObj
             }
             if( hatStyle( Style::Raster ) )
             {
-                zRObj.drawLinieH( xPos, yPos + zHi, sBr, rasterFarbe );
+                zRObj.drawLinieHAlpha( xPos, yPos + zHi, sBr, rasterFarbe );
                 yPos += rasterBreite;
             }
             yPos += zHi;
@@ -1113,7 +1113,7 @@ void ObjTabelle::render( Bild &zRObj ) // zeichnet nach zRObj
         }
         if( hatStyle( Style::Raster ) )
         {
-            zRObj.drawLinieV( xPos + sBr, 0, innenSize.y, rasterFarbe );
+            zRObj.drawLinieVAlpha( xPos + sBr, 0, innenSize.y, rasterFarbe );
             xPos += rasterBreite;
         }
         xPos += sBr;

+ 50 - 2
Text.cpp

@@ -80,6 +80,52 @@ Text::~Text()
     delete[]txt;
 }
 
+void Text::toUpperCase()
+{
+    if( !txt )
+        return;
+    for( int i = 0; txt[ i ]; i++ )
+    {
+        if( txt[ i ] >= 'a' && txt[ i ] <= 'z' )
+            txt[ i ] -= 32;
+        switch( txt[ i ] )
+        {
+        case 'ü':
+            txt[ i ] = 'Ü';
+            break;
+        case 'ö':
+            txt[ i ] = 'Ö';
+            break;
+        case 'ä':
+            txt[ i ] = 'Ä';
+            break;
+        }
+    }
+}
+
+void Text::toLowerCase()
+{
+    if( !txt )
+        return;
+    for( int i = 0; txt[ i ]; i++ )
+    {
+        if( txt[ i ] >= 'A' && txt[ i ] <= 'Z' )
+            txt[ i ] += 32;
+        switch( txt[ i ] )
+        {
+        case 'Ü':
+            txt[ i ] = 'ü';
+            break;
+        case 'Ö':
+            txt[ i ] = 'ö';
+            break;
+        case 'Ä':
+            txt[ i ] = 'ä';
+            break;
+        }
+    }
+}
+
 // nicht constant
 void Text::setSuchGrenzen( char gBeg, char gEnd ) // sucht bei jeder suchfunktion nicht zwischen den Zeichen gBeg und gEnd
 {
@@ -466,8 +512,10 @@ void Text::remove( int p1, int p2 ) // l
         p2 = x;
     }
     int l = getLength(); // Länge des Testes
-    if( p1 < 0 || p2 > l ) // Auf unsinnige übergabe prüfen
-        return;
+    if( p1 < 0 ) // Auf unsinnige übergabe prüfen
+        p1 = 0;
+    if( p2 > l )
+        p2 = l;
     int resl = l - ( p2 - p1 ); // Länge vom Ergebnis
     char *res = new char[ resl + 1 ]; // Neuen Text erstellen
     for( int i = 0; i < p1; ++i ) // Text füllen

+ 4 - 0
Text.h

@@ -37,6 +37,10 @@ namespace Framework
         __declspec( dllexport ) Text( float num );
         // Löscht den Text
         __declspec( dllexport ) ~Text();
+        // Wandelt alle buchstaben in großbuchstaben um
+        __declspec( dllexport ) void toUpperCase();
+        // Wandelt alle buchstaben in kleinbuchstaben um
+        __declspec( dllexport ) void toLowerCase();
         // Legt die Suchgrenzen fest, die von den Suchfunktionen verwendet werden.
         //  gBeg: Das Zeichen, bei dem die Suche beginnen soll
         //  gEnd: Das Zeichen, bei dem die Suche enden soll

+ 11 - 4
TextFeld.cpp

@@ -128,6 +128,13 @@ void TextFeld::setAuswahl( Punkt &auswahl )
 	rend = 1;
 }
 
+void TextFeld::setTextRendererZ( TextRenderer *textRd )
+{
+    if( this->textRd )
+        this->textRd->release();
+    this->textRd = textRd;
+}
+
 void TextFeld::setSchriftZ( Schrift *schrift ) // setzt einen Zeiger zur Schrift
 {
     if( !this->textRd )
@@ -698,16 +705,16 @@ void TextFeld::render( Bild &zRObj ) // zeichenet nach zRObj
 			int len = text->getLength() - text->anzahlVon( '\n' ) - text->anzahlVon( '\r' ) * 11;
 			rt.fillText( showChar, len );
 			if( tickVal <= 0.5 )
-                textRd->renderText( xxx, yyy, rt, zRObj, cpos, 0xFFFF5555, begf, 0xFF0000FF, sF );
+                textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
 			else
-                textRd->renderText( xxx, yyy, rt, zRObj, cpos, 0x00000000, begf, 0xFF0000FF, sF );
+                textRd->renderText( xxx, yyy, rt, zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
 		}
 		else
 		{
 			if( tickVal <= 0.5 )
-                textRd->renderText( xxx, yyy, text->getText(), zRObj, cpos, 0xFFFF5555, begf, 0xFF0000FF, sF );
+                textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0xFFFF5555, begf, 0xFF0000FF );
 			else
-                textRd->renderText( xxx, yyy, text->getText(), zRObj, cpos, 0x00000000, begf, 0xFF0000FF, sF );
+                textRd->renderText( xxx, yyy, text->getText(), zRObj, sF, cpos, 0x00000000, begf, 0xFF0000FF );
 		}
 	}
 	else