From 5c22342dcc587b008afd32a33831558679a3087d Mon Sep 17 00:00:00 2001 From: Jonas Diemer Date: Thu, 18 Dec 2025 13:43:47 +0100 Subject: [PATCH] Formatting. --- src/activities/boot_sleep/SleepActivity.cpp | 138 ++++++++++---------- 1 file changed, 68 insertions(+), 70 deletions(-) diff --git a/src/activities/boot_sleep/SleepActivity.cpp b/src/activities/boot_sleep/SleepActivity.cpp index 8a5b6eb9..067776c0 100644 --- a/src/activities/boot_sleep/SleepActivity.cpp +++ b/src/activities/boot_sleep/SleepActivity.cpp @@ -9,83 +9,82 @@ #include "config.h" #include "images/CrossLarge.h" -void convertBmpToBWdisplayData(uint8_t* bmpData, - int width, int height, uint8_t* displayImage){ - // Convert BMP data to 1bpp format for e-ink display - // Implementation details depend on the specific BMP format and display requirements +void convertBmpToBWdisplayData(uint8_t* bmpData, int width, int height, uint8_t* displayImage) { + // Convert BMP data to 1bpp format for e-ink display + // Implementation details depend on the specific BMP format and display requirements - // Static lookup table for bit masks (better performance) - static const uint8_t bitMasks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; + // Static lookup table for bit masks (better performance) + static const uint8_t bitMasks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; - // For 1bpp images where width is divisible by 8, we can use a highly optimized approach - const int bytesPerSrcRow = width / 8; - const int bytesPerRow = (height + 7) / 8; // use heigth due to 90deg rotation + // For 1bpp images where width is divisible by 8, we can use a highly optimized approach + const int bytesPerSrcRow = width / 8; + const int bytesPerRow = (height + 7) / 8; // use heigth due to 90deg rotation - int bmpRowSize = width / 8; // 1 bit per pixel, assuming width is divisible by 8 + int bmpRowSize = width / 8; // 1 bit per pixel, assuming width is divisible by 8 - // Process each source row - for (int y = 0; y < height; y++) { - // Calculate source row (BMPs are normally stored bottom-to-top) - int srcRow = height-1-y; + // Process each source row + for (int y = 0; y < height; y++) { + // Calculate source row (BMPs are normally stored bottom-to-top) + int srcRow = height - 1 - y; - // In 90-degree rotation, source Y becomes destination X - int destX = y; - int destByteX = destX / 8; - int destBitInByte = destX & 0x07; // Fast mod 8 - uint8_t destBitMask = bitMasks[destBitInByte]; + // In 90-degree rotation, source Y becomes destination X + int destX = y; + int destByteX = destX / 8; + int destBitInByte = destX & 0x07; // Fast mod 8 + uint8_t destBitMask = bitMasks[destBitInByte]; - // Get pointer to this row's data - uint8_t* srcRowData = bmpData + (srcRow * bmpRowSize); + // Get pointer to this row's data + uint8_t* srcRowData = bmpData + (srcRow * bmpRowSize); - // Process all bytes in this row - for (int xByte = 0; xByte < bytesPerSrcRow; xByte++) { - uint8_t srcByte = srcRowData[xByte]; + // Process all bytes in this row + for (int xByte = 0; xByte < bytesPerSrcRow; xByte++) { + uint8_t srcByte = srcRowData[xByte]; - // Skip processing if byte is all white - if (srcByte == 0xFF) continue; + // Skip processing if byte is all white + if (srcByte == 0xFF) continue; - // For bytes that are either all black or have a simple pattern, optimize - if (srcByte == 0x00) { - // All 8 pixels are black - use fast path - for (int bit = 0; bit < 8; bit++) { + // For bytes that are either all black or have a simple pattern, optimize + if (srcByte == 0x00) { + // All 8 pixels are black - use fast path + for (int bit = 0; bit < 8; bit++) { + int srcX = (xByte * 8) + bit; + int destY = width - 1 - srcX; + int destByteIdx = (destY * bytesPerRow) + destByteX; + displayImage[destByteIdx] &= ~destBitMask; + } + } else { + // Process individual bits for mixed bytes + for (int bit = 0; bit < 8; bit++) { + // Only process if this bit is black (0) + if ((srcByte & bitMasks[bit]) == 0) { int srcX = (xByte * 8) + bit; int destY = width - 1 - srcX; int destByteIdx = (destY * bytesPerRow) + destByteX; displayImage[destByteIdx] &= ~destBitMask; } - } else { - // Process individual bits for mixed bytes - for (int bit = 0; bit < 8; bit++) { - // Only process if this bit is black (0) - if ((srcByte & bitMasks[bit]) == 0) { - int srcX = (xByte * 8) + bit; - int destY = width - 1 - srcX; - int destByteIdx = (destY * bytesPerRow) + destByteX; - displayImage[destByteIdx] &= ~destBitMask; - } - } } } } + } } // BMP file header structure #pragma pack(push, 1) struct BMPHeader { - uint16_t signature; // 'BM' - uint32_t fileSize; // Size of the BMP file in bytes - uint32_t reserved; // Reserved - uint32_t dataOffset; // Offset to bitmap data - uint32_t headerSize; // Size of the header - int32_t width; // Width of the image - int32_t height; // Height of the image - uint16_t planes; // Number of color planes - uint16_t bitsPerPixel; // Bits per pixel - uint32_t compression; // Compression method - uint32_t imageSize; // Size of the image data - int32_t xPixelsPerMeter; // Horizontal resolution - int32_t yPixelsPerMeter; // Vertical resolution - uint32_t totalColors; // Number of colors in palette - uint32_t importantColors;// Number of important colors + uint16_t signature; // 'BM' + uint32_t fileSize; // Size of the BMP file in bytes + uint32_t reserved; // Reserved + uint32_t dataOffset; // Offset to bitmap data + uint32_t headerSize; // Size of the header + int32_t width; // Width of the image + int32_t height; // Height of the image + uint16_t planes; // Number of color planes + uint16_t bitsPerPixel; // Bits per pixel + uint32_t compression; // Compression method + uint32_t imageSize; // Size of the image data + int32_t xPixelsPerMeter; // Horizontal resolution + int32_t yPixelsPerMeter; // Vertical resolution + uint32_t totalColors; // Number of colors in palette + uint32_t importantColors; // Number of important colors }; #pragma pack(pop) @@ -112,19 +111,19 @@ uint8_t* loadBMP(const char* filename, int& width, int& height) { bmpFile.read((uint8_t*)&header, sizeof(BMPHeader)); // Check if this is a valid BMP file - if (header.signature != 0x4D42) { // "BM" in little-endian + if (header.signature != 0x4D42) { // "BM" in little-endian Serial.printf("[%lu] [SleepScreen] Invalid BMP signature\n", millis()); bmpFile.close(); return nullptr; } // Check for supported bit depths - if (header.bitsPerPixel != 1){ //} && header.bitsPerPixel != 24) { + if (header.bitsPerPixel != 1) { //} && header.bitsPerPixel != 24) { Serial.printf("[%lu] [SleepScreen] Unsupported bit depth: %d\n", millis(), header.bitsPerPixel); bmpFile.close(); return nullptr; } - if (header.height < 0){ //} && header.bitsPerPixel != 24) { + if (header.height < 0) { //} && header.bitsPerPixel != 24) { Serial.printf("[%lu] [SleepScreen] Unsupported negative height\n", millis()); bmpFile.close(); return nullptr; @@ -134,7 +133,8 @@ uint8_t* loadBMP(const char* filename, int& width, int& height) { width = header.width; height = header.height; - Serial.printf("[%lu] [SleepScreen] BMP dimensions: %dx%d, %d bits/pixel\n", millis(), width, height, header.bitsPerPixel); + Serial.printf("[%lu] [SleepScreen] BMP dimensions: %dx%d, %d bits/pixel\n", millis(), width, height, + header.bitsPerPixel); // Calculate destination dimensions based on rotation type int destWidth, destHeight; @@ -158,7 +158,6 @@ uint8_t* loadBMP(const char* filename, int& width, int& height) { // Initialize to all white (0xFF = all bits set to 1) memset(displayImage, 0xFF, bufferSize); - // With 4-byte divisibility assertion, no padding calculations are needed // Add assertion that dimensions are divisible by 4 @@ -180,8 +179,7 @@ uint8_t* loadBMP(const char* filename, int& width, int& height) { // Allocate a buffer for the entire bitmap uint8_t* bmpData = (uint8_t*)malloc(totalBitmapSize); if (!bmpData) { - Serial.printf("[%lu] [SleepScreen] Failed to allocate bitmap buffer (%d bytes)\n", - millis(), totalBitmapSize); + Serial.printf("[%lu] [SleepScreen] Failed to allocate bitmap buffer (%d bytes)\n", millis(), totalBitmapSize); free(displayImage); bmpFile.close(); return nullptr; @@ -191,15 +189,15 @@ uint8_t* loadBMP(const char* filename, int& width, int& height) { bmpFile.seek(header.dataOffset); bmpFile.read(bmpData, totalBitmapSize); - convertBmpToBWdisplayData(bmpData, width, height,displayImage); + convertBmpToBWdisplayData(bmpData, width, height, displayImage); // Clean up free(bmpData); } bmpFile.close(); const unsigned long elapsedTime = millis() - startTime; - Serial.printf("[%lu] [SleepScreen] Successfully loaded BMP: %dx%d in %lu ms\n", - millis(), destWidth, destHeight, elapsedTime); + Serial.printf("[%lu] [SleepScreen] Successfully loaded BMP: %dx%d in %lu ms\n", millis(), destWidth, destHeight, + elapsedTime); return displayImage; } @@ -221,8 +219,8 @@ void SleepActivity::onEnter() { for (const char* path : bmpPaths) { imageData = loadBMP(path, imageWidth, imageHeight); if (imageData) { - Serial.printf("[%lu] [SleepScreen] Successfully loaded: %s\n", millis(), path); - break; + Serial.printf("[%lu] [SleepScreen] Successfully loaded: %s\n", millis(), path); + break; } } @@ -240,8 +238,8 @@ void SleepActivity::onEnter() { // Note: We've applied 90-degree clockwise rotation to compensate for // the renderer's behavior and ensure the image appears correctly // on the e-ink display. - Serial.printf("[%lu] [SleepScreen] Drawing at position: %d,%d (dimensions: %dx%d)\n", millis(), - xPos, yPos, imageWidth, imageHeight); + Serial.printf("[%lu] [SleepScreen] Drawing at position: %d,%d (dimensions: %dx%d)\n", millis(), xPos, yPos, + imageWidth, imageHeight); renderer.drawImage(imageData, xPos, yPos, imageWidth, imageHeight); // Free the image data