1 #include <lib/gdi/gfbdc.h>
3 #include <lib/base/init.h>
4 #include <lib/base/init_num.h>
6 #include <lib/gdi/accel.h>
10 #include <vuplus_gles.h>
18 eFatal("no framebuffer available");
20 surface.clut.data = 0;
21 setResolution(720, 576); // default res
29 delete[] surface.clut.data;
32 void gFBDC::calcRamp()
35 float fgamma=gamma ? gamma : 1;
38 for (int i=0; i<256; i++)
40 float raw=i/255.0; // IIH, float.
41 float corr=pow(raw, fgamma) * 256.0;
43 int d=corr * (float)(256-brightness) / 256 + brightness;
50 rampalpha[i]=i*alpha/256;
53 for (int i=0; i<256; i++)
57 d=(d-128)*(gamma+64)/(128+64)+128;
58 d+=brightness-128; // brightness correction
65 rampalpha[i]=i*alpha/256;
68 rampalpha[255]=255; // transparent BLEIBT bitte so.
71 void gFBDC::setPalette()
73 if (!surface.clut.data)
76 for (int i=0; i<256; ++i)
78 fb->CMAP()->red[i]=ramp[surface.clut.data[i].r]<<8;
79 fb->CMAP()->green[i]=ramp[surface.clut.data[i].g]<<8;
80 fb->CMAP()->blue[i]=ramp[surface.clut.data[i].b]<<8;
81 fb->CMAP()->transp[i]=rampalpha[surface.clut.data[i].a]<<8;
86 void gFBDC::exec(const gOpcode *o)
90 case gOpcode::setPalette:
98 if (m_enable_double_buffering)
101 surface = surface_back;
104 fb->setOffset(surface_back.offset);
108 case gOpcode::waitVSync:
116 gettimeofday(&now, 0);
118 int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000;
119 eDebug("%d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1));
131 #ifdef USE_LIBVUGLES2
132 if (gles_is_animation())
142 case gOpcode::sendShow:
144 #ifdef USE_LIBVUGLES2
145 gles_set_buffer((unsigned int *)surface.data);
146 gles_set_animation(1, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height());
148 delete o->parm.setShowHideInfo;
151 case gOpcode::sendHide:
153 #ifdef USE_LIBVUGLES2
154 gles_set_buffer((unsigned int *)surface.data);
155 gles_set_animation(0, o->parm.setShowHideInfo->point.x(), o->parm.setShowHideInfo->point.y(), o->parm.setShowHideInfo->size.width(), o->parm.setShowHideInfo->size.height());
157 delete o->parm.setShowHideInfo;
160 #ifdef USE_LIBVUGLES2
161 case gOpcode::sendShowItem:
163 gles_set_buffer((unsigned int *)surface.data);
164 gles_set_animation_listbox(o->parm.setShowItemInfo->dir, o->parm.setShowItemInfo->point.x(), o->parm.setShowItemInfo->point.y(), o->parm.setShowItemInfo->size.width(), o->parm.setShowItemInfo->size.height());
165 delete o->parm.setShowItemInfo;
168 case gOpcode::setFlush:
170 gles_set_flush(o->parm.setFlush->enable);
171 delete o->parm.setFlush;
174 case gOpcode::setView:
176 gles_viewport(o->parm.setViewInfo->size.width(), o->parm.setViewInfo->size.height(), fb->Stride());
177 delete o->parm.setViewInfo;
187 void gFBDC::setAlpha(int a)
195 void gFBDC::setBrightness(int b)
203 void gFBDC::setGamma(int g)
211 void gFBDC::setResolution(int xres, int yres)
213 if ((m_xres == xres) && (m_yres == yres))
216 m_xres = xres; m_yres = yres;
218 fb->SetMode(m_xres, m_yres, 32);
220 for (int y=0; y<m_yres; y++) // make whole screen transparent
221 memset(fb->lfb+y*fb->Stride(), 0x00, fb->Stride());
228 surface.stride = fb->Stride();
229 surface.data = fb->lfb;
232 surface.data_phys = fb->getPhysAddr();
234 int fb_size = surface.stride * surface.y;
236 if (fb->getNumPages() > 1)
238 m_enable_double_buffering = 1;
239 surface_back.type = 0;
240 surface_back.x = m_xres;
241 surface_back.y = m_yres;
242 surface_back.bpp = 32;
243 surface_back.bypp = 4;
244 surface_back.stride = fb->Stride();
245 surface_back.offset = surface.y;
246 surface_back.data = fb->lfb + fb_size;
247 surface_back.data_phys = surface.data_phys + fb_size;
251 m_enable_double_buffering = 0;
253 eDebug("%dkB available for acceleration surfaces.", (fb->Available() - fb_size)/1024);
254 eDebug("resolution: %d x %d x %d (stride: %d)", surface.x, surface.y, surface.bpp, fb->Stride());
256 if (gAccel::getInstance())
257 gAccel::getInstance()->setAccelMemorySpace(fb->lfb + fb_size, surface.data_phys + fb_size, fb->Available() - fb_size);
259 if (!surface.clut.data)
261 surface.clut.colors = 256;
262 surface.clut.data = new gRGB[surface.clut.colors];
263 memset(surface.clut.data, 0, sizeof(*surface.clut.data)*surface.clut.colors);
266 surface_back.clut = surface.clut;
268 m_pixmap = new gPixmap(&surface);
271 void gFBDC::saveSettings()
275 void gFBDC::reloadSettings()
285 eAutoInitPtr<gFBDC> init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC");