1 //
2 //   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
3 //   Free Software Foundation, Inc
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 //
19 
20 #ifndef __RAWFB_DEVICE_H__
21 #define __RAWFB_DEVICE_H__ 1
22 
23 #ifdef HAVE_CONFIG_H
24 #include "gnashconfig.h"
25 #endif
26 
27 #include <memory>
28 #include <fcntl.h>
29 #include <sys/ioctl.h>
30 #include <sys/mman.h>
31 #include <linux/fb.h>
32 #include <linux/kd.h>
33 #include <linux/vt.h>
34 
35 #include "GnashDevice.h"
36 
37 namespace gnash {
38 
39 namespace renderer {
40 
41 namespace rawfb {
42 
43 #define CMAP_SIZE (256*2)
44 
45 class DSOEXPORT RawFBDevice : public GnashDevice
46 {
47   public:
48 
49     RawFBDevice();
50     RawFBDevice(int);
51     RawFBDevice(int argc, char *argv[]);
52 
53     // virtual classes should have virtual destructors
54     virtual ~RawFBDevice();
55 
getType()56     dtype_t getType() { return RAWFB; };
57 
58     // Initialize RAWFB Device layer
59     bool initDevice(int argc, char *argv[]);
60 
61     // Initialize RAWFB Window layer
62     bool attachWindow(GnashDevice::native_window_t window);
63 
64     // Utility methods not in the base class
65 
66     // Return a string with the error code as text, instead of a numeric value
67     const char *getErrorString(int error);
68 
getDepth()69     int getDepth() { return _varinfo.bits_per_pixel; };
70 
71     // Accessors for the settings needed by higher level code.
72     // Surface accessors
getWidth()73     size_t getWidth() { return _varinfo.xres; };
getHeight()74     size_t getHeight() { return _varinfo.yres; };
75 
supportsRenderer(GnashDevice::rtype_t)76     bool supportsRenderer(GnashDevice::rtype_t /* rtype */) { return false; }
77 
isBufferDestroyed()78     bool isBufferDestroyed() { return false; }
79     // bool isBufferDestroyed(IRAWFBSurface surface) {
80     //     return false;
81     // }
getID()82     int getID() { return 0; };
83 
84     // Get the size of the pixels
getRedSize()85     int getRedSize()   { return _varinfo.red.length; };
getGreenSize()86     int getGreenSize() { return _varinfo.green.length; };
getBlueSize()87     int getBlueSize()  { return _varinfo.blue.length; };
88 
89 #ifdef RENDERER_AGG
90     /// These methods are only needed by AGG, which uses these
91     /// to calculate the pixel format.
getRedOffset()92     int getRedOffset()   { return _varinfo.red.offset; };
getGreenOffset()93     int getGreenOffset() { return _varinfo.green.offset; };
getBlueOffset()94     int getBlueOffset()  { return _varinfo.blue.offset; };
95 #endif
96 
97     // Using RAWFB always means a native renderer
isNativeRender()98     bool isNativeRender() { return true; }
99 
getDrawableWindow()100     native_window_t getDrawableWindow() { return 0; };
101 
102     //
103     // Testing Support
104     //
105 
106     // Create an RAWFB window to render in. This is only used by testing
107     void createWindow(const char *name, int x, int y, int width, int height);
108 
109     // Get the memory from the real framebuffer
getFBMemory()110     std::uint8_t *getFBMemory() { return _fbmem; };
111 
112     // // Get the memory from an offscreen buffer to support Double Buffering
getOffscreenBuffer()113     std::uint8_t *getOffscreenBuffer() { return _offscreen_buffer.get(); };
114 
getStride()115     size_t getStride() { return _fixinfo.line_length; };
getFBMemSize()116     size_t getFBMemSize() { return _fixinfo.smem_len; };
getHandle()117     int getHandle() { return _fd; };
118 
119     /// Start an RAWFB event loop. This is only used by testing. Note that
120     /// calling this function blocks until the specified number of events
121     /// have been handled. The first 5 are used up by creating the window.
122     ///
123     /// @param passes the number of events to process before returning.
124     /// @return nothing
125     void eventLoop(size_t passes);
126 
127     /// For 8 bit (palette / LUT) modes, sets a grayscale palette.
128     /// This GUI currently does not support palette modes.
129     bool setGrayscaleLUT8();
130 
isSingleBuffered()131     bool isSingleBuffered() {
132 #ifdef ENABLE_DOUBLE_BUFFERING
133         return false;
134 #else
135         return true;
136 #endif
137     }
138 
139     bool swapBuffers();
140 
141     void dump();
142 protected:
143     /// Clear the framebuffer memory
144     void clear();
145 
146     int                                 _fd;
147     std::string                         _filespec;
148     struct fb_fix_screeninfo            _fixinfo;
149     struct fb_var_screeninfo            _varinfo;
150     std::uint8_t                     *_fbmem;
151 
152     std::unique_ptr<std::uint8_t>     _offscreen_buffer;
153     struct fb_cmap                      _cmap;       // the colormap
154 };
155 
156 #ifdef ENABLE_FAKE_FRAMEBUFFER
157 /// Simulate the ioctls used to get information from the framebuffer driver.
158 ///
159 /// Since this is an emulator, we have to set these fields to a reasonable default.
160 int fakefb_ioctl(int fd, int request, void *data);
161 #endif
162 
163 typedef void (*init_func)();
164 typedef void (*reshape_func)(int, int);
165 typedef void (*draw_func)();
166 typedef int  (*key_func)(unsigned key);
167 
168 } // namespace rawFB
169 } // namespace renderer
170 } // namespace gnash
171 
172 #endif  // end of __RAWFB_DEVICE_H__
173 
174 // local Variables:
175 // mode: C++
176 // indent-tabs-mode: nil
177 // End:
178