mirror of
https://github.com/0ldsk00l/nestopia.git
synced 2025-04-02 10:31:51 -04:00
282 lines
6.5 KiB
C++
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
|