]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / FrameBufferBltLib / FrameBufferBltLib.c
index 5f6eddcb389eb0e42ca9d9d3dba0c3466d9c4d88..47c5326e99589a076a0d4ed3ff29a12dc035c492 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   FrameBufferBltLib - Library to perform blt operations on a frame buffer.\r
 \r
-  Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Library/FrameBufferBltLib.h>\r
 \r
 struct FRAME_BUFFER_CONFIGURE {\r
-  UINTN                           ColorDepth;\r
-  UINTN                           WidthInBytes;\r
-  UINTN                           BytesPerPixel;\r
-  UINTN                           WidthInPixels;\r
-  UINTN                           Height;\r
-  UINT8                           LineBuffer[SIZE_4KB * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)];\r
+  UINT32                          PixelsPerScanLine;\r
+  UINT32                          BytesPerPixel;\r
+  UINT32                          Width;\r
+  UINT32                          Height;\r
   UINT8                           *FrameBuffer;\r
   EFI_GRAPHICS_PIXEL_FORMAT       PixelFormat;\r
   EFI_PIXEL_BITMASK               PixelMasks;\r
   INT8                            PixelShl[4]; // R-G-B-Rsvd\r
   INT8                            PixelShr[4]; // R-G-B-Rsvd\r
+  UINT8                           LineBuffer[0];\r
 };\r
 \r
 CONST EFI_PIXEL_BITMASK mRgbPixelMasks = {\r
@@ -53,7 +46,7 @@ CONST EFI_PIXEL_BITMASK mBgrPixelMasks = {
 VOID\r
 FrameBufferBltLibConfigurePixelFormat (\r
   IN CONST EFI_PIXEL_BITMASK    *BitMask,\r
-  OUT UINT                    *BytesPerPixel,\r
+  OUT UINT32                    *BytesPerPixel,\r
   OUT INT8                      *PixelShl,\r
   OUT INT8                      *PixelShr\r
   )\r
@@ -84,7 +77,7 @@ FrameBufferBltLibConfigurePixelFormat (
   MergedMasks = (UINT32) (MergedMasks | Masks[3]);\r
 \r
   ASSERT (MergedMasks != 0);\r
-  *BytesPerPixel = (UINTN) ((HighBitSet32 (MergedMasks) + 7) / 8);\r
+  *BytesPerPixel = (UINT32) ((HighBitSet32 (MergedMasks) + 7) / 8);\r
   DEBUG ((DEBUG_INFO, "Bytes per pixel: %d\n", *BytesPerPixel));\r
 }\r
 \r
@@ -115,7 +108,7 @@ FrameBufferBltConfigure (
   )\r
 {\r
   CONST EFI_PIXEL_BITMASK                      *BitMask;\r
-  UINT                                       BytesPerPixel;\r
+  UINT32                                       BytesPerPixel;\r
   INT8                                         PixelShl[4];\r
   INT8                                         PixelShr[4];\r
 \r
@@ -123,15 +116,6 @@ FrameBufferBltConfigure (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (*ConfigureSize < sizeof (FRAME_BUFFER_CONFIGURE)) {\r
-    *ConfigureSize = sizeof (FRAME_BUFFER_CONFIGURE);\r
-    return RETURN_BUFFER_TOO_SMALL;\r
-  }\r
-\r
-  if (Configure == NULL) {\r
-    return RETURN_INVALID_PARAMETER;\r
-  }\r
-\r
   switch (FrameBufferInfo->PixelFormat) {\r
   case PixelRedGreenBlueReserved8BitPerColor:\r
     BitMask = &mRgbPixelMasks;\r
@@ -154,19 +138,32 @@ FrameBufferBltConfigure (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
+  if (FrameBufferInfo->PixelsPerScanLine < FrameBufferInfo->HorizontalResolution) {\r
+    return RETURN_UNSUPPORTED;\r
+  }\r
+\r
   FrameBufferBltLibConfigurePixelFormat (BitMask, &BytesPerPixel, PixelShl, PixelShr);\r
 \r
+  if (*ConfigureSize < sizeof (FRAME_BUFFER_CONFIGURE)\r
+                     + FrameBufferInfo->HorizontalResolution * BytesPerPixel) {\r
+    *ConfigureSize = sizeof (FRAME_BUFFER_CONFIGURE)\r
+                   + FrameBufferInfo->HorizontalResolution * BytesPerPixel;\r
+    return RETURN_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  if (Configure == NULL) {\r
+    return RETURN_INVALID_PARAMETER;\r
+  }\r
+\r
   CopyMem (&Configure->PixelMasks, BitMask,  sizeof (*BitMask));\r
   CopyMem (Configure->PixelShl,    PixelShl, sizeof (PixelShl));\r
   CopyMem (Configure->PixelShr,    PixelShr, sizeof (PixelShr));\r
-  Configure->BytesPerPixel = BytesPerPixel;\r
-  Configure->PixelFormat   = FrameBufferInfo->PixelFormat;\r
-  Configure->FrameBuffer   = (UINT8*) FrameBuffer;\r
-  Configure->WidthInPixels = (UINTN) FrameBufferInfo->HorizontalResolution;\r
-  Configure->Height        = (UINTN) FrameBufferInfo->VerticalResolution;\r
-  Configure->WidthInBytes  = Configure->WidthInPixels * Configure->BytesPerPixel;\r
-\r
-  ASSERT (Configure->WidthInBytes < sizeof (Configure->LineBuffer));\r
+  Configure->BytesPerPixel     = BytesPerPixel;\r
+  Configure->PixelFormat       = FrameBufferInfo->PixelFormat;\r
+  Configure->FrameBuffer       = (UINT8*) FrameBuffer;\r
+  Configure->Width             = FrameBufferInfo->HorizontalResolution;\r
+  Configure->Height            = FrameBufferInfo->VerticalResolution;\r
+  Configure->PixelsPerScanLine = FrameBufferInfo->PixelsPerScanLine;\r
 \r
   return RETURN_SUCCESS;\r
 }\r
@@ -216,7 +213,7 @@ FrameBufferBltLibVideoFill (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (DestinationX + Width > Configure->WidthInPixels) {\r
+  if (DestinationX + Width > Configure->Width) {\r
     DEBUG ((EFI_D_VERBOSE, "VideoFill: Past screen (X)\n"));\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
@@ -269,14 +266,15 @@ FrameBufferBltLibVideoFill (
     }\r
   }\r
 \r
-  if (UseWideFill && (DestinationX == 0) && (Width == Configure->WidthInPixels)) {\r
+  if (UseWideFill && (DestinationX == 0) && (Width == Configure->PixelsPerScanLine)) {\r
     DEBUG ((EFI_D_VERBOSE, "VideoFill (wide, one-shot)\n"));\r
-    Offset = DestinationY * Configure->WidthInPixels;\r
+    Offset = DestinationY * Configure->PixelsPerScanLine;\r
     Offset = Configure->BytesPerPixel * Offset;\r
     Destination = Configure->FrameBuffer + Offset;\r
     SizeInBytes = WidthInBytes * Height;\r
     if (SizeInBytes >= 8) {\r
       SetMem32 (Destination, SizeInBytes & ~3, (UINT32) WideFill);\r
+      Destination += SizeInBytes & ~3;\r
       SizeInBytes &= 3;\r
     }\r
     if (SizeInBytes > 0) {\r
@@ -285,7 +283,7 @@ FrameBufferBltLibVideoFill (
   } else {\r
     LineBufferReady = FALSE;\r
     for (IndexY = DestinationY; IndexY < (Height + DestinationY); IndexY++) {\r
-      Offset = (IndexY * Configure->WidthInPixels) + DestinationX;\r
+      Offset = (IndexY * Configure->PixelsPerScanLine) + DestinationX;\r
       Offset = Configure->BytesPerPixel * Offset;\r
       Destination = Configure->FrameBuffer + Offset;\r
 \r
@@ -294,6 +292,7 @@ FrameBufferBltLibVideoFill (
         SizeInBytes = WidthInBytes;\r
         if (SizeInBytes >= 8) {\r
           SetMem64 (Destination, SizeInBytes & ~7, WideFill);\r
+          Destination += SizeInBytes & ~7;\r
           SizeInBytes &= 7;\r
         }\r
         if (SizeInBytes > 0) {\r
@@ -369,7 +368,7 @@ FrameBufferBltLibVideoToBltBuffer (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (SourceX + Width > Configure->WidthInPixels) {\r
+  if (SourceX + Width > Configure->Width) {\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
@@ -395,7 +394,7 @@ FrameBufferBltLibVideoToBltBuffer (
        DstY < (Height + DestinationY);\r
        SrcY++, DstY++) {\r
 \r
-    Offset = (SrcY * Configure->WidthInPixels) + SourceX;\r
+    Offset = (SrcY * Configure->PixelsPerScanLine) + SourceX;\r
     Offset = Configure->BytesPerPixel * Offset;\r
     Source = Configure->FrameBuffer + Offset;\r
 \r
@@ -477,7 +476,7 @@ FrameBufferBltLibBufferToVideo (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (DestinationX + Width > Configure->WidthInPixels) {\r
+  if (DestinationX + Width > Configure->Width) {\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
@@ -500,7 +499,7 @@ FrameBufferBltLibBufferToVideo (
        SrcY < (Height + SourceY);\r
        SrcY++, DstY++) {\r
 \r
-    Offset = (DstY * Configure->WidthInPixels) + DestinationX;\r
+    Offset = (DstY * Configure->PixelsPerScanLine) + DestinationX;\r
     Offset = Configure->BytesPerPixel * Offset;\r
     Destination = Configure->FrameBuffer + Offset;\r
 \r
@@ -573,7 +572,7 @@ FrameBufferBltLibVideoToVideo (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (SourceX + Width > Configure->WidthInPixels) {\r
+  if (SourceX + Width > Configure->Width) {\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
@@ -581,7 +580,7 @@ FrameBufferBltLibVideoToVideo (
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
-  if (DestinationX + Width > Configure->WidthInPixels) {\r
+  if (DestinationX + Width > Configure->Width) {\r
     return RETURN_INVALID_PARAMETER;\r
   }\r
 \r
@@ -591,15 +590,15 @@ FrameBufferBltLibVideoToVideo (
 \r
   WidthInBytes = Width * Configure->BytesPerPixel;\r
 \r
-  Offset = (SourceY * Configure->WidthInPixels) + SourceX;\r
+  Offset = (SourceY * Configure->PixelsPerScanLine) + SourceX;\r
   Offset = Configure->BytesPerPixel * Offset;\r
   Source = Configure->FrameBuffer + Offset;\r
 \r
-  Offset = (DestinationY * Configure->WidthInPixels) + DestinationX;\r
+  Offset = (DestinationY * Configure->PixelsPerScanLine) + DestinationX;\r
   Offset = Configure->BytesPerPixel * Offset;\r
   Destination = Configure->FrameBuffer + Offset;\r
 \r
-  LineStride = Configure->WidthInBytes;\r
+  LineStride = Configure->BytesPerPixel * Configure->PixelsPerScanLine;\r
   if (Destination > Source) {\r
     //\r
     // Copy from last line to avoid source is corrupted by copying\r