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