winamp/Src/Winamp/IVideoD3DOSD.h
2024-09-24 14:54:57 +02:00

159 lines
4.7 KiB
C++

#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#include <dxerr.h>
#include "videoosd.h"
#include "videooutput.h"
#include "resource.h"
extern HWND hMainWindow;
class IVideoD3DOSD :
public IVideoOSD
{
public:
IVideoD3DOSD(void);
~IVideoD3DOSD(void);
enum UI_ELEM
{
NO_BUTTON,
PREV_BUTTON,
PLAY_BUTTON,
PAUSE_BUTTON,
STOP_BUTTON,
NEXT_BUTTON,
ENDFS_BUTTON,
MUTE_BUTTON,
PROGRESS_FRAME,
VOLUME_FRAME,
PROGRESS_SLIDER,
VOLUME_SLIDER
};
enum BUTTON_STATE
{
NORMAL,
CLICKED,
HILITE,
DISABLED
};
void CreateOSD(IDirect3DDevice9 * device);
void UpdateOSD(HWND hWnd, VideoOutput *adjuster);
void DrawOSD(IDirect3DDevice9 * device);
void LostOSD();
void ResetOSD(IDirect3DDevice9 *device);
UI_ELEM HitTest(float x, float y);
bool MouseDown(int xpt, int ypt, WPARAM wParam);
bool MouseMove(int xpt, int ypt, WPARAM wParam);
bool MouseUp(int xpt, int ypt, WPARAM wParam);
void SetScalingFactor(float x, float y);
bool isOSDInited(){return isInited;}
bool isOSDReadyToDraw(){return isReadyToDraw;};
protected:
ID3DXSprite *osdSprite;
IDirect3DTexture9 *osdAtlasTexture;
ID3DXFont *osdTimeFont;
ID3DXFont *osdTitleFont;
// Texture Src Coordinates for sprite images
// Right and Bottom (last two) excluded from image
RECT osdPrevButtonNormalSrcCoords;
RECT osdPlayButtonNormalSrcCoords;
RECT osdPauseButtonNormalSrcCoords;
RECT osdStopButtonNormalSrcCoords;
RECT osdNextButtonNormalSrcCoords;
RECT osdProgressFrameNormalSrcCoords;
RECT osdVolumeFrameNormalSrcCoords;
RECT osdEndFSButtonNormalSrcCoords;
RECT osdMuteButtonNormalSrcCoords;
RECT osdProgressSliderNormalSrcCoords;
RECT osdVolumeSliderNormalSrcCoords;
RECT osdProgressProgressSrcCoords;
RECT osdVolumeProgressSrcCoords;
RECT osdPrevButtonClickSrcCoords;
RECT osdPlayButtonClickSrcCoords;
RECT osdPauseButtonClickSrcCoords;
RECT osdStopButtonClickSrcCoords;
RECT osdNextButtonClickSrcCoords;
RECT osdEndFSButtonClickSrcCoords;
RECT osdProgressSliderClickSrcCoords;
RECT osdVolumeSliderClickSrcCoords;
RECT osdPrevButtonDisabledSrcCoords;
RECT osdNextButtonDisabledSrcCoords;
// RECT osdProgressFrameDisabledSrcCoords;
// RECT osdProgressSliderDisabledSrcCoords;
RECT osdPrevButtonHiliteSrcCoords;
RECT osdPlayButtonHiliteSrcCoords;
RECT osdPauseButtonHiliteSrcCoords;
RECT osdStopButtonHiliteSrcCoords;
RECT osdNextButtonHiliteSrcCoords;
// RECT osdProgressFrameHiliteSrcCoords;
// RECT osdVolumeFrameHiliteSrcCoords;
RECT osdEndFSButtonHiliteSrcCoords;
RECT osdProgressSliderHiliteSrcCoords;
RECT osdVolumeSliderHiliteSrcCoords;
RECT osdBkgrndTextSrcCoords;
RECT osdTimeRect;
RECT osdTitleRect;
// Position of sprites in screen coordinates
// Center of sprite (where the position is mapped) is left to default to upper left corner
// except for progress and volume sliders, which are mapped to their center
// Note the Bkgrnd is positioned and then all other sprites are relative to that
D3DXVECTOR3 osdBkgrndPosition;
D3DXVECTOR3 osdPrevButtonPosition;
D3DXVECTOR3 osdPlayButtonPosition;
D3DXVECTOR3 osdPauseButtonPosition;
D3DXVECTOR3 osdStopButtonPosition;
D3DXVECTOR3 osdNextButtonPosition;
D3DXVECTOR3 osdProgressFramePosition;
D3DXVECTOR3 osdVolumeFramePosition;
D3DXVECTOR3 osdEndFSButtonPosition;
D3DXVECTOR3 osdMuteButtonPosition;
D3DXVECTOR3 osdProgressSliderPosition;
D3DXVECTOR3 osdVolumeSliderPosition;
// Hit test rects for buttons
RECT osdPrevButtonHit;
RECT osdPlayButtonHit;
RECT osdPauseButtonHit;
RECT osdStopButtonHit;
RECT osdNextButtonHit;
RECT osdEndFSButtonHit;
RECT osdProgressFrameHit;
RECT osdVolumeFrameHit;
RECT osdProgressSliderHit;
RECT osdVolumeSliderHit;
float xScalingFactor;
float yScalingFactor;
BUTTON_STATE bState[12]; // bState[0] is for NO_BUTTON
bool streaming;
wchar_t *displayTitle; // title displayed in osd UI
wchar_t *marqueeTitleSrc; // temp string used to create displayTitle if title does not fit.
size_t titleRestart; // location in title to loop back to for marquee effect
bool titleFits; // indicates whether the title will fit in the UI title field
DWORD dtFormat; // format of title text rect based on title size, i.e., center or left justified
UI_ELEM mouseOver;
UI_ELEM mouseLastOver;
UI_ELEM mousePressed;
UI_ELEM mouseLastPressed; // used to verify that the LMouse up event matches the LMouse down
bool mouseDragging; // whether dragging is in progress to decide to update from winamp info
bool isInited; // has run CreateOSD to create all the d3d objects
bool isReadyToDraw; // has run UpdateOSD to init OSD for drawing, i.e., positioning the UI elements
bool PointInRect(float x, float y, RECT testRect);
RECT BuildHitRect(D3DXVECTOR3 position, RECT size);
RECT * GetTextCoords(UI_ELEM item);
};