scummvm/backends/platform/ios7/ios7_osys_main.h

199 lines
6.4 KiB
C
Raw Normal View History

/* 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 BACKENDS_PLATFORM_IOS7_IOS7_OSYS_MAIN_H
#define BACKENDS_PLATFORM_IOS7_IOS7_OSYS_MAIN_H
#include "graphics/surface.h"
2016-01-07 12:40:55 +01:00
#include "backends/platform/ios7/ios7_common.h"
2020-09-04 13:28:52 +01:00
#include "backends/modular-backend.h"
#include "backends/keymapper/hardware-input.h"
#include "common/events.h"
#include "common/str.h"
2020-08-19 16:06:32 +05:30
#include "common/ustr.h"
#include "audio/mixer_intern.h"
#include "backends/fs/posix/posix-fs-factory.h"
#include "graphics/palette.h"
#include <AudioToolbox/AudioQueue.h>
#define AUDIO_BUFFERS 3
#define WAVE_BUFFER_SIZE 2048
#define AUDIO_SAMPLE_RATE 44100
#define MAX_IOS7_SCUMMVM_LOG_FILESIZE_IN_BYTES (100*1024)
typedef void (*SoundProc)(void *param, byte *buf, int len);
typedef int (*TimerProc)(int interval);
struct AQCallbackStruct {
AudioQueueRef queue;
uint32 frameCount;
AudioQueueBufferRef buffers[AUDIO_BUFFERS];
AudioStreamBasicDescription dataFormat;
};
class OSystem_iOS7 : public ModularGraphicsBackend, public EventsBaseBackend {
protected:
static AQCallbackStruct s_AudioQueue;
static SoundProc s_soundCallback;
static void *s_soundParam;
Audio::MixerImpl *_mixer;
CFTimeInterval _startTime;
uint32 _timeSuspended;
long _lastMouseDown;
long _lastMouseTap;
long _queuedEventTime;
Common::Event _queuedInputEvent;
bool _secondaryTapped;
long _lastSecondaryDown;
long _lastSecondaryTap;
bool _mouseClickAndDragEnabled;
bool _touchpadModeEnabled;
int _lastPadX;
int _lastPadY;
ScreenOrientation _screenOrientation;
Common::String _lastErrorMessage;
2015-12-11 14:24:29 +01:00
Common::String _chrootBasePath;
public:
OSystem_iOS7();
virtual ~OSystem_iOS7();
2015-12-11 14:24:29 +01:00
static OSystem_iOS7 *sharedInstance();
void initBackend() override;
2018-05-22 16:03:56 +02:00
void engineInit() override;
void engineDone() override;
void updateStartSettings(const Common::String &executable, Common::String &command, Common::StringMap &settings, Common::StringArray& additionalArgs) override;
bool hasFeature(Feature f) override;
void setFeatureState(Feature f, bool enable) override;
bool getFeatureState(Feature f) override;
bool touchpadModeEnabled() const;
IOS7: Add iOSGraphicsManager class The ios7 backend implements the graphic handling in the backend code. iOS supports OpenGL through the OpenGL Framework since iOS 2.0. It's marked as deprecated but is still shipped with the SDKs for iPhoneOS and tvOS and will hopefully be so for some time. The ios7 backend can therefore utilize the OpenGLGraphicsManager to handle all graphics. Implement an iOSGraphicsManager class that can be used in the ios7 backend. The iOSGraphicsManager will require some callback functions in the ios7 backend. createOpenGLContext() will be called to ask the backend to create an OpenGL context in which the graphic manager can draw. The function returns the ID of the renderbuffer which shall be used when creating the framebuffer object this differ iOS from other platforms). A custom RenderBufferTarget class is added to address this. destroyOpenGLContext() will be called to make sure that the old GLES context is not reused. notifyContextDestroy() does call the function OpenGLContext.reset() but that will not destroy the context. refreshScreen() will be called to ask the backend to present the drawn graphics on the screen. getSystemHiDPIScreenFactor() is called to get the screen scaling factor. getScreenWidth() and getScreenHeight() are called to get the width and height of the surface to draw on. This commit adds the class but the ios7 backend doesn't make use of it quite yet. To use it require the ios7 to be a child class of the ModularGraphicsBackend. That change requires a lot of changes which will be targeted in separate commits. Update docportal and github ci worker to only disable the feature opengl_classic_game since opengl and opengl_shaders are required to compile the OpenGLGraphicsManager.
2023-05-31 08:02:38 +02:00
uint createOpenGLContext();
void destroyOpenGLContext();
void refreshScreen() const;
int getScreenWidth() const;
int getScreenHeight() const;
float getSystemHiDPIScreenFactor() const;
2022-04-25 15:36:50 +02:00
#if defined(USE_OPENGL) && defined(USE_GLAD)
void *getOpenGLProcAddress(const char *name) const override;
#endif
public:
bool pollEvent(Common::Event &event) override;
uint32 getMillis(bool skipRecord = false) override;
void delayMillis(uint msecs) override;
Common::MutexInternal *createMutex() override;
static void mixCallback(void *sys, byte *samples, int len);
virtual void setupMixer(void);
virtual void setTimerCallback(TimerProc callback, int interval);
void quit() override;
void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0) override;
void getTimeAndDate(TimeDate &td, bool skipRecord = false) const override;
Common::HardwareInputSet *getHardwareInputSet() override;
Audio::Mixer *getMixer() override;
void startSoundsystem();
void stopSoundsystem();
Common::String getDefaultConfigFileName() override;
void logMessage(LogMessageType::Type type, const char *message) override;
void fatalError() override;
bool hasTextInClipboard() override;
Common::U32String getTextFromClipboard() override;
bool setTextInClipboard(const Common::U32String &text) override;
bool openUrl(const Common::String &url) override;
2019-08-04 16:14:46 +01:00
Common::String getSystemLanguage() const override;
2019-08-04 16:55:46 +01:00
bool isConnectionLimited() override;
void virtualController(bool connect);
2019-08-04 17:41:53 +01:00
virtual Common::String getDefaultLogFileName() override { return Common::String("/scummvm.log"); }
virtual GUI::OptionsContainerWidget* buildBackendOptionsWidget(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override;
virtual void applyBackendSettings() override;
virtual void registerDefaultSettings(const Common::String &target) const override;
protected:
void updateOutputSurface();
void setShowKeyboard(bool);
bool isKeyboardShown() const;
void suspendLoop();
void saveState();
void restoreState();
void clearState();
static void AQBufferCallback(void *in, AudioQueueRef inQ, AudioQueueBufferRef outQB);
static int timerHandler(int t);
bool handleEvent_swipe(Common::Event &event, int direction, int touches);
bool handleEvent_tap(Common::Event &event, UIViewTapDescription type, int touches);
void handleEvent_keyPressed(Common::Event &event, int keyPressed);
void handleEvent_orientationChanged(int orientation);
void handleEvent_applicationSuspended();
void handleEvent_applicationResumed();
void handleEvent_applicationSaveState();
void handleEvent_applicationRestoreState();
void handleEvent_applicationClearState();
bool handleEvent_touchFirstDown(Common::Event &event, int x, int y);
bool handleEvent_touchFirstUp(Common::Event &event, int x, int y);
bool handleEvent_touchSecondDown(Common::Event &event, int x, int y);
bool handleEvent_touchSecondUp(Common::Event &event, int x, int y);
bool handleEvent_touchFirstDragged(Common::Event &event, int x, int y);
bool handleEvent_touchSecondDragged(Common::Event &event, int x, int y);
void handleEvent_mouseLeftButtonDown(Common::Event &event, int x, int y);
void handleEvent_mouseLeftButtonUp(Common::Event &event, int x, int y);
void handleEvent_mouseRightButtonDown(Common::Event &event, int x, int y);
void handleEvent_mouseRightButtonUp(Common::Event &event, int x, int y);
void handleEvent_mouseDelta(Common::Event &event, int deltaX, int deltaY);
void handleEvent_mouseEvent(Common::Event &event, int relX, int relY);
void rebuildSurface();
float getMouseSpeed();
};
#endif