Emscripten port

This commit is contained in:
elasota
2021-03-29 21:41:11 -04:00
parent 9ba0e9f13d
commit 6fb45f480b
92 changed files with 15731 additions and 300 deletions

View File

@@ -34,6 +34,11 @@
#include <stdlib.h>
#include <new>
int16_t DialogManagerImpl_AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return -1;
}
namespace PortabilityLayer
{
class DialogImpl;
@@ -90,7 +95,12 @@ namespace PortabilityLayer
ArrayView<const DialogItem> GetItems() const override;
void SetItemVisibility(unsigned int itemIndex, bool isVisible) override;
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t ExecuteModal(void *captureContext, const TFilterFunc &filterFunc);
#else
int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc) override;
#endif
bool ReplaceWidget(unsigned int itemIndex, Widget *widget) override;
@@ -108,15 +118,71 @@ namespace PortabilityLayer
static void MakeStringSubstitutions(uint8_t *outStr, const uint8_t *inStr, const DialogTextSubstitutions *substitutions);
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t ExecuteModalInDarkenStack(void *captureContext, const TFilterFunc &filterFunc);
#else
int16_t ExecuteModalInDarkenStack(void *captureContext, DialogFilterFunc_t filterFunc);
#endif
Window *m_window;
DialogItem *m_items;
size_t m_numItems;
size_t m_maxItems;
};
}
#if GP_ASYNCIFY_PARANOID
#define PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(f) \
template<> \
int16_t Dialog::ExecuteModal(void *captureContext, DialogFilterFunc_t filterFuncID, const DialogFilterFuncs::InvokeWrapper<DialogFilterFuncs::k##f> &filterFunc) \
{ \
(void)filterFuncID; \
return static_cast<PortabilityLayer::DialogImpl*>(this)->ExecuteModal(captureContext, filterFunc); \
}
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BlowerFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FurnitureFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(CustPictFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(SwitchFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(TriggerFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(ApplianceFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(MicrowaveFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(GreaseFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(InvisBonusFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(TransFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(EnemyFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FlowerFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LightFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(GoToFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(RoomFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(OriginalArtFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(AboutFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LicenseReaderFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(LoadFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(AboutFrameworkFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BrainsFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(NameFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(BannerFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(ControlFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(SoundFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(HouseFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(DisplayFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(PrefsFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FileBrowserUIImpl_PopUpAlertUIFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(FileBrowserUIImpl_FileBrowserUIFilter)
PL_DIALOG_IMPLEMENT_EXECUTE_MODAL(DialogManagerImpl_AlertFilter)
#endif
namespace PortabilityLayer
{
DialogItem::DialogItem(Widget *widget)
: m_widget(widget)
{
@@ -336,7 +402,12 @@ namespace PortabilityLayer
}
}
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t DialogImpl::ExecuteModal(void *captureContext, const TFilterFunc &filterFunc)
#else
int16_t DialogImpl::ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc)
#endif
{
Window *exclWindow = this->GetWindow();
@@ -349,7 +420,12 @@ namespace PortabilityLayer
return result;
}
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t DialogImpl::ExecuteModalInDarkenStack(void *captureContext, const TFilterFunc &filterFunc)
#else
int16_t DialogImpl::ExecuteModalInDarkenStack(void *captureContext, DialogFilterFunc_t filterFunc)
#endif
{
Window *window = this->GetWindow();
Widget *capturingWidget = nullptr;
@@ -359,12 +435,16 @@ namespace PortabilityLayer
{
TimeTaggedVOSEvent evt;
const bool haveEvent = WaitForEvent(&evt, 1);
bool haveEvent = false;
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
haveEvent = WaitForEvent(&evt, 1);
}
if (!haveEvent && window->IsHandlingTickEvents())
window->OnTick();
const int16_t selection = (filterFunc != nullptr) ? filterFunc(captureContext, this, haveEvent ? &evt : nullptr) : -1;
const int16_t selection = filterFunc(captureContext, this, haveEvent ? &evt : nullptr);
if (selection >= 0)
return selection;
@@ -614,7 +694,7 @@ namespace PortabilityLayer
public:
Dialog *LoadDialog(int16_t resID, Window *behindWindow, const DialogTextSubstitutions *substitutions) override;
Dialog *LoadDialogFromTemplate(int16_t templateResID, const Rect &rect, bool visible, bool hasCloseBox, uint32_t referenceConstant, uint16_t positionSpec, Window *behindWindow, const PLPasStr &title, const DialogTextSubstitutions *substitutions) override;
int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) override;
int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) GP_ASYNCIFY_PARANOID_OVERRIDE;
void PositionWindow(Window *window, const Rect &rect) const override;
DialogTemplate *LoadDialogTemplate(int16_t resID);
@@ -622,9 +702,6 @@ namespace PortabilityLayer
static DialogManagerImpl *GetInstance();
private:
static int16_t AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
static DialogManagerImpl ms_instance;
};
@@ -708,11 +785,6 @@ namespace PortabilityLayer
return dialog;
}
int16_t DialogManagerImpl::AlertFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return -1;
}
int16_t DialogManagerImpl::DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions)
{
struct AlertResourceData
@@ -769,7 +841,7 @@ namespace PortabilityLayer
if (!dialog)
return 0;
int16_t hit = dialog->ExecuteModal(nullptr, DialogManagerImpl::AlertFilter);
int16_t hit = dialog->ExecuteModal(nullptr, PL_FILTER_FUNC(DialogManagerImpl_AlertFilter));
dialog->Destroy();
return hit;
@@ -885,3 +957,12 @@ namespace PortabilityLayer
return DialogManagerImpl::GetInstance();
}
}
PL_IMPLEMENT_FILTER_FUNCTION(DialogManagerImpl_AlertFilter)
#if GP_ASYNCIFY_PARANOID
int16_t PortabilityLayer::DialogManager::DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions)
{
return static_cast<DialogManagerImpl*>(this)->DisplayAlert(alertResID, substitutions);
}
#endif

View File

@@ -1,5 +1,6 @@
#pragma once
#include "CoreDefs.h"
#include <stdint.h>
struct Dialog;
@@ -19,7 +20,7 @@ namespace PortabilityLayer
public:
virtual Dialog *LoadDialog(int16_t resID, Window *behindWindow, const DialogTextSubstitutions *substitutions) = 0;
virtual Dialog *LoadDialogFromTemplate(int16_t templateResID, const Rect &rect, bool visible, bool hasCloseBox, uint32_t referenceConstant, uint16_t positionSpec, Window *behindWindow, const PLPasStr &title, const DialogTextSubstitutions *substitutions) = 0;
virtual int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL int16_t DisplayAlert(int16_t alertResID, const DialogTextSubstitutions *substitutions) GP_ASYNCIFY_PARANOID_PURE;
virtual void PositionWindow(Window *window, const Rect &rect) const = 0;
static DialogManager *GetInstance();

View File

@@ -62,8 +62,6 @@ namespace PortabilityLayer
static void PubScrollBarCallback(void *captureContext, Widget *control, int part);
static bool PubEditBoxCharFilter(void *context, uint8_t ch);
static int16_t PubFileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
static int16_t PubPopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
bool AppendName(const char *name, size_t nameLength, void *details);
void SortNames();
@@ -82,6 +80,9 @@ namespace PortabilityLayer
static int16_t PopUpAlert(const Rect &rect, int dialogResID, const DialogTextSubstitutions *substitutions);
int16_t FileBrowserUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
int16_t PopUpAlertUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
private:
typedef PascalStr<255> NameStr_t;
@@ -92,8 +93,6 @@ namespace PortabilityLayer
};
void ScrollBarCallback(Widget *control, int part);
int16_t FileBrowserUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
int16_t PopUpAlertUIFilter(Dialog *dialog, const TimeTaggedVOSEvent *evt);
static bool FileEntrySortPred(const FileEntry &a, const FileEntry &b);
@@ -114,7 +113,21 @@ namespace PortabilityLayer
const FileBrowserUI_DetailsCallbackAPI m_api;
};
}
static int16_t FileBrowserUIImpl_FileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return static_cast<PortabilityLayer::FileBrowserUIImpl*>(context)->FileBrowserUIFilter(dialog, evt);
}
static int16_t FileBrowserUIImpl_PopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return static_cast<PortabilityLayer::FileBrowserUIImpl*>(context)->PopUpAlertUIFilter(dialog, evt);
}
namespace PortabilityLayer
{
FileBrowserUIImpl::FileBrowserUIImpl(const FileBrowserUI_DetailsCallbackAPI &callbackAPI)
: m_offset(0)
, m_surface(nullptr)
@@ -148,16 +161,6 @@ namespace PortabilityLayer
static_cast<FileBrowserUIImpl*>(captureContext)->ScrollBarCallback(control, part);
}
int16_t FileBrowserUIImpl::PubFileBrowserUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return static_cast<FileBrowserUIImpl*>(context)->FileBrowserUIFilter(dialog, evt);
}
int16_t FileBrowserUIImpl::PubPopUpAlertUIFilter(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt)
{
return static_cast<FileBrowserUIImpl*>(context)->PopUpAlertUIFilter(dialog, evt);
}
bool FileBrowserUIImpl::PubEditBoxCharFilter(void *context, uint8_t ch)
{
uint16_t unicodeChar = MacRoman::ToUnicode(ch);
@@ -356,6 +359,7 @@ namespace PortabilityLayer
if (okayButton->IsEnabled())
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
okayButton->SetHighlightStyle(kControlButtonPart, true);
PLSysCalls::Sleep(8);
okayButton->SetHighlightStyle(kControlButtonPart, false);
@@ -368,6 +372,7 @@ namespace PortabilityLayer
case PL_KEY_SPECIAL(kEscape):
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
Widget *cancelButton = dialog->GetItems()[kCancelButton - 1].GetWidget();
cancelButton->SetHighlightStyle(kControlButtonPart, true);
@@ -555,7 +560,7 @@ namespace PortabilityLayer
int16_t hit = 0;
do
{
hit = dialog->ExecuteModal(nullptr, PubPopUpAlertUIFilter);
hit = dialog->ExecuteModal(nullptr, PL_FILTER_FUNC(FileBrowserUIImpl_PopUpAlertUIFilter));
} while (hit != kOkayButton && hit != kCancelButton);
dialog->Destroy();
@@ -709,7 +714,7 @@ namespace PortabilityLayer
do
{
hit = dialog->ExecuteModal(&uiImpl, FileBrowserUIImpl::PubFileBrowserUIFilter);
hit = dialog->ExecuteModal(&uiImpl, PL_FILTER_FUNC(FileBrowserUIImpl_FileBrowserUIFilter));
if (hit == kFileListScrollBar)
uiImpl.SetScrollOffset(scrollBar->GetState());
@@ -806,3 +811,6 @@ namespace PortabilityLayer
return confirmed;
}
}
PL_IMPLEMENT_FILTER_FUNCTION(FileBrowserUIImpl_FileBrowserUIFilter)
PL_IMPLEMENT_FILTER_FUNCTION(FileBrowserUIImpl_PopUpAlertUIFilter)

View File

@@ -100,6 +100,8 @@ namespace PortabilityLayer
if (!stream)
return nullptr;
fprintf(stderr, "Composite file opened\n");
ZipFileProxy *zipFile = ZipFileProxy::Create(stream);
if (!zipFile)
{
@@ -107,6 +109,8 @@ namespace PortabilityLayer
return nullptr;
}
fprintf(stderr, "Zip proxy created\n");
size_t metaIndex = 0;
if (!zipFile->IndexFile("!!meta", metaIndex))
{
@@ -114,6 +118,8 @@ namespace PortabilityLayer
return nullptr;
}
fprintf(stderr, "Meta file indexed\n");
MacFilePropertiesSerialized mfps;
GpIOStream *metaStream = zipFile->OpenFile(metaIndex);
@@ -124,6 +130,8 @@ namespace PortabilityLayer
return nullptr;
}
fprintf(stderr, "Meta data deserialized\n");
if (!metaStream->ReadExact(mfps.m_data, sizeof(mfps.m_data)))
{
metaStream->Close();
@@ -152,6 +160,8 @@ namespace PortabilityLayer
stream = nullptr;
}
fprintf(stderr, "Composite constructed\n");
CompositeFile *compositeFile = CompositeFileImpl::Create(dirID, filename, stream, zipFile, mfp, hasResources, hasData, hasData ? dataIndex : 0);
if (!compositeFile)
{

View File

@@ -32,8 +32,8 @@ struct IGpDisplayDriver;
class GpAppInterface
{
public:
virtual void ApplicationInit() = 0;
virtual int ApplicationMain() = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL void ApplicationInit() GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL int ApplicationMain() GP_ASYNCIFY_PARANOID_PURE;
virtual void PL_IncrementTickCounter(uint32_t count) = 0;
virtual void PL_Render(IGpDisplayDriver *displayDriver) = 0;
virtual GpDriverCollection *PL_GetDriverCollection() = 0;

View File

@@ -1,17 +1,17 @@
#include "HostSuspendHook.h"
#include "HostSuspendHook.h"
#include "HostSuspendCallArgument.h"
#include "DisplayDeviceManager.h"
#include "PLDrivers.h"
#include "IGpDisplayDriver.h"
namespace PortabilityLayer
{
#include "IGpDisplayDriver.h"
namespace PortabilityLayer
{
void RenderFrames(unsigned int ticks)
{
{
PLDrivers::GetDisplayDriver()->ServeTicks(ticks);
DisplayDeviceManager::GetInstance()->IncrementTickCount(ticks);
}
}
DisplayDeviceManager::GetInstance()->IncrementTickCount(ticks);
}
}

View File

@@ -22,6 +22,7 @@
#include "PLPasStr.h"
#include "PLResources.h"
#include "PLStandardColors.h"
#include "PLSysCalls.h"
#include "PLTimeTaggedVOSEvent.h"
#include "PLQDOffscreen.h"
@@ -153,7 +154,7 @@ namespace PortabilityLayer
uint16_t GetMenuBarHeight() const override;
bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) override;
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) override;
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_OVERRIDE;
void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) override;
void DrawMenuBar() override;
@@ -709,7 +710,13 @@ namespace PortabilityLayer
bool canDismiss = false;
while (!canDismiss)
{
if (WaitForEvent(&evt, 1))
bool haveEvent = false;
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
haveEvent = WaitForEvent(&evt, 1);
}
if (haveEvent)
{
if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput)
{
@@ -1576,4 +1583,11 @@ namespace PortabilityLayer
{
return MenuManagerImpl::GetInstance();
}
#ifdef GP_ASYNCIFY_PARANOID
void MenuManager::MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem)
{
static_cast<MenuManagerImpl*>(this)->MenuSelect(initialPoint, outMenu, outItem);
}
#endif
}

View File

@@ -4,6 +4,7 @@
#include <stddef.h>
#include "PLErrorCodes.h"
#include "CoreDefs.h"
template<class T>
class THandle;
@@ -48,7 +49,7 @@ namespace PortabilityLayer
virtual uint16_t GetMenuBarHeight() const = 0;
virtual bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) = 0;
virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_PURE;
virtual void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) = 0;
virtual void DrawMenuBar() = 0;

View File

@@ -1,10 +1,11 @@
#include "PLButtonWidget.h"
#include "PLCore.h"
#include "PLControlDefinitions.h"
#include "PLRegions.h"
#include "PLTimeTaggedVOSEvent.h"
#include "PLStandardColors.h"
#include "PLQDraw.h"
#include "PLRegions.h"
#include "PLStandardColors.h"
#include "PLSysCalls.h"
#include "PLTimeTaggedVOSEvent.h"
#include "FontFamily.h"
#include "RenderedFont.h"
#include "GpRenderedFontMetrics.h"
@@ -13,10 +14,10 @@
#include <algorithm>
static const int kLightGray = 238;
static const int kMidGray = 221;
static const int kMidDarkGray = 170;
static const int kDarkGray = 102;
static const int kButtonLightGray = 238;
static const int kButtonMidGray = 221;
static const int kButtonMidDarkGray = 170;
static const int kButtonDarkGray = 102;
#ifdef CLR
#undef CLR
@@ -27,28 +28,28 @@ static const int kDarkGray = 102;
static const PortabilityLayer::RGBAColor gs_buttonTopLeftCornerGraphicPixels[] =
{
CLR(0), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(kMidGray),
CLR(0), CLR(kMidGray), CLR(255)
CLR(0), CLR(0), CLR(kButtonMidGray),
CLR(0), CLR(kButtonMidGray), CLR(255)
};
static const PortabilityLayer::RGBAColor gs_buttonTopRightCornerGraphicPixels[] =
{
CLR(0), CLR(0), CLR(0),
CLR(kMidGray), CLR(0), CLR(0),
CLR(255), CLR(kMidGray), CLR(0)
CLR(kButtonMidGray), CLR(0), CLR(0),
CLR(255), CLR(kButtonMidGray), CLR(0)
};
static const PortabilityLayer::RGBAColor gs_buttonBottomLeftCornerGraphicPixels[] =
{
CLR(0), CLR(kMidGray), CLR(255),
CLR(0), CLR(0), CLR(kMidGray),
CLR(0), CLR(kButtonMidGray), CLR(255),
CLR(0), CLR(0), CLR(kButtonMidGray),
CLR(0), CLR(0), CLR(0)
};
static const PortabilityLayer::RGBAColor gs_buttonBottomRightCornerGraphicPixels[] =
{
CLR(kMidGray), CLR(kDarkGray), CLR(0),
CLR(kDarkGray), CLR(0), CLR(0),
CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
CLR(kButtonDarkGray), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(0)
};
@@ -57,28 +58,28 @@ static const PortabilityLayer::RGBAColor gs_buttonBottomRightCornerGraphicPixels
static const PortabilityLayer::RGBAColor gs_buttonPressedTopLeftCornerGraphicPixels[] =
{
CLR(0), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(kDarkGray),
CLR(0), CLR(kDarkGray), CLR(kDarkGray)
CLR(0), CLR(0), CLR(kButtonDarkGray),
CLR(0), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
};
static const PortabilityLayer::RGBAColor gs_buttonPressedTopRightCornerGraphicPixels[] =
{
CLR(0), CLR(0), CLR(0),
CLR(kDarkGray), CLR(0), CLR(0),
CLR(kDarkGray), CLR(kDarkGray), CLR(0)
CLR(kButtonDarkGray), CLR(0), CLR(0),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(0)
};
static const PortabilityLayer::RGBAColor gs_buttonPressedBottomLeftCornerGraphicPixels[] =
{
CLR(0), CLR(kDarkGray), CLR(kDarkGray),
CLR(0), CLR(0), CLR(kDarkGray),
CLR(0), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
CLR(0), CLR(0), CLR(kButtonDarkGray),
CLR(0), CLR(0), CLR(0)
};
static const PortabilityLayer::RGBAColor gs_buttonPressedBottomRightCornerGraphicPixels[] =
{
CLR(kDarkGray), CLR(kDarkGray), CLR(0),
CLR(kDarkGray), CLR(0), CLR(0),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(0),
CLR(kButtonDarkGray), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(0)
};
@@ -86,30 +87,30 @@ static const PortabilityLayer::RGBAColor gs_buttonPressedBottomRightCornerGraphi
static const PortabilityLayer::RGBAColor gs_buttonDisabledTopLeftCornerGraphicPixels[] =
{
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray),
CLR(kDarkGray), CLR(kDarkGray), CLR(kLightGray),
CLR(kDarkGray), CLR(kLightGray), CLR(kLightGray)
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonLightGray),
CLR(kButtonDarkGray), CLR(kButtonLightGray), CLR(kButtonLightGray)
};
static const PortabilityLayer::RGBAColor gs_buttonDisabledTopRightCornerGraphicPixels[] =
{
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray),
CLR(kLightGray), CLR(kDarkGray), CLR(kDarkGray),
CLR(kLightGray), CLR(kLightGray), CLR(kDarkGray)
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
CLR(kButtonLightGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
CLR(kButtonLightGray), CLR(kButtonLightGray), CLR(kButtonDarkGray)
};
static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomLeftCornerGraphicPixels[] =
{
CLR(kDarkGray), CLR(kLightGray), CLR(kLightGray),
CLR(kDarkGray), CLR(kDarkGray), CLR(kLightGray),
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray)
CLR(kButtonDarkGray), CLR(kButtonLightGray), CLR(kButtonLightGray),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonLightGray),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
};
static const PortabilityLayer::RGBAColor gs_buttonDisabledBottomRightCornerGraphicPixels[] =
{
CLR(kLightGray), CLR(kLightGray), CLR(kDarkGray),
CLR(kLightGray), CLR(kDarkGray), CLR(kDarkGray),
CLR(kDarkGray), CLR(kDarkGray), CLR(kDarkGray)
CLR(kButtonLightGray), CLR(kButtonLightGray), CLR(kButtonDarkGray),
CLR(kButtonLightGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray),
CLR(kButtonDarkGray), CLR(kButtonDarkGray), CLR(kButtonDarkGray)
};
// Default boundary
@@ -118,35 +119,35 @@ static const PortabilityLayer::RGBAColor gs_buttonDefaultTopLeftCornerGraphicPix
{
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(0), CLR(0), CLR(255),
CLR(0), CLR(0), CLR(0), CLR(255), CLR(kMidGray),
CLR(0), CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray),
CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray), CLR(0),
CLR(0), CLR(0), CLR(0), CLR(255), CLR(kButtonMidGray),
CLR(0), CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray),
CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0),
};
static const PortabilityLayer::RGBAColor gs_buttonDefaultTopRightCornerGraphicPixels[] =
{
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
CLR(255), CLR(0), CLR(0), CLR(0), CLR(0),
CLR(kMidGray), CLR(kMidGray), CLR(0), CLR(0), CLR(0),
CLR(kMidGray), CLR(kMidGray), CLR(kMidGray), CLR(0), CLR(0),
CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0),
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0), CLR(0), CLR(0),
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0), CLR(0),
CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
};
static const PortabilityLayer::RGBAColor gs_buttonDefaultBottomLeftCornerGraphicPixels[] =
{
CLR(0), CLR(255), CLR(kMidGray), CLR(kMidGray), CLR(0),
CLR(0), CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kMidGray),
CLR(0), CLR(0), CLR(0), CLR(kMidGray), CLR(kMidGray),
CLR(0), CLR(0), CLR(0), CLR(0), CLR(kDarkGray),
CLR(0), CLR(255), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(0),
CLR(0), CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonMidGray),
CLR(0), CLR(0), CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray),
CLR(0), CLR(0), CLR(0), CLR(0), CLR(kButtonDarkGray),
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
};
static const PortabilityLayer::RGBAColor gs_buttonDefaultBottomRightCornerGraphicPixels[] =
{
CLR(0), CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0),
CLR(kMidGray), CLR(kMidGray), CLR(kDarkGray), CLR(0), CLR(0),
CLR(kMidGray), CLR(kDarkGray), CLR(0), CLR(0), CLR(0),
CLR(kDarkGray), CLR(0), CLR(0), CLR(0), CLR(0),
CLR(0), CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0),
CLR(kButtonMidGray), CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0), CLR(0),
CLR(kButtonMidGray), CLR(kButtonDarkGray), CLR(0), CLR(0), CLR(0),
CLR(kButtonDarkGray), CLR(0), CLR(0), CLR(0), CLR(0),
CLR(0), CLR(0), CLR(0), CLR(0), CLR(0),
};
@@ -154,15 +155,15 @@ static const PortabilityLayer::RGBAColor gs_buttonRadioGraphicPixels[] =
{
CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(0),CLR(255),CLR(255),CLR(255),CLR(255),CLR(255),CLR(255),CLR(0),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(255),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(0),CLR(0),
CLR(0),CLR(255),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kLightGray),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kLightGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),
CLR(0),CLR(0),CLR(kMidGray),CLR(kMidGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kMidDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(0),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(kDarkGray),CLR(0),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(255),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(0),CLR(0),
CLR(0),CLR(255),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kButtonLightGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(255),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),
CLR(0),CLR(0),CLR(kButtonMidGray),CLR(kButtonMidGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonMidDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(0),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(kButtonDarkGray),CLR(0),CLR(0),CLR(0),
CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),CLR(0),
};
@@ -222,7 +223,7 @@ namespace PortabilityLayer
}
ButtonWidget::ButtonWidget(const WidgetBasicState &state)
: WidgetSpec<ButtonWidget>(state)
: WidgetSpec<ButtonWidget, WidgetTypes::kButton>(state)
, m_text(state.m_text)
, m_haveHighlightOverride(false)
, m_buttonStyle(kButtonStyle_Button)
@@ -280,7 +281,13 @@ namespace PortabilityLayer
}
TimeTaggedVOSEvent evt;
if (WaitForEvent(&evt, 1))
bool haveEvent = false;
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
haveEvent = WaitForEvent(&evt, 1);
}
if (haveEvent)
{
if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput)
{
@@ -363,45 +370,45 @@ namespace PortabilityLayer
if (!m_enabled)
{
cornerGraphics = gs_buttonDisabledCornerGraphics;
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
textColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
borderColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
textColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
borderColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
}
else if (inverted || m_haveHighlightOverride)
{
cornerGraphics = gs_buttonPressedCornerGraphics;
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
topStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
leftStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
textColor = StdColors::White();
borderColor = StdColors::Black();
}
else
{
cornerGraphics = gs_buttonCornerGraphics;
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
topStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
topStripeColors[1] = StdColors::White();
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
leftStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
leftStripeColors[1] = StdColors::White();
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
bottomStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
bottomStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
rightStripeColors[0] = PortabilityLayer::RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
rightStripeColors[1] = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
centerColor = PortabilityLayer::RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
textColor = StdColors::Black();
borderColor = StdColors::Black();
}
@@ -469,9 +476,9 @@ namespace PortabilityLayer
ResolveCachingColor *checkEraseColor = nullptr;
ResolveCachingColor *textColor = nullptr;
ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
ResolveCachingColor lightGrayColor = RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
ResolveCachingColor midGrayColor = RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
ResolveCachingColor lightGrayColor = RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
ResolveCachingColor darkGrayColor = RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
ResolveCachingColor blackColor = StdColors::Black();
if (!m_enabled)
@@ -558,9 +565,9 @@ namespace PortabilityLayer
ResolveCachingColor *radioColor = nullptr;
ResolveCachingColor *textColor = nullptr;
ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
ResolveCachingColor lightGrayColor = RGBAColor::Create(kLightGray, kLightGray, kLightGray, 255);
ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
ResolveCachingColor midGrayColor = RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255);
ResolveCachingColor lightGrayColor = RGBAColor::Create(kButtonLightGray, kButtonLightGray, kButtonLightGray, 255);
ResolveCachingColor darkGrayColor = RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255);
if (!m_enabled)
{
@@ -613,15 +620,15 @@ namespace PortabilityLayer
RGBAColor upperLeftStripeColors[3] =
{
RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255),
RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255),
StdColors::White(),
StdColors::Black(),
};
RGBAColor bottomRightStripeColors[3] =
{
RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255),
RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255),
RGBAColor::Create(kButtonMidGray, kButtonMidGray, kButtonMidGray, 255),
RGBAColor::Create(kButtonDarkGray, kButtonDarkGray, kButtonDarkGray, 255),
StdColors::Black(),
};
@@ -653,3 +660,5 @@ namespace PortabilityLayer
}
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kButton, PortabilityLayer::ButtonWidget)

View File

@@ -5,7 +5,7 @@
namespace PortabilityLayer
{
class ButtonWidget final : public WidgetSpec<ButtonWidget>
class ButtonWidget final : public WidgetSpec<ButtonWidget, WidgetTypes::kButton>
{
public:
enum ButtonStyle
@@ -30,10 +30,10 @@ namespace PortabilityLayer
void SetString(const PLPasStr &str) override;
PLPasStr GetString() const override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
void OnEnabledChanged() override;
void OnStateChanged() override;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
void SetHighlightStyle(int16_t style, bool enabled) override;
static void DrawDefaultButtonChrome(const Rect &rect, DrawSurface *surface);

View File

@@ -89,26 +89,6 @@ void SelectDialogItemText(Dialog *dialog, int item, int firstSelChar, int lastSe
widget->SetSelection(firstSelChar, lastSelCharExclusive);
}
ModalFilterUPP NewModalFilterUPP(ModalFilterUPP func)
{
return func;
}
void ModalDialog(ModalFilterUPP filter, short *item)
{
PL_NotYetImplemented();
}
void DisposeModalFilterUPP(ModalFilterUPP upp)
{
PL_NotYetImplemented();
}
void ShowDialogItem(Dialog *dialog, int item)
{
PL_NotYetImplemented();
}
void HideDialogItem(Dialog *dialog, int item)
{
PortabilityLayer::Widget *widget = dialog->GetItems()[item - 1].GetWidget();

View File

@@ -14,7 +14,79 @@ class PLPasStr;
struct Control;
struct Dialog;
#if GP_ASYNCIFY_PARANOID
namespace DialogFilterFuncs
{
enum DialogFilterFunc
{
kBlowerFilter,
kFurnitureFilter,
kCustPictFilter,
kSwitchFilter,
kTriggerFilter,
kApplianceFilter,
kMicrowaveFilter,
kGreaseFilter,
kInvisBonusFilter,
kTransFilter,
kEnemyFilter,
kFlowerFilter,
kLightFilter,
kGoToFilter,
kRoomFilter,
kOriginalArtFilter,
kAboutFilter,
kLicenseReaderFilter,
kLoadFilter,
kAboutFrameworkFilter,
kBrainsFilter,
kNameFilter,
kBannerFilter,
kControlFilter,
kSoundFilter,
kHouseFilter,
kDisplayFilter,
kPrefsFilter,
kFileBrowserUIImpl_PopUpAlertUIFilter,
kFileBrowserUIImpl_FileBrowserUIFilter,
kDialogManagerImpl_AlertFilter,
};
template<int TFilterFuncID>
int16_t InvokeWrapperThunk(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
template<DialogFilterFunc TFilterFuncID>
class InvokeWrapper
{
public:
inline int16_t operator()(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) const
{
return InvokeWrapperThunk<TFilterFuncID>(context, dialog, evt);
}
};
}
typedef DialogFilterFuncs::DialogFilterFunc DialogFilterFunc_t;
#define PL_FILTER_FUNC(f) DialogFilterFuncs::k##f, DialogFilterFuncs::InvokeWrapper<DialogFilterFuncs::k##f>()
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl) \
template<> \
int16_t DialogFilterFuncs::InvokeWrapperThunk<DialogFilterFuncs::k##f>(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt) \
{ \
return impl(context, dialog, evt); \
}
#define PL_IMPLEMENT_FILTER_FUNCTION(f) PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, f)
#else
typedef int16_t(*DialogFilterFunc_t)(void *context, Dialog *dialog, const TimeTaggedVOSEvent *evt);
#define PL_FILTER_FUNC(f) f
#define PL_IMPLEMENT_FILTER_FUNCTION_THUNK(f, impl)
#define PL_IMPLEMENT_FILTER_FUNCTION(f)
#endif
struct DialogTextSubstitutions
{
@@ -39,7 +111,12 @@ struct Dialog
virtual void SetItemVisibility(unsigned int itemIndex, bool isVisible) = 0;
#if GP_ASYNCIFY_PARANOID
template<class TFilterFunc>
int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFuncID, const TFilterFunc &filterFunc);
#else
virtual int16_t ExecuteModal(void *captureContext, DialogFilterFunc_t filterFunc) = 0;
#endif
virtual bool ReplaceWidget(unsigned int itemIndex, PortabilityLayer::Widget *widget) = 0;
};
@@ -56,7 +133,5 @@ void SetDialogItemText(THandle<Control> handle, const PLPasStr &str);
void SelectDialogItemText(Dialog *dialog, int item, int firstSelChar, int lastSelCharExclusive);
void ModalDialog(ModalFilterUPP filter, short *item);
void ShowDialogItem(Dialog *dialog, int item);
void HideDialogItem(Dialog *dialog, int item);

View File

@@ -26,7 +26,7 @@
namespace PortabilityLayer
{
EditboxWidget::EditboxWidget(const WidgetBasicState &state)
: WidgetSpec<EditboxWidget>(state)
: WidgetSpec<EditboxWidget, WidgetTypes::kEditbox>(state)
, m_capacity(255)
, m_length(0)
, m_chars(nullptr)
@@ -351,6 +351,11 @@ namespace PortabilityLayer
return WidgetHandleStates::kIgnored;
}
int16_t EditboxWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return DefaultCapture(captureContext, pos, callback);
}
Rect EditboxWidget::GetExpandedRect() const
{
return GetRect().Inset(-3, -3);
@@ -1394,4 +1399,7 @@ namespace PortabilityLayer
{ 0xf5, EditboxWidget::CharacterCategory_AlphaNumeric },
{ 0xff, EditboxWidget::CharacterCategory_Punctuation },
};
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kEditbox, PortabilityLayer::EditboxWidget)

View File

@@ -8,7 +8,7 @@ struct DrawSurface;
namespace PortabilityLayer
{
class EditboxWidget final : public WidgetSpec<EditboxWidget>
class EditboxWidget final : public WidgetSpec<EditboxWidget, WidgetTypes::kEditbox>
{
public:
typedef bool (*CharacterFilterCallback_t)(void *context, uint8_t character);
@@ -25,7 +25,8 @@ namespace PortabilityLayer
void GainFocus() override;
void LoseFocus() override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
Rect GetExpandedRect() const override;

View File

@@ -9,7 +9,7 @@
namespace PortabilityLayer
{
IconWidget::IconWidget(const WidgetBasicState &state)
: WidgetSpec<IconWidget>(state)
: WidgetSpec<IconWidget, WidgetTypes::kIcon>(state)
{
}
@@ -58,4 +58,11 @@ namespace PortabilityLayer
else
return WidgetHandleStates::kIgnored;
}
int16_t IconWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return DefaultCapture(captureContext, pos, callback);
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kIcon, PortabilityLayer::IconWidget)

View File

@@ -7,7 +7,7 @@ namespace PortabilityLayer
{
class PixMapImpl;
class IconWidget final : public WidgetSpec<IconWidget>
class IconWidget final : public WidgetSpec<IconWidget, WidgetTypes::kIcon>
{
public:
IconWidget(const WidgetBasicState &state);
@@ -17,7 +17,8 @@ namespace PortabilityLayer
void DrawControl(DrawSurface *surface) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
private:
THandle<PixMapImpl> m_iconImage;

View File

@@ -5,7 +5,7 @@
namespace PortabilityLayer
{
ImageWidget::ImageWidget(const WidgetBasicState &state)
: WidgetSpec<ImageWidget>(state)
: WidgetSpec<ImageWidget, WidgetTypes::kImage>(state)
{
}
@@ -28,4 +28,16 @@ namespace PortabilityLayer
if (m_pict && m_rect.IsValid())
surface->DrawPicture(m_pict, m_rect);
}
WidgetHandleState_t ImageWidget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
{
return DefaultProcessEvent(captureContext, evt);
}
int16_t ImageWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return DefaultCapture(captureContext, pos, callback);
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kImage, PortabilityLayer::ImageWidget)

View File

@@ -7,7 +7,7 @@ struct BitmapImage;
namespace PortabilityLayer
{
class ImageWidget final : public WidgetSpec<ImageWidget>
class ImageWidget final : public WidgetSpec<ImageWidget, WidgetTypes::kImage>
{
public:
ImageWidget(const WidgetBasicState &state);
@@ -16,6 +16,9 @@ namespace PortabilityLayer
bool Init(const WidgetBasicState &state, const void *additionalData) override;
void DrawControl(DrawSurface *surface) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
private:
THandle<BitmapImage> m_pict;
};

View File

@@ -5,7 +5,7 @@
namespace PortabilityLayer
{
InvisibleWidget::InvisibleWidget(const WidgetBasicState &state)
: WidgetSpec<InvisibleWidget>(state)
: WidgetSpec<InvisibleWidget, WidgetTypes::kInvisible>(state)
, m_clickable(state.m_enabled)
{
}
@@ -31,4 +31,11 @@ namespace PortabilityLayer
else
return WidgetHandleStates::kIgnored;
}
int16_t InvisibleWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return DefaultCapture(captureContext, pos, callback);
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kInvisible, PortabilityLayer::InvisibleWidget)

View File

@@ -4,7 +4,7 @@
namespace PortabilityLayer
{
class InvisibleWidget final : public WidgetSpec<InvisibleWidget>
class InvisibleWidget final : public WidgetSpec<InvisibleWidget, WidgetTypes::kInvisible>
{
public:
explicit InvisibleWidget(const WidgetBasicState &state);
@@ -12,7 +12,8 @@ namespace PortabilityLayer
bool Init(const WidgetBasicState &state, const void *additionalData) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
private:
bool m_clickable;

View File

@@ -11,7 +11,7 @@
namespace PortabilityLayer
{
LabelWidget::LabelWidget(const WidgetBasicState &state)
: WidgetSpec<LabelWidget>(state)
: WidgetSpec<LabelWidget, WidgetTypes::kLabel>(state)
, m_text(state.m_text)
{
}
@@ -46,4 +46,16 @@ namespace PortabilityLayer
surface->DrawStringWrap(textStartPoint, m_rect, m_text.ToShortStr(), blackColor, sysFont);
}
WidgetHandleState_t LabelWidget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
{
return DefaultProcessEvent(captureContext, evt);
}
int16_t LabelWidget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return DefaultCapture(captureContext, pos, callback);
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kLabel, PortabilityLayer::LabelWidget)

View File

@@ -5,7 +5,7 @@
namespace PortabilityLayer
{
class LabelWidget final : public WidgetSpec<LabelWidget>
class LabelWidget final : public WidgetSpec<LabelWidget, WidgetTypes::kLabel>
{
public:
LabelWidget(const WidgetBasicState &state);
@@ -17,6 +17,9 @@ namespace PortabilityLayer
void DrawControl(DrawSurface *surface) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
private:
PascalStr<255> m_text;
};

View File

@@ -12,15 +12,15 @@
#include "FontFamily.h"
#include "Vec2i.h"
static const int kLightGray = 238;
static const int kMidGray = 221;
static const int kMidDarkGray = 170;
static const int kDarkGray = 102;
static const int kPopupMenuLightGray = 238;
static const int kPopupMenuMidGray = 221;
static const int kPopupMenuMidDarkGray = 170;
static const int kPopupMenuDarkGray = 102;
namespace PortabilityLayer
{
PopupMenuWidget::PopupMenuWidget(const WidgetBasicState &state)
: WidgetSpec<PopupMenuWidget>(state)
: WidgetSpec<PopupMenuWidget, WidgetTypes::kPopupMenu>(state)
{
}
@@ -82,8 +82,8 @@ namespace PortabilityLayer
PortabilityLayer::ResolveCachingColor whiteColor = StdColors::White();
PortabilityLayer::ResolveCachingColor blackColor = StdColors::Black();
PortabilityLayer::ResolveCachingColor midGrayColor = RGBAColor::Create(kMidGray, kMidGray, kMidGray, 255);
PortabilityLayer::ResolveCachingColor darkGrayColor = RGBAColor::Create(kDarkGray, kDarkGray, kDarkGray, 255);
PortabilityLayer::ResolveCachingColor midGrayColor = RGBAColor::Create(kPopupMenuMidGray, kPopupMenuMidGray, kPopupMenuMidGray, 255);
PortabilityLayer::ResolveCachingColor darkGrayColor = RGBAColor::Create(kPopupMenuDarkGray, kPopupMenuDarkGray, kPopupMenuDarkGray, 255);
const Rect rect = m_rect;
const Rect innerRect = rect.Inset(2, 2);
@@ -144,3 +144,5 @@ namespace PortabilityLayer
return m_menu;
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kPopupMenu, PortabilityLayer::PopupMenuWidget)

View File

@@ -7,15 +7,15 @@ struct Menu;
namespace PortabilityLayer
{
class PopupMenuWidget final : public WidgetSpec<PopupMenuWidget>
class PopupMenuWidget final : public WidgetSpec<PopupMenuWidget, WidgetTypes::kPopupMenu>
{
public:
explicit PopupMenuWidget(const WidgetBasicState &state);
bool Init(const WidgetBasicState &state, const void *additionalData) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
void DrawControl(DrawSurface *surface) override;
void OnStateChanged() override;

View File

@@ -184,9 +184,12 @@ namespace PortabilityLayer
GpIOStream *fStream = nullptr;
ZipFileProxy *proxy = nullptr;
bool proxyIsShared = false;
fprintf(stderr, "Trying to open resource file\n");
if (file->OpenResources(fStream, proxy, proxyIsShared) != PLErrors::kNone)
return nullptr;
fprintf(stderr, "Creating resource archive\n");
IResourceArchive *archive = ResourceArchiveZipFile::Create(proxy, proxyIsShared, fStream);
if (!archive)
{

View File

@@ -9,7 +9,7 @@
namespace PortabilityLayer
{
ScrollBarWidget::ScrollBarWidget(const WidgetBasicState &state)
: WidgetSpec<ScrollBarWidget>(state)
: WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>(state)
, m_min(0)
, m_max(0)
, m_gripSize(0)
@@ -260,11 +260,11 @@ namespace PortabilityLayer
void ScrollBarWidget::SetState(int16_t state)
{
if (state < m_min)
WidgetSpec<ScrollBarWidget>::SetState(m_min);
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(m_min);
else if (state > m_max)
WidgetSpec<ScrollBarWidget>::SetState(m_max);
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(m_max);
else
WidgetSpec<ScrollBarWidget>::SetState(state);
WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>::SetState(state);
}
void ScrollBarWidget::OnStateChanged()
@@ -486,3 +486,5 @@ namespace PortabilityLayer
return kControlDownButtonPart;
}
}
PL_IMPLEMENT_WIDGET_TYPE(PortabilityLayer::WidgetTypes::kScrollBar, PortabilityLayer::ScrollBarWidget)

View File

@@ -7,7 +7,7 @@ struct Rect;
namespace PortabilityLayer
{
class ScrollBarWidget final : public WidgetSpec<ScrollBarWidget>
class ScrollBarWidget final : public WidgetSpec<ScrollBarWidget, WidgetTypes::kScrollBar>
{
public:
explicit ScrollBarWidget(const WidgetBasicState &state);
@@ -15,7 +15,7 @@ namespace PortabilityLayer
bool Init(const WidgetBasicState &state, const void *additionalData) override;
void OnEnabledChanged() override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) override;
WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_OVERRIDE;
void DrawControl(DrawSurface *surface) override;
void SetState(int16_t state) override;
@@ -24,7 +24,7 @@ namespace PortabilityLayer
void SetMin(int32_t v) override;
void SetMax(int32_t v) override;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) override;
int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_OVERRIDE;
int ResolvePart(const Point &point) const override;

View File

@@ -15,6 +15,7 @@
#include "MacRomanConversion.h"
#include "PLDrivers.h"
#include "CoreDefs.h"
#include <assert.h>
#include <setjmp.h>
@@ -173,10 +174,35 @@ static void ImportVOSEvents(uint32_t timestamp)
namespace PLSysCalls
{
// Asyncify disarm checks are for manually checking that a stack has no indirect calls.
// They should not be nested!
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
static bool g_asyncifyParanoidDisarmed = false;
void AsyncifyParanoidSetDisarmed(bool state)
{
assert(g_asyncifyParanoidDisarmed != state);
g_asyncifyParanoidDisarmed = state;
}
AsyncifyDisarmScope::AsyncifyDisarmScope()
{
AsyncifyParanoidSetDisarmed(true);
}
AsyncifyDisarmScope::~AsyncifyDisarmScope()
{
AsyncifyParanoidSetDisarmed(false);
}
#endif
void Sleep(uint32_t ticks)
{
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
assert(g_asyncifyParanoidDisarmed);
#endif
if (ticks > 0)
{
{
PortabilityLayer::RenderFrames(ticks);
ImportVOSEvents(PortabilityLayer::DisplayDeviceManager::GetInstance()->GetTickCount());
@@ -190,8 +216,12 @@ namespace PLSysCalls
void Exit(int exitCode)
{
#if GP_ASYNCIFY_PARANOID
exit(exitCode);
#else
gs_exitCode = exitCode;
longjmp(gs_mainExitWrapper, 1);
#endif
}
int MainExitWrapper(int (*mainFunc)())

View File

@@ -1,5 +1,6 @@
#pragma once
#include "CoreDefs.h"
#include "VirtualDirectory.h"
#include <stdint.h>
@@ -9,5 +10,18 @@ namespace PLSysCalls
void Sleep(uint32_t ticks);
void Exit(int exitCode);
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
class AsyncifyDisarmScope
{
public:
AsyncifyDisarmScope();
~AsyncifyDisarmScope();
};
#define PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE() PLSysCalls::AsyncifyDisarmScope disarmScope
#else
#define PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE()
#endif
int MainExitWrapper(int (*mainFunc)());
}

View File

@@ -17,14 +17,14 @@ namespace PortabilityLayer
{
}
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
WidgetHandleState_t Widget::DefaultProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
{
(void)evt;
return WidgetHandleStates::kIgnored;
}
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
int16_t Widget::DefaultCapture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return 0;
}
@@ -34,6 +34,68 @@ namespace PortabilityLayer
(void)surface;
}
#if GP_ASYNCIFY_PARANOID
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
{
switch (this->GetWidgetType())
{
case WidgetTypes::kButton:
return DispatchDynProcessEvent<WidgetTypes::kButton>(this, captureContext, evt);
case WidgetTypes::kPopupMenu:
return DispatchDynProcessEvent<WidgetTypes::kPopupMenu>(this, captureContext, evt);
case WidgetTypes::kEditbox:
return DispatchDynProcessEvent<WidgetTypes::kEditbox>(this, captureContext, evt);
case WidgetTypes::kIcon:
return DispatchDynProcessEvent<WidgetTypes::kIcon>(this, captureContext, evt);
case WidgetTypes::kImage:
return DispatchDynProcessEvent<WidgetTypes::kImage>(this, captureContext, evt);
case WidgetTypes::kInvisible:
return DispatchDynProcessEvent<WidgetTypes::kInvisible>(this, captureContext, evt);
case WidgetTypes::kLabel:
return DispatchDynProcessEvent<WidgetTypes::kLabel>(this, captureContext, evt);
case WidgetTypes::kScrollBar:
return DispatchDynProcessEvent<WidgetTypes::kScrollBar>(this, captureContext, evt);
default:
return WidgetHandleStates::kIgnored;
}
}
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
switch (this->GetWidgetType())
{
case WidgetTypes::kButton:
return DispatchDynCapture<WidgetTypes::kButton>(this, captureContext, pos, callback);
case WidgetTypes::kPopupMenu:
return DispatchDynCapture<WidgetTypes::kPopupMenu>(this, captureContext, pos, callback);
case WidgetTypes::kEditbox:
return DispatchDynCapture<WidgetTypes::kEditbox>(this, captureContext, pos, callback);
case WidgetTypes::kIcon:
return DispatchDynCapture<WidgetTypes::kIcon>(this, captureContext, pos, callback);
case WidgetTypes::kImage:
return DispatchDynCapture<WidgetTypes::kImage>(this, captureContext, pos, callback);
case WidgetTypes::kInvisible:
return DispatchDynCapture<WidgetTypes::kInvisible>(this, captureContext, pos, callback);
case WidgetTypes::kLabel:
return DispatchDynCapture<WidgetTypes::kLabel>(this, captureContext, pos, callback);
case WidgetTypes::kScrollBar:
return DispatchDynCapture<WidgetTypes::kScrollBar>(this, captureContext, pos, callback);
default:
return -1;
}
}
#else
WidgetHandleState_t Widget::ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt)
{
return this->DefaultProcessEvent(captureContext, evt);
}
int16_t Widget::Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback)
{
return this->DefaultCapture(captureContext, pos, callback);
}
#endif
void Widget::SetMin(int32_t v)
{
}

View File

@@ -25,7 +25,47 @@ namespace PortabilityLayer
typedef WidgetHandleStates::WidgetHandleState WidgetHandleState_t;
typedef void (*WidgetUpdateCallback_t)(void *captureContext, Widget *control, int part);
namespace WidgetTypes
{
enum WidgetType
{
kButton,
kPopupMenu,
kEditbox,
kIcon,
kImage,
kInvisible,
kLabel,
kScrollBar,
};
}
typedef WidgetTypes::WidgetType WidgetType_t;
typedef void(*WidgetUpdateCallback_t)(void *captureContext, Widget *control, int part);
#if GP_ASYNCIFY_PARANOID
template<WidgetType_t TWidgetType>
WidgetHandleState_t DispatchDynProcessEvent(Widget *widget, void *captureContext, const TimeTaggedVOSEvent &evt);
template<WidgetType_t TWidgetType>
int16_t DispatchDynCapture(Widget *widget, void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
#define PL_IMPLEMENT_WIDGET_TYPE(typeID, type) \
template<> \
PortabilityLayer::WidgetHandleState_t PortabilityLayer::DispatchDynProcessEvent<typeID>(Widget *widget, void *captureContext, const TimeTaggedVOSEvent &evt) \
{ \
return static_cast<type*>(widget)->ProcessEvent(captureContext, evt); \
} \
template<> \
int16_t PortabilityLayer::DispatchDynCapture<typeID>(Widget *widget, void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) \
{ \
return static_cast<type*>(widget)->Capture(captureContext, pos, callback); \
}
#else
#define PL_IMPLEMENT_WIDGET_TYPE(typeID, type)
#endif
struct WidgetBasicState
{
@@ -48,9 +88,12 @@ namespace PortabilityLayer
{
public:
virtual bool Init(const WidgetBasicState &state, const void *additionalData) = 0;
virtual WidgetType_t GetWidgetType() const = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt) GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback) GP_ASYNCIFY_PARANOID_PURE;
virtual void Destroy() = 0;
virtual WidgetHandleState_t ProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt);
virtual int16_t Capture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
virtual void DrawControl(DrawSurface *surface);
virtual void SetMin(int32_t v);
@@ -100,6 +143,9 @@ namespace PortabilityLayer
static void BaseRelease(void *storage);
static void *BaseAlloc(size_t sz);
WidgetHandleState_t DefaultProcessEvent(void *captureContext, const TimeTaggedVOSEvent &evt);
int16_t DefaultCapture(void *captureContext, const Point &pos, WidgetUpdateCallback_t callback);
Window *m_window;
Rect m_rect;
uint32_t m_referenceConstant;
@@ -115,7 +161,7 @@ namespace PortabilityLayer
namespace PortabilityLayer
{
template<class T>
template<class T, WidgetType_t TWidgetType>
class WidgetSpec : public Widget
{
public:
@@ -130,6 +176,11 @@ namespace PortabilityLayer
Widget::BaseRelease(static_cast<T*>(this));
}
WidgetType_t GetWidgetType() const override
{
return TWidgetType;
}
static T *Create(const WidgetBasicState &state, const void *additionalData)
{
void *storage = Widget::BaseAlloc(sizeof(T));
@@ -139,7 +190,7 @@ namespace PortabilityLayer
T *widgetT = new (storage) T(state);
// Conversion check
WidgetSpec<T> *downcastWidget = widgetT;
WidgetSpec<T, TWidgetType> *downcastWidget = widgetT;
(void)downcastWidget;
Widget *widget = widgetT;

View File

@@ -0,0 +1,86 @@
#include "AntiAliasTable.cpp"
#include "AppEventHandler.cpp"
#include "BinHex4.cpp"
#include "BitmapImage.cpp"
#include "ByteSwap.cpp"
#include "CFileStream.cpp"
#include "DeflateCodec.cpp"
#include "DialogManager.cpp"
#include "DisplayDeviceManager.cpp"
#include "EllipsePlotter.cpp"
#include "FileBrowserUI.cpp"
#include "FileManager.cpp"
#include "FileSectionStream.cpp"
#include "FontFamily.cpp"
#include "FontManager.cpp"
#include "FontRenderer.cpp"
#include "GPArchive.cpp"
#include "HostSuspendHook.cpp"
#include "IconLoader.cpp"
#include "InflateStream.cpp"
#include "InputManager.cpp"
#include "LinePlotter.cpp"
#include "MacBinary2.cpp"
#include "MacFileInfo.cpp"
#include "MacFileMem.cpp"
#include "MemoryManager.cpp"
#include "MemReaderStream.cpp"
#include "MenuManager.cpp"
#include "MMBlock.cpp"
#include "MMHandleBlock.cpp"
#include "PLApplication.cpp"
#include "PLButtonWidget.cpp"
#include "PLControlDefinitions.cpp"
#include "PLCore.cpp"
#include "PLCTabReducer.cpp"
#include "PLDialogs.cpp"
#include "PLDrivers.cpp"
#include "PLEditboxWidget.cpp"
#include "PLEventQueue.cpp"
#include "PLHacks.cpp"
#include "PLHandle.cpp"
#include "PLIconWidget.cpp"
#include "PLImageWidget.cpp"
#include "PLInvisibleWidget.cpp"
#include "PLKeyEncoding.cpp"
#include "PLLabelWidget.cpp"
#include "PLMenus.cpp"
#include "PLMovies.cpp"
#include "PLNumberFormatting.cpp"
#include "PLPopupMenuWidget.cpp"
#include "PLQDOffscreen.cpp"
#include "PLQDraw.cpp"
#include "PLResourceManager.cpp"
#include "PLResources.cpp"
#include "PLScrollBarWidget.cpp"
#include "PLSound.cpp"
#include "PLStandardColors.cpp"
#include "PLStringCompare.cpp"
#include "PLSysCalls.cpp"
#include "PLTimeTaggedVOSEvent.cpp"
#include "PLWidgets.cpp"
#include "QDGraf.cpp"
#include "QDManager.cpp"
#include "QDPictDecoder.cpp"
#include "QDPictEmitContext.cpp"
#include "QDPictHeader.cpp"
#include "QDPixMap.cpp"
#include "QDPort.cpp"
#include "QDStandardPalette.cpp"
#include "RandomNumberGenerator.cpp"
#include "ResolveCachingColor.cpp"
#include "ResourceCompiledRef.cpp"
#include "ResourceFile.cpp"
#include "ScanlineMask.cpp"
#include "ScanlineMaskBuilder.cpp"
#include "ScanlineMaskConverter.cpp"
#include "ScanlineMaskIterator.cpp"
#include "SimpleGraphic.cpp"
#include "TextPlacer.cpp"
#include "UTF8.cpp"
#include "UTF16.cpp"
#include "WindowDef.cpp"
#include "WindowManager.cpp"
#include "WorkerThread.cpp"
#include "XModemCRC.cpp"
#include "ZipFileProxy.cpp"

View File

@@ -188,8 +188,8 @@ namespace PortabilityLayer
bool GetWindowChromeInteractionZone(Window *window, const Vec2i &point, RegionID_t &outRegion) const override;
void SwapExclusiveWindow(Window *& windowRef) override;
void FlickerWindowIn(Window *window, int32_t velocity) override;
void FlickerWindowOut(Window *window, int32_t velocity) override;
void FlickerWindowIn(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_OVERRIDE;
void FlickerWindowOut(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_OVERRIDE;
void SetWindowDesaturation(Window *window, float desaturationLevel) override;
@@ -1324,6 +1324,7 @@ namespace PortabilityLayer
void WindowManagerImpl::FlickerWindowIn(Window *window, int32_t velocity)
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
m_flickerWindow = static_cast<WindowImpl*>(window);
int32_t chromeLead = 64;
@@ -1353,6 +1354,7 @@ namespace PortabilityLayer
void WindowManagerImpl::FlickerWindowOut(Window *window, int32_t velocity)
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
m_flickerWindow = static_cast<WindowImpl*>(window);
int32_t chromeLead = 64;
@@ -1689,4 +1691,16 @@ namespace PortabilityLayer
{
return WindowManagerImpl::GetInstance();
}
#if GP_ASYNCIFY_PARANOID
void WindowManager::FlickerWindowIn(Window *window, int32_t velocity)
{
static_cast<WindowManagerImpl*>(this)->FlickerWindowIn(window, velocity);
}
void WindowManager::FlickerWindowOut(Window *window, int32_t velocity)
{
static_cast<WindowManagerImpl*>(this)->FlickerWindowOut(window, velocity);
}
#endif
}

View File

@@ -3,6 +3,7 @@
#include <stdint.h>
#include "PLRegions.h"
#include "PLSysCalls.h"
struct Window;
struct DrawSurface;
@@ -39,8 +40,8 @@ namespace PortabilityLayer
virtual bool GetWindowChromeInteractionZone(Window *window, const Vec2i &point, RegionID_t &outRegion) const = 0;
virtual void SwapExclusiveWindow(Window *& windowRef) = 0;
virtual void FlickerWindowIn(Window *window, int32_t velocity) = 0;
virtual void FlickerWindowOut(Window *window, int32_t velocity) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL void FlickerWindowIn(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL void FlickerWindowOut(Window *window, int32_t velocity) GP_ASYNCIFY_PARANOID_PURE;
virtual void SetWindowDesaturation(Window *window, float desaturationLevel) = 0;

View File

@@ -285,17 +285,29 @@ namespace PortabilityLayer
MemoryManager *mm = MemoryManager::GetInstance();
if (!stream->SeekEnd(sizeof(ZipEndOfCentralDirectoryRecord)))
{
fprintf(stderr, "Seek end failed\n");
return nullptr;
}
ZipEndOfCentralDirectoryRecord eocd;
if (stream->Read(&eocd, sizeof(eocd)) != sizeof(eocd))
{
fprintf(stderr, "EOCD read failed\n");
return nullptr;
}
if (eocd.m_signature != ZipEndOfCentralDirectoryRecord::kSignature)
{
fprintf(stderr, "EOCD sig check failed\n");
return nullptr;
}
if (!stream->SeekStart(eocd.m_centralDirStartOffset))
{
fprintf(stderr, "CDir seek failed\n");
return nullptr;
}
const size_t centralDirSize = eocd.m_centralDirectorySizeBytes;
void *centralDirImage = nullptr;
@@ -318,6 +330,8 @@ namespace PortabilityLayer
if (stream->Read(centralDirImage, centralDirSize) != centralDirSize)
{
fprintf(stderr, "CDir image read failed\n");
mm->Release(centralDirFiles);
mm->Release(centralDirImage);
return nullptr;
@@ -334,6 +348,8 @@ namespace PortabilityLayer
{
if (centralDirEnd - centralDirCursor < sizeof(ZipCentralDirectoryFileHeader))
{
fprintf(stderr, "CDir read failed point 1\n");
failed = true;
break;
}
@@ -345,18 +361,24 @@ namespace PortabilityLayer
if (centralDirHeader.m_signature != ZipCentralDirectoryFileHeader::kSignature)
{
fprintf(stderr, "CDir read failed point 2\n");
failed = true;
break;
}
if (centralDirEnd - centralDirCursor < centralDirHeader.m_fileNameLength)
{
fprintf(stderr, "CDir read failed point 3\n");
failed = true;
break;
}
if (!CheckAndFixFileName(centralDirCursor, centralDirHeader.m_fileNameLength))
{
fprintf(stderr, "CDir read failed point 4\n");
failed = true;
break;
}
@@ -365,6 +387,8 @@ namespace PortabilityLayer
if (centralDirEnd - centralDirCursor < centralDirHeader.m_extraFieldLength)
{
fprintf(stderr, "CDir read failed point 5\n");
failed = true;
break;
}
@@ -373,6 +397,8 @@ namespace PortabilityLayer
if (centralDirEnd - centralDirCursor < centralDirHeader.m_commentLength)
{
fprintf(stderr, "CDir read failed point 6\n");
failed = true;
break;
}
@@ -396,6 +422,8 @@ namespace PortabilityLayer
{
if (ZipDirectorySortPredicate(centralDirFiles + (i - 1), centralDirFiles + i) == 0)
{
fprintf(stderr, "File names were duplicated\n");
// Duplicate file names
mm->Release(centralDirFiles);
mm->Release(centralDirImage);