1 /* ----------------------------------------------------------------------- * 2 * 3 * Copyright 2006-2008 H. Peter Anvin - All Rights Reserved 4 * 5 * Permission is hereby granted, free of charge, to any person 6 * obtaining a copy of this software and associated documentation 7 * files (the "Software"), to deal in the Software without 8 * restriction, including without limitation the rights to use, 9 * copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom 11 * the Software is furnished to do so, subject to the following 12 * conditions: 13 * 14 * The above copyright notice and this permission notice shall 15 * be included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 * OTHER DEALINGS IN THE SOFTWARE. 25 * 26 * ----------------------------------------------------------------------- */ 27 28 /* 29 * fmtpixel.c 30 * 31 * Functions to format a single pixel 32 */ 33 34 #include <inttypes.h> 35 #include "video.h" 36 37 /* 38 * Format a sequence of pixels. The first argument is the line buffer; 39 * we can use it to write up to 4 bytes past the end of the last pixel. 40 * Return the place we should be copying from, this is usually the 41 * buffer address, but doesn't *have* to be. 42 */ 43 44 static const void *format_pxf_bgra32(void *ptr, const uint32_t * p, size_t n) 45 { 46 (void)ptr; 47 (void)n; 48 return p; /* No conversion needed! */ 49 } 50 51 static const void *format_pxf_bgr24(void *ptr, const uint32_t * p, size_t n) 52 { 53 char *q = ptr; 54 55 while (n--) { 56 *(uint32_t *) q = *p++; 57 q += 3; 58 } 59 return ptr; 60 } 61 62 static const void *format_pxf_le_rgb16_565(void *ptr, const uint32_t * p, 63 size_t n) 64 { 65 uint32_t bgra; 66 uint16_t *q = ptr; 67 68 while (n--) { 69 bgra = *p++; 70 *q++ = 71 ((bgra >> 3) & 0x1f) + 72 ((bgra >> (2 + 8 - 5)) & (0x3f << 5)) + 73 ((bgra >> (3 + 16 - 11)) & (0x1f << 11)); 74 } 75 return ptr; 76 } 77 78 static const void *format_pxf_le_rgb15_555(void *ptr, const uint32_t * p, 79 size_t n) 80 { 81 uint32_t bgra; 82 uint16_t *q = ptr; 83 84 while (n--) { 85 bgra = *p++; 86 *q++ = 87 ((bgra >> 3) & 0x1f) + 88 ((bgra >> (2 + 8 - 5)) & (0x1f << 5)) + 89 ((bgra >> (3 + 16 - 10)) & (0x1f << 10)); 90 } 91 return ptr; 92 } 93 94 __vesacon_format_pixels_t __vesacon_format_pixels; 95 96 const __vesacon_format_pixels_t __vesacon_format_pixels_list[PXF_NONE] = { 97 [PXF_BGRA32] = format_pxf_bgra32, 98 [PXF_BGR24] = format_pxf_bgr24, 99 [PXF_LE_RGB16_565] = format_pxf_le_rgb16_565, 100 [PXF_LE_RGB15_555] = format_pxf_le_rgb15_555, 101 }; 102