00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "mmsgui/mmsfbmanager.h"
00034 #include "mmsgui/fb/mmsfbsurfacemanager.h"
00035 #include <string.h>
00036 #include <stdlib.h>
00037
00038 MMS_CREATEERROR(MMSFBManagerError);
00039
00040
00041 MMSFBManager mmsfbmanager;
00042
00043
00044 void mmsfbmanager_onexit(int num, void *arg) {
00045 MMSFBManager *o=(MMSFBManager*)arg;
00046 o->release();
00047 }
00048
00049 MMSFBManager::MMSFBManager() {
00050
00051 this->graphicslayer = NULL;
00052 this->videolayer = NULL;
00053 this->graphicslayerid = -1;
00054 this->videolayerid = -1;
00055 this->layercount = 0;
00056 }
00057
00058 MMSFBManager::~MMSFBManager() {
00059 }
00060
00061 bool MMSFBManager::init(int argc, char **argv, string appl_name, string appl_icon_name,
00062 bool virtual_console, bool flip_flush) {
00063 int myargc=argc;
00064 char *myargv[255];
00065 int i;
00066
00067
00068 this->virtual_console = virtual_console;
00069
00070
00071 this->layercount = 1;
00072
00073 for(i=0;i<argc;i++)
00074 myargv[i]=strdup(argv[i]);
00075
00076 DEBUGMSG("MMSGUI", "init mmsfb");
00077 bool ea = config.getExtendedAccel();
00078 #ifdef __HAVE_DIRECTFB__
00079 if (config.getAllocMethod() == "DFB") {
00080
00081 ea = false;
00082 }
00083 #endif
00084
00085 if (this->config.getRotateScreen() == 180) {
00086
00087 MMSFBBase_rotate180 = true;
00088 }
00089
00090
00091 MMSConfigDataLayer videolayer_conf = this->config.getVideoLayer();
00092 MMSConfigDataLayer graphicslayer_conf = this->config.getGraphicsLayer();
00093
00094 #ifdef __HAVE_DIRECTFB__
00095 if(videolayer_conf.outputtype == MMSFB_OT_X11) {
00096 myargv[myargc++] = strdup("--dfb:system=x11");
00097 char mode[24];
00098 snprintf(mode, 24, "--dfb:mode=%dx%d", graphicslayer_conf.rect.w, graphicslayer_conf.rect.h);
00099 myargv[myargc++] = strdup(mode);
00100 }
00101 #endif
00102
00103
00104 if (!mmsfb->init(myargc, myargv, config.getBackend(), graphicslayer_conf.rect,
00105 ea, config.getFullScreen(), config.getPointer(), appl_name, appl_icon_name, config.getHideApplication())) {
00106 DEBUGMSG("MMSGUI", "init mmsfb failed!");
00107 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00108 }
00109
00110 DEBUGMSG("MMSGUI", "get video layer");
00111 if (!mmsfb->getLayer(videolayer_conf.id, &this->videolayer, videolayer_conf.outputtype, this->virtual_console))
00112 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00113
00114 if (videolayer_conf.id == graphicslayer_conf.id) {
00115 DEBUGMSG("MMSGUI", "video layer and graphics layer are the same");
00116 this->graphicslayer = this->videolayer;
00117
00118 if (!flip_flush)
00119 this->graphicslayer->setFlipFlags(MMSFB_FLIP_ONSYNC);
00120 else
00121 this->graphicslayer->setFlipFlags(MMSFB_FLIP_ONSYNC | MMSFB_FLIP_FLUSH);
00122 }
00123 else {
00124 this->layercount++;
00125 DEBUGMSG("MMSGUI", "get graphics layer");
00126 if (!mmsfb->getLayer(graphicslayer_conf.id, &this->graphicslayer, graphicslayer_conf.outputtype, false))
00127 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00128
00129 if (!flip_flush)
00130 this->graphicslayer->setFlipFlags(MMSFB_FLIP_ONSYNC);
00131 else
00132 this->graphicslayer->setFlipFlags(MMSFB_FLIP_ONSYNC | MMSFB_FLIP_FLUSH);
00133
00134 if (videolayer_conf.outputtype == MMSFB_OT_MATROXFB)
00135 this->videolayer->setFlipFlags(MMSFB_FLIP_WAITFORSYNC);
00136 else
00137 this->videolayer->setFlipFlags(MMSFB_FLIP_ONSYNC);
00138 }
00139
00140 if (!this->graphicslayer->getID(&this->graphicslayerid))
00141 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00142
00143 if (!this->videolayer->getID(&this->videolayerid))
00144 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00145
00146
00147 on_exit(mmsfbmanager_onexit, this);
00148
00149 return true;
00150 }
00151
00152 void MMSFBManager::release() {
00153 DEBUGMSG("MMSGUI", "release mmsfb");
00154 if (this->videolayer)
00155 delete this->videolayer;
00156 mmsfb->release();
00157 }
00158
00159 void MMSFBManager::applySettings() {
00160 DEBUGMSG("MMSGUI", "configure graphics layer");
00161
00162
00163 MMSConfigDataLayer videolayer_conf = this->config.getVideoLayer();
00164 MMSConfigDataLayer graphicslayer_conf = this->config.getGraphicsLayer();
00165
00166
00167 MMSFBSurfacePixelFormat window_pixelformat = config.getGraphicsWindowPixelformat();
00168 switch (window_pixelformat) {
00169 case MMSFB_PF_ARGB:
00170 case MMSFB_PF_AiRGB:
00171 case MMSFB_PF_AYUV:
00172 case MMSFB_PF_ARGB4444:
00173 case MMSFB_PF_RGB16:
00174 break;
00175 default:
00176
00177 window_pixelformat = graphicslayer_conf.pixelformat;
00178 if (!isAlphaPixelFormat(window_pixelformat)) {
00179
00180
00181 if (!isRGBPixelFormat(window_pixelformat))
00182
00183 window_pixelformat = MMSFB_PF_AYUV;
00184 else
00185
00186 window_pixelformat = MMSFB_PF_ARGB;
00187 }
00188 else
00189 if (isIndexedPixelFormat(window_pixelformat)) {
00190
00191
00192 window_pixelformat = MMSFB_PF_ARGB;
00193 }
00194 break;
00195 }
00196
00197
00198 MMSFBSurfacePixelFormat surface_pixelformat = config.getGraphicsSurfacePixelformat();
00199 switch (surface_pixelformat) {
00200 case MMSFB_PF_ARGB:
00201 case MMSFB_PF_AiRGB:
00202 case MMSFB_PF_AYUV:
00203 case MMSFB_PF_ARGB4444:
00204 case MMSFB_PF_RGB16:
00205 break;
00206 default:
00207
00208 surface_pixelformat = graphicslayer_conf.pixelformat;
00209 if (!isAlphaPixelFormat(surface_pixelformat)) {
00210
00211
00212 if (!isRGBPixelFormat(surface_pixelformat))
00213
00214 surface_pixelformat = MMSFB_PF_AYUV;
00215 else
00216
00217 surface_pixelformat = MMSFB_PF_ARGB;
00218 }
00219 else
00220 if (isIndexedPixelFormat(surface_pixelformat)) {
00221
00222
00223 surface_pixelformat = MMSFB_PF_ARGB;
00224 }
00225 break;
00226 }
00227
00228
00229 DEBUGMSG("MMSGUI", "set exclusive access");
00230 if (!this->graphicslayer->setExclusiveAccess())
00231 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00232
00233 DEBUGMSG("MMSGUI", "set configuration");
00234 if(!this->graphicslayer->setConfiguration(graphicslayer_conf.rect.w, graphicslayer_conf.rect.h,
00235 graphicslayer_conf.pixelformat,
00236 graphicslayer_conf.buffermode,
00237 graphicslayer_conf.options,
00238 window_pixelformat,
00239 surface_pixelformat))
00240 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00241
00242 if (this->videolayerid != this->graphicslayerid) {
00243 #ifdef __HAVE_DIRECTFB__
00244 if (config.getBackend() == MMSFB_BE_X11) {
00245
00246 usleep(300000);
00247 }
00248 #endif
00249
00250
00251 DEBUGMSG("MMSGUI", "configure video layer");
00252
00253 DEBUGMSG("MMSGUI", "set exclusive access");
00254
00255 if (!this->videolayer->setExclusiveAccess())
00256 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00257
00258 DEBUGMSG("MMSGUI", "set configuration");
00259
00260 if (!this->videolayer->setConfiguration(videolayer_conf.rect.w, videolayer_conf.rect.h,
00261 videolayer_conf.pixelformat,
00262 videolayer_conf.buffermode,
00263 videolayer_conf.options))
00264 throw MMSFBManagerError(0, MMSFB_LastErrorString);
00265
00266
00267
00268 this->graphicslayer->setOpacity(0);
00269
00270 if (graphicslayer_conf.outputtype == MMSFB_OT_VIAFB) {
00271
00272 DEBUGMSG("MMSGUI", "set the video layer behind the graphics layer");
00273 this->videolayer->setLevel(-1);
00274 }
00275 else
00276 if (graphicslayer_conf.outputtype == MMSFB_OT_XSHM) {
00277 DEBUGMSG("MMSGUI", "set the video layer behind the graphics layer");
00278 this->graphicslayer->setLevel(+1);
00279 }
00280 }
00281
00282
00283 string buffermode = graphicslayer_conf.buffermode;
00284 MMSFBSurface *gls;
00285 if (this->graphicslayer->getSurface(&gls, this->virtual_console)) {
00286
00287 gls->setExtendedAcceleration(config.getExtendedAccel());
00288
00289
00290 if (mmsfb->getBackend() == MMSFB_BE_DFB) {
00291 #ifdef __HAVE_DIRECTFB__
00292 string am = config.getAllocMethod();
00293 if (am == "MALLOC") {
00294 if (!config.getExtendedAccel())
00295 gls->setAllocMethod(MMSFBSurfaceAllocMethod_dfb);
00296 }
00297 else
00298 gls->setAllocMethod(MMSFBSurfaceAllocMethod_dfb);
00299 #endif
00300 }
00301 else
00302 if (graphicslayer_conf.outputtype == MMSFB_OT_OGL) {
00303 gls->setAllocMethod(MMSFBSurfaceAllocMethod_ogl);
00304 }
00305 }
00306
00307
00308 mmsfbwindowmanager->init(this->graphicslayer, (config.getPointer()==MMSFB_PM_TRUE));
00309
00310 DEBUGMSG("MMSGUI", "creating temporary surface: %dx%d, %s", graphicslayer_conf.rect.w, graphicslayer_conf.rect.h, getMMSFBPixelFormatString(surface_pixelformat).c_str());
00311 mmsfbsurfacemanager->createTemporarySurface(graphicslayer_conf.rect.w, graphicslayer_conf.rect.h, surface_pixelformat, (buffermode == MMSFB_BM_BACKSYSTEM));
00312 }
00313
00314
00315 MMSFBLayer *MMSFBManager::getVideoLayer() {
00316 return this->videolayer;
00317 }
00318
00319 MMSFBLayer *MMSFBManager::getGraphicsLayer() {
00320 return this->graphicslayer;
00321 }
00322
00323 int MMSFBManager::getLayerCount() {
00324 return this->layercount;
00325 }
00326