diff --git a/lib/GfxRenderer/GfxRenderer.cpp b/lib/GfxRenderer/GfxRenderer.cpp index 435c1e9c..6dcc8e86 100644 --- a/lib/GfxRenderer/GfxRenderer.cpp +++ b/lib/GfxRenderer/GfxRenderer.cpp @@ -821,7 +821,8 @@ void GfxRenderer::drawBitmap1Bit(const Bitmap &bitmap, const int x, const int y, free(rowBytes); } -void GfxRenderer::drawTransparentBitmap(const Bitmap& bitmap, const int x, const int y, const int w, const int h) const { +void GfxRenderer::drawTransparentBitmap(const Bitmap& bitmap, const int x, const int y, const int w, + const int h) const { // Similar to drawBitmap1Bit but strictly skips 1s (white) in the source 1-bit data // The Bitmap reader returns 2-bit packed data where 0-2=Black and 3=White for 1-bit sources @@ -880,7 +881,7 @@ void GfxRenderer::drawTransparentBitmap(const Bitmap& bitmap, const int x, const if (val < 3) { for (int sy = startY; sy < endY; sy++) { for (int sx = startX; sx < endX; sx++) { - drawPixel(sx, sy, true); // Black + drawPixel(sx, sy, true); // Black } } } @@ -984,7 +985,7 @@ void GfxRenderer::drawRoundedBitmap(const Bitmap& bitmap, const int x, const int if (renderMode == BW) { pixelBlack = (val < 2); } else if (renderMode == GRAYSCALE_MSB) { - pixelBlack = (val < 3); // Draw all non-white as black for icons/covers + pixelBlack = (val < 3); // Draw all non-white as black for icons/covers } else if (renderMode == GRAYSCALE_LSB) { pixelBlack = (val == 0); } diff --git a/lib/ThemeEngine/include/BasicElements.h b/lib/ThemeEngine/include/BasicElements.h index f0dcae82..839978f2 100644 --- a/lib/ThemeEngine/include/BasicElements.h +++ b/lib/ThemeEngine/include/BasicElements.h @@ -262,67 +262,67 @@ class Label : public UIElement { // Binary search for cut point int len = remaining.length(); int cut = len; - + // Find split point // Optimistic start: approximate chars that fit - int avgCharWidth = renderer.getTextWidth(fontId, "a"); + int avgCharWidth = renderer.getTextWidth(fontId, "a"); if (avgCharWidth < 1) avgCharWidth = 8; - int approxChars = absW / avgCharWidth; + int approxChars = absW / avgCharWidth; if (approxChars < 1) approxChars = 1; if (approxChars >= len) approxChars = len - 1; - + // Refine from approxChars int w = renderer.getTextWidth(fontId, remaining.substr(0, approxChars).c_str()); if (w < absW) { - // Grow - for (int i = approxChars; i <= len; i++) { - if (renderer.getTextWidth(fontId, remaining.substr(0, i).c_str()) > absW) { - cut = i - 1; - break; - } - cut = i; - } + // Grow + for (int i = approxChars; i <= len; i++) { + if (renderer.getTextWidth(fontId, remaining.substr(0, i).c_str()) > absW) { + cut = i - 1; + break; + } + cut = i; + } } else { - // Shrink - for (int i = approxChars; i > 0; i--) { - if (renderer.getTextWidth(fontId, remaining.substr(0, i).c_str()) <= absW) { - cut = i; - break; - } - } + // Shrink + for (int i = approxChars; i > 0; i--) { + if (renderer.getTextWidth(fontId, remaining.substr(0, i).c_str()) <= absW) { + cut = i; + break; + } + } } // Find last space before cut if (cut < (int)remaining.length()) { - int space = -1; - for (int i = cut; i > 0; i--) { - if (remaining[i] == ' ') { - space = i; - break; - } + int space = -1; + for (int i = cut; i > 0; i--) { + if (remaining[i] == ' ') { + space = i; + break; } - if (space != -1) cut = space; + } + if (space != -1) cut = space; } std::string line = remaining.substr(0, cut); - + // If we're at the last allowed line but still have more text if ((int)lines.size() == maxLines - 1 && cut < (int)remaining.length()) { - if (ellipsis) { - line = renderer.truncatedText(fontId, remaining.c_str(), absW); - } - lines.push_back(line); - break; + if (ellipsis) { + line = renderer.truncatedText(fontId, remaining.c_str(), absW); + } + lines.push_back(line); + break; } - + lines.push_back(line); // Advance if (cut < (int)remaining.length()) { - // Skip the space if check - if (remaining[cut] == ' ') cut++; - remaining = remaining.substr(cut); + // Skip the space if check + if (remaining[cut] == ' ') cut++; + remaining = remaining.substr(cut); } else { - remaining = ""; + remaining = ""; } } } else { @@ -332,29 +332,29 @@ class Label : public UIElement { } lines.push_back(finalText); } - + // Draw lines int totalTextHeight = lines.size() * lineHeight; int startY = absY; - + // Vertical centering if (absH > 0 && totalTextHeight < absH) { startY = absY + (absH - totalTextHeight) / 2; } for (size_t i = 0; i < lines.size(); i++) { - int lineWidth = renderer.getTextWidth(fontId, lines[i].c_str()); - int drawX = absX; - - if (alignment == Alignment::Center && absW > 0) { - drawX = absX + (absW - lineWidth) / 2; - } else if (alignment == Alignment::Right && absW > 0) { - drawX = absX + absW - lineWidth; - } - - renderer.drawText(fontId, drawX, startY + i * lineHeight, lines[i].c_str(), black); + int lineWidth = renderer.getTextWidth(fontId, lines[i].c_str()); + int drawX = absX; + + if (alignment == Alignment::Center && absW > 0) { + drawX = absX + (absW - lineWidth) / 2; + } else if (alignment == Alignment::Right && absW > 0) { + drawX = absX + absW - lineWidth; + } + + renderer.drawText(fontId, drawX, startY + i * lineHeight, lines[i].c_str(), black); } - + markClean(); } }; diff --git a/lib/ThemeEngine/src/BasicElements.cpp b/lib/ThemeEngine/src/BasicElements.cpp index e488875c..73ee5ae6 100644 --- a/lib/ThemeEngine/src/BasicElements.cpp +++ b/lib/ThemeEngine/src/BasicElements.cpp @@ -1,10 +1,11 @@ #include "BasicElements.h" +#include + #include "Bitmap.h" #include "ListElement.h" #include "ThemeManager.h" #include "ThemeTypes.h" -#include namespace ThemeEngine { @@ -23,7 +24,7 @@ void BitmapElement::draw(const GfxRenderer& renderer, const ThemeContext& contex // Resolve simplified or relative paths if (path.find('/') == std::string::npos || (path.length() > 0 && path[0] != '/')) { - path = ThemeManager::get().getAssetPath(path); + path = ThemeManager::get().getAssetPath(path); } // 1. Check if we have a cached 1-bit render @@ -47,46 +48,46 @@ void BitmapElement::draw(const GfxRenderer& renderer, const ThemeContext& contex // 2. Try Streaming (Absolute paths, large images) if (path.length() > 0 && path[0] == '/') { - FsFile file; - if (SdMan.openFileForRead("HOME", path, file)) { - Bitmap bmp(file, true); // (file, dithering=true) - if (bmp.parseHeaders() == BmpReaderError::Ok) { - // Center logic - int drawX = absX; - int drawY = absY; - if (bmp.getWidth() < absW) drawX += (absW - bmp.getWidth()) / 2; - if (bmp.getHeight() < absH) drawY += (absH - bmp.getHeight()) / 2; - - if (borderRadius > 0) { - renderer.drawRoundedBitmap(bmp, drawX, drawY, absW, absH, borderRadius); - } else { - renderer.drawBitmap(bmp, drawX, drawY, absW, absH); - } - drawSuccess = true; - } - file.close(); + FsFile file; + if (SdMan.openFileForRead("HOME", path, file)) { + Bitmap bmp(file, true); // (file, dithering=true) + if (bmp.parseHeaders() == BmpReaderError::Ok) { + // Center logic + int drawX = absX; + int drawY = absY; + if (bmp.getWidth() < absW) drawX += (absW - bmp.getWidth()) / 2; + if (bmp.getHeight() < absH) drawY += (absH - bmp.getHeight()) / 2; + + if (borderRadius > 0) { + renderer.drawRoundedBitmap(bmp, drawX, drawY, absW, absH, borderRadius); + } else { + renderer.drawBitmap(bmp, drawX, drawY, absW, absH); + } + drawSuccess = true; } + file.close(); + } } // 3. Fallback to RAM Cache (Standard method) if (!drawSuccess) { - const std::vector* data = ThemeManager::get().getCachedAsset(path); - if (data && !data->empty()) { - Bitmap bmp(data->data(), data->size()); - if (bmp.parseHeaders() == BmpReaderError::Ok) { - int drawX = absX; - int drawY = absY; - if (bmp.getWidth() < absW) drawX += (absW - bmp.getWidth()) / 2; - if (bmp.getHeight() < absH) drawY += (absH - bmp.getHeight()) / 2; - - if (borderRadius > 0) { - renderer.drawRoundedBitmap(bmp, drawX, drawY, absW, absH, borderRadius); - } else { - renderer.drawBitmap(bmp, drawX, drawY, absW, absH); - } - drawSuccess = true; + const std::vector* data = ThemeManager::get().getCachedAsset(path); + if (data && !data->empty()) { + Bitmap bmp(data->data(), data->size()); + if (bmp.parseHeaders() == BmpReaderError::Ok) { + int drawX = absX; + int drawY = absY; + if (bmp.getWidth() < absW) drawX += (absW - bmp.getWidth()) / 2; + if (bmp.getHeight() < absH) drawY += (absH - bmp.getHeight()) / 2; + + if (borderRadius > 0) { + renderer.drawRoundedBitmap(bmp, drawX, drawY, absW, absH, borderRadius); + } else { + renderer.drawBitmap(bmp, drawX, drawY, absW, absH); } - } + drawSuccess = true; + } + } } // 4. Cache result if successful