Subversion Repositories Kolibri OS

Rev

Rev 5021 | Rev 5603 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4438 Serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include 
7
#include "winlib/winlib.h"
5021 Serge 8
#include 
4438 Serge 9
#include "fplay.h"
10
#include 
11
12
 
13
14
 
15
extern int res_pause_btn_pressed[];
16
17
 
18
extern int res_play_btn_pressed[];
19
20
 
21
extern volatile int sound_level_0;
22
extern volatile int sound_level_1;
23
24
 
25
{
26
    AVPicture      picture;
27
    double         pts;
28
    volatile int   ready;
29
}vframe_t;
30
31
 
32
volatile int      frames_count = 0;
33
34
 
35
36
 
37
int dfx    = 0;
38
39
 
40
41
 
42
int height;
43
44
 
45
AVFrame  *Frame;
46
47
 
48
49
 
50
51
 
52
{
53
    int i;
54
55
 
56
    {
57
        frames[i].pts    = 0;
58
        frames[i].ready  = 0;
59
    };
60
    frames_count = 0;
61
    vfx    = 0;
62
    dfx    = 0;
63
};
64
65
 
66
{
67
    int        i;
68
69
 
70
    height = ctx->height;
71
72
 
73
 
74
    if ( Frame == NULL )
75
    {
76
        printf("Cannot alloc video frame\n\r");
77
        return 0;
78
    };
79
80
 
81
    {
82
        int ret;
83
84
 
85
//                   ctx->width, ctx->height, ctx->pix_fmt );
86
87
 
88
                               ctx->width, ctx->height);
89
        if ( ret != 0 )
90
        {
91
            printf("Cannot alloc video buffer\n\r");
92
            return 0;
93
        };
94
95
 
96
        frames[i].ready  = 0;
97
    };
98
99
 
100
101
 
102
    return 1;
103
};
104
105
 
106
{
107
    AVPacket   pkt;
108
    double     pts;
109
    int frameFinished;
110
    double current_clock;
111
112
 
113
        return -1;
114
115
 
116
        return 0;
117
118
 
119
    current_clock = -90.0 + get_master_clock();
120
121
 
122
        Frame->reordered_opaque != AV_NOPTS_VALUE)
123
        pts = Frame->reordered_opaque;
124
    else if(pkt.dts != AV_NOPTS_VALUE)
125
        pts= pkt.dts;
126
    else
127
        pts= 0;
128
129
 
130
 
131
*/
132
    if( 1 /*pts > current_clock*/)
133
    {
134
        frameFinished = 0;
135
136
 
137
138
 
139
            printf("video decoder error\n");
140
141
 
142
        {
143
            AVPicture *dst_pic;
144
145
 
146
                Frame->reordered_opaque != AV_NOPTS_VALUE)
147
                pts = Frame->reordered_opaque;
148
            else if(pkt.dts != AV_NOPTS_VALUE)
149
                pts= pkt.dts;
150
            else
151
                pts= 0;
152
153
 
154
//                                Frame, "best_effort_timestamp");
155
156
 
157
//            pts = 0;
158
159
 
160
161
 
162
163
 
164
                      (const uint8_t**)Frame->data,
165
                      Frame->linesize, ctx->pix_fmt, ctx->width, ctx->height);
166
167
 
168
//            printf("pts %f\n", frames[dfx].pts);
169
170
 
171
172
 
173
            dfx&= 3;
174
            frames_count++;
175
        };
176
    };
177
    av_free_packet(&pkt);
178
179
 
180
}
181
182
 
183
extern volatile enum player_state decoder_state;
184
extern volatile enum player_state sound_state;
185
186
 
187
188
 
189
{
190
    window_t  *win;
191
192
 
193
194
 
195
196
 
197
    win->panel.play_btn->img_hilite     = res_play_btn;
198
    win->panel.play_btn->img_pressed    = res_play_btn_pressed;
199
    win->panel.prg->current             = rewind_pos;
200
201
 
202
    player_state = STOP;
203
    decoder_state = PLAY_2_STOP;
204
    sound_state = PLAY_2_STOP;
205
    render_draw_client(main_render);
206
//    printf("stop player\n");
207
208
 
209
210
 
211
{
212
    window_t  *win = (window_t*)ctrl;
213
    static int spc_down = 0;
214
    static int ent_down = 0;
215
216
 
217
    {
218
        case MSG_SIZE:
219
            if(main_render)
220
            {
221
                render_adjust_size(main_render, win);
222
                render_draw_client(main_render);
223
            };
224
            break;
225
226
 
227
            switch((short)arg2)
228
            {
229
                case 0x39:
230
                    if(spc_down == 0)
231
                    {
232
                        spc_down = 1;
233
                        send_message(win, MSG_LBTNDOWN, 0, 0);
234
                    }
235
                    break;
236
237
 
238
                    spc_down = 0;
239
                    break;
240
241
 
242
                    if(ent_down == 0)
243
                    {
244
                        int screensize;
245
                        if(win->win_state == NORMAL)
246
                        {
247
                            win->saved = win->rc;
248
                            win->saved_state = win->win_state;
249
250
 
251
                            __asm__ __volatile__(
252
                            "int $0x40"
253
                            ::"a"(67), "b"(0), "c"(0),
254
                            "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) );
255
                            win->win_state = FULLSCREEN;
256
                            window_update_layout(win);
257
                        }
258
                        else if(win->win_state == FULLSCREEN)
259
                        {
260
                            __asm__ __volatile__(
261
                            "int $0x40"
262
                            ::"a"(67), "b"(win->saved.l), "c"(win->saved.t),
263
                            "d"(win->saved.r-win->saved.l-1),"S"(win->saved.b-win->saved.t-1));
264
                            win->win_state = win->saved_state;
265
                            window_update_layout(win);
266
//                            if(win->saved_state == MAXIMIZED)
267
//                            {
5372 serge 268
//                                blit_caption(&win->caption);
269
//                                blit_panel(&win->panel);
270
//                            }
271
                        }
4438 Serge 272
                        ent_down = 1;
273
                    };
274
                    break;
275
276
 
277
                    ent_down = 0;
278
                    break;
279
            };
280
281
 
282
            if(main_render)
283
            {
284
                render_draw_client(main_render);
285
            };
286
            break;
287
288
 
289
290
 
291
            {
292
                win->panel.play_btn->img_default = res_pause_btn;
293
                win->panel.play_btn->img_hilite  = res_pause_btn;
294
                win->panel.play_btn->img_pressed = res_pause_btn_pressed;
295
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
296
                player_state = PLAY;
297
                sound_state  = PAUSE_2_PLAY;
298
299
 
300
            else if(player_state == PLAY)
301
            {
302
                win->panel.play_btn->img_default = res_play_btn;
303
                win->panel.play_btn->img_hilite  = res_play_btn;
304
                win->panel.play_btn->img_pressed = res_play_btn_pressed;
305
                send_message(&win->panel.play_btn->ctrl, MSG_PAINT, 0, 0);
306
                player_state = PAUSE;
307
                sound_state  = PLAY_2_PAUSE;
308
            }
309
            break;
310
311
 
312
            switch((short)arg1)
313
            {
314
                case ID_PLAY:
315
                    if(player_state == PAUSE)
316
                    {
317
                        win->panel.play_btn->img_default  = res_pause_btn;
318
                        win->panel.play_btn->img_hilite   = res_pause_btn;
319
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
320
                        player_state = PLAY;
321
                        sound_state = PAUSE_2_PLAY;
322
                    }
323
                    else if(player_state == PLAY)
324
                    {
325
                        win->panel.play_btn->img_default = res_play_btn;
326
                        win->panel.play_btn->img_hilite  = res_play_btn;
327
                        win->panel.play_btn->img_pressed  = res_play_btn_pressed;
328
                        player_state = PAUSE;
329
                        sound_state  = PLAY_2_PAUSE;
330
                    }
331
                    else if(player_state == STOP)
332
                    {
333
                        win->panel.play_btn->img_default  = res_pause_btn;
334
                        win->panel.play_btn->img_hilite   = res_pause_btn;
335
                        win->panel.play_btn->img_pressed = res_pause_btn_pressed;
336
                        rewind_pos = 0;
337
                        send_message(&win->panel.ctrl, MSG_PAINT, 0, 0);
338
                        player_state = PLAY;
339
                        decoder_state = PREPARE;
340
                    }
341
                    break;
342
343
 
344
                    player_stop();
345
                    break;
346
347
 
348
                    if(player_state != REWIND)
349
                    {
350
                        progress_t *prg = (progress_t*)arg2;
351
352
 
353
354
 
355
                        player_state  = REWIND;
356
                        decoder_state = REWIND;
357
                        sound_state   = PLAY_2_STOP;
358
                        if(rewind_pos < prg->current)
359
                        {
360
                            prg->current  = rewind_pos;
361
                            rewind_pos = -rewind_pos;
362
                        }
363
                        else
364
                            prg->current  = rewind_pos;
365
366
 
367
                        win->panel.play_btn->img_hilite   = res_pause_btn;
368
                        win->panel.play_btn->img_pressed  = res_pause_btn_pressed;
369
                        send_message(&prg->ctrl, MSG_PAINT, 0, 0);
370
                    };
371
                    break;
372
373
 
374
                {
375
                    slider_t *sld = (slider_t*)arg2;
376
                    int      peak;
377
                    int      level;
378
379
 
380
//                    level = (log2(peak+16384)*10000.0)/15 - 10000;
381
                    level =  peak;
382
383
 
384
                    set_audio_volume(level, level);
385
                    send_message(&sld->ctrl, MSG_PAINT, 0, 0);
386
                    win->panel.lvl->vol = level;
387
                }
388
389
 
390
                    break;
391
            }
392
            break;
393
394
 
395
            def_window_proc(ctrl,msg,arg1,arg2);
396
    };
397
    return 0;
398
};
399
400
 
401
402
 
403
extern queue_t  q_audio;
404
405
 
406
{
407
    progress_t  *prg = main_render->win->panel.prg;
408
    level_t     *lvl = main_render->win->panel.lvl;
409
410
 
411
    double      fdelay;           /*    milliseconds    */
412
413
 
414
415
 
416
    {
417
        render->win->win_command = WIN_CLOSED;
418
        return;
419
    }
420
    else if((player_state == PAUSE) || (player_state == REWIND))
421
    {
422
        delay(1);
423
        return;
424
    }
425
    else if (decoder_state == STOP && frames_count  == 0 &&
426
              player_state  != STOP)
427
    {
428
        player_stop();
429
    }
430
    else if(player_state != PLAY)
431
    {
432
        delay(1);
433
        return;
434
    };
435
436
 
437
 
438
    if(frames[vfx].ready == 1 )
439
    {
440
        int sys_time;
441
442
 
443
        fdelay = (frames[vfx].pts - ctime);
444
445
 
446
//                frames[vfx].pts, ctime, fdelay);
447
448
 
449
        {
450
            delay((int)fdelay/10);
451
        //    return;
452
        };
453
#if 0
454
        ctime = get_master_clock();
455
        fdelay = (frames[vfx].pts - ctime);
456
457
 
458
//        {
459
//            yield();
460
//            ctime = get_master_clock();
461
//            fdelay = (frames[vfx].pts - ctime);
462
//        }
463
464
 
465
466
 
467
//            printf("systime %d pts %f time %f delay %f\n",
468
//                    sys_time*10, frames[vfx].pts, ctime, fdelay);
469
470
 
471
                frames[vfx].pts, ctime, fdelay);
472
        printf("video cache %d audio cache %d\n", q_video.size/1024, q_audio.size/1024);
473
#endif
474
475
 
476
        if(main_render->win->win_state != FULLSCREEN)
477
        {
478
            prg->current = frames[vfx].pts*1000;
479
//        printf("current %f\n", prg->current);
480
            lvl->current = vfx & 1 ? sound_level_1 : sound_level_0;
481
482
 
483
484
 
485
                send_message(&lvl->ctrl, MSG_PAINT, 0, 0);
486
        }
487
488
 
489
        frames[vfx].ready = 0;
490
        vfx++;
491
        vfx&= 3;
492
    }
493
    else delay(1);
494
495
 
496
497
 
498
    {
499
        ctime = get_master_clock();
500
        fdelay = (frames[vfx].pts - ctime);
501
502
 
503
//                    frames[vfx].pts, ctime, fdelay);
504
505
 
506
        {
507
            int  next_vfx;
508
            fdelay = 0;
509
            next_vfx = (vfx+1) & 3;
510
            if( frames[next_vfx].ready == 1 )
511
            {
512
                if(frames[next_vfx].pts <= ctime)
513
                {
514
                    frames[vfx].ready = 0;                  // skip this frame
515
                    vfx++;
516
                    vfx&= 3;
517
                }
518
                else
519
                {
520
                    if( (frames[next_vfx].pts - ctime) <
521
                        ( ctime - frames[vfx].pts) )
522
                    {
523
                        frames[vfx].ready = 0;                  // skip this frame
524
                        vfx++;
525
                        vfx&= 3;
526
                        fdelay = (frames[next_vfx].pts - ctime);
527
                    }
528
                }
529
            };
530
        };
531
532
 
533
        {
534
           int val = fdelay;
535
           printf("pts %f time %f delay %d\n",
536
                   frames[vfx].pts, ctime, val);
537
           delay(val/10);
538
        };
539
540
 
541
        fdelay = (frames[vfx].pts - ctime);
542
543
 
544
                frames[vfx].pts, ctime, fdelay);
545
546
 
547
        main_render->win->panel.prg->current = frames[vfx].pts;
548
//        send_message(&render->win->panel.prg->ctrl, MSG_PAINT, 0, 0);
549
        frames[vfx].ready = 0;
550
        vfx++;
551
        vfx&= 3;
552
    }
553
    else yield();
554
#endif
555
556
 
557
558
 
559
 
560
561
 
562
{
563
    AVCodecContext *ctx = param;
564
    window_t  *MainWindow;
565
566
 
5372 serge 567
 
568
569
 
4438 Serge 570
571
 
572
                               10,10,width,height+CAPTION_HEIGHT+PANEL_HEIGHT,MainWindowProc);
573
574
 
575
//    printf("MainWindow %x\n", MainWindow);
576
577
 
578
579
 
580
581
 
582
    if( main_render == NULL)
583
    {
584
        printf("Cannot create render\n\r");
585
        return 0;
586
    };
587
588
 
589
    player_state = PLAY;
590
591
 
592
593
 
594
    fini_winlib();
595
596
 
597
    return 0;
598
};
599
600
 
601
 
602
void draw_sw_picture(render_t *render, AVPicture *picture);
603
604
 
605
{
606
    render_t *render;
607
608
 
609
    uint32_t s, sw, sh;
610
    uint8_t  state;
611
612
 
613
614
 
615
    memset(render, 0, sizeof(render_t));
616
617
 
618
619
 
620
    render->ctx_height = ctx->height;
621
    render->ctx_format = ctx->pix_fmt;
622
623
 
624
    render->caps = pxInit(1);
5372 serge 625
    mutex_unlock(&driver_lock);
4438 Serge 626
627
 
628
    bottom = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
629
630
 
5372 serge 631
                    right, bottom);
632
4438 Serge 633
 
634
635
 
636
    draw_h = right*render->ctx_height/render->ctx_width;
637
638
 
639
    {
640
        draw_w = right;
641
        draw_h = right*render->ctx_height/render->ctx_width;
642
    };
643
644
 
645
    {
646
        draw_h = bottom;
647
        draw_w = bottom*render->ctx_width/render->ctx_height;
648
    };
649
650
 
651
    render->win_height = win->h-CAPTION_HEIGHT-PANEL_HEIGHT;
652
653
 
654
655
 
5372 serge 656
4438 Serge 657
 
658
    {
659
        render->bitmap[0] = pxCreateBitmap(draw_w, draw_h);
5372 serge 660
        if(render->bitmap[0] == NULL)
661
        {
4438 Serge 662
            free(render);
663
            return NULL;
664
        }
665
        render->draw = draw_sw_picture;
666
    }
667
    else
668
    {
669
        int width, height;
5372 serge 670
        int i;
4438 Serge 671
672
 
673
        {
674
            width  = render->ctx_width;
675
            height = render->ctx_height;
676
        }
677
        else
678
        {
679
            width  = draw_w;
680
            height = draw_h;;
681
        }
682
683
 
684
        {
685
            render->bitmap[i] = pxCreateBitmap(width, height);
5372 serge 686
            if( render->bitmap[i] == NULL )
687
            {
4438 Serge 688
                player_state = CLOSED;
689
                free(render);
690
                return NULL;
691
            };
692
        }
693
694
 
695
        render->target = 0;
696
        render->draw   = draw_hw_picture;
697
    };
698
699
 
700
           render->caps & HW_TEX_BLIT ? "hw_tex_blit":
701
           render->caps & HW_BIT_BLIT ? "hw_bit_blit":"software",
702
           render->ctx_width, render->ctx_height,
703
           draw_w, draw_h);
704
705
 
706
};
707
708
 
709
{
710
711
 
5372 serge 712
4438 Serge 713
 
714
        pxDestroyBitmap(render->bitmap[1]);
5372 serge 715
4438 Serge 716
 
5372 serge 717
};
4438 Serge 718
719
 
720
{
721
    int i;
722
723
 
724
    render->rcvideo.l = 0;
725
    render->rcvideo.t = 0;
726
    render->rcvideo.r = width;
727
    render->rcvideo.b = height;
728
729
 
730
731
 
732
    {
733
        int yoffs;
734
        yoffs = (render->win_height-height)/2;
735
        if(yoffs)
736
        {
737
            render->rctop.t = 0;
738
            render->rctop.b = yoffs;
739
            render->rcvideo.t  = yoffs;
740
            render->layout |= HAS_TOP;
741
        }
742
743
 
744
        if(yoffs)
745
        {
746
            render->rcbottom.t = render->rcvideo.t+render->rcvideo.b;
747
            render->rcbottom.b = yoffs;
748
            render->layout |= HAS_BOTTOM;
749
        }
750
    }
751
752
 
753
    {
754
        int xoffs;
755
        xoffs = (render->win_width-width)/2;
756
        if(xoffs)
757
        {
758
            render->rcleft.r  = xoffs;
759
            render->rcvideo.l = xoffs;
760
            render->layout |= HAS_LEFT;
761
        }
762
        xoffs = render->win_width-(render->rcvideo.l+render->rcvideo.r);
763
        if(xoffs)
764
        {
765
            render->rcright.l = render->rcvideo.l+render->rcvideo.r;
766
            render->rcright.r = xoffs;
767
            render->layout |= HAS_RIGHT;
768
        }
769
    };
770
};
771
772
 
773
{
774
    uint32_t right, bottom, new_w, new_h;
775
    uint32_t s, sw, sh;
776
    uint8_t  state;
777
778
 
779
    bottom = win->h;
780
781
 
782
        bottom-= CAPTION_HEIGHT+PANEL_HEIGHT;
783
784
 
785
 //                   right, bottom);
786
787
 
788
789
 
790
        return;
791
792
 
793
        return;
794
795
 
796
        bottom == render->win_height)
797
        return;
798
799
 
800
801
 
802
    new_h = right*render->ctx_height/render->ctx_width;
803
804
 
805
    {
806
        new_w = right;
807
        new_h = right*render->ctx_height/render->ctx_width;
808
    };
809
    if(new_h > bottom)
810
    {
811
        new_h = bottom;
812
        new_w = bottom*render->ctx_width/render->ctx_height;
813
    };
814
815
 
816
    render->win_height = bottom;
817
    render_set_size(render, new_w, new_h);
818
819
 
820
    {
5372 serge 821
        if(render->win->win_state == FULLSCREEN)
822
            pxResizeClient(render->rcvideo.l, render->rcvideo.t, new_w, new_h);
823
        else
824
            pxResizeClient(render->rcvideo.l, render->rcvideo.t+CAPTION_HEIGHT, new_w, new_h);
825
826
 
4438 Serge 827
    };
5372 serge 828
4438 Serge 829
 
5372 serge 830
4438 Serge 831
 
832
        pxResizeBitmap(render->bitmap[1], new_w, new_h);
5372 serge 833
834
 
4438 Serge 835
};
836
837
 
838
{
839
    int       dst_width;
5372 serge 840
    int       dst_height;
841
    bitmap_t *bitmap;
842
    uint8_t  *bitmap_data;
843
    uint32_t  bitmap_pitch;
844
    uint8_t  *data[4];
845
    int       linesize[4];
846
4438 Serge 847
 
848
       render->win->win_state == ROLLED)
849
        return;
850
851
 
852
    {
853
        dst_width  = render->ctx_width;
854
        dst_height = render->ctx_height;
855
    }
856
    else
857
    {
858
        dst_width  = render->rcvideo.r;
859
        dst_height = render->rcvideo.b;
860
    };
861
862
 
863
              render->ctx_width, render->ctx_height, render->ctx_format,
864
              dst_width, dst_height, PIX_FMT_BGRA,
865
              SWS_FAST_BILINEAR, NULL, NULL, NULL);
866
    if(cvt_ctx == NULL)
867
    {
868
        printf("Cannot initialize the conversion context!\n");
869
        return ;
870
    };
871
872
 
5372 serge 873
4438 Serge 874
 
5372 serge 875
    if( bitmap_data == NULL)
876
    {
4438 Serge 877
        printf("Cannot lock bitmap!\n");
878
        return ;
879
    }
880
881
 
882
    data[0] = bitmap_data;
5372 serge 883
    data[1] = bitmap_data+1;
884
    data[2] = bitmap_data+2;
885
    data[3] = bitmap_data+3;
886
4438 Serge 887
 
5372 serge 888
    linesize[1] = bitmap_pitch;
889
    linesize[2] = bitmap_pitch;
890
    linesize[3] = bitmap_pitch;
891
4438 Serge 892
 
893
              picture->linesize, 0, render->ctx_height, data, linesize);
894
//    printf("sws_scale\n");
895
896
 
897
 
898
    {
899
900
 
901
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
5372 serge 902
                 render->rcvideo.r, render->rcvideo.b,0,0);
903
        else
4438 Serge 904
            pxBlitBitmap(bitmap, render->rcvideo.l,
5372 serge 905
                    CAPTION_HEIGHT+render->rcvideo.t,
4438 Serge 906
                    render->rcvideo.r, render->rcvideo.b,0,0);
5372 serge 907
    }
4438 Serge 908
    else
909
    {
910
        if(render->win->win_state == FULLSCREEN)
911
            pxBlitBitmap(bitmap,render->rcvideo.l,render->rcvideo.t,
5372 serge 912
                    render->rcvideo.r, render->rcvideo.b, 0,0);
4438 Serge 913
        else
914
            pxBlitBitmap(bitmap, render->rcvideo.l,
5372 serge 915
                    CAPTION_HEIGHT+render->rcvideo.t,
4438 Serge 916
                    render->rcvideo.r, render->rcvideo.b, 0, 0);
917
    };
918
919
 
920
    render->target++;
921
    render->target&= 1;
922
}
923
924
 
925
{
926
    uint8_t  *bitmap_data;
5372 serge 927
    uint32_t  bitmap_pitch;
928
    uint8_t     *data[4];
4438 Serge 929
    int      linesize[4];
930
931
 
932
       render->win->win_state == ROLLED)
933
        return;
934
935
 
936
              render->ctx_width, render->ctx_height,
937
              render->ctx_format,
938
              render->rcvideo.r, render->rcvideo.b,
939
              PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL);
940
    if(cvt_ctx == NULL)
941
    {
942
        printf("Cannot initialize the conversion context!\n");
943
        return ;
944
    }
945
946
 
5372 serge 947
4438 Serge 948
 
5372 serge 949
    data[1] = bitmap_data+1;
950
    data[2] = bitmap_data+2;
951
    data[3] = bitmap_data+3;
952
4438 Serge 953
 
5372 serge 954
    linesize[1] = bitmap_pitch;
955
    linesize[2] = bitmap_pitch;
956
    linesize[3] = bitmap_pitch;
957
4438 Serge 958
 
959
              picture->linesize, 0, render->ctx_height, data, linesize);
960
961
 
962
        pxBlitBitmap(render->bitmap[0],render->rcvideo.l,render->rcvideo.t,
5372 serge 963
                 render->rcvideo.r, render->rcvideo.b,0,0);
964
    else
4438 Serge 965
        pxBlitBitmap(render->bitmap[0], render->rcvideo.l,
5372 serge 966
                 CAPTION_HEIGHT+render->rcvideo.t,
4438 Serge 967
                 render->rcvideo.r, render->rcvideo.b,0,0);
5372 serge 968
4438 Serge 969
 
5372 serge 970
}
4438 Serge 971
972
 
973
{
974
    int y;
975
976
 
977
       render->win_state == ROLLED )
978
        return;
979
    if(render->win_state == FULLSCREEN)
980
        y = 0;
981
    else
982
        y = CAPTION_HEIGHT;
983
984
 
985
    {
986
         if(frames[vfx].ready == 1 )
987
            main_render->draw(main_render, &frames[vfx].picture);
988
         else
989
            draw_bar(0, y, render->win_width,
990
                 render->rcvideo.b, 0);
991
    }
992
    else if( player_state == STOP )
993
    {
994
        draw_bar(0,y, render->win_width,
995
                 render->rcvideo.b, 0);
996
    };
997
998
 
999
        draw_bar(0, y, render->win_width,
1000
                 render->rctop.b, 0);
1001
    if(render->layout & HAS_LEFT)
1002
        draw_bar(0, render->rcvideo.t+y, render->rcleft.r,
1003
                 render->rcvideo.b, 0);
1004
    if(render->layout & HAS_RIGHT)
1005
        draw_bar(render->rcright.l, render->rcvideo.t+y,
1006
                 render->rcright.r, render->rcvideo.b, 0);
1007
    if(render->layout & HAS_BOTTOM)
1008
        draw_bar(0, render->rcbottom.t+y,
1009
                 render->win_width, render->rcbottom.b, 0);
1010
}
1011
>
1012