Subversion Repositories HelenOS

Rev

Rev 1790 | Rev 1869 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1790 Rev 1837
Line 132... Line 132...
132
{
132
{
133
    int color = *(uint16_t *)(src);
133
    int color = *(uint16_t *)(src);
134
    return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
134
    return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
135
}
135
}
136
 
136
 
137
/** Put pixel - 8-bit depth (3:2:3) */
137
/** Put pixel - 8-bit depth (color palette/3:2:3)
-
 
138
 *
-
 
139
 * Even though we try 3:2:3 color scheme here, an 8-bit framebuffer
-
 
140
 * will most likely use a color palette. The color appearance
-
 
141
 * will be pretty random and depend on the default installed
-
 
142
 * palette. This could be fixed by supporting custom palette
-
 
143
 * and setting it to simulate the 8-bit truecolor.
-
 
144
 */
138
static void rgb_1byte(void *dst, int rgb)
145
static void rgb_1byte(void *dst, int rgb)
139
{
146
{
140
    *(uint8_t *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3);
147
    *(uint8_t *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3);
141
}
148
}
142
 
149
 
143
/** Return pixel color - 8-bit depth (3:2:3) */
150
/** Return pixel color - 8-bit depth (color palette/3:2:3)
-
 
151
 *
-
 
152
 * See the comment for rgb_1byte().
-
 
153
 */
144
static int byte1_rgb(void *src)
154
static int byte1_rgb(void *src)
145
{
155
{
146
    int color = *(uint8_t *)src;
156
    int color = *(uint8_t *)src;
147
    return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
157
    return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
148
}
158
}
Line 327... Line 337...
327
};
337
};
328
 
338
 
329
 
339
 
330
/** Initialize framebuffer as a chardev output device
340
/** Initialize framebuffer as a chardev output device
331
 *
341
 *
332
 * @param addr Physical address of the framebuffer
342
 * @param addr  Physical address of the framebuffer
333
 * @param x    Screen width in pixels
343
 * @param x     Screen width in pixels
334
 * @param y    Screen height in pixels
344
 * @param y     Screen height in pixels
335
 * @param bpp  Bits per pixel (8, 16, 24, 32)
345
 * @param bpp   Bits per pixel (8, 16, 24, 32)
336
 * @param scan Bytes per one scanline
346
 * @param scan  Bytes per one scanline
337
 *
-
 
-
 
347
 * @param align Request alignment for 24bpp mode.
338
 */
348
 */
339
void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan)
349
void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan, bool align)
340
{
350
{
341
    switch (bpp) {
351
    switch (bpp) {
342
        case 8:
352
        case 8:
343
            rgb2scr = rgb_1byte;
353
            rgb2scr = rgb_1byte;
344
            scr2rgb = byte1_rgb;
354
            scr2rgb = byte1_rgb;
Line 350... Line 360...
350
            pixelbytes = 2;
360
            pixelbytes = 2;
351
            break;
361
            break;
352
        case 24:
362
        case 24:
353
            rgb2scr = rgb_3byte;
363
            rgb2scr = rgb_3byte;
354
            scr2rgb = byte3_rgb;
364
            scr2rgb = byte3_rgb;
-
 
365
            if (align)
-
 
366
                pixelbytes = 4;
-
 
367
            else
355
            pixelbytes = 3;
368
                pixelbytes = 3;
356
            break;
369
            break;
357
        case 32:
370
        case 32:
358
            rgb2scr = rgb_4byte;
371
            rgb2scr = rgb_4byte;
359
            scr2rgb = byte4_rgb;
372
            scr2rgb = byte4_rgb;
360
            pixelbytes = 4;
373
            pixelbytes = 4;