3247aa6a13bc9bcfd943e85b3667085036ad68fb
[vuplus_dvbapp] / lib / gdi / gfbdc.cpp
1 #include <lib/gdi/gfbdc.h>
2
3 #include <lib/base/init.h>
4 #include <lib/base/init_num.h>
5 #include <lib/base/econfig.h>
6
7 gFBDC *gFBDC::instance;
8
9 gFBDC::gFBDC()
10 {
11         instance=this;
12         fb=new fbClass;
13
14         if (!fb->Available())
15                 eFatal("no framebuffer available");
16
17         fb->SetMode(720, 576, 8);
18
19         for (int y=0; y<576; y++)                                                                                                                                                // make whole screen transparent
20                 memset(fb->lfb+y*fb->Stride(), 0x00, fb->Stride());
21
22         surface.type = 0;
23         surface.x = 720;
24         surface.y = 576;
25         surface.bpp = 8;
26         surface.bypp = 1;
27         surface.stride = fb->Stride();
28         surface.data = fb->lfb;
29         surface.clut.colors=256;
30         surface.clut.data=new gRGB[surface.clut.colors];
31         
32         m_pixmap = new gPixmap(&surface);
33         
34         memset(surface.clut.data, 0, sizeof(*surface.clut.data)*surface.clut.colors);
35         reloadSettings();
36 }
37
38 gFBDC::~gFBDC()
39 {
40         delete fb;
41         instance=0;
42 }
43
44 void gFBDC::calcRamp()
45 {
46 #if 0
47         float fgamma=gamma ? gamma : 1;
48         fgamma/=10.0;
49         fgamma=1/log(fgamma);
50         for (int i=0; i<256; i++)
51         {
52                 float raw=i/255.0; // IIH, float.
53                 float corr=pow(raw, fgamma) * 256.0;
54
55                 int d=corr * (float)(256-brightness) / 256 + brightness;
56                 if (d < 0)
57                         d=0;
58                 if (d > 255)
59                         d=255;
60                 ramp[i]=d;
61                 
62                 rampalpha[i]=i*alpha/256;
63         }
64 #endif
65         for (int i=0; i<256; i++)
66         {
67                 int d;
68                 d=i;
69                 d=(d-128)*(gamma+64)/(128+64)+128;
70                 d+=brightness-128; // brightness correction
71                 if (d<0)
72                         d=0;
73                 if (d>255)
74                         d=255;
75                 ramp[i]=d;
76
77                 rampalpha[i]=i*alpha/256;
78         }
79
80         rampalpha[255]=255; // transparent BLEIBT bitte so.
81 }
82
83 void gFBDC::setPalette()
84 {
85         if (!surface.clut.data)
86                 return;
87         
88         for (int i=0; i<256; ++i)
89         {
90                 fb->CMAP()->red[i]=ramp[surface.clut.data[i].r]<<8;
91                 fb->CMAP()->green[i]=ramp[surface.clut.data[i].g]<<8;
92                 fb->CMAP()->blue[i]=ramp[surface.clut.data[i].b]<<8;
93                 fb->CMAP()->transp[i]=rampalpha[surface.clut.data[i].a]<<8;
94                 if (!fb->CMAP()->red[i])
95                         fb->CMAP()->red[i]=0x100;
96         }
97         fb->PutCMAP();
98 }
99
100 void gFBDC::exec(gOpcode *o)
101 {
102         switch (o->opcode)
103         {
104         case gOpcode::setPalette:
105         {
106                 gDC::exec(o);
107                 setPalette();
108                 break;
109         }
110         default:
111                 gDC::exec(o);
112                 break;
113         }
114 }
115
116 gFBDC *gFBDC::getInstance()
117 {
118         return instance;
119 }
120
121 void gFBDC::setAlpha(int a)
122 {
123         alpha=a;
124
125         calcRamp();
126         setPalette();
127 }
128
129 void gFBDC::setBrightness(int b)
130 {
131         brightness=b;
132
133         calcRamp();
134         setPalette();
135 }
136
137 void gFBDC::setGamma(int g)
138 {
139         gamma=g;
140
141         calcRamp();
142         setPalette();
143 }
144
145 void gFBDC::saveSettings()
146 {
147         eConfig::getInstance()->setKey("/ezap/osd/alpha", alpha);
148         eConfig::getInstance()->setKey("/ezap/osd/gamma", gamma);
149         eConfig::getInstance()->setKey("/ezap/osd/brightness", brightness);
150 }
151
152 void gFBDC::reloadSettings()
153 {
154         if (eConfig::getInstance()->getKey("/ezap/osd/alpha", alpha))
155                 alpha=255;
156         if (eConfig::getInstance()->getKey("/ezap/osd/gamma", gamma))
157                 gamma=128;
158         if (eConfig::getInstance()->getKey("/ezap/osd/brightness", brightness))
159                 brightness=128;
160
161         calcRamp();
162         setPalette();
163 }
164
165 eAutoInitP0<gFBDC> init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC");