nestopia/source/win32/NstDialogVideo.hpp

282 lines
6.5 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////
//
// Nestopia - NES/Famicom emulator written in C++
//
// Copyright (C) 2003-2008 Martin Freij
//
// This file is part of Nestopia.
//
// Nestopia is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Nestopia is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Nestopia; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
////////////////////////////////////////////////////////////////////////////////////////
#ifndef NST_DIALOG_VIDEO_H
#define NST_DIALOG_VIDEO_H
#pragma once
#include "NstWindowDialog.hpp"
#include "NstDialogVideoFilters.hpp"
#include "NstDirect2D.hpp"
#include "../core/api/NstApiMachine.hpp"
namespace Nestopia
{
namespace Window
{
class Video
{
public:
typedef DirectX::Direct2D::Adapter Adapter;
typedef DirectX::Direct2D::Adapters Adapters;
typedef DirectX::Direct2D::Mode Mode;
typedef Adapter::Modes Modes;
enum
{
NES_WIDTH = Nes::Video::Output::WIDTH,
NES_HEIGHT = Nes::Video::Output::HEIGHT,
NTSC_WIDTH = Nes::Video::Output::NTSC_WIDTH,
MIN_DIALOG_WIDTH = 640,
MIN_DIALOG_HEIGHT = 480,
SCREEN_MATCHED = 8,
SCREEN_STRETCHED = 255,
MIN_SCREEN_CURVATURE = -10,
MAX_SCREEN_CURVATURE = +10
};
Video(Managers::Emulator&,const Adapters&,const Managers::Paths&,const Configuration&);
~Video();
void Save(Configuration&) const;
void UpdateAutoModes() const;
const Rect GetRenderState(Nes::Video::RenderState&,const Point) const;
uint GetScanlines() const;
Modes::const_iterator GetDialogMode() const;
private:
struct Handlers;
uint GetFullscreenScaleMethod() const;
void UpdateFullscreenScaleMethod(uint);
void UpdateNtscFilter() const;
void UpdateFinalRects();
Nes::Video::Palette::Mode GetDesiredPaletteMode() const;
enum
{
NTSC_CLIP_TOP = 8,
NTSC_CLIP_BOTTOM = NES_HEIGHT - 8,
PAL_CLIP_TOP = 1,
PAL_CLIP_BOTTOM = NES_HEIGHT - 0,
TV_WIDTH = 292
};
typedef VideoFilters Filter;
struct Settings
{
Settings();
~Settings();
class Backup;
struct Rects
{
Rect ntsc;
Rect pal;
Rect outNtsc;
Rect outPal;
};
enum TexMem
{
TEXMEM_VIDMEM,
TEXMEM_SYSMEM
};
Adapters::const_iterator adapter;
TexMem texMem;
Modes::const_iterator mode;
Filter::Settings* filter;
Filter::Settings filters[Filter::NUM_TYPES];
Rects rects;
Path palette;
Nes::Video::Palette::Mode lockedMode;
int screenCurvature;
uchar fullscreenScale;
bool autoPalette;
bool autoHz;
bool tvAspect;
const Backup* backup;
};
ibool OnInitDialog (Param&);
ibool OnHScroll (Param&);
ibool OnCmdDevice (Param&);
ibool OnCmdMode (Param&);
ibool OnCmdFilter (Param&);
ibool OnCmdFilterSettings (Param&);
ibool OnCmdBitDepth (Param&);
ibool OnCmdRam (Param&);
ibool OnCmdColorsAdvanced (Param&);
ibool OnCmdColorsReset (Param&);
ibool OnCmdPalType (Param&);
ibool OnCmdPalBrowse (Param&);
ibool OnCmdPalClear (Param&);
ibool OnCmdPalEditor (Param&);
ibool OnCmdDefault (Param&);
ibool OnCmdOk (Param&);
ibool OnDestroy (Param&);
void UpdateDevice(Mode);
void UpdateResolutions(Mode);
void UpdateFilters();
void UpdateRects(const Rect&,const Rect&) const;
void UpdateColors() const;
void UpdateScreenCurvature() const;
void UpdatePalette() const;
void ImportPalette(Path&,Managers::Paths::Alert);
void ValidateRects();
void ResetRects();
void ResetColors();
Modes::const_iterator GetDefaultMode() const;
Settings settings;
const Adapters& adapters;
Managers::Emulator& nes;
Dialog dialog;
const Managers::Paths& paths;
class DefaultMode
{
enum
{
DEFAULT_4_3_WIDTH = 640,
DEFAULT_4_3_HEIGHT = 480,
DEFAULT_16_9_WIDTH = 1680,
DEFAULT_16_9_HEIGHT = 1050
};
public:
DefaultMode();
uint width;
uint height;
};
static const DefaultMode defaultMode;
public:
void Open()
{
dialog.Open();
}
bool IsOpen() const
{
return dialog.IsOpen();
}
const Rect& GetInputRect() const
{
return (Nes::Machine(nes).GetMode() == Nes::Machine::NTSC ? settings.rects.ntsc : settings.rects.pal);
}
bool ToggleTvAspect()
{
settings.tvAspect = !settings.tvAspect;
UpdateFinalRects();
return settings.tvAspect;
}
bool TvAspect() const
{
return settings.tvAspect;
}
Modes::const_iterator GetMode() const
{
return settings.mode;
}
Adapters::const_iterator GetAdapter() const
{
return settings.adapter;
}
Adapter::Filter GetTextureFilter() const
{
if (settings.filter->attributes[Filter::ATR_BILINEAR] && (settings.adapter->filters & Adapter::FILTER_BILINEAR))
return Adapter::FILTER_BILINEAR;
else
return Adapter::FILTER_NONE;
}
int GetScreenCurvature() const
{
return settings.screenCurvature;
}
uint GetFullscreenScale() const
{
return settings.fullscreenScale;
}
void SetFullscreenScale(uint scale)
{
settings.fullscreenScale = scale;
}
bool UseAutoFrequency() const
{
return settings.autoHz;
}
bool UseAutoFieldMerging() const
{
return settings.filters[Filter::TYPE_NTSC].attributes[Filter::ATR_FIELDMERGING] == Filter::ATR_FIELDMERGING_AUTO;
}
bool EnableFieldMerging() const
{
return settings.filters[Filter::TYPE_NTSC].attributes[Filter::ATR_FIELDMERGING] == Filter::ATR_FIELDMERGING_ON;
}
bool PutTextureInVideoMemory() const
{
return settings.texMem == Settings::TEXMEM_VIDMEM;
}
const Rect& GetNesRect(Nes::Machine::Mode mode) const
{
return mode == Nes::Machine::NTSC ? settings.rects.outNtsc : settings.rects.outPal;
}
const Rect& GetNesRect() const
{
return GetNesRect( Nes::Machine(nes).GetMode() );
}
};
}
}
#endif