TRUE\r
},\r
{\r
- { 80, 25, 0, 0, 0, 0 }, // Mode 0\r
- { 80, 50, 0, 0, 0, 0 }, // Mode 1\r
- { 100,31, 0, 0, 0, 0 }, // Mode 2\r
- { 0, 0, 0, 0, 0, 0 } // Mode 3\r
+ { 80, 25, 0, 0, 0, 0, 0 }, // Mode 0\r
+ { 80, 50, 0, 0, 0, 0, 0 }, // Mode 1\r
+ { 100,31, 0, 0, 0, 0, 0 }, // Mode 2\r
+ { 0, 0, 0, 0, 0, 0, 0 }, // Mode 3\r
+ { 0, 0, 0, 0, 0, 0, 0 } // Mode 4\r
},\r
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL\r
};\r
UINT32 VerticalResolution;\r
UINT32 ColorDepth;\r
UINT32 RefreshRate;\r
+ UINTN ModeIndex;\r
UINTN MaxMode;\r
UINTN Columns;\r
UINTN Rows;\r
UINT32 ModeNumber;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;\r
+ GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
ModeNumber = 0;\r
\r
//\r
}\r
\r
//\r
- // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
+ // Add Mode #3 that uses the entire display for user-defined mode\r
//\r
- Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
- Rows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
+ Private->ModeData[3].Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+ Private->ModeData[3].Rows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
\r
//\r
- // See if the mode is too small to support the required 80x25 text mode\r
+ // Add Mode #4 that uses the PCD values\r
//\r
- if (Columns < 80 || Rows < 25) {\r
- goto Error;\r
- }\r
+ Private->ModeData[4].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
+ Private->ModeData[4].Rows = (UINTN) PcdGet32 (PcdConOutRow);\r
+\r
//\r
- // Add Mode #0 that must be 80x25\r
+ // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
//\r
- MaxMode = 0;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
-\r
- //\r
- // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
- //\r
- if (Rows >= 50) {\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
- }\r
+ Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+ Rows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
\r
//\r
- // If it is not to support Mode #1 - 80x50, then skip it\r
+ // Here we make sure that mode 0 is valid\r
//\r
- if (MaxMode < 2) {\r
- Private->ModeData[MaxMode].Columns = 0;\r
- Private->ModeData[MaxMode].Rows = 0;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = 0;\r
- Private->ModeData[MaxMode].DeltaY = 0;\r
- MaxMode++;\r
+ if (Columns < Private->ModeData[0].Columns ||\r
+ Rows < Private->ModeData[0].Rows) {\r
+ //\r
+ // 80x25 cannot be supported.\r
+ //\r
+ // Fallback to using the PcdConOutColumn and PcdConOutRow\r
+ // for mode 0. If the PCDs are also to large, then mode 0\r
+ // will be shrunk to fit as needed.\r
+ //\r
+ Private->ModeData[0].Columns = MIN (Private->ModeData[4].Columns, Columns);\r
+ Private->ModeData[0].Rows = MIN (Private->ModeData[4].Rows, Rows);\r
}\r
\r
- //\r
- // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
- //\r
- if (Columns >= 100 && Rows >= 31) {\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (100 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (31 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
+ MaxMode = 0;\r
+ for (ModeIndex = 0; ModeIndex < GRAPHICS_MAX_MODE; ModeIndex++) {\r
+ ModeData = &Private->ModeData[ModeIndex];\r
+ ModeData->GopWidth = HorizontalResolution;\r
+ ModeData->GopHeight = VerticalResolution;\r
+ ModeData->GopModeNumber = ModeNumber;\r
+ if (Columns >= ModeData->Columns &&\r
+ Rows >= ModeData->Rows) {\r
+ ModeData->DeltaX = (HorizontalResolution - (ModeData->Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+ ModeData->DeltaY = (VerticalResolution - (ModeData->Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
+ MaxMode = ModeIndex + 1;\r
+ } else {\r
+ ModeData->Columns = 0;\r
+ ModeData->Rows = 0;\r
+ ModeData->DeltaX = 0;\r
+ ModeData->DeltaY = 0;\r
+ }\r
}\r
\r
//\r
- // Add Mode #3 that uses the entire display for user-defined mode\r
+ // See if the resolution was too small to support any text modes\r
//\r
- if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
- Private->ModeData[MaxMode].Columns = HorizontalResolution/EFI_GLYPH_WIDTH;\r
- Private->ModeData[MaxMode].Rows = VerticalResolution/EFI_GLYPH_HEIGHT;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution % EFI_GLYPH_HEIGHT) >> 1;\r
- MaxMode++;\r
+ if (MaxMode == 0) {\r
+ goto Error;\r
}\r
\r
//\r