1 /**
2     \author mean fixounet@free.fr 2010
3 */
4 
5 /***************************************************************************
6  *                                                                         *
7  *   This program is free software; you can redistribute it and/or modify  *
8  *   it under the terms of the GNU General Public License as published by  *
9  *   the Free Software Foundation; either version 2 of the License, or     *
10  *   (at your option) any later version.                                   *
11  *                                                                         *
12  ***************************************************************************/
13 #include "config.h"
14 #include "ADM_default.h"
15 #include "DIA_coreToolkit.h"
16 #include "GUI_render.h"
17 #include "GUI_renderInternal.h"
18 #include "GUI_accelRender.h"
19 #include "GUI_simpleRender.h"
20 #include "QPainter"
21 #include "QPaintEngine"
22 
23 extern void *MUI_getDrawWidget(void);
24 
25 
spawnSimpleRender()26 VideoRenderBase *spawnSimpleRender()
27 {
28     return new simpleRender();
29 }
30 
31 
32 /**
33     \fn simpleRender
34 */
simpleRender()35 simpleRender::simpleRender()
36 {
37     ADM_info("creating simple render.\n");
38     videoBuffer=NULL;
39     paintEngineType=-1;
40     videoWidget=NULL;
41 }
42 /**
43     \fn simpleRender
44 */
~simpleRender()45 simpleRender::~simpleRender()
46 {
47     admScopedMutex autoLock(&lock);
48     videoWidget->setDrawer(NULL);
49     videoWidget->useExternalRedraw(true);
50     ADM_info("Destroying simple render.\n");
51     if(videoBuffer) delete [] videoBuffer;
52     videoBuffer=NULL;
53 }
54 
55 /**
56     \fn stop
57 */
stop(void)58 bool simpleRender::stop(void)
59 {
60     ADM_info("stopping simple render.\n");
61     return true;
62 }
63 /**
64     \fn refresh
65 */
refresh(void)66 bool simpleRender::refresh(void)
67 {
68      videoWidget->repaint();
69      return true;
70 }
71 /**
72     \fn displayImage
73 */
displayImage(ADMImage * pic)74 bool simpleRender::displayImage(ADMImage *pic)
75 {
76     scaler->convertImage(pic,videoBuffer);
77     lock.lock();
78     myImage=QImage(videoBuffer,displayWidth,displayHeight,QImage::Format_RGB32).copy(0,0,displayWidth,displayHeight);
79     lock.unlock();
80     refresh();
81     return true;
82 }
83 #if !(ADM_UI_TYPE_BUILD == ADM_UI_QT4)
84     #define IVERT ADM_COLOR_BGR32A
85 #else
86     #define IVERT ADM_COLOR_RGB32A
87 #endif
88 /**
89     \fn cleanup
90 */
cleanup(void)91 bool simpleRender::cleanup(void)
92 {
93     if(videoBuffer) delete [] videoBuffer;
94     videoBuffer=NULL;
95     if(scaler) delete scaler;
96     scaler=NULL;
97     return true;
98 }
99 /**
100     \fn allocateStuff
101 */
allocateStuff(void)102 bool simpleRender::allocateStuff(void)
103 {
104         cleanup();
105         scaler=new ADMColorScalerFull(ADM_CS_BICUBIC,imageWidth,imageHeight,displayWidth,displayHeight,
106             ADM_COLOR_YV12,
107             IVERT
108         );
109         videoBuffer=new uint8_t[displayWidth*displayHeight*4];
110         return true;
111 }
112 
113 /**
114     \fn changeZoom
115 */
changeZoom(float newZoom)116 bool simpleRender::changeZoom(float newZoom)
117 {
118         ADM_info("changing zoom, simple render.\n");
119         calcDisplayFromZoom(newZoom);
120         currentZoom=newZoom;
121         allocateStuff();
122         return true;
123 }
124 /**
125     \fn changeZoom
126 */
init(GUI_WindowInfo * window,uint32_t w,uint32_t h,float zoom)127 bool simpleRender::init( GUI_WindowInfo *window, uint32_t w, uint32_t h, float zoom)
128 {
129     info=*window;
130     baseInit(w,h,zoom);
131     ADM_info("init, simple render. w=%d, h=%d,zoom=%.4f\n",(int)w,(int)h,zoom);
132     allocateStuff();
133     videoWidget=(ADM_Qvideo *)info.widget;
134     videoWidget->useExternalRedraw(false);
135     videoWidget->setDrawer(this);
136     return true;
137 }
138 
139 /**
140  * \brief This is the callback called when the display wants to redraw
141  * @param widget
142  * @param ev
143  * @return
144  */
draw(QWidget * widget,QPaintEvent * ev)145 bool simpleRender::draw(QWidget *widget, QPaintEvent *ev)
146 {
147     admScopedMutex autoLock(&lock);
148     QPainter painter(widget);
149     if (painter.isActive())
150     {
151         const QRect rec=ev->rect();
152         int x=rec.x();
153         int y=rec.y();
154         int w=rec.width();
155         int h=rec.height();
156         painter.drawImage(x,y,myImage,x,y,w,h);
157     }else
158     {
159         ADM_warning("Painter inactive!\n");
160     }
161     return true;
162 }
163