winamp/Src/Plugins/Visualization/vis_milk2/dxcontext.h
2024-09-24 14:54:57 +02:00

151 lines
6.4 KiB
C++

/*
LICENSE
-------
Copyright 2005-2013 Nullsoft, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Nullsoft nor the names of its contributors may be used to
endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __NULLSOFT_DX9_PLUGIN_SHELL_DXCONTEXT_H__
#define __NULLSOFT_DX9_PLUGIN_SHELL_DXCONTEXT_H__ 1
#include <windows.h>
#include "shell_defines.h"
#ifdef _DEBUG
#define D3D_DEBUG_INFO // declare this before including d3d9.h
#endif
#include <d3d9.h>
#include <d3dx9.h>
#define SNAP_WINDOWED_MODE_BLOCKSIZE 32 // or use 0 if you don't want snapping
typedef struct
{
eScrMode screenmode; // WINDOWED, FULLSCREEN, or FAKE FULLSCREEN
int nbackbuf;
int allow_page_tearing;
GUID adapter_guid;
char adapter_devicename[256];
D3DDISPLAYMODE display_mode; // ONLY VALID FOR FULLSCREEN MODE.
D3DMULTISAMPLE_TYPE multisamp;
HWND parent_window;
int m_dualhead_horz; // 0 = span both, 1 = left only, 2 = right only
int m_dualhead_vert; // 0 = span both, 1 = top only, 2 = bottom only
int m_skin;
}
DXCONTEXT_PARAMS;
#define MAX_DXC_ADAPTERS 32
class DXContext
{
public:
// PUBLIC FUNCTIONS
DXContext(HWND hWndWinamp,HINSTANCE hInstance,LPCWSTR szClassName,LPCSTR szWindowCaption,WNDPROC pProc,LONG_PTR uWindowLong, int minimize_winamp, wchar_t* szIniFile);
~DXContext();
BOOL StartOrRestartDevice(DXCONTEXT_PARAMS *pParams); // also serves as Init() function
BOOL OnUserResizeWindow(RECT *new_window_rect, RECT *new_client_rect);
inline HWND GetHwnd() { return m_hwnd; };
inline int TempIgnoreDestroyMessages() { return m_ignore_wm_destroy; };
void OnTrulyExiting() { m_truly_exiting = 1; }
void UpdateMonitorWorkRect();
int GetBitDepth() { return m_bpp; };
inline D3DFORMAT GetZFormat() { return m_zFormat; };
char* GetDriver() { return m_szDriver; };
char* GetDesc() { return m_szDesc; };
void SaveWindow();
// PUBLIC DATA - DO NOT WRITE TO THESE FROM OUTSIDE THE CLASS
int m_ready;
HRESULT m_lastErr;
int m_window_width;
int m_window_height;
int m_client_width; //in windowed mode, these are the SNAPPED (locked to nearest 32x32)
int m_client_height; // width and height
int m_REAL_client_width; //these are the ACTUAL (raw) width and height -
int m_REAL_client_height; // only valid in windowed mode!
int m_fake_fs_covers_all;
int m_frame_delay;
RECT m_all_monitors_rect; // rect that encompasses all monitors that make up the desktop. The primary monitor's upper-left corner is (0,0).
RECT m_monitor_rect; // rect for monitor the plugin is running on; for pseudo-multimon modes like 2048x768, if user decides to only run on half the monitor, this rect reflects that as well.
RECT m_monitor_rect_orig; // same, but it's the original rect; does not account for pseudo-multimon modes like 2048x768
RECT m_monitor_work_rect; // same, but excludes the taskbar area.
RECT m_monitor_work_rect_orig; // original work rect; does not account for pseudo-multimon modes like 2048x768
DXCONTEXT_PARAMS m_current_mode;
LPDIRECT3DDEVICE9 m_lpDevice;
D3DPRESENT_PARAMETERS m_d3dpp;
LPDIRECT3D9 m_lpD3D;
D3DCAPS9 m_caps;
protected:
D3DMULTISAMPLE_TYPE m_multisamp;
D3DFORMAT m_zFormat;
D3DFORMAT m_orig_windowed_mode_format[MAX_DXC_ADAPTERS];
HMODULE m_hmod_d3d9, m_hmod_d3dx9;
int m_ordinal_adapter;
HWND m_hwnd;
HWND m_hwnd_winamp;
LONG_PTR m_uWindowLong;
ATOM m_classAtom;
char m_szWindowCaption[512];
wchar_t m_szIniFile[MAX_PATH];
char m_szDriver[MAX_DEVICE_IDENTIFIER_STRING];
char m_szDesc[MAX_DEVICE_IDENTIFIER_STRING];
HINSTANCE m_hInstance;
int m_ignore_wm_destroy;
int m_minimize_winamp;
int m_winamp_minimized;
int m_truly_exiting;
int m_bpp;
embedWindowState myWindowState;
void WriteSafeWindowPos();
int GetWindowedModeAutoSize(int iteration);
BOOL TestDepth(int ordinal_adapter, D3DFORMAT fmt);
BOOL TestFormat(int ordinal_adapter, D3DFORMAT fmt);
int CheckAndCorrectFullscreenDispMode(int ordinal_adapter, D3DDISPLAYMODE *pdm);
void SetViewport();
void MinimizeWinamp(HMONITOR hPluginMonitor);
BOOL Internal_Init(DXCONTEXT_PARAMS *pParams, BOOL bFirstInit);
void Internal_CleanUp();
void RestoreWinamp();
void GetSnappedClientSize(); //windowed mode only
};
#define DXC_ERR_REGWIN -2
#define DXC_ERR_CREATEWIN -3
#define DXC_ERR_CREATE3D -4
#define DXC_ERR_GETFORMAT -5
#define DXC_ERR_FORMAT -6
#define DXC_ERR_CREATEDEV_PROBABLY_OUTOFVIDEOMEMORY -7
#define DXC_ERR_RESIZEFAILED -8
#define DXC_ERR_CAPSFAIL -9
#define DXC_ERR_BAD_FS_DISPLAYMODE -10
#define DXC_ERR_USER_CANCELED -11
#define DXC_ERR_CREATEDEV_NOT_AVAIL -12
#define DXC_ERR_CREATEDDRAW -13
#endif