| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * QEMU OMAP LCD Emulator templates | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |  * are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  *    notice, this list of conditions and the following disclaimer in | 
					
						
							|  |  |  |  *    the documentation and/or other materials provided with the | 
					
						
							|  |  |  |  *    distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | 
					
						
							|  |  |  |  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | 
					
						
							|  |  |  |  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR | 
					
						
							|  |  |  |  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 
					
						
							|  |  |  |  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
					
						
							|  |  |  |  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 
					
						
							|  |  |  |  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 
					
						
							|  |  |  |  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							|  |  |  |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
					
						
							|  |  |  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if DEPTH == 8
 | 
					
						
							|  |  |  | # define BPP 1
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | # define PIXEL_TYPE uint8_t
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | #elif DEPTH == 15 || DEPTH == 16
 | 
					
						
							|  |  |  | # define BPP 2
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | # define PIXEL_TYPE uint16_t
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | #elif DEPTH == 32
 | 
					
						
							|  |  |  | # define BPP 4
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | # define PIXEL_TYPE uint32_t
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | # error unsupport depth
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |  * 2-bit colour | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  | static void glue(draw_line2_, DEPTH)(void *opaque, | 
					
						
							|  |  |  |                 uint8_t *d, const uint8_t *s, int width, int deststep) | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  |     uint16_t *pal = opaque; | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |     uint8_t v, r, g, b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2014-03-28 18:43:14 +01:00
										 |  |  |         v = ldub_p((void *) s); | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |         r = (pal[v & 3] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 3] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 3] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         v >>= 2; | 
					
						
							|  |  |  |         r = (pal[v & 3] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 3] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 3] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         v >>= 2; | 
					
						
							|  |  |  |         r = (pal[v & 3] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 3] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 3] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         v >>= 2; | 
					
						
							|  |  |  |         r = (pal[v & 3] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 3] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 3] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         s ++; | 
					
						
							|  |  |  |         width -= 4; | 
					
						
							|  |  |  |     } while (width > 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |  * 4-bit colour | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  | static void glue(draw_line4_, DEPTH)(void *opaque, | 
					
						
							|  |  |  |                 uint8_t *d, const uint8_t *s, int width, int deststep) | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  |     uint16_t *pal = opaque; | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |     uint8_t v, r, g, b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2014-03-28 18:43:14 +01:00
										 |  |  |         v = ldub_p((void *) s); | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |         r = (pal[v & 0xf] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 0xf] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 0xf] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         v >>= 4; | 
					
						
							|  |  |  |         r = (pal[v & 0xf] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v & 0xf] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v & 0xf] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |         s ++; | 
					
						
							|  |  |  |         width -= 2; | 
					
						
							|  |  |  |     } while (width > 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |  * 8-bit colour | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  | static void glue(draw_line8_, DEPTH)(void *opaque, | 
					
						
							|  |  |  |                 uint8_t *d, const uint8_t *s, int width, int deststep) | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  |     uint16_t *pal = opaque; | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |     uint8_t v, r, g, b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2014-03-28 18:43:14 +01:00
										 |  |  |         v = ldub_p((void *) s); | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |         r = (pal[v] >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = pal[v] & 0xf0; | 
					
						
							|  |  |  |         b = (pal[v] << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         s ++; | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |     } while (-- width != 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |  * 12-bit colour | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  | static void glue(draw_line12_, DEPTH)(void *opaque, | 
					
						
							|  |  |  |                 uint8_t *d, const uint8_t *s, int width, int deststep) | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     uint16_t v; | 
					
						
							|  |  |  |     uint8_t r, g, b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2015-12-17 13:37:13 +00:00
										 |  |  |         v = lduw_le_p((void *) s); | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |         r = (v >> 4) & 0xf0; | 
					
						
							|  |  |  |         g = v & 0xf0; | 
					
						
							|  |  |  |         b = (v << 4) & 0xf0; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         s += 2; | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |     } while (-- width != 0); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 21:08:06 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |  * 16-bit colour | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-04-01 12:27:59 +00:00
										 |  |  | static void glue(draw_line16_, DEPTH)(void *opaque, | 
					
						
							|  |  |  |                 uint8_t *d, const uint8_t *s, int width, int deststep) | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-27 16:13:06 +02:00
										 |  |  | #if DEPTH == 16 && defined(HOST_WORDS_BIGENDIAN) == defined(TARGET_WORDS_BIGENDIAN)
 | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |     memcpy(d, s, width * 2); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     uint16_t v; | 
					
						
							|  |  |  |     uint8_t r, g, b; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							| 
									
										
										
										
											2015-12-17 13:37:13 +00:00
										 |  |  |         v = lduw_le_p((void *) s); | 
					
						
							| 
									
										
										
										
											2007-07-29 17:57:26 +00:00
										 |  |  |         r = (v >> 8) & 0xf8; | 
					
						
							|  |  |  |         g = (v >> 3) & 0xfc; | 
					
						
							|  |  |  |         b = (v << 3) & 0xf8; | 
					
						
							|  |  |  |         ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b); | 
					
						
							|  |  |  |         s += 2; | 
					
						
							|  |  |  |         d += BPP; | 
					
						
							|  |  |  |     } while (-- width != 0); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #undef DEPTH
 | 
					
						
							|  |  |  | #undef BPP
 | 
					
						
							|  |  |  | #undef PIXEL_TYPE
 |