]> git.vomp.tv Git - vompclient.git/blob - surface.h
Fix an OO issue that only a later compiler picked up
[vompclient.git] / surface.h
1 /*
2     Copyright 2004-2005 Chris Tallon
3     Portions copyright 2004 Jon Gettler
4
5     This file is part of VOMP.
6
7     VOMP 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     VOMP is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with VOMP; if not, write to the Free Software
19     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 */
21
22 #ifndef SURFACE_H
23 #define SURFACE_H
24
25 #include <stdio.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <sys/mman.h>
29 #include <sys/ioctl.h>
30
31 // Structures for surface management
32
33 typedef struct
34 {
35   unsigned long num;
36   unsigned long unknown[4];
37   unsigned long width;
38   unsigned long height;
39   char unknown2;
40 } stbgfx_display_t;
41
42 typedef struct
43 {
44   unsigned long unknown;
45   unsigned long win_unknown;
46   unsigned long addr;
47   unsigned long size;
48   unsigned long unknown2;
49   unsigned long width;
50   unsigned long height;
51   unsigned long unknown3;
52   unsigned long unknown4;
53   unsigned long width2;
54   unsigned long unknown5;
55   unsigned long unknown6;
56 } stbgfx_map_item_t;
57
58 typedef struct {
59   stbgfx_map_item_t map[3];
60   unsigned long other[2];
61 } stbgfx_map_t;
62
63 typedef struct
64 {
65   unsigned long handle; /* surface handle */
66   unsigned long width;
67   unsigned long height;
68   unsigned long flags;
69   long unknown;   //unsigned long
70   unsigned long depth;  /* number of subplanes */
71 } stbgfx_sfc_t;
72
73 typedef struct
74 {
75   stbgfx_display_t display;
76   stbgfx_map_t map;
77   stbgfx_sfc_t sfc;
78   unsigned char *base[3];
79 } osd_surface_t;
80
81
82 // Structures for surface drawing
83
84 typedef struct
85 {
86   unsigned long handle;
87   unsigned long x;
88   unsigned long y;
89   unsigned long width;
90   unsigned long height;
91   unsigned long colour;
92 } osd_fillblt_t;
93
94 typedef struct {
95   unsigned long dst_handle;
96   unsigned long dst_x;
97   unsigned long dst_y;
98   unsigned long width;
99   unsigned long height;
100   unsigned long src_handle;
101   unsigned long src_x;
102   unsigned long src_y;
103   unsigned long u1;
104   unsigned long u2;
105   unsigned char u3;
106 } osd_bitblt_t;
107
108 // Font stuff
109
110 typedef struct bogl_font {
111   char *name;     /* Font name. */
112   int height;     /* Height in pixels. */
113   unsigned long *content;   /* 32-bit right-padded bitmap array. */
114   short *offset;      /* 256 offsets into content. */
115   unsigned char *width;   /* 256 character widths. */
116 } osd_font_t;
117
118 extern osd_font_t font_CaslonRoman_1_25;
119 extern osd_font_t font_helvB24;
120 extern osd_font_t font_helvB18;
121
122 // Surface ioctls
123
124 #define GFX_FB_SFC_ALLOC  _IOWR(0xfb,1,int*)
125 #define GFX_FB_SFC_FREE   _IOWR(0xfb,2,int)
126 #define GFX_FB_MAP    _IOWR(0xfb,3,int*)
127 #define GFX_FB_SFC_UNMAP  _IOWR(0xfb,4,int)
128 #define GFX_FB_SET_PAL_1  _IOWR(0xfb,5,int*)
129 #define GFX_FB_SET_PAL_2  _IOW(0xfb,6,int*)
130 #define GFX_FB_OSD_SURFACE  _IO(0xfb,7)
131 #define GFX_FB_SFC_SET_SHARE  _IOW(0xfb,8,int)
132 #define GFX_FB_OSD_CUR_SETATTR  _IOW(0xfb,9,int*)
133 #define GFX_FB_ATTACH   _IOW(0xfb,11,int)
134 #define GFX_FB_SFC_DETACH _IOW(0xfb,12,int*)
135 #define GFX_FB_MOVE_DISPLAY _IOWR(0xfb,13,int)
136 #define GFX_FB_SET_DISPLAY  _IOW(0xfb,14,int)
137 #define GFX_FB_OSD_CUR_MOVE_1 _IOW(0xfb,15,int*)
138 #define GFX_FB_OSD_CUR_MOVE_2 _IOW(0xfb,16,int)
139 #define GFX_FB_SET_OSD    _IOW(0xfb,18,int)
140 #define GFX_FB_SET_DISP_CTRL  _IOW(0xfb,21,int*)
141 #define GFX_FB_GET_DISP_CTRL  _IOWR(0xfb,22,int*)
142 #define GFX_FB_SET_VIS_DEV_CTL  _IOWR(0xfb,23,int*)
143 #define GFX_FB_GET_VIS_DEV_CTL  _IOWR(0xfb,24,int*)
144 #define GFX_FB_OSD_BITBLT _IOW(0xfb,51,osd_bitblt_t*)
145 #define GFX_FB_OSD_FILLBLT  _IOW(0xfb,53,osd_fillblt_t*)
146 #define GFX_FB_OSD_ADVFILLBLT _IOW(0xfb,54,osd_afillblt_t*)
147 #define GFX_FB_OSD_BLEND  _IOW(0xfb,55,int*)
148 #define GFX_FB_OSD_ADVBLEND _IOW(0xfb,56,int*)
149 #define GFX_FB_OSD_RESIZE _IOW(0xfb,58,int*)
150 #define GFX_FB_ENGINE_WAIT  _IOW(0xfb,60,int)
151 #define GFX_FB_RESET_ENGINE _IO(0xfb,61)
152 #define GFX_FB_SET_ENGINE_MODE  _IOW(0xfb,62,int)
153 #define GFX_FB_GET_ENGINE_MODE  _IO(0xfb,63)
154 #define GFX_FB_GET_SFC_INFO _IO(0xfb,64,int*)
155 #define GFX_FB_OSD_SFC_CLIP _IOW(0xfb,65,osd_clip_rec_t*)
156 #define GFX_FB_OSD_COLOURKEY  _IOW(0xfb,67,int*)
157 #define GFX_FB_GET_SFC_PSEUDO _IOWR(0xfb,68,int*)
158
159 extern "C"
160 {
161   #include <jpeglib.h>
162 }
163
164 #include "log.h"
165
166 class Surface
167 {
168   public:
169     Surface(int fd, int id);
170     ~Surface();
171
172     static Surface* getObject(int id);
173
174     int create(int height, int width);
175     void display();
176     unsigned long getSurfaceHandle();
177
178     int fillblt(int x, int y, int width, int height, unsigned int c);
179     void drawPixel(int x, int y, unsigned int c);
180     void drawHorzLine(int x1, int x2, int y, unsigned int c);
181     void drawVertLine(int x, int y1, int y2, unsigned int c);
182     int updateToScreen(int x, int y, int width, int height);
183     int drawText(char* text, int x, int y, int r, int g, int b);
184     int drawTextRJ(char* text, int x, int y, int r, int g, int b);
185     int getCharWidth(char c);
186     int getFontHeight();
187     void readPixel(int x, int y, unsigned char* r, unsigned char* g, unsigned char* b);
188     void yuv2rgb(int y, int u, int v, unsigned char* pr, unsigned char* pg, unsigned char* pb);
189     void screenShot(char* fileName);
190
191     static void initConversionTables();
192
193     static void disableBuffer();
194     static void bufferToScreen();
195     static int blt(int fd, unsigned long shandle, int sx, int sy, int width, int height, unsigned long dhandle, int dx, int dy);
196
197     const static int SCREEN = 1;
198     const static int BUFFER = 2;
199
200     // Implicit inlines
201     void c2rgba(unsigned long c, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a)
202     {
203       *a = (c & 0xff000000) >> 24;
204       *r = (c & 0x00ff0000) >> 16;
205       *g = (c & 0x0000ff00) >> 8;
206       *b = (c & 0x000000ff);
207     }
208
209     unsigned long rgba(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
210     {
211       return (a<<24) | (r<<16) | (g<<8) | b;
212
213     }
214
215   private:
216     static Surface* screen;
217     static Surface* buffer;
218     static int disableDoubleBuffering;
219
220     int fdOsd;
221
222     osd_surface_t surface;
223     osd_font_t* font;
224
225     void rgb2yuv(unsigned char r, unsigned char g, unsigned char b, unsigned char *y, unsigned char *u, unsigned char *v);
226
227     static int conv_YB[256];
228     static int conv_YG[256];
229     static int conv_YR[256];
230     static int conv_UB[256];
231     static int conv_UG[256];
232     static int conv_UR[256];
233     static int conv_VB[256];
234     static int conv_VG[256];
235     static int conv_VR[256];
236
237     static int conv_BY[256];
238     static int conv_GY[256];
239     static int conv_RY[256];
240     static int conv_BU[256];
241     static int conv_GU[256];
242     static int conv_RU[256];
243     static int conv_BV[256];
244     static int conv_GV[256];
245     static int conv_RV[256];
246
247 };
248
249 #endif