Index: /trunk/src/VBox/Devices/Graphics/BIOS/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Devices/Graphics/BIOS/Makefile.kmk	(revision 64959)
+++ /trunk/src/VBox/Devices/Graphics/BIOS/Makefile.kmk	(revision 64960)
@@ -160,4 +160,8 @@
 VgaDefBiosLogo_SOURCES   = $(VgaDefBiosLogo_0_OUTDIR)/VgaDefBiosLogo.c
 VgaDefBiosLogo_CLEAN     = $(VgaDefBiosLogo_0_OUTDIR)/VgaDefBiosLogo.c
+ifndef VBOX_OSE
+VgaDefBiosLogo_SOURCES  += $(VgaDefBiosLogo_0_OUTDIR)/VgaDefBiosLogoNY.c
+VgaDefBiosLogo_CLEAN    += $(VgaDefBiosLogo_0_OUTDIR)/VgaDefBiosLogoNY.c
+endif
 
 # Rule for making the bios logo.
@@ -165,4 +169,9 @@
 	$(call MSG_TOOL,bin2c,VgaDefBiosLogo,$<,$@)
 	$(QUIET)$(VBOX_BIN2C) VgaDefBiosLogo $< $@
+
+# Rule for making the bios logo.
+$$(VgaDefBiosLogo_0_OUTDIR)/VgaDefBiosLogoNY.c: $(PATH_ROOT)/src/VBox/Devices/Graphics/BIOS/puel_logo_ny.bmp $(VBOX_BIN2C) | $$(dir $$@)
+	$(call MSG_TOOL,bin2c,VgaDefBiosLogoNY,$<,$@)
+	$(QUIET)$(VBOX_BIN2C) VgaDefBiosLogoNY $< $@
 
 
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 64959)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 64960)
@@ -3871,4 +3871,5 @@
  * @param   cxLogo      Logo width.
  * @param   cyLogo      Logo height.
+ * @param   fInverse    True if the bitmask is black on white (only for 1bpp)
  * @param   iStep       Fade in/fade out step.
  * @param   pu32Palette Palette data.
@@ -3876,5 +3877,6 @@
  * @param   pbDst       Destination buffer.
  */
-static void vbeShowBitmap(uint16_t cBits, uint16_t xLogo, uint16_t yLogo, uint16_t cxLogo, uint16_t cyLogo, uint8_t iStep,
+static void vbeShowBitmap(uint16_t cBits, uint16_t xLogo, uint16_t yLogo, uint16_t cxLogo, uint16_t cyLogo,
+                          bool fInverse, uint8_t iStep,
                           const uint32_t *pu32Palette, const uint8_t *pbSrc, uint8_t *pbDst)
 {
@@ -3924,6 +3926,4 @@
         for (i = 0; i < cxLogo; i++)
         {
-            uint8_t pix;
-
             switch (cBits)
             {
@@ -3933,17 +3933,25 @@
                         c = *pbSrc++;
 
-                    pix = (c & 1) ? 0xFF : 0;
-                    c >>= 1;
-
-                    if (pix)
+                    if (c & 1)
                     {
-                        *pbTmpDst++ = pix * iStep / LOGO_SHOW_STEPS;
-                        *pbTmpDst++ = pix * iStep / LOGO_SHOW_STEPS;
-                        *pbTmpDst++ = pix * iStep / LOGO_SHOW_STEPS;
-                        pbTmpDst++;
+                        if (fInverse)
+                        {
+                            *pbTmpDst++ = 0;
+                            *pbTmpDst++ = 0;
+                            *pbTmpDst++ = 0;
+                            pbTmpDst++;
+                        }
+                        else
+                        {
+                            uint8_t pix = 0xFF * iStep / LOGO_SHOW_STEPS;
+                            *pbTmpDst++ = pix;
+                            *pbTmpDst++ = pix;
+                            *pbTmpDst++ = pix;
+                            pbTmpDst++;
+                        }
                     }
                     else
                         pbTmpDst += 4;
-
+                    c >>= 1;
                     j = (j + 1) % 8;
                     break;
@@ -3955,5 +3963,5 @@
                         c = *pbSrc++;
 
-                    pix = (c >> 4) & 0xF;
+                    uint8_t pix = (c >> 4) & 0xF;
                     c <<= 4;
 
@@ -3976,5 +3984,5 @@
                     uint32_t u32Pal = pu32Palette[*pbSrc++];
 
-                    pix = (u32Pal >> 16) & 0xFF;
+                    uint8_t pix = (u32Pal >> 16) & 0xFF;
                     *pbTmpDst++ = pix * iStep / LOGO_SHOW_STEPS;
                     pix = (u32Pal >> 8) & 0xFF;
@@ -4055,5 +4063,5 @@
                 vbeShowBitmap(pThis->cLogoBits, xLogo, yLogo,
                               pThis->cxLogo, pThis->cyLogo,
-                              iStep, &pThis->au32LogoPalette[0],
+                              false, iStep, &pThis->au32LogoPalette[0],
                               pbSrc, pbDst);
 
@@ -4062,5 +4070,5 @@
                     vbeShowBitmap(1, LOGO_F12TEXT_X, LOGO_F12TEXT_Y,
                                   LOGO_F12TEXT_WIDTH, LOGO_F12TEXT_HEIGHT,
-                                  iStep, &pThis->au32LogoPalette[0],
+                                  pThis->fBootMenuInverse, iStep, &pThis->au32LogoPalette[0],
                                   &g_abLogoF12BootText[0], pbDst);
 
@@ -6069,4 +6077,5 @@
                                           "HostWindowId\0"
 #endif
+                                          "SuppressNewYearSplash\0"
                                           ))
         return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
@@ -6919,8 +6928,16 @@
     /*
      * Allocate buffer for the logo data.
-     * RT_MAX() is applied to let us fall back to default logo on read failure.
+     * Let us fall back to default logo on read failure.
      */
-    pThis->cbLogo = sizeof(LogoHdr) + LogoHdr.cbLogo;
-    pThis->pbLogo = (uint8_t *)PDMDevHlpMMHeapAlloc(pDevIns, RT_MAX(pThis->cbLogo, g_cbVgaDefBiosLogo + sizeof(LogoHdr)));
+    pThis->cbLogo = LogoHdr.cbLogo;
+    if (g_cbVgaDefBiosLogo)
+        pThis->cbLogo = g_cbVgaDefBiosLogo;
+#ifndef VBOX_OSE
+    if (g_cbVgaDefBiosLogoNY)
+        pThis->cbLogo = g_cbVgaDefBiosLogoNY;
+#endif
+    pThis->cbLogo += sizeof(LogoHdr);
+
+    pThis->pbLogo = (uint8_t *)PDMDevHlpMMHeapAlloc(pDevIns, pThis->cbLogo);
     if (pThis->pbLogo)
     {
@@ -6949,5 +6966,21 @@
             || RT_FAILURE(rc))
         {
-            memcpy(pLogoHdr + 1, g_abVgaDefBiosLogo, LogoHdr.cbLogo);
+#ifndef VBOX_OSE
+            RTTIMESPEC Now;
+            RTTimeLocalNow(&Now);
+            RTTIME T;
+            RTTimeLocalExplode(&T, &Now);
+            bool fSuppressNewYearSplash = false;
+            rc = CFGMR3QueryBoolDef(pCfg, "SuppressNewYearSplash", &fSuppressNewYearSplash, false);
+            if (   !fSuppressNewYearSplash
+                && (T.u16YearDay > 353 || T.u16YearDay < 10))
+            {
+                pLogoHdr->cbLogo = LogoHdr.cbLogo = g_cbVgaDefBiosLogoNY;
+                memcpy(pLogoHdr + 1, g_abVgaDefBiosLogoNY, LogoHdr.cbLogo);
+                pThis->fBootMenuInverse = true;
+            }
+            else
+#endif
+                memcpy(pLogoHdr + 1, g_abVgaDefBiosLogo, LogoHdr.cbLogo);
             rc = vbeParseBitmap(pThis);
             if (RT_FAILURE(rc))
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 64959)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 64960)
@@ -585,5 +585,6 @@
     /** Clear screen flag. */
     uint8_t                     fLogoClearScreen;
-    uint8_t                     Padding8[7];
+    uint8_t                     fBootMenuInverse;
+    uint8_t                     Padding8[6];
     /** Palette data. */
     uint32_t                    au32LogoPalette[256];
Index: /trunk/src/VBox/Devices/build/VBoxDD.h
===================================================================
--- /trunk/src/VBox/Devices/build/VBoxDD.h	(revision 64959)
+++ /trunk/src/VBox/Devices/build/VBoxDD.h	(revision 64960)
@@ -25,6 +25,8 @@
 /** The default BIOS logo data. */
 extern const unsigned char  g_abVgaDefBiosLogo[];
+extern const unsigned char  g_abVgaDefBiosLogoNY[];
 /** The size of the default BIOS logo data. */
 extern const unsigned       g_cbVgaDefBiosLogo;
+extern const unsigned       g_cbVgaDefBiosLogoNY;
 
 
