Ver Fonte

fix formatted text conflicts with null terminated strings

Kolja Strohm há 6 meses atrás
pai
commit
6270e063a8
2 ficheiros alterados com 80 adições e 52 exclusões
  1. 60 37
      TextFeld.cpp
  2. 20 15
      TextFeld.h

+ 60 - 37
TextFeld.cpp

@@ -547,13 +547,22 @@ void TextFeld::setText(const char* txt) // setzt den angezeigten Text
 // setzt den Text mit styles
 //  txt: der Text
 //  format: \x1: aktiviert unterschtrich
-//          \x2\xY: setzt die schriftgröße auf y für den folgenden text
-//          \x3\xA\xR\xG\xB: setzt die schriftfarbe auf ARGB
-//          \x4\xA\xR\xG\xB: setzt die farbe des ausgewählten textes
-//          \x5\xA\xR\xG\xB: setzt die hintergrundfarbe des ausgewählten textes
-//          \x6\xY: setzt text renderer index auf y
+//          \x2FF: setzt die schriftgröße für den folgenden text.
+//              FF ist ein zweistelliger Hex Wert
+//          \x3AARRGGBB: setzt die schriftfarbe.
+//              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
+//              für alpha, rot, grün n blau
+//          \x4AARRGGBB: setzt die farbe des ausgewählten textes.
+//              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
+//              für alpha, rot, grün n blau
+//          \x5AARRGGBB: setzt die hintergrundfarbe des ausgewählten textes.
+//              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei zeichen
+//              für alpha, rot, grün n blau
+//          \x6FF: setzt text renderer index.
+//              FF ist ein zweistelliger Hex Wert
 //          \x7: deaktiviert unterschtrich
-//          \x8\xA\xB\xC\xD: set interact param to ABCD
+//          \x8FFFFFFFF: set interact param.
+//              FFFFFFFF ist ein 8 stelliger hex wert
 void TextFeld::setFormattedText(const char* txt)
 {
     lockZeichnung();
@@ -585,48 +594,62 @@ void TextFeld::setFormattedText(const char* txt)
             tm->textStyle.add(current);
             break;
         case 2:
-            current.fontSize = (unsigned char)txt[++i];
-            tm->textStyle.add(current);
-            break;
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 2);
+                current.fontSize = (unsigned char)(int)p;
+                tm->textStyle.add(current);
+                i += 2;
+                break;
+            }
         case 3:
-            current.fontColor = 0;
-            current.fontColor |= (unsigned char)txt[++i] << 24;
-            current.fontColor |= (unsigned char)txt[++i] << 16;
-            current.fontColor |= (unsigned char)txt[++i] << 8;
-            current.fontColor |= (unsigned char)txt[++i];
-            tm->textStyle.add(current);
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 8);
+                current.fontColor = (int)p;
+                tm->textStyle.add(current);
+                i += 8;
+            }
             break;
         case 4:
-            current.selectedColor = 0;
-            current.selectedColor |= (unsigned char)txt[++i] << 24;
-            current.selectedColor |= (unsigned char)txt[++i] << 16;
-            current.selectedColor |= (unsigned char)txt[++i] << 8;
-            current.selectedColor |= (unsigned char)txt[++i];
-            tm->textStyle.add(current);
-            break;
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 8);
+                current.selectedColor = (int)p;
+                tm->textStyle.add(current);
+                i += 8;
+                break;
+            }
         case 5:
-            current.selectedBackcroundColor = 0;
-            current.selectedBackcroundColor |= (unsigned char)txt[++i] << 24;
-            current.selectedBackcroundColor |= (unsigned char)txt[++i] << 16;
-            current.selectedBackcroundColor |= (unsigned char)txt[++i] << 8;
-            current.selectedBackcroundColor |= (unsigned char)txt[++i];
-            tm->textStyle.add(current);
-            break;
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 8);
+                current.selectedBackcroundColor = (int)p;
+                tm->textStyle.add(current);
+                i += 8;
+                break;
+            }
         case 6:
-            current.rendererIndex = (unsigned char)(txt[++i] - 1);
-            tm->textStyle.add(current);
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 2);
+                current.rendererIndex = (unsigned char)(int)p;
+                tm->textStyle.add(current);
+                i += 2;
+            }
             break;
         case 7:
             current.underlined = 0;
             tm->textStyle.add(current);
             break;
         case 8:
-            current.interactParam = 0;
-            current.interactParam |= (unsigned char)txt[++i] << 24;
-            current.interactParam |= (unsigned char)txt[++i] << 16;
-            current.interactParam |= (unsigned char)txt[++i] << 8;
-            current.interactParam |= (unsigned char)txt[++i];
-            tm->textStyle.add(current);
+            {
+                Text p = "0x";
+                p.append(txt + i + 1, 8);
+                current.interactParam = (int)p;
+                tm->textStyle.add(current);
+                i += 8;
+            }
             break;
         default:
             result.append(txt[i]);

+ 20 - 15
TextFeld.h

@@ -155,21 +155,26 @@ namespace Framework
         //! setzt den Text des Textfeldes
         //! \param txt der Text
         DLLEXPORT void setText(const char* txt);
-        //! setzt den Text mit styles
-        //! \param txt der Text
-        //! \param format
-        //!               - \\x1: aktiviert unterschtrich
-        //!               - \\x2\\xY: setzt die schriftgröße auf y für den
-        //!               folgenden text
-        //!               - \\x3\\xA\\xR\\xG\\xB: setzt die schriftfarbe auf
-        //!               ARGB
-        //!               - \\x4\\xA\\xR\\xG\\xB: setzt die farbe des
-        //!               ausgewählten textes
-        //!               - \\x5\\xA\\xR\\xG\\xB: setzt die hintergrundfarbe des
-        //!               ausgewählten textes
-        //!               - \\x6\\xY: setzt text renderer index auf y
-        //!               - \\x7: deaktiviert unterschtrich
-        //!               - \\x8\\xA\\xB\\xC\\xD: set interact param to ABCD
+        // setzt den Text mit styles
+        //  txt: der Text
+        //  format: \x1: aktiviert unterschtrich
+        //          \x2FF: setzt die schriftgröße für den folgenden text.
+        //              FF ist ein zweistelliger Hex Wert
+        //          \x3AARRGGBB: setzt die schriftfarbe.
+        //              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei
+        //              zeichen für alpha, rot, grün n blau
+        //          \x4AARRGGBB: setzt die farbe des ausgewählten textes.
+        //              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei
+        //              zeichen für alpha, rot, grün n blau
+        //          \x5AARRGGBB: setzt die hintergrundfarbe des ausgewählten
+        //          textes.
+        //              AARRGGBB ist ein 8 stelliger hex wert mit jeweils zwei
+        //              zeichen für alpha, rot, grün n blau
+        //          \x6FF: setzt text renderer index.
+        //              FF ist ein zweistelliger Hex Wert
+        //          \x7: deaktiviert unterschtrich
+        //          \x8FFFFFFFF: set interact param.
+        //              FFFFFFFF ist ein 8 stelliger hex wert
         DLLEXPORT void setFormattedText(const char* txt);
         //! fügt zeilenumbrüche so ein, dass der text nicht die breite des
         //! textfeldes überschreitet \param spacing ein text, der direkt nach