qemu/hw/display/omap_lcd_template.h
<<
>>
Prefs
   1/*
   2 * QEMU OMAP LCD Emulator templates
   3 *
   4 * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
   5 *
   6 * Redistribution and use in source and binary forms, with or without
   7 * modification, are permitted provided that the following conditions
   8 * are met:
   9 *
  10 * 1. Redistributions of source code must retain the above copyright
  11 *    notice, this list of conditions and the following disclaimer.
  12 * 2. Redistributions in binary form must reproduce the above copyright
  13 *    notice, this list of conditions and the following disclaimer in
  14 *    the documentation and/or other materials provided with the
  15 *    distribution.
  16 *
  17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
  18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  19 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  20 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
  21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  25 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28 */
  29
  30#if DEPTH == 8
  31# define BPP 1
  32# define PIXEL_TYPE uint8_t
  33#elif DEPTH == 15 || DEPTH == 16
  34# define BPP 2
  35# define PIXEL_TYPE uint16_t
  36#elif DEPTH == 32
  37# define BPP 4
  38# define PIXEL_TYPE uint32_t
  39#else
  40# error unsupport depth
  41#endif
  42
  43/*
  44 * 2-bit colour
  45 */
  46static void glue(draw_line2_, DEPTH)(void *opaque,
  47                uint8_t *d, const uint8_t *s, int width, int deststep)
  48{
  49    uint16_t *pal = opaque;
  50    uint8_t v, r, g, b;
  51
  52    do {
  53        v = ldub_p((void *) s);
  54        r = (pal[v & 3] >> 4) & 0xf0;
  55        g = pal[v & 3] & 0xf0;
  56        b = (pal[v & 3] << 4) & 0xf0;
  57        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
  58        d += BPP;
  59        v >>= 2;
  60        r = (pal[v & 3] >> 4) & 0xf0;
  61        g = pal[v & 3] & 0xf0;
  62        b = (pal[v & 3] << 4) & 0xf0;
  63        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
  64        d += BPP;
  65        v >>= 2;
  66        r = (pal[v & 3] >> 4) & 0xf0;
  67        g = pal[v & 3] & 0xf0;
  68        b = (pal[v & 3] << 4) & 0xf0;
  69        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
  70        d += BPP;
  71        v >>= 2;
  72        r = (pal[v & 3] >> 4) & 0xf0;
  73        g = pal[v & 3] & 0xf0;
  74        b = (pal[v & 3] << 4) & 0xf0;
  75        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
  76        d += BPP;
  77        s ++;
  78        width -= 4;
  79    } while (width > 0);
  80}
  81
  82/*
  83 * 4-bit colour
  84 */
  85static void glue(draw_line4_, DEPTH)(void *opaque,
  86                uint8_t *d, const uint8_t *s, int width, int deststep)
  87{
  88    uint16_t *pal = opaque;
  89    uint8_t v, r, g, b;
  90
  91    do {
  92        v = ldub_p((void *) s);
  93        r = (pal[v & 0xf] >> 4) & 0xf0;
  94        g = pal[v & 0xf] & 0xf0;
  95        b = (pal[v & 0xf] << 4) & 0xf0;
  96        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
  97        d += BPP;
  98        v >>= 4;
  99        r = (pal[v & 0xf] >> 4) & 0xf0;
 100        g = pal[v & 0xf] & 0xf0;
 101        b = (pal[v & 0xf] << 4) & 0xf0;
 102        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
 103        d += BPP;
 104        s ++;
 105        width -= 2;
 106    } while (width > 0);
 107}
 108
 109/*
 110 * 8-bit colour
 111 */
 112static void glue(draw_line8_, DEPTH)(void *opaque,
 113                uint8_t *d, const uint8_t *s, int width, int deststep)
 114{
 115    uint16_t *pal = opaque;
 116    uint8_t v, r, g, b;
 117
 118    do {
 119        v = ldub_p((void *) s);
 120        r = (pal[v] >> 4) & 0xf0;
 121        g = pal[v] & 0xf0;
 122        b = (pal[v] << 4) & 0xf0;
 123        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
 124        s ++;
 125        d += BPP;
 126    } while (-- width != 0);
 127}
 128
 129/*
 130 * 12-bit colour
 131 */
 132static void glue(draw_line12_, DEPTH)(void *opaque,
 133                uint8_t *d, const uint8_t *s, int width, int deststep)
 134{
 135    uint16_t v;
 136    uint8_t r, g, b;
 137
 138    do {
 139        v = lduw_le_p((void *) s);
 140        r = (v >> 4) & 0xf0;
 141        g = v & 0xf0;
 142        b = (v << 4) & 0xf0;
 143        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
 144        s += 2;
 145        d += BPP;
 146    } while (-- width != 0);
 147}
 148
 149/*
 150 * 16-bit colour
 151 */
 152static void glue(draw_line16_, DEPTH)(void *opaque,
 153                uint8_t *d, const uint8_t *s, int width, int deststep)
 154{
 155#if DEPTH == 16 && defined(HOST_WORDS_BIGENDIAN) == defined(TARGET_WORDS_BIGENDIAN)
 156    memcpy(d, s, width * 2);
 157#else
 158    uint16_t v;
 159    uint8_t r, g, b;
 160
 161    do {
 162        v = lduw_le_p((void *) s);
 163        r = (v >> 8) & 0xf8;
 164        g = (v >> 3) & 0xfc;
 165        b = (v << 3) & 0xf8;
 166        ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
 167        s += 2;
 168        d += BPP;
 169    } while (-- width != 0);
 170#endif
 171}
 172
 173#undef DEPTH
 174#undef BPP
 175#undef PIXEL_TYPE
 176