// S3Graphics.h: interface for the CS3Graphics class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_S3GRAPHICS_H__17417CB7_9D36_41EF_8FF5_FAF1C201C207__INCLUDED_) #define AFX_S3GRAPHICS_H__17417CB7_9D36_41EF_8FF5_FAF1C201C207__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "surface.h" /* This is for the hardware (card)-adjusted mode timing. */ struct ModeTiming { int pixelClock; /* Pixel clock in kHz. */ int HDisplay; /* Horizontal Timing. */ int HSyncStart; int HSyncEnd; int HTotal; int VDisplay; /* Vertical Timing. */ int VSyncStart; int VSyncEnd; int VTotal; int flags; /* The following field are optionally filled in according to card */ /* specific parameters. */ int programmedClock; /* Actual clock to be programmed. */ int selectedClockNo; /* Index number of fixed clock used. */ int CrtcHDisplay; /* Actual programmed horizontal CRTC timing. */ int CrtcHSyncStart; int CrtcHSyncEnd; int CrtcHTotal; int CrtcVDisplay; /* Actual programmed vertical CRTC timing. */ int CrtcVSyncStart; int CrtcVSyncEnd; int CrtcVTotal; }; /* Flags in ModeTiming. */ #define PHSYNC 0x1 /* Positive hsync polarity. */ #define NHSYNC 0x2 /* Negative hsync polarity. */ #define PVSYNC 0x4 /* Positive vsync polarity. */ #define NVSYNC 0x8 /* Negative vsync polarity. */ #define INTERLACED 0x10 /* Mode has interlaced timing. */ #define DOUBLESCAN 0x20 /* Mode uses VGA doublescan (see note). */ #define HADJUSTED 0x40 /* Horizontal CRTC timing adjusted. */ #define VADJUSTED 0x80 /* Vertical CRTC timing adjusted. */ #define USEPROGRCLOCK 0x100 /* A programmable clock is used. */ /* Mode info. */ struct ModeInfo { /* Basic properties. */ short width; /* Width of the screen in pixels. */ short height; /* Height of the screen in pixels. */ char bytesPerPixel; /* Number of bytes per pixel. */ char bitsPerPixel; /* Number of bits per pixel. */ char colorBits; /* Number of significant bits in pixel. */ char __padding1; /* Truecolor pixel specification. */ char redWeight; /* Number of significant red bits. */ char greenWeight; /* Number of significant green bits. */ char blueWeight; /* Number of significant blue bits. */ char __padding2; char redOffset; /* Offset in bits of red value into pixel. */ char blueOffset; /* Offset of green value. */ char greenOffset; /* Offset of blue value. */ char __padding3; unsigned redMask; /* Pixel mask of read value. */ unsigned blueMask; /* Pixel mask of green value. */ unsigned greenMask; /* Pixel mask of blue value. */ /* Structural properties of the mode. */ int lineWidth; /* Offset in bytes between scanlines. */ short realWidth; /* Real on-screen resolution. */ short realHeight; /* Real on-screen resolution. */ int flags; }; /* Cards specifications. */ struct CardSpecs { int videoMemory; /* Video memory in kilobytes. */ int maxPixelClock4bpp; /* Maximum pixel clocks in kHz for each depth. */ int maxPixelClock8bpp; int maxPixelClock16bpp; int maxPixelClock24bpp; int maxPixelClock32bpp; int flags; /* Flags (e.g. programmable clocks). */ int nClocks; /* Number of fixed clocks. */ int *clocks; /* Pointer to array of fixed clock values. */ int maxHorizontalCrtc; /* * The following function maps from a pixel clock and depth to * the raw clock frequency required. */ int (*mapClock) (int bpp, int pixelclock); /* * The following function maps from a requested clock value * to the closest clock that the programmable clock device * can produce. */ int (*matchProgrammableClock) (int desiredclock); /* * The following function maps from a pixel clock, depth and * horizontal CRTC timing parameter to the horizontal timing * that has to be programmed. */ int (*mapHorizontalCrtc) (int bpp, int pixelclock, int htiming); }; struct MonitorModeTiming { int pixelClock; /* Pixel clock in kHz. */ int HDisplay; /* Horizontal Timing. */ int HSyncStart; int HSyncEnd; int HTotal; int VDisplay; /* Vertical Timing. */ int VSyncStart; int VSyncEnd; int VTotal; int flags; MonitorModeTiming *next; }; class CS3Graphics : public Surface { public: CS3Graphics(); virtual ~CS3Graphics(); IMPLEMENT_IUNKNOWN(CS3Graphics); STDMETHOD(SetPalette)(int nIndex, int red, int green, int blue); STDMETHOD(Lock)(surface_t* pDesc); STDMETHOD(Unlock)(); STDMETHOD(GetSurfaceDesc)(surface_t* pDesc); STDMETHOD_(pixel_t, ColourMatch)(colour_t clr); STDMETHOD(SetPixel)(int x, int y, pixel_t pix); STDMETHOD_(pixel_t, GetPixel)(int x, int y); STDMETHOD(Blt)(ISurface* pSrc, int x, int y, int nWidth, int nHeight, int nSrcX, int nSrcY, pixel_t pixTrans); STDMETHOD(FillRect)(const rectangle_t* rect, pixel_t pix); STDMETHOD(AttachProcess)(); protected: int s3_flags, s3_chiptype, s3_memory; CardSpecs* cardspecs; int s3Mclk; void HwLock(); void HwLockEnh(); void HwUnlock(); void HwUnlockEnh(); int Init(int force, int par1, int par2); bool ModeAvailable(int mode); int AdjustLineWidth(int oldwidth); void InitializeMode(unsigned char *moderegs, ModeTiming * modetiming, ModeInfo * modeinfo); int SaveRegisters(unsigned char regs[]); void SetRegisters(const unsigned char regs[], int mode); int SetMode(int mode, int prv_mode); }; #endif // !defined(AFX_S3GRAPHICS_H__17417CB7_9D36_41EF_8FF5_FAF1C201C207__INCLUDED_)