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