From 0fe0cfabd1847801ae6e6b1e82aa6c0c0430fc77 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 13 Sep 2006 11:51:25 -0700 Subject: [PATCH] Code to deal with multiple pixel formats --- com32/lib/sys/vesa/fmtpixel.h | 71 +++++++++++++++++++++++++++++++++++++++++++ com32/lib/sys/vesa/video.h | 8 +++++ 2 files changed, 79 insertions(+) create mode 100644 com32/lib/sys/vesa/fmtpixel.h diff --git a/com32/lib/sys/vesa/fmtpixel.h b/com32/lib/sys/vesa/fmtpixel.h new file mode 100644 index 0000000..0f9d57e --- /dev/null +++ b/com32/lib/sys/vesa/fmtpixel.h @@ -0,0 +1,71 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2006 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * fmtpixel.h + * + * Inline function to format a single pixel + */ + +#ifndef LIB_SYS_VESA_FMTPIXEL_H +#define LIB_SYS_VESA_FMTPIXEL_H + +#include +#include "video.h" + +/* Format a pixel and return the advanced pointer. + THIS FUNCTION IS ALLOWED TO WRITE BEYOND THE END OF THE PIXEL. */ + +static inline void *format_pixel(void *ptr, uint32_t rgba, + enum vesa_pixel_format fmt) +{ + switch (fmt) { + case PXF_BGRA32: + *(uint32_t *)ptr = rgba; + return (uint32_t *)ptr + 1; + + case PXF_BGR24: + *(uint32_t *)ptr = rgba; + return (uint8_t *)ptr + 3; + + case PXF_LE_RGB16_565: + { + uint16_t pxv = + ((rgba >> 3) & 0x1f) | + ((rgba >> (2+8-5)) & (0x3f << 5)) | + ((rgba >> (3+16-11)) & (0x1f << 11)); + + *(uint16_t *)ptr = pxv; + return (uint16_t *)ptr + 1; + } + + case PXF_NONE: /* Shuts up gcc */ + return ptr; + } +} + +#endif /* LIB_SYS_VESA_FMTPIXEL_H */ diff --git a/com32/lib/sys/vesa/video.h b/com32/lib/sys/vesa/video.h index d13021c..3bf93e3 100644 --- a/com32/lib/sys/vesa/video.h +++ b/com32/lib/sys/vesa/video.h @@ -51,6 +51,14 @@ struct vesa_char { uint8_t pad; /* Currently unused */ }; +/* Pixel formats in order of decreasing preference; PXF_NONE should be last */ +enum vesa_pixel_format { + PXF_BGRA32, /* 32-bit BGRA */ + PXF_BGR24, /* 24-bit BGR */ + PXF_LE_RGB16_565, /* 16-bit littleendian 5:6:5 RGB */ + PXF_NONE +}; + extern struct vesa_char *__vesacon_text_display; extern int __vesacon_font_height, __vesacon_text_rows; -- 2.7.4