summaryrefslogblamecommitdiff
path: root/Source/Kernel/Devices/Display/VESADisplay.class.h
blob: c3bae826ae7bf5e16e2a3ab53ee95d9ab15a98c9 (plain) (tree)













































                                                                

                                   

                          




                              





                                                                    
 


                                                





                                                
                         



                                                      

                                                                   
                                                                             
                                                                                           


      
#ifndef DEF_VESADISPLAY_CLASS_H
#define DEF_VESADISPLAY_CLASS_H

#include <Devices/Display/GraphicDisplay.proto.h>
#include <TaskManager/V86/V86.ns.h>

struct vbe_controller_info_t {
	char signature[4];             // == "VESA"
	s16int version;                 // == 0x0300 for VBE 3.0
	//s16int oemString[2];            // isa vbeFarPtr
	FARPTR oemString;
	u8int capabilities[4];
	FARPTR videomodes;
	s16int totalMemory;             // as # of 64KB blocks
} __attribute__((packed));

struct vbe_mode_info_t {
	u16int attributes;
	u8int winA, winB;
	u16int granularity;
	u16int winsize;
	u16int segmentA, segmentB;
	FARPTR realFctPtr;
	u16int pitch; // bytes per scanline

	u16int Xres, Yres;
	u8int Wchar, Ychar, planes, bpp, banks;
	u8int memory_model, bank_size, image_pages;
	u8int reserved0;

	u8int red_mask, red_position;
	u8int green_mask, green_position;
	u8int blue_mask, blue_position;
	u8int rsv_mask, rsv_position;
	u8int directcolor_attributes;

	u32int physbase;  // your LFB address ;)
	u32int reserved1;
	u16int reserved2;
} __attribute__ ((packed));

class VESADisplay : public GraphicDisplay {
	private:
	vbe_controller_info_t getCtrlrInfo();
	vbe_mode_info_t getModeInfo(u16int mode);

	vbe_mode_info_t m_currMode;

	int b, m_pixWidth;

	struct {
		u32int pixels;
		u16int color;
	} m_8bitPalette[256];

	u8int *m_fb;

	u8int* memPos(u16int x, u16int y) {
		u32int addr = y * m_currMode.pitch + x * m_pixWidth;
		return ((u8int*)m_fb) + addr;
	}

	u8int get8Bit(u32int color);
	void setPalette(u8int id, u32int color);

	public:
	String getClass();
	String getName();

	void getModes(Vector<Disp::mode_t> &to);
	bool setMode(Disp::mode_t& mode);
	void unsetMode();

	void clear();
	void putPix(u16int x, u16int y, u32int color);
	u32int getPix(u16int x, u16int y);

	//Advanced graphical functions, recoded for being optimized
	virtual void drawChar(u16int line, u16int col, WChar c, u8int color);
	bool textScroll(u16int line, u16int col, u16int height, u16int width, u8int color);
};

#endif