symbian-qemu-0.9.1-12/qemu-symbian-svp/hw/pl110_template.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * Arm PrimeCell PL110 Color LCD Controller
       
     3  *
       
     4  * Copyright (c) 2005 CodeSourcery, LLC.
       
     5  * Written by Paul Brook
       
     6  *
       
     7  * This code is licenced under the GNU LGPL
       
     8  *
       
     9  * Framebuffer format conversion routines.
       
    10  */
       
    11 
       
    12 #ifndef ORDER
       
    13 
       
    14 #if BITS == 8
       
    15 #define COPY_PIXEL(to, from) *(to++) = from
       
    16 #elif BITS == 15 || BITS == 16
       
    17 #define COPY_PIXEL(to, from) *(uint16_t *)to = from; to += 2;
       
    18 #elif BITS == 24
       
    19 #define COPY_PIXEL(to, from) \
       
    20   *(to++) = from; *(to++) = (from) >> 8; *(to++) = (from) >> 16
       
    21 #elif BITS == 32
       
    22 #define COPY_PIXEL(to, from) *(uint32_t *)to = from; to += 4;
       
    23 #else
       
    24 #error unknown bit depth
       
    25 #endif
       
    26 
       
    27 #undef RGB
       
    28 #define BORDER bgr
       
    29 #define ORDER 0
       
    30 #include "pl110_template.h"
       
    31 #define ORDER 1
       
    32 #include "pl110_template.h"
       
    33 #define ORDER 2
       
    34 #include "pl110_template.h"
       
    35 #undef BORDER
       
    36 #define RGB
       
    37 #define BORDER rgb
       
    38 #define ORDER 0
       
    39 #include "pl110_template.h"
       
    40 #define ORDER 1
       
    41 #include "pl110_template.h"
       
    42 #define ORDER 2
       
    43 #include "pl110_template.h"
       
    44 #undef BORDER
       
    45 
       
    46 static drawfn glue(pl110_draw_fn_,BITS)[36] =
       
    47 {
       
    48     glue(pl110_draw_line1_lblp_bgr,BITS),
       
    49     glue(pl110_draw_line2_lblp_bgr,BITS),
       
    50     glue(pl110_draw_line4_lblp_bgr,BITS),
       
    51     glue(pl110_draw_line8_lblp_bgr,BITS),
       
    52     glue(pl110_draw_line16_lblp_bgr,BITS),
       
    53     glue(pl110_draw_line32_lblp_bgr,BITS),
       
    54 
       
    55     glue(pl110_draw_line1_bbbp_bgr,BITS),
       
    56     glue(pl110_draw_line2_bbbp_bgr,BITS),
       
    57     glue(pl110_draw_line4_bbbp_bgr,BITS),
       
    58     glue(pl110_draw_line8_bbbp_bgr,BITS),
       
    59     glue(pl110_draw_line16_bbbp_bgr,BITS),
       
    60     glue(pl110_draw_line32_bbbp_bgr,BITS),
       
    61 
       
    62     glue(pl110_draw_line1_lbbp_bgr,BITS),
       
    63     glue(pl110_draw_line2_lbbp_bgr,BITS),
       
    64     glue(pl110_draw_line4_lbbp_bgr,BITS),
       
    65     glue(pl110_draw_line8_lbbp_bgr,BITS),
       
    66     glue(pl110_draw_line16_lbbp_bgr,BITS),
       
    67     glue(pl110_draw_line32_lbbp_bgr,BITS),
       
    68 
       
    69     glue(pl110_draw_line1_lblp_rgb,BITS),
       
    70     glue(pl110_draw_line2_lblp_rgb,BITS),
       
    71     glue(pl110_draw_line4_lblp_rgb,BITS),
       
    72     glue(pl110_draw_line8_lblp_rgb,BITS),
       
    73     glue(pl110_draw_line16_lblp_rgb,BITS),
       
    74     glue(pl110_draw_line32_lblp_rgb,BITS),
       
    75 
       
    76     glue(pl110_draw_line1_bbbp_rgb,BITS),
       
    77     glue(pl110_draw_line2_bbbp_rgb,BITS),
       
    78     glue(pl110_draw_line4_bbbp_rgb,BITS),
       
    79     glue(pl110_draw_line8_bbbp_rgb,BITS),
       
    80     glue(pl110_draw_line16_bbbp_rgb,BITS),
       
    81     glue(pl110_draw_line32_bbbp_rgb,BITS),
       
    82 
       
    83     glue(pl110_draw_line1_lbbp_rgb,BITS),
       
    84     glue(pl110_draw_line2_lbbp_rgb,BITS),
       
    85     glue(pl110_draw_line4_lbbp_rgb,BITS),
       
    86     glue(pl110_draw_line8_lbbp_rgb,BITS),
       
    87     glue(pl110_draw_line16_lbbp_rgb,BITS),
       
    88     glue(pl110_draw_line32_lbbp_rgb,BITS),
       
    89 };
       
    90 
       
    91 #undef BITS
       
    92 #undef COPY_PIXEL
       
    93 
       
    94 #else
       
    95 
       
    96 #if ORDER == 0
       
    97 #define NAME glue(glue(lblp_, BORDER), BITS)
       
    98 #ifdef WORDS_BIGENDIAN
       
    99 #define SWAP_WORDS 1
       
   100 #endif
       
   101 #elif ORDER == 1
       
   102 #define NAME glue(glue(bbbp_, BORDER), BITS)
       
   103 #ifndef WORDS_BIGENDIAN
       
   104 #define SWAP_WORDS 1
       
   105 #endif
       
   106 #else
       
   107 #define SWAP_PIXELS 1
       
   108 #define NAME glue(glue(lbbp_, BORDER), BITS)
       
   109 #ifdef WORDS_BIGENDIAN
       
   110 #define SWAP_WORDS 1
       
   111 #endif
       
   112 #endif
       
   113 
       
   114 #define FN_2(x, y) FN(x, y) FN(x+1, y)
       
   115 #define FN_4(x, y) FN_2(x, y) FN_2(x+2, y)
       
   116 #define FN_8(y) FN_4(0, y) FN_4(4, y)
       
   117 
       
   118 static void glue(pl110_draw_line1_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   119 {
       
   120     uint32_t data;
       
   121     while (width > 0) {
       
   122         data = *(uint32_t *)src;
       
   123 #ifdef SWAP_PIXELS
       
   124 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 7 - (x))) & 1]);
       
   125 #else
       
   126 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x) + y)) & 1]);
       
   127 #endif
       
   128 #ifdef SWAP_WORDS
       
   129         FN_8(24)
       
   130         FN_8(16)
       
   131         FN_8(8)
       
   132         FN_8(0)
       
   133 #else
       
   134         FN_8(0)
       
   135         FN_8(8)
       
   136         FN_8(16)
       
   137         FN_8(24)
       
   138 #endif
       
   139 #undef FN
       
   140         width -= 32;
       
   141         src += 4;
       
   142     }
       
   143 }
       
   144 
       
   145 static void glue(pl110_draw_line2_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   146 {
       
   147     uint32_t data;
       
   148     while (width > 0) {
       
   149         data = *(uint32_t *)src;
       
   150 #ifdef SWAP_PIXELS
       
   151 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 6 - (x)*2)) & 3]);
       
   152 #else
       
   153 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x)*2 + y)) & 3]);
       
   154 #endif
       
   155 #ifdef SWAP_WORDS
       
   156         FN_4(0, 24)
       
   157         FN_4(0, 16)
       
   158         FN_4(0, 8)
       
   159         FN_4(0, 0)
       
   160 #else
       
   161         FN_4(0, 0)
       
   162         FN_4(0, 8)
       
   163         FN_4(0, 16)
       
   164         FN_4(0, 24)
       
   165 #endif
       
   166 #undef FN
       
   167         width -= 16;
       
   168         src += 4;
       
   169     }
       
   170 }
       
   171 
       
   172 static void glue(pl110_draw_line4_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   173 {
       
   174     uint32_t data;
       
   175     while (width > 0) {
       
   176         data = *(uint32_t *)src;
       
   177 #ifdef SWAP_PIXELS
       
   178 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 4 - (x)*4)) & 0xf]);
       
   179 #else
       
   180 #define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x)*4 + y)) & 0xf]);
       
   181 #endif
       
   182 #ifdef SWAP_WORDS
       
   183         FN_2(0, 24)
       
   184         FN_2(0, 16)
       
   185         FN_2(0, 8)
       
   186         FN_2(0, 0)
       
   187 #else
       
   188         FN_2(0, 0)
       
   189         FN_2(0, 8)
       
   190         FN_2(0, 16)
       
   191         FN_2(0, 24)
       
   192 #endif
       
   193 #undef FN
       
   194         width -= 8;
       
   195         src += 4;
       
   196     }
       
   197 }
       
   198 
       
   199 static void glue(pl110_draw_line8_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   200 {
       
   201     uint32_t data;
       
   202     while (width > 0) {
       
   203         data = *(uint32_t *)src;
       
   204 #define FN(x) COPY_PIXEL(d, pallette[(data >> (x)) & 0xff]);
       
   205 #ifdef SWAP_WORDS
       
   206         FN(24)
       
   207         FN(16)
       
   208         FN(8)
       
   209         FN(0)
       
   210 #else
       
   211         FN(0)
       
   212         FN(8)
       
   213         FN(16)
       
   214         FN(24)
       
   215 #endif
       
   216 #undef FN
       
   217         width -= 4;
       
   218         src += 4;
       
   219     }
       
   220 }
       
   221 
       
   222 static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   223 {
       
   224     uint32_t data;
       
   225     unsigned int r, g, b;
       
   226     while (width > 0) {
       
   227         data = *(uint32_t *)src;
       
   228 #ifdef SWAP_WORDS
       
   229         data = bswap32(data);
       
   230 #endif
       
   231 #ifdef RGB
       
   232 #define LSB r
       
   233 #define MSB b
       
   234 #else
       
   235 #define LSB b
       
   236 #define MSB r
       
   237 #endif
       
   238 #if 0
       
   239         LSB = data & 0x1f;
       
   240         data >>= 5;
       
   241         g = data & 0x3f;
       
   242         data >>= 6;
       
   243         MSB = data & 0x1f;
       
   244         data >>= 5;
       
   245 #else
       
   246         LSB = (data & 0x1f) << 3;
       
   247         data >>= 5;
       
   248         g = (data & 0x3f) << 2;
       
   249         data >>= 6;
       
   250         MSB = (data & 0x1f) << 3;
       
   251         data >>= 5;
       
   252 #endif
       
   253         COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
       
   254         LSB = (data & 0x1f) << 3;
       
   255         data >>= 5;
       
   256         g = (data & 0x3f) << 2;
       
   257         data >>= 6;
       
   258         MSB = (data & 0x1f) << 3;
       
   259         data >>= 5;
       
   260         COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
       
   261 #undef MSB
       
   262 #undef LSB
       
   263         width -= 2;
       
   264         src += 4;
       
   265     }
       
   266 }
       
   267 
       
   268 static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
       
   269 {
       
   270     uint32_t data;
       
   271     unsigned int r, g, b;
       
   272     while (width > 0) {
       
   273         data = *(uint32_t *)src;
       
   274 #ifdef RGB
       
   275 #define LSB r
       
   276 #define MSB b
       
   277 #else
       
   278 #define LSB b
       
   279 #define MSB r
       
   280 #endif
       
   281 #ifndef SWAP_WORDS
       
   282         LSB = data & 0xff;
       
   283         g = (data >> 8) & 0xff;
       
   284         MSB = (data >> 16) & 0xff;
       
   285 #else
       
   286         LSB = (data >> 24) & 0xff;
       
   287         g = (data >> 16) & 0xff;
       
   288         MSB = (data >> 8) & 0xff;
       
   289 #endif
       
   290         COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
       
   291 #undef MSB
       
   292 #undef LSB
       
   293         width--;
       
   294         src += 4;
       
   295     }
       
   296 }
       
   297 
       
   298 #undef SWAP_PIXELS
       
   299 #undef NAME
       
   300 #undef SWAP_WORDS
       
   301 #undef ORDER
       
   302 
       
   303 #endif