1
/***************************************************************************
2
gui_render.cpp - description
4
The final render a frame. The external interface is the same
5
whatever the mean (RGB/YUV/Xv)
8
copyright : (C) 2002 by mean
9
email : fixounet@free.fr
10
***************************************************************************/
12
/***************************************************************************
14
* This program is free software; you can redistribute it and/or modify *
15
* it under the terms of the GNU General Public License as published by *
16
* the Free Software Foundation; either version 2 of the License, or *
17
* (at your option) any later version. *
19
***************************************************************************/
33
#include <ADM_assert.h>
35
#include "prototype.h"
36
//#include "ADM_colorspace/colorspace.h"
37
//#include "ADM_gui/GUI_vars.h"
40
#include "ADM_gui2/GUI_render.h"
42
#include "ADM_gui2/GUI_accelRender.h"
43
#include "ADM_gui2/GUI_xvDraw.h"
44
#include "ADM_gui2/GUI_sdlDraw.h"
46
#include "ADM_toolkit/toolkit_gtk.h"
49
#include "ADM_colorspace/ADM_rgb.h"
50
#include "ADM_libswscale/ADM_mp.h"
54
static uint8_t updateWindowSize(GtkWidget * win, uint32_t w, uint32_t h);
57
uint8_t GUI_InitRender (GtkWidget *g, uint32_t w,uint32_t h);
58
static renderZoom zoom=ZOOM_1_1;
60
static ColYuvRgb rgbConverter(640,480);
62
extern GtkWidget *getDrawWidget( void );
63
extern uint8_t UI_shrink(uint32_t w,uint32_t h);
64
static AccelRender *accel_mode=NULL;
65
//_______________________________________
67
static uint8_t *screenBuffer=NULL;
68
static ADMImage *resized=NULL;
69
static ADM_MplayerResize *resizer=NULL;
70
static uint8_t *lastImage=NULL;
71
static GtkWidget *draw=NULL;
72
static uint32_t renderW=0,renderH=0;
74
//_______________________________________
76
Render init, initialize internals. Constuctor like function
79
uint8_t renderInit( void )
81
draw=getDrawWidget( );
86
Warn the renderer that the display size is changing
89
//----------------------------------------
90
uint8_t renderResize(uint32_t w, uint32_t h,renderZoom newzoom)
96
delete [] screenBuffer;
112
case ZOOM_1_4: mul=1;break;
113
case ZOOM_1_2: mul=2;break;
114
case ZOOM_1_1: mul=4;break;
115
case ZOOM_2: mul=8;break;
116
case ZOOM_4: mul=16;break;
117
default : ADM_assert(0);
126
screenBuffer=new uint8_t[xx*yy*4];
130
resizer=new ADM_MplayerResize(w,h,xx,yy);
131
resized=new ADMImage(xx,yy);
134
updateWindowSize( draw,xx,yy);
140
Update the image and render it
141
The width and hiehgt must NOT have changed
144
//----------------------------------------
145
uint8_t renderUpdateImage(uint8_t *ptr)
148
ADM_assert(screenBuffer);
153
resizer->resize(ptr,resized->data);
154
lastImage=resized->data;
162
GUI_ConvertRGB(ptr,screenBuffer, renderW,renderH);
168
Refresh the image from internal buffer / last image
169
Used for example as call back for X11 events
172
//_______________________________________________
173
uint8_t renderRefresh(void)
177
if(accel_mode) ADM_assert(0);
183
accel_mode->display(lastImage, renderW, renderH);
187
GUI_RGBDisplay(screenBuffer, renderW, renderH,draw);
191
uint8_t renderExpose(void)
195
if(accel_mode) ADM_assert(0);
202
accel_mode->display(lastImage,renderW,renderH);
205
GUI_RGBDisplay(screenBuffer, renderW, renderH,draw);
209
uint8_t renderStartPlaying( void )
212
unsigned int renderI;
213
ADM_RENDER_TYPE render;
214
ADM_assert(!accel_mode);
215
// First check if local
216
// We do it in a very wrong way : If DISPLAY!=:0.0 we assume remote display
217
// in that case we do not even try to use accel
219
// Win32 does not have display
221
displ=getenv("DISPLAY");
226
if(strcmp(displ,":0") && strcmp(displ,":0.0"))
228
printf("Looks like remote display, no Xv :%s\n",displ);
233
if(prefs->get(DEVICE_VIDEODEVICE,&renderI)!=RC_OK)
238
render=(ADM_RENDER_TYPE)renderI;
245
accel_mode=new XvAccelRender();
246
if(!accel_mode->init(draw,renderW,renderH))
250
printf("Xv init failed\n");
254
printf("Xv init ok\n");
260
printf("Trying SDL\n");
261
accel_mode=new sdlAccelRender();
262
if(!accel_mode->init(draw,renderW,renderH))
266
printf("sdl init failed\n");
270
printf("SDL init ok\n");
278
rgbConverter.reset(renderW,renderH);
279
printf("No accel used for rendering\n");
286
uint8_t renderStopPlaying( void )
298
//___________________________________________________________________________
301
uint8_t updateWindowSize(GtkWidget * win, uint32_t w, uint32_t h)
303
ADM_assert(screenBuffer);
307
// Shrink the main window
308
// so that we do not leave blanks everywhere
316
gtk_widget_set_usize(win, w, h);
320
uint8_t GUI_ConvertRGB(uint8_t * in, uint8_t * out, uint32_t w, uint32_t h)
322
//COL_yv12rgb (w, h,in, out);
323
rgbConverter.reset(w,h);
324
rgbConverter.scale(in,out);
328
AccelRender::AccelRender( void)
332
void GUI_RGBDisplay(uint8_t * dis, uint32_t w, uint32_t h, void *widg)
335
widget = (GtkWidget *)widg;
339
gdk_draw_rgb_32_image(widget->window, widget->style->fg_gc[GTK_STATE_NORMAL], 0, // X
344
//GDK_RGB_DITHER_MAX, // dithering
345
(guchar *) dis, // buffer