]> code.delx.au - refind/blobdiff - libeg/screen.c
Refinements to image-sizing code; 0.7.8 release version.
[refind] / libeg / screen.c
index cd973975f05e3862ff8dc860445db6da295b303e..c6f23037fa13313948a84d06fb083dfb3f2bf8ae 100644 (file)
@@ -34,7 +34,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 /*
- * Modifications copyright (c) 2012 Roderick W. Smith
+ * Modifications copyright (c) 2012-2014 Roderick W. Smith
  *
  * Modifications distributed under the terms of the GNU General Public
  * License (GPL) version 3 (GPLv3), a copy of which must be distributed
@@ -46,6 +46,7 @@
 #include "../refind/screen.h"
 #include "../refind/lib.h"
 #include "../include/refit_call_wrapper.h"
+#include "libeg.h"
 
 #include <efiUgaDraw.h>
 #include <efiConsoleControl.h>
@@ -236,7 +237,6 @@ BOOLEAN egSetTextMode(UINT32 RequestedMode) {
    BOOLEAN       ChangedIt = FALSE;
 
    if ((RequestedMode != DONT_CHANGE_TEXT_MODE) && (RequestedMode != ST->ConOut->Mode->Mode)) {
-//      SwitchToGraphics();
       Status = refit_call2_wrapper(ST->ConOut->SetMode, ST->ConOut, RequestedMode);
       if (Status == EFI_SUCCESS) {
          ChangedIt = TRUE;
@@ -364,11 +364,6 @@ VOID egDrawImage(IN EG_IMAGE *Image, IN UINTN ScreenPosX, IN UINTN ScreenPosY)
         (ScreenPosX > egScreenWidth) || (ScreenPosY > egScreenHeight))
         return;
 
-//     if (Image->HasAlpha) {
-//         Image->HasAlpha = FALSE;
-//         egSetPlane(PLPTR(Image, a), 0, Image->Width * Image->Height);
-//     }
-
     if ((GlobalConfig.ScreenBackground == NULL) || ((Image->Width == egScreenWidth) && (Image->Height == egScreenHeight))) {
        CompImage = Image;
     } else if (GlobalConfig.ScreenBackground == Image) {
@@ -418,11 +413,6 @@ VOID egDrawImageArea(IN EG_IMAGE *Image,
     if (AreaWidth == 0)
         return;
 
-//     if (Image->HasAlpha) {
-//         Image->HasAlpha = FALSE;
-//         egSetPlane(PLPTR(Image, a), 0, Image->Width * Image->Height);
-//     }
-
     if (GraphicsOutput != NULL) {
         refit_call10_wrapper(GraphicsOutput->Blt, GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)Image->PixelData,
                              EfiBltBufferToVideo, AreaPosX, AreaPosY, ScreenPosX, ScreenPosY, AreaWidth, AreaHeight,
@@ -441,12 +431,13 @@ VOID egDisplayMessage(IN CHAR16 *Text, EG_PIXEL *BGColor) {
    EG_IMAGE *Box;
 
    if ((Text != NULL) && (BGColor != NULL)) {
-      BoxWidth = (StrLen(Text) + 2) * FONT_CELL_WIDTH;
+      egMeasureText(Text, &BoxWidth, &BoxHeight);
+      BoxWidth += 14;
+      BoxHeight *= 2;
       if (BoxWidth > egScreenWidth)
          BoxWidth = egScreenWidth;
-      BoxHeight = 2 * FONT_CELL_HEIGHT;
       Box = egCreateFilledImage(BoxWidth, BoxHeight, FALSE, BGColor);
-      egRenderText(Text, Box, FONT_CELL_WIDTH, FONT_CELL_HEIGHT / 2, (BGColor->r + BGColor->g + BGColor->b) / 3);
+      egRenderText(Text, Box, 7, BoxHeight / 4, (BGColor->r + BGColor->g + BGColor->b) / 3);
       egDrawImage(Box, (egScreenWidth - BoxWidth) / 2, (egScreenHeight - BoxHeight) / 2);
    } // if non-NULL inputs
 } // VOID egDisplayMessage()
@@ -487,6 +478,9 @@ VOID egScreenShot(VOID)
     UINT8           *FileData;
     UINTN           FileDataLength;
     UINTN           Index;
+    UINTN           ssNum;
+    CHAR16          Filename[80];
+    EFI_FILE*       BaseDir;
 
     Image = egCopyScreen();
     if (Image == NULL) {
@@ -502,11 +496,20 @@ VOID egScreenShot(VOID)
         goto bailout_wait;
     }
 
+    Status = egFindESP(&BaseDir);
+    if (EFI_ERROR(Status))
+        return;
+
+    // Search for existing screen shot files; increment number to an unused value...
+    ssNum = 001;
+    do {
+       SPrint(Filename, 80, L"screenshot_%03d.bmp", ssNum++);
+    } while (FileExists(BaseDir, Filename));
+
     // save to file on the ESP
-    Status = egSaveFile(NULL, L"screenshot.bmp", FileData, FileDataLength);
+    Status = egSaveFile(BaseDir, Filename, FileData, FileDataLength);
     FreePool(FileData);
-    if (EFI_ERROR(Status)) {
-        Print(L"Error egSaveFile: %x\n", Status);
+    if (CheckError(Status, L"in egSaveFile()")) {
         goto bailout_wait;
     }