Initial commit
This commit is contained in:
207
engines/director/lingo/xtras/d/displayres.cpp
Normal file
207
engines/director/lingo/xtras/d/displayres.cpp
Normal file
@@ -0,0 +1,207 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common/system.h"
|
||||
|
||||
#include "director/director.h"
|
||||
#include "director/lingo/lingo.h"
|
||||
#include "director/lingo/lingo-object.h"
|
||||
#include "director/lingo/lingo-utils.h"
|
||||
#include "director/lingo/xtras/d/displayres.h"
|
||||
|
||||
/**************************************************
|
||||
*
|
||||
* USED IN:
|
||||
* I Spy Spooky Mansion
|
||||
*
|
||||
**************************************************/
|
||||
|
||||
/*
|
||||
-- xtra DisplayRes
|
||||
-- DisplayRes Xtra, Version 1.0.0.3, 4/27/1997
|
||||
-- Copyright 1997 Glenn M. Picher, Dirigo Multimedia
|
||||
--
|
||||
--Published by g/matter, inc.
|
||||
--Sales: sales@gmatter.com, (800)933-6223
|
||||
--Tech support: support@gmatter.com, (415)243-0394
|
||||
--Web: http://www.gmatter.com
|
||||
--
|
||||
--Author: Glenn M. Picher, gpicher@maine.com, (207)767-8015
|
||||
--Web: http://www.maine.com/shops/gpicher
|
||||
--
|
||||
-- Registered version-- thank you! See the 'register' handler.
|
||||
--
|
||||
new object me
|
||||
-- Note: this Xtra uses only global handlers, so there's no need to
|
||||
-- create any child objects. Just use the handlers listed below.
|
||||
--
|
||||
-- All methods return a string. Check the result for word 1 'Error:' to
|
||||
-- verify proper operation.
|
||||
--
|
||||
* dresGetDisplaySettings
|
||||
-- Provides a string of possible resolutions for the current display,
|
||||
-- in the format:
|
||||
-- width height colors frequency interlace grayOrColor capability
|
||||
-- Reports width in pixels; height in pixels; color depth in bits per pixel: 1 (2
|
||||
-- colors), 4 (16 colors), 8 (256 colors), 15 (32K colors), 16 (64K colors),
|
||||
-- 24 (16 million colors), 32 (24 million colors plus 8 bits transparency);
|
||||
-- vertical refresh rate in cycles per second (a value of 0 or 1 may be returned,
|
||||
-- which indicates the default hardware refresh); 'interlaced' or 'noninterlaced';
|
||||
-- 'grayscale' or 'color'; and the capabilites (typically 'dynamic' or 'restart,'
|
||||
-- but if some error occurs while checking capabilities, could also be 'badFlags',
|
||||
-- 'failed', 'badMode', 'notUpdated', or 'unknown'). Note that the quality of
|
||||
-- of Windows display drivers varies wildly. Some drivers may report they can
|
||||
-- change modes dynamically when they really can't. Some report no error when
|
||||
-- actually asked to change modes dynamically and unable to do so (I've observed
|
||||
-- this on Windows NT 3.51). Therefore, it's best to verify that the display really
|
||||
-- *has* changed with dresGetCurrentDisplay(), after using dresDynamicSetDisplay().
|
||||
-- NOTE: This method can return more than one line. Each possible display setting
|
||||
-- is on a different line of the returned string. Based on the results, choose
|
||||
-- a line number of the new mode you want to set with dresDynamicSetDisplay() (or,
|
||||
-- if 'capability' indicates a restart is required, dresRestartSetDisplay).
|
||||
--
|
||||
* dresDynamicSetDisplay integer lineNumber
|
||||
-- Change the monitor to use the display settings on the specified line
|
||||
-- of the information returned by dresGetDisplaySettings. Does not affect
|
||||
-- registry settings, so the default will be restored on the next restart.
|
||||
-- It's best to verify proper operation with dresGetCurrentDisplay().
|
||||
--
|
||||
* dresRestartSetDisplay integer lineNumber
|
||||
-- Change the monitor to use the display settings on the specified line
|
||||
-- of the information returned by dresGetDisplaySettings (updating the
|
||||
-- default registry settings for the next time the computer restarts).
|
||||
-- Note that this method *will* change dynamically if it's possible, as
|
||||
-- well as updating the default registry settings. Use dresGetCurrentDisplay()
|
||||
-- to verify whether a dynamic change was made.
|
||||
* dresRestart
|
||||
-- Restart the machine. Lingo's 'restart' doesn't work on Win95/NT.
|
||||
* dresShutdown
|
||||
-- Shut down the machine. Lingo's 'shutdown' doesn't work on Win95/NT.
|
||||
--
|
||||
* dresDefaultDisplay
|
||||
-- Sets the display to the default values stored in the registry. Useful to
|
||||
-- restore the screen after a dynamic change with dresDynamicSetDisplay.
|
||||
-- Note that dresRestartSetDisplay() will *change* the defaults, so this method
|
||||
-- can't be used to restore an old setting after a restart.
|
||||
* dresGetCurrentDisplay
|
||||
-- Returns a line of information about the current display settings (in the same
|
||||
-- format as dresGetDisplaySettings). This is useful to save the existing settings
|
||||
-- when you change the display, so you can know what to restore it to later.
|
||||
-- This also returns up-to-date information after a display change, which Lingo's
|
||||
-- 'the desktopRectList' and 'the colorDepth' will not (in Director 5 at least).
|
||||
-- Note that the values for 'interlace' and 'grayOrColor' are not meaningful; the value
|
||||
-- for 'capability' is always 'dynamic' (because by definition the sytem is already
|
||||
-- using this display mode); and the value for 'frequency' is only meaningful on
|
||||
-- Windows NT. This is due to the nature of the underlying Windows API functions.
|
||||
--
|
||||
+ register object xtraReference, string registrationString
|
||||
--
|
||||
|
||||
*/
|
||||
|
||||
namespace Director {
|
||||
|
||||
const char *DisplayResXtra::xlibName = "DisplayRes";
|
||||
const XlibFileDesc DisplayResXtra::fileNames[] = {
|
||||
{ "displayres", nullptr },
|
||||
{ "DispRes", nullptr },
|
||||
{ nullptr, nullptr },
|
||||
};
|
||||
|
||||
static MethodProto xlibMethods[] = {
|
||||
{ "new", DisplayResXtra::m_new, 0, 0, 500 },
|
||||
{ "register", DisplayResXtra::m_register, 1, 1, 500 },
|
||||
{ nullptr, nullptr, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static BuiltinProto xlibBuiltins[] = {
|
||||
{ "dresGetDisplaySettings", DisplayResXtra::m_dresGetDisplaySettings, 0, 0, 500, HBLTIN },
|
||||
{ "dresDynamicSetDisplay", DisplayResXtra::m_dresDynamicSetDisplay, 1, 1, 500, HBLTIN },
|
||||
{ "dresRestartSetDisplay", DisplayResXtra::m_dresRestartSetDisplay, 1, 1, 500, HBLTIN },
|
||||
{ "dresRestart", DisplayResXtra::m_dresRestart, 0, 0, 500, HBLTIN },
|
||||
{ "dresShutdown", DisplayResXtra::m_dresShutdown, 0, 0, 500, HBLTIN },
|
||||
{ "dresDefaultDisplay", DisplayResXtra::m_dresDefaultDisplay, 0, 0, 500, HBLTIN },
|
||||
{ "dresGetCurrentDisplay", DisplayResXtra::m_dresGetCurrentDisplay, 0, 0, 500, HBLTIN },
|
||||
{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
|
||||
};
|
||||
|
||||
DisplayResXtraObject::DisplayResXtraObject(ObjectType ObjectType) :Object<DisplayResXtraObject>("DisplayRes") {
|
||||
_objType = ObjectType;
|
||||
}
|
||||
|
||||
bool DisplayResXtraObject::hasProp(const Common::String &propName) {
|
||||
return (propName == "name");
|
||||
}
|
||||
|
||||
Datum DisplayResXtraObject::getProp(const Common::String &propName) {
|
||||
if (propName == "name")
|
||||
return Datum(DisplayResXtra::xlibName);
|
||||
warning("DisplayResXtra::getProp: unknown property '%s'", propName.c_str());
|
||||
return Datum();
|
||||
}
|
||||
|
||||
void DisplayResXtra::open(ObjectType type, const Common::Path &path) {
|
||||
DisplayResXtraObject::initMethods(xlibMethods);
|
||||
DisplayResXtraObject *xobj = new DisplayResXtraObject(type);
|
||||
if (type == kXtraObj) {
|
||||
g_lingo->_openXtras.push_back(xlibName);
|
||||
g_lingo->_openXtraObjects.push_back(xobj);
|
||||
}
|
||||
g_lingo->exposeXObject(xlibName, xobj);
|
||||
g_lingo->initBuiltIns(xlibBuiltins);
|
||||
}
|
||||
|
||||
void DisplayResXtra::close(ObjectType type) {
|
||||
DisplayResXtraObject::cleanupMethods();
|
||||
g_lingo->_globalvars[xlibName] = Datum();
|
||||
|
||||
}
|
||||
|
||||
void DisplayResXtra::m_new(int nargs) {
|
||||
g_lingo->printSTUBWithArglist("DisplayResXtra::m_new", nargs);
|
||||
g_lingo->dropStack(nargs);
|
||||
g_lingo->push(g_lingo->_state->me);
|
||||
}
|
||||
|
||||
void DisplayResXtra::m_dresGetDisplaySettings(int nargs) {
|
||||
Common::String result = Common::String::format("%d %d %d %d noninterlaced color dynamic", g_director->_wm->getWidth(), g_director->_wm->getHeight(), g_director->_wm->_pixelformat.bytesPerPixel*8, 0);
|
||||
g_lingo->push(Datum(result));
|
||||
}
|
||||
|
||||
XOBJSTUB(DisplayResXtra::m_dresDynamicSetDisplay, 0)
|
||||
XOBJSTUB(DisplayResXtra::m_dresRestartSetDisplay, 0)
|
||||
XOBJSTUB(DisplayResXtra::m_dresRestart, 0)
|
||||
XOBJSTUB(DisplayResXtra::m_dresShutdown, 0)
|
||||
XOBJSTUB(DisplayResXtra::m_dresDefaultDisplay, 0)
|
||||
|
||||
void DisplayResXtra::m_dresGetCurrentDisplay(int nargs) {
|
||||
Common::String result = Common::String::format("%d %d %d %d noninterlaced color dynamic", g_director->_wm->getWidth(), g_director->_wm->getHeight(), g_director->_wm->_pixelformat.bytesPerPixel*8, 0);
|
||||
g_lingo->push(Datum(result));
|
||||
}
|
||||
|
||||
|
||||
void DisplayResXtra::m_register(int nargs) {
|
||||
Datum key = g_lingo->pop();
|
||||
debugC(5, kDebugXObj, "DisplayResXtra::m_register: %s", key.asString().c_str());
|
||||
g_lingo->push(Datum("OK"));
|
||||
}
|
||||
|
||||
}
|
||||
57
engines/director/lingo/xtras/d/displayres.h
Normal file
57
engines/director/lingo/xtras/d/displayres.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef DIRECTOR_LINGO_XTRAS_D_DISPLAYRES_H
|
||||
#define DIRECTOR_LINGO_XTRAS_D_DISPLAYRES_H
|
||||
|
||||
namespace Director {
|
||||
|
||||
class DisplayResXtraObject : public Object<DisplayResXtraObject> {
|
||||
public:
|
||||
DisplayResXtraObject(ObjectType objType);
|
||||
|
||||
bool hasProp(const Common::String &propName) override;
|
||||
Datum getProp(const Common::String &propName) override;
|
||||
};
|
||||
|
||||
namespace DisplayResXtra {
|
||||
|
||||
extern const char *xlibName;
|
||||
extern const XlibFileDesc fileNames[];
|
||||
|
||||
void open(ObjectType type, const Common::Path &path);
|
||||
void close(ObjectType type);
|
||||
|
||||
void m_new(int nargs);
|
||||
void m_dresGetDisplaySettings(int nargs);
|
||||
void m_dresDynamicSetDisplay(int nargs);
|
||||
void m_dresRestartSetDisplay(int nargs);
|
||||
void m_dresRestart(int nargs);
|
||||
void m_dresShutdown(int nargs);
|
||||
void m_dresDefaultDisplay(int nargs);
|
||||
void m_dresGetCurrentDisplay(int nargs);
|
||||
void m_register(int nargs);
|
||||
|
||||
} // End of namespace DisplayResXtra
|
||||
|
||||
} // End of namespace Director
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user