//========= Copyright Valve Corporation, All rights reserved. ============// // // The copyright to the contents herein is the property of Valve, L.L.C. // The contents may be used and/or copied only with the written permission of // Valve, L.L.C., or in accordance with the terms and conditions stipulated in // the agreement/contract under which the contents have been supplied. // // Purpose: // // $NoKeywords: $ //============================================================================= #ifndef ISURFACE_V30_H #define ISURFACE_V30_H #ifdef _WIN32 #pragma once #endif #include // CreateHTML, PaintHTML #include #include "IVguiMatInfo.h" #include "interface.h" #include "Vector2D.h" // must be before the namespace line #include "appframework/IAppSystem.h" #include "bitmap/ImageFormat.h" #ifdef CreateFont #undef CreateFont #endif #ifdef PlaySound #undef PlaySound #endif class Color; namespace vgui { class Image; class Point; // handles typedef unsigned long HCursor; typedef unsigned long HTexture; typedef unsigned long HFont; } // namespace vgui namespace SurfaceV30 { // SRC only defines struct Vertex_t { Vertex_t() {} Vertex_t(const Vector2D &pos, const Vector2D &coord = Vector2D(0, 0)) { m_Position = pos; m_TexCoord = coord; } void Init(const Vector2D &pos, const Vector2D &coord = Vector2D(0, 0)) { m_Position = pos; m_TexCoord = coord; } Vector2D m_Position; Vector2D m_TexCoord; }; enum FontDrawType_t { // Use the "additive" value from the scheme file FONT_DRAW_DEFAULT = 0, // Overrides FONT_DRAW_NONADDITIVE, FONT_DRAW_ADDITIVE, FONT_DRAW_TYPE_COUNT = 2, }; // Refactor these two struct CharRenderInfo { // In: FontDrawType_t drawType; wchar_t ch; // Out bool valid; // In/Out (true by default) bool shouldclip; // Text pos int x, y; // Top left and bottom right Vertex_t verts[2]; int textureId; int abcA; int abcB; int abcC; int fontTall; vgui::HFont currentFont; }; struct IntRect { int x0; int y0; int x1; int y1; }; //----------------------------------------------------------------------------- // Purpose: Wraps contextless windows system functions //----------------------------------------------------------------------------- class ISurface : public IAppSystem { public: // call to Shutdown surface; surface can no longer be used after this is // called virtual void Shutdown() = 0; // frame virtual void RunFrame() = 0; // hierarchy root virtual vgui::VPANEL GetEmbeddedPanel() = 0; virtual void SetEmbeddedPanel(vgui::VPANEL pPanel) = 0; // drawing context virtual void PushMakeCurrent(vgui::VPANEL panel, bool useInsets) = 0; virtual void PopMakeCurrent(vgui::VPANEL panel) = 0; // rendering functions virtual void DrawSetColor(int r, int g, int b, int a) = 0; virtual void DrawSetColor(Color col) = 0; virtual void DrawFilledRect(int x0, int y0, int x1, int y1) = 0; virtual void DrawFilledRectArray(IntRect *pRects, int numRects) = 0; virtual void DrawOutlinedRect(int x0, int y0, int x1, int y1) = 0; virtual void DrawLine(int x0, int y0, int x1, int y1) = 0; virtual void DrawPolyLine(int *px, int *py, int numPoints) = 0; virtual void DrawSetTextFont(vgui::HFont font) = 0; virtual void DrawSetTextColor(int r, int g, int b, int a) = 0; virtual void DrawSetTextColor(Color col) = 0; virtual void DrawSetTextPos(int x, int y) = 0; virtual void DrawGetTextPos(int &x, int &y) = 0; virtual void DrawPrintText(const wchar_t *text, int textLen, FontDrawType_t drawType = FONT_DRAW_DEFAULT) = 0; virtual void DrawUnicodeChar( wchar_t wch, FontDrawType_t drawType = FONT_DRAW_DEFAULT) = 0; virtual void DrawFlushText() = 0; // flushes any buffered text (for // rendering optimizations) virtual vgui::IHTML *CreateHTMLWindow(vgui::IHTMLEvents *events, vgui::VPANEL context) = 0; virtual void PaintHTMLWindow(vgui::IHTML *htmlwin) = 0; virtual void DeleteHTMLWindow(vgui::IHTML *htmlwin) = 0; virtual int DrawGetTextureId(char const *filename) = 0; virtual bool DrawGetTextureFile(int id, char *filename, int maxlen) = 0; virtual void DrawSetTextureFile(int id, const char *filename, int hardwareFilter, bool forceReload) = 0; virtual void DrawSetTextureRGBA(int id, const unsigned char *rgba, int wide, int tall, int hardwareFilter, bool forceReload) = 0; virtual void DrawSetTexture(int id) = 0; virtual void DrawGetTextureSize(int id, int &wide, int &tall) = 0; virtual void DrawTexturedRect(int x0, int y0, int x1, int y1) = 0; virtual bool IsTextureIDValid(int id) = 0; virtual int CreateNewTextureID(bool procedural = false) = 0; #ifdef _XBOX virtual void DestroyTextureID(int id) = 0; virtual bool IsCachedForRendering(int id, bool bSyncWait) = 0; virtual void CopyFrontBufferToBackBuffer() = 0; virtual void UncacheUnusedMaterials() = 0; #endif virtual void GetScreenSize(int &wide, int &tall) = 0; virtual void SetAsTopMost(vgui::VPANEL panel, bool state) = 0; virtual void BringToFront(vgui::VPANEL panel) = 0; virtual void SetForegroundWindow(vgui::VPANEL panel) = 0; virtual void SetPanelVisible(vgui::VPANEL panel, bool state) = 0; virtual void SetMinimized(vgui::VPANEL panel, bool state) = 0; virtual bool IsMinimized(vgui::VPANEL panel) = 0; virtual void FlashWindow(vgui::VPANEL panel, bool state) = 0; virtual void SetTitle(vgui::VPANEL panel, const wchar_t *title) = 0; virtual void SetAsToolBar( vgui::VPANEL panel, bool state) = 0; // removes the window's task bar entry (for context // menu's, etc.) // windows stuff virtual void CreatePopup(vgui::VPANEL panel, bool minimised, bool showTaskbarIcon = true, bool disabled = false, bool mouseInput = true, bool kbInput = true) = 0; virtual void SwapBuffers(vgui::VPANEL panel) = 0; virtual void Invalidate(vgui::VPANEL panel) = 0; virtual void SetCursor(vgui::HCursor cursor) = 0; virtual bool IsCursorVisible() = 0; virtual void ApplyChanges() = 0; virtual bool IsWithin(int x, int y) = 0; virtual bool HasFocus() = 0; // returns true if the surface supports minimize & maximize capabilities enum SurfaceFeature_e { ANTIALIASED_FONTS = 1, DROPSHADOW_FONTS = 2, ESCAPE_KEY = 3, OPENING_NEW_HTML_WINDOWS = 4, FRAME_MINIMIZE_MAXIMIZE = 5, OUTLINE_FONTS = 6, DIRECT_HWND_RENDER = 7, }; virtual bool SupportsFeature(SurfaceFeature_e feature) = 0; // restricts what gets drawn to one panel and it's children // currently only works in the game virtual void RestrictPaintToSinglePanel(vgui::VPANEL panel) = 0; // these two functions obselete, use IInput::SetAppModalSurface() instead virtual void SetModalPanel(vgui::VPANEL) = 0; virtual vgui::VPANEL GetModalPanel() = 0; virtual void UnlockCursor() = 0; virtual void LockCursor() = 0; virtual void SetTranslateExtendedKeys(bool state) = 0; virtual vgui::VPANEL GetTopmostPopup() = 0; // engine-only focus handling (replacing WM_FOCUS windows handling) virtual void SetTopLevelFocus(vgui::VPANEL panel) = 0; // fonts // creates an empty handle to a vgui font. windows fonts can be add to this // via SetFontGlyphSet(). virtual vgui::HFont CreateFont() = 0; // adds to the font enum EFontFlags { FONTFLAG_NONE, FONTFLAG_ITALIC = 0x001, FONTFLAG_UNDERLINE = 0x002, FONTFLAG_STRIKEOUT = 0x004, FONTFLAG_SYMBOL = 0x008, FONTFLAG_ANTIALIAS = 0x010, FONTFLAG_GAUSSIANBLUR = 0x020, FONTFLAG_ROTARY = 0x040, FONTFLAG_DROPSHADOW = 0x080, FONTFLAG_ADDITIVE = 0x100, FONTFLAG_OUTLINE = 0x200, FONTFLAG_CUSTOM = 0x400, // custom generated font - never fall back to // asian compatibility mode FONTFLAG_BITMAP = 0x800, // compiled bitmap font - no fallbacks }; virtual bool SetFontGlyphSet(vgui::HFont font, const char *windowsFontName, int tall, int weight, int blur, int scanlines, int flags) = 0; // adds a custom font file (only supports true type font files (.ttf) for // now) virtual bool AddCustomFontFile(const char *fontName, const char *fontFileName) = 0; // returns the details about the font virtual int GetFontTall(vgui::HFont font) = 0; virtual int GetFontAscent(vgui::HFont font, wchar_t wch) = 0; virtual bool IsFontAdditive(vgui::HFont font) = 0; virtual void GetCharABCwide(vgui::HFont font, int ch, int &a, int &b, int &c) = 0; virtual int GetCharacterWidth(vgui::HFont font, int ch) = 0; virtual void GetTextSize(vgui::HFont font, const wchar_t *text, int &wide, int &tall) = 0; // notify icons?!? virtual vgui::VPANEL GetNotifyPanel() = 0; virtual void SetNotifyIcon(vgui::VPANEL context, vgui::HTexture icon, vgui::VPANEL panelToReceiveMessages, const char *text) = 0; // plays a sound virtual void PlaySound(const char *fileName) = 0; //!! these functions should not be accessed directly, but only through other //!vgui items ! need to move these to seperate interface virtual int GetPopupCount() = 0; virtual vgui::VPANEL GetPopup(int index) = 0; virtual bool ShouldPaintChildPanel(vgui::VPANEL childPanel) = 0; virtual bool RecreateContext(vgui::VPANEL panel) = 0; virtual void AddPanel(vgui::VPANEL panel) = 0; virtual void ReleasePanel(vgui::VPANEL panel) = 0; virtual void MovePopupToFront(vgui::VPANEL panel) = 0; virtual void MovePopupToBack(vgui::VPANEL panel) = 0; virtual void SolveTraverse(vgui::VPANEL panel, bool forceApplySchemeSettings = false) = 0; virtual void PaintTraverse(vgui::VPANEL panel) = 0; virtual void EnableMouseCapture(vgui::VPANEL panel, bool state) = 0; // returns the size of the workspace virtual void GetWorkspaceBounds(int &x, int &y, int &wide, int &tall) = 0; // gets the absolute coordinates of the screen (in windows space) virtual void GetAbsoluteWindowBounds(int &x, int &y, int &wide, int &tall) = 0; // gets the base resolution used in proportional mode virtual void GetProportionalBase(int &width, int &height) = 0; virtual void CalculateMouseVisible() = 0; virtual bool NeedKBInput() = 0; virtual bool HasCursorPosFunctions() = 0; virtual void SurfaceGetCursorPos(int &x, int &y) = 0; virtual void SurfaceSetCursorPos(int x, int y) = 0; // SRC only functions!!! virtual void DrawTexturedLine(const Vertex_t &a, const Vertex_t &b) = 0; virtual void DrawOutlinedCircle(int x, int y, int radius, int segments) = 0; virtual void DrawTexturedPolyLine( const Vertex_t *p, int n) = 0; // (Note: this connects the first and last points). virtual void DrawTexturedSubRect(int x0, int y0, int x1, int y1, float texs0, float text0, float texs1, float text1) = 0; virtual void DrawTexturedPolygon(int n, Vertex_t *pVertices) = 0; virtual const wchar_t *GetTitle(vgui::VPANEL panel) = 0; virtual bool IsCursorLocked(void) const = 0; virtual void SetWorkspaceInsets(int left, int top, int right, int bottom) = 0; // Lower level char drawing code, call DrawGet then pass in info to // DrawRender virtual bool DrawGetUnicodeCharRenderInfo(wchar_t ch, CharRenderInfo &info) = 0; virtual void DrawRenderCharFromInfo(const CharRenderInfo &info) = 0; // global alpha setting functions // affect all subsequent draw calls - shouldn't normally be used directly, // only in Panel::PaintTraverse() virtual void DrawSetAlphaMultiplier(float alpha /* [0..1] */) = 0; virtual float DrawGetAlphaMultiplier() = 0; // web browser virtual void SetAllowHTMLJavaScript(bool state) = 0; // video mode changing virtual void OnScreenSizeChanged(int nOldWidth, int nOldHeight) = 0; #if !defined(_XBOX) virtual vgui::HCursor CreateCursorFromFile(char const *curOrAniFile, char const *pPathID = 0) = 0; #endif // create IVguiMatInfo object ( IMaterial wrapper in VguiMatSurface, NULL in // CWin32Surface ) virtual IVguiMatInfo *DrawGetTextureMatInfoFactory(int id) = 0; virtual void PaintTraverseEx(vgui::VPANEL panel, bool paintPopups = false) = 0; virtual float GetZPos() const = 0; // From the Xbox virtual void SetPanelForInput(vgui::VPANEL vpanel) = 0; virtual void DrawFilledRectFade(int x0, int y0, int x1, int y1, unsigned int alpha0, unsigned int alpha1, bool bHorizontal) = 0; virtual void DrawSetTextureRGBAEx(int id, const unsigned char *rgba, int wide, int tall, ImageFormat imageFormat) = 0; virtual void DrawSetTextScale(float sx, float sy) = 0; virtual bool SetBitmapFontGlyphSet(vgui::HFont font, const char *windowsFontName, float scalex, float scaley, int flags) = 0; // adds a bitmap font file virtual bool AddBitmapFontFile(const char *fontFileName) = 0; // sets a symbol for the bitmap font virtual void SetBitmapFontName(const char *pName, const char *pFontFilename) = 0; // gets the bitmap font filename virtual const char *GetBitmapFontName(const char *pName) = 0; virtual vgui::IImage *GetIconImageForFullPath(char const *pFullPath) = 0; virtual void DrawUnicodeString( const wchar_t *pwString, FontDrawType_t drawType = FONT_DRAW_DEFAULT) = 0; }; } // namespace SurfaceV30 //----------------------------------------------------------------------------- // FIXME: This works around using scoped interfaces w/ EXPOSE_SINGLE_INTERFACE //----------------------------------------------------------------------------- class ISurfaceV30 : public SurfaceV30::ISurface { public: }; #define VGUI_SURFACE_INTERFACE_VERSION_30 "VGUI_Surface030" #endif // ISURFACE_V30_H