Subversion Repositories HelenOS

Rev

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

Rev 2479 Rev 2619
Line 163... Line 163...
163
 
163
 
164
static void
164
static void
165
bgr_byte0888(void *dst, int rgb)
165
bgr_byte0888(void *dst, int rgb)
166
{
166
{
167
    *((uint32_t *) dst) = BLUE(rgb, 8) << 16 | GREEN(rgb, 8) << 8 |
167
    *((uint32_t *) dst) = BLUE(rgb, 8) << 16 | GREEN(rgb, 8) << 8 |
168
        RED(rgb, 8);
168
        RED(rgb, 8);
169
}
169
}
170
 
170
 
171
static int
171
static int
172
byte0888_bgr(void *src)
172
byte0888_bgr(void *src)
173
{
173
{
174
    int color = *(uint32_t *)(src);
174
    int color = *(uint32_t *)(src);
175
    return ((color & 0xff) << 16) | (((color >> 8) & 0xff) << 8) |
175
    return ((color & 0xff) << 16) | (((color >> 8) & 0xff) << 8) |
176
        ((color >> 16) & 0xff);
176
        ((color >> 16) & 0xff);
177
}
177
}
178
 
178
 
179
static void
179
static void
180
rgb_byte888(void *dst, int rgb)
180
rgb_byte888(void *dst, int rgb)
181
{
181
{
Line 206... Line 206...
206
static void
206
static void
207
rgb_byte555(void *dst, int rgb)
207
rgb_byte555(void *dst, int rgb)
208
{
208
{
209
    /* 5-bit, 5-bits, 5-bits */
209
    /* 5-bit, 5-bits, 5-bits */
210
    *((uint16_t *)(dst)) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 |
210
    *((uint16_t *)(dst)) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 |
211
        BLUE(rgb, 5);
211
        BLUE(rgb, 5);
212
}
212
}
213
 
213
 
214
/** 16-bit depth (5:5:5) */
214
/** 16-bit depth (5:5:5) */
215
static int
215
static int
216
byte555_rgb(void *src)
216
byte555_rgb(void *src)
217
{
217
{
218
    int color = *(uint16_t *)(src);
218
    int color = *(uint16_t *)(src);
219
    return (((color >> 10) & 0x1f) << (16 + 3)) |
219
    return (((color >> 10) & 0x1f) << (16 + 3)) |
220
        (((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3);
220
        (((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3);
221
}
221
}
222
 
222
 
223
/**  16-bit depth (5:6:5) */
223
/**  16-bit depth (5:6:5) */
224
static void
224
static void
225
rgb_byte565(void *dst, int rgb)
225
rgb_byte565(void *dst, int rgb)
226
{
226
{
227
    /* 5-bit, 6-bits, 5-bits */
227
    /* 5-bit, 6-bits, 5-bits */
228
    *((uint16_t *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 |
228
    *((uint16_t *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 |
229
        BLUE(rgb, 5);
229
        BLUE(rgb, 5);
230
}
230
}
231
 
231
 
232
/** 16-bit depth (5:6:5) */
232
/** 16-bit depth (5:6:5) */
233
static int
233
static int
234
byte565_rgb(void *src)
234
byte565_rgb(void *src)
235
{
235
{
236
    int color = *(uint16_t *)(src);
236
    int color = *(uint16_t *)(src);
237
    return (((color >> 11) & 0x1f) << (16 + 3)) |
237
    return (((color >> 11) & 0x1f) << (16 + 3)) |
238
        (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
238
        (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
239
}
239
}
240
 
240
 
241
/** Put pixel - 8-bit depth (3:2:3) */
241
/** Put pixel - 8-bit depth (3:2:3) */
242
static void
242
static void
243
rgb_byte8(void *dst, int rgb)
243
rgb_byte8(void *dst, int rgb)
Line 249... Line 249...
249
static int
249
static int
250
byte8_rgb(void *src)
250
byte8_rgb(void *src)
251
{
251
{
252
    int color = *(uint8_t *)src;
252
    int color = *(uint8_t *)src;
253
    return (((color >> 5) & 0x7) << (16 + 5)) |
253
    return (((color >> 5) & 0x7) << (16 + 5)) |
254
        (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
254
        (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
255
}
255
}
256
 
256
 
257
/** Put pixel into viewport
257
/** Put pixel into viewport
258
 *
258
 *
259
 * @param vport Viewport identification
259
 * @param vport Viewport identification
Line 267... Line 267...
267
    int dx = vport->x + x;
267
    int dx = vport->x + x;
268
    int dy = vport->y + y;
268
    int dy = vport->y + y;
269
 
269
 
270
    if (! (vport->paused && vport->dbdata))
270
    if (! (vport->paused && vport->dbdata))
271
        (*screen.rgb2scr)(&screen.fbaddress[POINTPOS(dx,dy)],
271
        (*screen.rgb2scr)(&screen.fbaddress[POINTPOS(dx,dy)],
272
            COLOR(color));
272
            COLOR(color));
273
 
273
 
274
    if (vport->dbdata) {
274
    if (vport->dbdata) {
275
        int dline = (y + vport->dboffset) % vport->height;
275
        int dline = (y + vport->dboffset) % vport->height;
276
        int doffset = screen.pixelbytes * (dline * vport->width + x);
276
        int doffset = screen.pixelbytes * (dline * vport->width + x);
277
        (*screen.rgb2scr)(&vport->dbdata[doffset], COLOR(color));
277
        (*screen.rgb2scr)(&vport->dbdata[doffset], COLOR(color));
Line 289... Line 289...
289
}
289
}
290
 
290
 
291
static inline void
291
static inline void
292
putpixel_mem(char *mem, unsigned int x, unsigned int y, int color)
292
putpixel_mem(char *mem, unsigned int x, unsigned int y, int color)
293
{
293
{
294
    (*screen.rgb2scr)(&mem[POINTPOS(x,y)], COLOR(color));
294
    (*screen.rgb2scr)(&mem[POINTPOS(x, y)], COLOR(color));
295
}
295
}
296
 
296
 
297
static void
297
static void
298
draw_rectangle(viewport_t *vport, unsigned int sx, unsigned int sy,
298
draw_rectangle(viewport_t *vport, unsigned int sx, unsigned int sy,
299
    unsigned int width, unsigned int height, int color)
299
    unsigned int width, unsigned int height, int color)
300
{
300
{
301
    unsigned int x, y;
301
    unsigned int x, y;
302
    static void *tmpline;
302
    static void *tmpline;
303
 
303
 
304
    if (!tmpline)
304
    if (!tmpline)
305
        tmpline = malloc(screen.scanline*screen.pixelbytes);
305
        tmpline = malloc(screen.scanline * screen.pixelbytes);
306
 
306
 
307
    /* Clear first line */
307
    /* Clear first line */
308
    for (x = 0; x < width; x++)
308
    for (x = 0; x < width; x++)
309
        putpixel_mem(tmpline, x, 0, color);
309
        putpixel_mem(tmpline, x, 0, color);
310
 
310
 
Line 313... Line 313...
313
        sx += vport->x;
313
        sx += vport->x;
314
        sy += vport->y;
314
        sy += vport->y;
315
        /* Copy the rest */
315
        /* Copy the rest */
316
        for (y = sy;y < sy+height; y++)
316
        for (y = sy;y < sy+height; y++)
317
            memcpy(&screen.fbaddress[POINTPOS(sx,y)], tmpline,
317
            memcpy(&screen.fbaddress[POINTPOS(sx,y)], tmpline,
318
                   screen.pixelbytes * width);
318
                screen.pixelbytes * width);
319
    }
319
    }
320
    if (vport->dbdata) {
320
    if (vport->dbdata) {
321
        for (y = sy; y < sy + height; y++) {
321
        for (y = sy; y < sy + height; y++) {
322
            int rline = (y + vport->dboffset) % vport->height;
322
            int rline = (y + vport->dboffset) % vport->height;
323
            int rpos = (rline * vport->width + sx) *
323
            int rpos = (rline * vport->width + sx) *
324
                screen.pixelbytes;
324
                screen.pixelbytes;
325
            memcpy(&vport->dbdata[rpos], tmpline,
325
            memcpy(&vport->dbdata[rpos], tmpline,
326
                screen.pixelbytes * width);
326
                screen.pixelbytes * width);
327
        }
327
        }
328
    }
328
    }
329
 
329
 
330
}
330
}
331
 
331
 
332
/** Fill viewport with background color */
332
/** Fill viewport with background color */
333
static void
333
static void
334
clear_port(viewport_t *vport)
334
clear_port(viewport_t *vport)
335
{
335
{
336
    draw_rectangle(vport, 0, 0, vport->width, vport->height,
336
    draw_rectangle(vport, 0, 0, vport->width, vport->height,
337
        vport->style.bg_color);
337
        vport->style.bg_color);
338
}
338
}
339
 
339
 
340
/** Scroll unbuffered viewport up/down
340
/** Scroll unbuffered viewport up/down
341
 *
341
 *
342
 * @param vport Viewport to scroll
342
 * @param vport Viewport to scroll
Line 348... Line 348...
348
    int y;
348
    int y;
349
 
349
 
350
    if (lines > 0) {
350
    if (lines > 0) {
351
        for (y = vport->y; y < vport->y+vport->height - lines; y++)
351
        for (y = vport->y; y < vport->y+vport->height - lines; y++)
352
            memcpy(&screen.fbaddress[POINTPOS(vport->x,y)],
352
            memcpy(&screen.fbaddress[POINTPOS(vport->x,y)],
353
                   &screen.fbaddress[POINTPOS(vport->x,y + lines)],
353
                &screen.fbaddress[POINTPOS(vport->x,y + lines)],
354
                   screen.pixelbytes * vport->width);
354
                screen.pixelbytes * vport->width);
355
        draw_rectangle(vport, 0, vport->height - lines, vport->width,
355
        draw_rectangle(vport, 0, vport->height - lines, vport->width,
356
            lines, vport->style.bg_color);
356
            lines, vport->style.bg_color);
357
    } else if (lines < 0) {
357
    } else if (lines < 0) {
358
        lines = -lines;
358
        lines = -lines;
359
        for (y = vport->y + vport->height-1; y >= vport->y + lines;
359
        for (y = vport->y + vport->height-1; y >= vport->y + lines; y--)
360
             y--)
-
 
361
            memcpy(&screen.fbaddress[POINTPOS(vport->x,y)],
360
            memcpy(&screen.fbaddress[POINTPOS(vport->x,y)],
362
                   &screen.fbaddress[POINTPOS(vport->x,y - lines)],
361
                &screen.fbaddress[POINTPOS(vport->x,y - lines)],
363
                   screen.pixelbytes * vport->width);
362
                screen.pixelbytes * vport->width);
364
        draw_rectangle(vport, 0, 0, vport->width, lines,
363
        draw_rectangle(vport, 0, 0, vport->width, lines,
365
            vport->style.bg_color);
364
            vport->style.bg_color);
366
    }
365
    }
367
}
366
}
368
 
367
 
369
/** Refresh given viewport from double buffer */
368
/** Refresh given viewport from double buffer */
370
static void
369
static void
Line 378... Line 377...
378
 
377
 
379
        dstx = vport->x;
378
        dstx = vport->x;
380
        dsty = vport->y + y;
379
        dsty = vport->y + y;
381
 
380
 
382
        memcpy(&screen.fbaddress[POINTPOS(dstx,dsty)],
381
        memcpy(&screen.fbaddress[POINTPOS(dstx,dsty)],
383
               &vport->dbdata[srcoff],
-
 
384
               vport->width*screen.pixelbytes);
382
            &vport->dbdata[srcoff], vport->width * screen.pixelbytes);
385
    }
383
    }
386
}
384
}
387
 
385
 
388
/** Scroll viewport that has double buffering enabled */
386
/** Scroll viewport that has double buffering enabled */
389
static void
387
static void
390
scroll_port_db(viewport_t *vport, int lines)
388
scroll_port_db(viewport_t *vport, int lines)
391
{
389
{
392
    ++vport->paused;
390
    ++vport->paused;
393
    if (lines > 0) {
391
    if (lines > 0) {
394
        draw_rectangle(vport, 0, 0, vport->width, lines,
392
        draw_rectangle(vport, 0, 0, vport->width, lines,
395
                   vport->style.bg_color);
393
            vport->style.bg_color);
396
        vport->dboffset += lines;
394
        vport->dboffset += lines;
397
        vport->dboffset %= vport->height;
395
        vport->dboffset %= vport->height;
398
    } else if (lines < 0) {
396
    } else if (lines < 0) {
399
        lines = -lines;
397
        lines = -lines;
400
        draw_rectangle(vport, 0, vport->height-lines,
398
        draw_rectangle(vport, 0, vport->height-lines, vport->width,
401
                   vport->width, lines,
-
 
402
                   vport->style.bg_color);
399
            lines, vport->style.bg_color);
403
 
400
 
404
        if (vport->dboffset < lines)
401
        if (vport->dboffset < lines)
405
            vport->dboffset += vport->height;
402
            vport->dboffset += vport->height;
406
        vport->dboffset -= lines;
403
        vport->dboffset -= lines;
407
    }
404
    }
Line 439... Line 436...
439
 * @param sy Coordinates of top-left of the character
436
 * @param sy Coordinates of top-left of the character
440
 * @param style Color of the character
437
 * @param style Color of the character
441
 * @param transparent If false, print background color
438
 * @param transparent If false, print background color
442
 */
439
 */
443
static void
440
static void
444
draw_glyph(viewport_t *vport,uint8_t glyph, unsigned int sx,
441
draw_glyph(viewport_t *vport,uint8_t glyph, unsigned int sx, unsigned int sy,
445
     unsigned int sy, style_t style, int transparent)
442
    style_t style, int transparent)
446
{
443
{
447
    int i;
444
    int i;
448
    unsigned int y;
445
    unsigned int y;
449
    unsigned int glline;
446
    unsigned int glline;
450
 
447
 
451
    for (y = 0; y < FONT_SCANLINES; y++) {
448
    for (y = 0; y < FONT_SCANLINES; y++) {
452
        glline = fb_font[glyph * FONT_SCANLINES + y];
449
        glline = fb_font[glyph * FONT_SCANLINES + y];
453
        for (i = 0; i < 8; i++) {
450
        for (i = 0; i < 8; i++) {
454
            if (glline & (1 << (7 - i)))
451
            if (glline & (1 << (7 - i)))
455
                putpixel(vport, sx + i, sy + y,
452
                putpixel(vport, sx + i, sy + y, style.fg_color);
456
                    style.fg_color);
-
 
457
            else if (!transparent)
453
            else if (!transparent)
458
                putpixel(vport, sx + i, sy + y,
454
                putpixel(vport, sx + i, sy + y, style.bg_color);
459
                    style.bg_color);
-
 
460
        }
455
        }
461
    }
456
    }
462
}
457
}
463
 
458
 
464
/** Invert character at given position */
459
/** Invert character at given position */
Line 469... Line 464...
469
    unsigned int y;
464
    unsigned int y;
470
 
465
 
471
    for (x = 0; x < COL_WIDTH; x++)
466
    for (x = 0; x < COL_WIDTH; x++)
472
        for (y = 0; y < FONT_SCANLINES; y++)
467
        for (y = 0; y < FONT_SCANLINES; y++)
473
            invert_pixel(vport, col * COL_WIDTH + x, row *
468
            invert_pixel(vport, col * COL_WIDTH + x, row *
474
                FONT_SCANLINES + y);
469
                FONT_SCANLINES + y);
475
}
470
}
476
 
471
 
477
/***************************************************************/
472
/***************************************************************/
478
/* Stdout specific functions */
473
/* Stdout specific functions */
479
 
474
 
Line 628... Line 623...
628
    if (vport->cursor_active && vport->cursor_shown &&
623
    if (vport->cursor_active && vport->cursor_shown &&
629
        (vport->cur_col != col || vport->cur_row != row))
624
        (vport->cur_col != col || vport->cur_row != row))
630
        invert_char(vport, vport->cur_row, vport->cur_col);
625
        invert_char(vport, vport->cur_row, vport->cur_col);
631
   
626
   
632
    draw_glyph(vport, c, col * COL_WIDTH, row * FONT_SCANLINES, style,
627
    draw_glyph(vport, c, col * COL_WIDTH, row * FONT_SCANLINES, style,
633
        transparent);
628
        transparent);
634
 
629
 
635
    vport->cur_col = col;
630
    vport->cur_col = col;
636
    vport->cur_row = row;
631
    vport->cur_row = row;
637
 
632
 
638
    vport->cur_col++;
633
    vport->cur_col++;
Line 657... Line 652...
657
    int col,row;
652
    int col,row;
658
 
653
 
659
    clear_port(vport);
654
    clear_port(vport);
660
    for (i = 0; i < vport->cols * vport->rows; i++) {
655
    for (i = 0; i < vport->cols * vport->rows; i++) {
661
        if (data[i].character == ' ' && style_same(data[i].style,
656
        if (data[i].character == ' ' && style_same(data[i].style,
662
            vport->style))
657
            vport->style))
663
            continue;
658
            continue;
664
        col = i % vport->cols;
659
        col = i % vport->cols;
665
        row = i / vport->cols;
660
        row = i / vport->cols;
666
        draw_glyph(vport, data[i].character, col * COL_WIDTH, row *
661
        draw_glyph(vport, data[i].character, col * COL_WIDTH, row *
667
            FONT_SCANLINES, data[i].style,
662
            FONT_SCANLINES, data[i].style, style_same(data[i].style,
668
            style_same(data[i].style,vport->style));
663
            vport->style));
669
    }
664
    }
670
    cursor_print(vport);
665
    cursor_print(vport);
671
}
666
}
672
 
667
 
673
/** Return first free pixmap */
668
/** Return first free pixmap */
Line 709... Line 704...
709
    pmap->data = malloc(pmap->width * pmap->height * screen.pixelbytes);
704
    pmap->data = malloc(pmap->width * pmap->height * screen.pixelbytes);
710
    if (!pmap->data)
705
    if (!pmap->data)
711
        return ENOMEM;
706
        return ENOMEM;
712
 
707
 
713
    ppm_draw(shm, size, 0, 0, pmap->width, pmap->height,
708
    ppm_draw(shm, size, 0, 0, pmap->width, pmap->height,
714
         (putpixel_cb_t)putpixel_pixmap, (void *)pm);
709
        (putpixel_cb_t)putpixel_pixmap, (void *)pm);
715
 
710
 
716
    return pm;
711
    return pm;
717
}
712
}
718
 
713
 
719
/** Handle shared memory communication calls
714
/** Handle shared memory communication calls
Line 755... Line 750...
755
    case IPC_M_AS_AREA_SEND:
750
    case IPC_M_AS_AREA_SEND:
756
        /* We accept one area for data interchange */
751
        /* We accept one area for data interchange */
757
        if (IPC_GET_ARG1(*call) == shm_id) {
752
        if (IPC_GET_ARG1(*call) == shm_id) {
758
            void *dest = as_get_mappable_page(IPC_GET_ARG2(*call));
753
            void *dest = as_get_mappable_page(IPC_GET_ARG2(*call));
759
            shm_size = IPC_GET_ARG2(*call);
754
            shm_size = IPC_GET_ARG2(*call);
760
            if (!ipc_answer_fast(callid, 0, (sysarg_t) dest, 0))
755
            if (!ipc_answer_1(callid, EOK, (sysarg_t) dest))
761
                shm = dest;
756
                shm = dest;
762
            else
757
            else
763
                shm_id = 0;
758
                shm_id = 0;
764
            if (shm[0] != 'P')
759
            if (shm[0] != 'P')
765
                while (1)
760
                while (1)
Line 803... Line 798...
803
            retval = EINVAL;
798
            retval = EINVAL;
804
            break;
799
            break;
805
        }
800
        }
806
       
801
       
807
        ppm_draw(shm, shm_size, IPC_GET_ARG1(*call),
802
        ppm_draw(shm, shm_size, IPC_GET_ARG1(*call),
808
            IPC_GET_ARG2(*call), vport->width - x,
803
            IPC_GET_ARG2(*call), vport->width - x, vport->height - y,
809
            vport->height - y, (putpixel_cb_t)putpixel, vport);
804
            (putpixel_cb_t)putpixel, vport);
810
        break;
805
        break;
811
    case FB_DRAW_TEXT_DATA:
806
    case FB_DRAW_TEXT_DATA:
812
        if (!interbuffer) {
807
        if (!interbuffer) {
813
            retval = EINVAL;
808
            retval = EINVAL;
814
            break;
809
            break;
815
        }
810
        }
816
        if (intersize < vport->cols * vport->rows *
811
        if (intersize < vport->cols * vport->rows *
817
            sizeof(*interbuffer)) {
812
            sizeof(*interbuffer)) {
818
            retval = EINVAL;
813
            retval = EINVAL;
819
            break;
814
            break;
820
        }
815
        }
821
        draw_text_data(vport, interbuffer);
816
        draw_text_data(vport, interbuffer);
822
        break;
817
        break;
823
    default:
818
    default:
824
        handled = 0;
819
        handled = 0;
825
    }
820
    }
826
   
821
   
827
    if (handled)
822
    if (handled)
828
        ipc_answer_fast(callid, retval, 0, 0);
823
        ipc_answer_0(callid, retval);
829
    return handled;
824
    return handled;
830
}
825
}
831
 
826
 
832
static void
827
static void
833
copy_vp_to_pixmap(viewport_t *vport, pixmap_t *pmap)
828
copy_vp_to_pixmap(viewport_t *vport, pixmap_t *pmap)
Line 849... Line 844...
849
    srcrowsize = vport->width * screen.pixelbytes;
844
    srcrowsize = vport->width * screen.pixelbytes;
850
    realrowsize = realwidth * screen.pixelbytes;
845
    realrowsize = realwidth * screen.pixelbytes;
851
   
846
   
852
    for (y = 0; y < realheight; y++) {
847
    for (y = 0; y < realheight; y++) {
853
        tmp = (vport->y + y) * screen.scanline +
848
        tmp = (vport->y + y) * screen.scanline +
854
            vport->x * screen.pixelbytes;
849
            vport->x * screen.pixelbytes;
855
        memcpy(pmap->data + srcrowsize * y, screen.fbaddress + tmp,
850
        memcpy(pmap->data + srcrowsize * y, screen.fbaddress + tmp,
856
            realrowsize);
851
            realrowsize);
857
    }
852
    }
858
}
853
}
859
 
854
 
860
/** Save viewport to pixmap */
855
/** Save viewport to pixmap */
861
static int
856
static int
Line 910... Line 905...
910
    srcrowsize = vport->width * screen.pixelbytes;
905
    srcrowsize = vport->width * screen.pixelbytes;
911
    realrowsize = realwidth * screen.pixelbytes;
906
    realrowsize = realwidth * screen.pixelbytes;
912
 
907
 
913
    for (y = 0; y < realheight; y++) {
908
    for (y = 0; y < realheight; y++) {
914
        tmp = (vport->y + y) * screen.scanline +
909
        tmp = (vport->y + y) * screen.scanline +
915
            vport->x * screen.pixelbytes;
910
            vport->x * screen.pixelbytes;
916
        memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize,
911
        memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize,
917
            realrowsize);
912
            realrowsize);
918
    }
913
    }
919
    return 0;
914
    return 0;
920
}
915
}
921
 
916
 
922
/** Tick animation one step forward */
917
/** Tick animation one step forward */
Line 931... Line 926...
931
    if (counts)
926
    if (counts)
932
        return;
927
        return;
933
 
928
 
934
    for (i = 0; i < MAX_ANIMATIONS; i++) {
929
    for (i = 0; i < MAX_ANIMATIONS; i++) {
935
        if (!animations[i].animlen || !animations[i].initialized ||
930
        if (!animations[i].animlen || !animations[i].initialized ||
936
            !animations[i].enabled)
931
            !animations[i].enabled)
937
            continue;
932
            continue;
938
        draw_pixmap(animations[i].vp,
933
        draw_pixmap(animations[i].vp,
939
            animations[i].pixmaps[animations[i].pos]);
934
            animations[i].pixmaps[animations[i].pos]);
940
        animations[i].pos = (animations[i].pos + 1) %
935
        animations[i].pos = (animations[i].pos + 1) %
941
            animations[i].animlen;
936
            animations[i].animlen;
942
    }
937
    }
943
}
938
}
944
 
939
 
945
 
940
 
946
static int pointer_x, pointer_y;
941
static int pointer_x, pointer_y;
Line 960... Line 955...
960
        return;
955
        return;
961
 
956
 
962
    /* Save image under the cursor */
957
    /* Save image under the cursor */
963
    if (pointer_vport == -1) {
958
    if (pointer_vport == -1) {
964
        pointer_vport = viewport_create(pointer_x, pointer_y,
959
        pointer_vport = viewport_create(pointer_x, pointer_y,
965
            pointer_width, pointer_height);
960
            pointer_width, pointer_height);
966
        if (pointer_vport < 0)
961
        if (pointer_vport < 0)
967
            return;
962
            return;
968
    } else {
963
    } else {
969
        viewports[pointer_vport].x = pointer_x;
964
        viewports[pointer_vport].x = pointer_x;
970
        viewports[pointer_vport].y = pointer_y;
965
        viewports[pointer_vport].y = pointer_y;
Line 972... Line 967...
972
 
967
 
973
    if (pointer_pixmap == -1)
968
    if (pointer_pixmap == -1)
974
        pointer_pixmap = save_vp_to_pixmap(&viewports[pointer_vport]);
969
        pointer_pixmap = save_vp_to_pixmap(&viewports[pointer_vport]);
975
    else
970
    else
976
        copy_vp_to_pixmap(&viewports[pointer_vport],
971
        copy_vp_to_pixmap(&viewports[pointer_vport],
977
            &pixmaps[pointer_pixmap]);
972
            &pixmaps[pointer_pixmap]);
978
 
973
 
979
    /* Draw cursor */
974
    /* Draw cursor */
980
    for (i = 0; i < pointer_height; i++)
975
    for (i = 0; i < pointer_height; i++)
981
        for (j = 0; j < pointer_width; j++) {
976
        for (j = 0; j < pointer_width; j++) {
982
            bytepos = i * ((pointer_width - 1) / 8 + 1) + j / 8;
977
            bytepos = i * ((pointer_width - 1) / 8 + 1) + j / 8;
983
            visibility = pointer_mask_bits[bytepos] &
978
            visibility = pointer_mask_bits[bytepos] &
984
                (1 << (j % 8));
979
                (1 << (j % 8));
985
            if (visibility) {
980
            if (visibility) {
986
                color = pointer_bits[bytepos] & (1 << (j % 8))
981
                color = pointer_bits[bytepos] &
987
                    ? 0 : 0xffffff;
982
                    (1 << (j % 8)) ? 0 : 0xffffff;
988
                if (pointer_x + j < screen.xres && pointer_y +
983
                if (pointer_x + j < screen.xres && pointer_y +
989
                    i < screen.yres)
984
                    i < screen.yres)
990
                    putpixel(&viewports[0], pointer_x + j,
985
                    putpixel(&viewports[0], pointer_x + j,
991
                        pointer_y + i, color);
986
                        pointer_y + i, color);
992
            }
987
            }
993
        }
988
        }
994
    pointer_shown = 1;
989
    pointer_shown = 1;
995
}
990
}
996
 
991
 
Line 1104... Line 1099...
1104
        break;
1099
        break;
1105
    default:
1100
    default:
1106
        handled = 0;
1101
        handled = 0;
1107
    }
1102
    }
1108
    if (handled)
1103
    if (handled)
1109
        ipc_answer_fast(callid, retval, 0, 0);
1104
        ipc_answer_0(callid, retval);
1110
    return handled;
1105
    return handled;
1111
}
1106
}
1112
 
1107
 
1113
/** Handler for messages concerning pixmap handling */
1108
/** Handler for messages concerning pixmap handling */
1114
static int
1109
static int
Line 1155... Line 1150...
1155
    default:
1150
    default:
1156
        handled = 0;
1151
        handled = 0;
1157
    }
1152
    }
1158
 
1153
 
1159
    if (handled)
1154
    if (handled)
1160
        ipc_answer_fast(callid, retval, 0, 0);
1155
        ipc_answer_0(callid, retval);
1161
    return handled;
1156
    return handled;
1162
   
1157
   
1163
}
1158
}
1164
 
1159
 
1165
/** Function for handling connections to FB
1160
/** Function for handling connections to FB
Line 1177... Line 1172...
1177
 
1172
 
1178
    int vp = 0;
1173
    int vp = 0;
1179
    viewport_t *vport = &viewports[0];
1174
    viewport_t *vport = &viewports[0];
1180
 
1175
 
1181
    if (client_connected) {
1176
    if (client_connected) {
1182
        ipc_answer_fast(iid, ELIMIT, 0,0);
1177
        ipc_answer_0(iid, ELIMIT);
1183
        return;
1178
        return;
1184
    }
1179
    }
1185
    client_connected = 1;
1180
    client_connected = 1;
1186
    ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
1181
    ipc_answer_0(iid, EOK); /* Accept connection */
1187
 
1182
 
1188
    while (1) {
1183
    while (1) {
1189
        if (vport->cursor_active || anims_enabled)
1184
        if (vport->cursor_active || anims_enabled)
1190
            callid = async_get_call_timeout(&call, 250000);
1185
            callid = async_get_call_timeout(&call, 250000);
1191
        else
1186
        else
Line 1220... Line 1215...
1220
            col = IPC_GET_ARG3(call);
1215
            col = IPC_GET_ARG3(call);
1221
            if (row >= vport->rows || col >= vport->cols) {
1216
            if (row >= vport->rows || col >= vport->cols) {
1222
                retval = EINVAL;
1217
                retval = EINVAL;
1223
                break;
1218
                break;
1224
            }
1219
            }
1225
            ipc_answer_fast(callid, 0, 0, 0);
1220
            ipc_answer_0(callid, EOK);
1226
 
1221
 
1227
            draw_char(vport, c, row, col, vport->style,
1222
            draw_char(vport, c, row, col, vport->style,
1228
                IPC_GET_METHOD(call) == FB_TRANS_PUTCHAR);
1223
                IPC_GET_METHOD(call) == FB_TRANS_PUTCHAR);
1229
            continue; /* msg already answered */
1224
            continue; /* msg already answered */
1230
        case FB_CLEAR:
1225
        case FB_CLEAR:
1231
            clear_port(vport);
1226
            clear_port(vport);
1232
            cursor_print(vport);
1227
            cursor_print(vport);
1233
            retval = 0;
1228
            retval = 0;
Line 1250... Line 1245...
1250
            vport->cursor_active = IPC_GET_ARG1(call);
1245
            vport->cursor_active = IPC_GET_ARG1(call);
1251
            cursor_print(vport);
1246
            cursor_print(vport);
1252
            retval = 0;
1247
            retval = 0;
1253
            break;
1248
            break;
1254
        case FB_GET_CSIZE:
1249
        case FB_GET_CSIZE:
1255
            ipc_answer_fast(callid, 0, vport->rows, vport->cols);
1250
            ipc_answer_2(callid, EOK, vport->rows, vport->cols);
1256
            continue;
1251
            continue;
1257
        case FB_SCROLL:
1252
        case FB_SCROLL:
1258
            i = IPC_GET_ARG1(call);
1253
            i = IPC_GET_ARG1(call);
1259
            if (i > vport->rows || i < (- (int)vport->rows)) {
1254
            if (i > vport->rows || i < (- (int)vport->rows)) {
1260
                retval = EINVAL;
1255
                retval = EINVAL;
Line 1272... Line 1267...
1272
                i = vp;
1267
                i = vp;
1273
            if (i < 0 || i >= MAX_VIEWPORTS) {
1268
            if (i < 0 || i >= MAX_VIEWPORTS) {
1274
                retval = EINVAL;
1269
                retval = EINVAL;
1275
                break;
1270
                break;
1276
            }
1271
            }
1277
            if (! viewports[i].initialized ) {
1272
            if (!viewports[i].initialized ) {
1278
                retval = EADDRNOTAVAIL;
1273
                retval = EADDRNOTAVAIL;
1279
                break;
1274
                break;
1280
            }
1275
            }
1281
            viewports[i].dboffset = 0;
1276
            viewports[i].dboffset = 0;
1282
            if (IPC_GET_ARG2(call) == 1 && !viewports[i].dbdata)
1277
            if (IPC_GET_ARG2(call) == 1 && !viewports[i].dbdata)
1283
                viewports[i].dbdata = malloc(screen.pixelbytes
1278
                viewports[i].dbdata =
1284
                    * viewports[i].width *
1279
                    malloc(screen.pixelbytes *
1285
                    viewports[i].height);
1280
                    viewports[i].width * viewports[i].height);
1286
            else if (IPC_GET_ARG2(call) == 0 &&
1281
            else if (IPC_GET_ARG2(call) == 0 &&
1287
                viewports[i].dbdata) {
1282
                viewports[i].dbdata) {
1288
                free(viewports[i].dbdata);
1283
                free(viewports[i].dbdata);
1289
                viewports[i].dbdata = NULL;
1284
                viewports[i].dbdata = NULL;
1290
            }
1285
            }
1291
            retval = 0;
1286
            retval = 0;
1292
            break;
1287
            break;
Line 1306... Line 1301...
1306
            cursor_print(vport);
1301
            cursor_print(vport);
1307
            retval = 0;
1302
            retval = 0;
1308
            break;
1303
            break;
1309
        case FB_VIEWPORT_CREATE:
1304
        case FB_VIEWPORT_CREATE:
1310
            retval = viewport_create(IPC_GET_ARG1(call) >> 16,
1305
            retval = viewport_create(IPC_GET_ARG1(call) >> 16,
1311
                IPC_GET_ARG1(call) & 0xffff,
1306
                IPC_GET_ARG1(call) & 0xffff,
1312
                IPC_GET_ARG2(call) >> 16,
1307
                IPC_GET_ARG2(call) >> 16,
1313
                IPC_GET_ARG2(call) & 0xffff);
1308
                IPC_GET_ARG2(call) & 0xffff);
1314
            break;
1309
            break;
1315
        case FB_VIEWPORT_DELETE:
1310
        case FB_VIEWPORT_DELETE:
1316
            i = IPC_GET_ARG1(call);
1311
            i = IPC_GET_ARG1(call);
1317
            if (i < 0 || i >= MAX_VIEWPORTS) {
1312
            if (i < 0 || i >= MAX_VIEWPORTS) {
1318
                retval = EINVAL;
1313
                retval = EINVAL;
Line 1333... Line 1328...
1333
            vport->style.fg_color = IPC_GET_ARG1(call);
1328
            vport->style.fg_color = IPC_GET_ARG1(call);
1334
            vport->style.bg_color = IPC_GET_ARG2(call);
1329
            vport->style.bg_color = IPC_GET_ARG2(call);
1335
            retval = 0;
1330
            retval = 0;
1336
            break;
1331
            break;
1337
        case FB_GET_RESOLUTION:
1332
        case FB_GET_RESOLUTION:
1338
            ipc_answer_fast(callid, 0, screen.xres,screen.yres);
1333
            ipc_answer_2(callid, EOK, screen.xres, screen.yres);
1339
            continue;
1334
            continue;
1340
        case FB_POINTER_MOVE:
1335
        case FB_POINTER_MOVE:
1341
            pointer_enabled = 1;
1336
            pointer_enabled = 1;
1342
            mouse_move(IPC_GET_ARG1(call), IPC_GET_ARG2(call));
1337
            mouse_move(IPC_GET_ARG1(call), IPC_GET_ARG2(call));
1343
            retval = 0;
1338
            retval = 0;
1344
            break;
1339
            break;
1345
        default:
1340
        default:
1346
            retval = ENOENT;
1341
            retval = ENOENT;
1347
        }
1342
        }
1348
        ipc_answer_fast(callid,retval, 0, 0);
1343
        ipc_answer_0(callid, retval);
1349
    }
1344
    }
1350
}
1345
}
1351
 
1346
 
1352
/** Initialization of framebuffer */
1347
/** Initialization of framebuffer */
1353
int
1348
int
Line 1373... Line 1368...
1373
 
1368
 
1374
    asz = fb_scanline * fb_height;
1369
    asz = fb_scanline * fb_height;
1375
    fb_addr = as_get_mappable_page(asz);
1370
    fb_addr = as_get_mappable_page(asz);
1376
   
1371
   
1377
    physmem_map(fb_ph_addr, fb_addr, ALIGN_UP(asz, PAGE_SIZE) >>
1372
    physmem_map(fb_ph_addr, fb_addr, ALIGN_UP(asz, PAGE_SIZE) >>
1378
        PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE);
1373
        PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE);
1379
 
1374
 
1380
    if (screen_init(fb_addr, fb_width, fb_height, fb_scanline, fb_visual,
1375
    if (screen_init(fb_addr, fb_width, fb_height, fb_scanline, fb_visual,
1381
        fb_invert_colors))
1376
        fb_invert_colors))
1382
        return 0;
1377
        return 0;
1383
   
1378
   
1384
    return -1;
1379
    return -1;
1385
}
1380
}
1386
 
1381