symbian-qemu-0.9.1-12/qemu-symbian-svp/hw/sm501_template.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * Pixel drawing function templates for QEMU SM501 Device
       
     3  *
       
     4  * Copyright (c) 2008 Shin-ichiro KAWASAKI
       
     5  *
       
     6  * Permission is hereby granted, free of charge, to any person obtaining a copy
       
     7  * of this software and associated documentation files (the "Software"), to deal
       
     8  * in the Software without restriction, including without limitation the rights
       
     9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       
    10  * copies of the Software, and to permit persons to whom the Software is
       
    11  * furnished to do so, subject to the following conditions:
       
    12  *
       
    13  * The above copyright notice and this permission notice shall be included in
       
    14  * all copies or substantial portions of the Software.
       
    15  *
       
    16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       
    17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       
    18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
       
    19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
       
    20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       
    21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
       
    22  * THE SOFTWARE.
       
    23  */
       
    24 
       
    25 #if DEPTH == 8
       
    26 #define BPP 1
       
    27 #define PIXEL_TYPE uint8_t
       
    28 #elif DEPTH == 15 || DEPTH == 16
       
    29 #define BPP 2
       
    30 #define PIXEL_TYPE uint16_t
       
    31 #elif DEPTH == 32
       
    32 #define BPP 4
       
    33 #define PIXEL_TYPE uint32_t
       
    34 #else
       
    35 #error unsupport depth
       
    36 #endif
       
    37 
       
    38 #ifdef BGR_FORMAT
       
    39 #define PIXEL_NAME glue(DEPTH, bgr)
       
    40 #else
       
    41 #define PIXEL_NAME DEPTH
       
    42 #endif /* BGR_FORMAT */
       
    43 
       
    44 
       
    45 static void glue(draw_line8_, PIXEL_NAME)(
       
    46                  uint8_t *d, const uint8_t *s, int width, const uint32_t *pal)
       
    47 {
       
    48     uint8_t v, r, g, b;
       
    49     do {
       
    50       	v = ldub_raw(s);
       
    51 	r = (pal[v] >> 16) & 0xff;
       
    52 	g = (pal[v] >>  8) & 0xff;
       
    53 	b = (pal[v] >>  0) & 0xff;
       
    54 	((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b);
       
    55 	s ++;
       
    56 	d += BPP;
       
    57     } while (-- width != 0);
       
    58 }
       
    59 
       
    60 static void glue(draw_line16_, PIXEL_NAME)(
       
    61 		 uint8_t *d, const uint8_t *s, int width, const uint32_t *pal)
       
    62 {
       
    63     uint16_t rgb565;
       
    64     uint8_t r, g, b;
       
    65 
       
    66     do {
       
    67 	rgb565 = lduw_raw(s);
       
    68 	r = ((rgb565 >> 11) & 0x1f) << 3;
       
    69 	g = ((rgb565 >>  5) & 0x3f) << 2;
       
    70 	b = ((rgb565 >>  0) & 0x1f) << 3;
       
    71 	((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b);
       
    72 	s += 2;
       
    73 	d += BPP;
       
    74     } while (-- width != 0);
       
    75 }
       
    76 
       
    77 static void glue(draw_line32_, PIXEL_NAME)(
       
    78 		 uint8_t *d, const uint8_t *s, int width, const uint32_t *pal)
       
    79 {
       
    80     uint8_t r, g, b;
       
    81 
       
    82     do {
       
    83 	ldub_raw(s);
       
    84 #if defined(TARGET_WORDS_BIGENDIAN)
       
    85         r = s[1];
       
    86         g = s[2];
       
    87         b = s[3];
       
    88 #else
       
    89         b = s[0];
       
    90         g = s[1];
       
    91         r = s[2];
       
    92 #endif
       
    93 	((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b);
       
    94 	s += 4;
       
    95 	d += BPP;
       
    96     } while (-- width != 0);
       
    97 }
       
    98 
       
    99 #undef DEPTH
       
   100 #undef BPP
       
   101 #undef PIXEL_TYPE
       
   102 #undef PIXEL_NAME
       
   103 #undef BGR_FORMAT