From dc092e57675e1d6be51f90875d10e921213410a1 Mon Sep 17 00:00:00 2001 From: Lumex <54485140+LumexDE@users.noreply.github.com> Date: Thu, 12 Sep 2024 00:08:02 +0200 Subject: [PATCH] Library bug fix, text spacing adjustments, textbox adjustments --- app/Badges/Components/TextField.php | 153 ++++++++++------------------ app/Badges/EF28_Badge.php | 20 ++-- 2 files changed, 61 insertions(+), 112 deletions(-) diff --git a/app/Badges/Components/TextField.php b/app/Badges/Components/TextField.php index 7b4fb9b..e8511b8 100644 --- a/app/Badges/Components/TextField.php +++ b/app/Badges/Components/TextField.php @@ -104,116 +104,65 @@ public function __construct( * @return ImageInterface The image with the drawn text. */ protected function drawTextInBox(ImageInterface $image, PointInterface $position): ImageInterface - { - $fontSize = $this->startFontSize; // Startet mit der anfänglichen Schriftgröße - $lines = []; // Array zum Speichern der Zeilen des Textes - $palette = new RGB(); // Erzeuge eine RGB-Palette - - do { - // Wenn der Text ein zusammenhängender String ohne Leerzeichen ist, füge das gesamte Wort in die Zeile ein - if (strpos($this->text, ' ') === false) { - $lines = [$this->text]; - $font = new Font($this->font_path, $fontSize, $this->font_color); - $textBox = $font->box($this->text); - - // Überprüft, ob der gesamte String in die Breite passt - if ($textBox->getWidth() > $this->width) { - $fontSize--; // Reduziert die Schriftgröße, wenn der Text nicht passt - } else { - break; // Passt, keine weiteren Änderungen erforderlich - } - } else { - // Teilt den Text in Wörter auf - $words = explode(' ', $this->text); - $lines = []; - $currentLine = ''; - - // Erstelle die Font-Instanz für die aktuelle Schleife - $font = new Font($this->font_path, $fontSize, $this->font_color); - - // Verarbeitet jedes Wort und fügt es zur aktuellen Zeile hinzu - foreach ($words as $word) { - $testLine = $currentLine . ($currentLine ? ' ' : '') . $word; - $textBox = $font->box($testLine); - - // Überprüft, ob die aktuelle Zeile in die Breite passt - if ($textBox->getWidth() > $this->width) { - if (!empty($currentLine)) { - $lines[] = $currentLine; - } - $currentLine = $word; - } else { - $currentLine = $testLine; - } - } - $lines[] = $currentLine; - - // Überprüft, ob die Anzahl der Zeilen die maximale Anzahl überschreitet - if (count($lines) > $this->maxRows) { - $fontSize--; // Reduziert die Schriftgröße, wenn zu viele Zeilen vorhanden sind - } else { - break; - } - } - } while ($fontSize >= $this->minFontSize); +{ + $fontSize = $this->startFontSize; // Startet mit der anfänglichen Schriftgröße + $palette = new RGB(); // Erzeuge eine RGB-Palette - // Erstelle die Font-Instanz mit finaler Schriftgröße + do { + // Berechne die Box-Größe mit der aktuellen Schriftgröße $font = new Font($this->font_path, $fontSize, $this->font_color); + $textBox = $font->box($this->text); - // Berechnet die vertikale Startposition, um den Text zentriert zu platzieren - $y = $position->getY() + ($this->height - (count($lines) * $fontSize)) / 2; - - // Zeichne Hintergrundfarbe und Rahmen, wenn angegeben - $drawer = $image->draw(); - if ($this->backgroundColor || $this->borderColor) { - $box = new Box($this->width, $this->height); - $boxEnd = new Point($position->getX() + $this->width, $position->getY() + $this->height); - - if ($this->backgroundColor) { - // Erzeuge ein Rechteck mit der Hintergrundfarbe - $drawer->rectangle($position, $boxEnd, $this->backgroundColor, true); - } - - if ($this->borderThickness > 0 && $this->borderColor) { - // Zeichne den Rahmen - $drawer->rectangle($position, $boxEnd, $this->borderColor, false, $this->borderThickness); + // Überprüft, ob der Text in die Box passt + if ($textBox->getWidth() > $this->width || $textBox->getHeight() > $this->height) { + $fontSize--; // Reduziert die Schriftgröße, wenn der Text zu groß ist + } else { + break; // Passt, keine weiteren Änderungen erforderlich + } + } while ($fontSize >= $this->minFontSize); + + // Berechne die vertikale Position, um den Text zentriert zu platzieren + $y = $position->getY() + ($this->height - $textBox->getHeight()) / 2; + // Berechne die horizontale Position basierend auf der Ausrichtung (zentriert, links oder rechts) + $x = $this->calculateXPosition($textBox->getWidth(), $position); + + // Zeichnet den Textumriss, falls angegeben + if ($this->textStrokeColor && $this->textStrokeThickness > 0) { + for ($offsetX = -$this->textStrokeThickness; $offsetX <= $this->textStrokeThickness; $offsetX++) { + for ($offsetY = -$this->textStrokeThickness; $offsetY <= $this->textStrokeThickness; $offsetY++) { + if ($offsetX !== 0 || $offsetY !== 0) { + $image->draw()->text( + $this->text, + new Font($this->font_path, $fontSize, $this->textStrokeColor), + new Point($x + $offsetX, $y + $offsetY) + ); + } } } + } - // Zeichnet jede Zeile auf das Bild - foreach ($lines as $line) { - // Berechnet die X-Position basierend auf der Ausrichtung - $textBox = $font->box($line); - - switch ($this->alignment) { - case TextAlignment::CENTER: - $x = $position->getX() + ($this->width - $textBox->getWidth()) / 2; - break; - case TextAlignment::RIGHT: - $x = $position->getX() + ($this->width - $textBox->getWidth()); - break; - case TextAlignment::LEFT: - default: - $x = $position->getX(); // Linksbündig - break; - } + // Zeichnet den Text auf das Bild an der berechneten Position + $image->draw()->text($this->text, $font, new Point($x, $y)); - // Zeichnet den Textumriss, falls angegeben - if ($this->textStrokeColor && $this->textStrokeThickness > 0) { - for ($offsetX = -$this->textStrokeThickness; $offsetX <= $this->textStrokeThickness; $offsetX++) { - for ($offsetY = -$this->textStrokeThickness; $offsetY <= $this->textStrokeThickness; $offsetY++) { - if ($offsetX !== 0 || $offsetY !== 0) { - $image->draw()->text($line, new Font($this->font_path, $fontSize, $this->textStrokeColor), new Point($x + $offsetX, $y + $offsetY)); - } - } - } - } + return $image; +} - // Zeichnet den Text auf das Bild an der berechneten Position - $image->draw()->text($line, $font, new Point($x, $y)); - $y += $fontSize; // Verschiebt die Y-Position für die nächste Zeile nach unten - } - return $image; + +/** + * Berechnet die X-Position des Textes basierend auf der Ausrichtung. + */ +private function calculateXPosition(int $textWidth, PointInterface $position): int +{ + switch ($this->alignment) { + case TextAlignment::CENTER: + return $position->getX() + ($this->width - $textWidth) / 2; + case TextAlignment::RIGHT: + return $position->getX() + ($this->width - $textWidth); + case TextAlignment::LEFT: + default: + return $position->getX(); // Linksbündig } } + +} diff --git a/app/Badges/EF28_Badge.php b/app/Badges/EF28_Badge.php index dc2c176..3c8653e 100644 --- a/app/Badges/EF28_Badge.php +++ b/app/Badges/EF28_Badge.php @@ -173,27 +173,27 @@ private function addFourthLayer(ImageInterface $badge_object) // Position of the texts in the image $position_attendee_id = new Point( $this->width_px - 129, // X-Position (adapted) - 42 // Y-Position + 38 // Y-Position ); $position_species = new Point( $this->width_px - 321 - 160, // X-Position (adapted for the width of the text box) - $this->height_px - 67 - 222 // Y-Position + $this->height_px - 67 - 213 // Y-Position ); $position_name = new Point( $this->width_px - 321 - 160, // X-Position (adapted for the width of the text box) - $this->height_px - 67 - 348 // Y-Position + $this->height_px - 67 - 339 // Y-Position ); $position_name_label = new Point( $this->width_px - 321 - 260, // X-Position (adapted for the width of the text box) - $this->height_px - 67 - 357 // Y-Position + $this->height_px - 67 - 361 // Y-Position ); $position_species_label = new Point( $this->width_px - 321 - 275, // X-Position (adapted for the width of the text box) - $this->height_px - 67 - 230 // Y-Position + $this->height_px - 67 - 232 // Y-Position ); $position_fursuit_badge = new Point( @@ -221,7 +221,7 @@ private function addFourthLayer(ImageInterface $badge_object) new TextField( $text_species, 321, // Width of the text field - 90, // Height of the text field + 60, // Height of the text field 15, // Minimum font size 50, // Start font size $font_path, @@ -237,7 +237,7 @@ private function addFourthLayer(ImageInterface $badge_object) new TextField( $text_name, 321, // Width of the text field - 90, // Height of the text field + 60, // Height of the text field 15, // Minimum font size 50, // Start font size $font_path, @@ -312,7 +312,7 @@ private function addFifthLayer(ImageInterface $badge_object, Box $size) $overlayImage->resize($size); // Textposition - $position = new Point($this->width_px - 552, $this->height_px - 173); + $position = new Point($this->width_px - 558, $this->height_px - 182); // Create color palette - Text color $palette = new RGB(); @@ -324,11 +324,11 @@ private function addFifthLayer(ImageInterface $badge_object, Box $size) $badge_object->paste($overlayImage, new Point(0, 0)); new TextField( - $this->addLetterSpacing(strtoupper($this->badge->fursuit->catch_code), 2), + $this->addLetterSpacing(strtoupper($this->badge->fursuit->catch_code), 1), 500, // Width of the text field 90, // Height of the text field 15, // Minimum font size - 65, // Start font size + 60, // Start font size resource_path('badges/ef28/fonts/upcib.ttf'), $font_color, $badge_object,