Refactor color cursor loading

This commit is contained in:
elasota
2020-01-05 04:13:00 -05:00
parent 700c31b9e4
commit 1fba6f9e85
4 changed files with 21 additions and 94 deletions

View File

@@ -10,6 +10,8 @@
#include "PLBigEndian.h" #include "PLBigEndian.h"
#include "Externs.h" #include "Externs.h"
#include "Environ.h" #include "Environ.h"
#include "HostDisplayDriver.h"
#include "IGpColorCursor.h"
#define rAcurID 128 #define rAcurID 128
@@ -33,7 +35,7 @@ typedef struct
{ {
struct struct
{ {
THandle<CCursor> cursorHdl; IGpColorCursor *hwCursor;
} frame[1]; } frame[1];
} compiledAcurRec; } compiledAcurRec;
@@ -46,7 +48,6 @@ void InitAnimatedCursor (acurHandle);
acurHandle animCursorH = nil; acurHandle animCursorH = nil;
compiledAcurHandle compiledAnimCursorH = nil; compiledAcurHandle compiledAnimCursorH = nil;
Boolean useColorCursor = false;
//============================================================== Functions //============================================================== Functions
@@ -58,7 +59,7 @@ Boolean useColorCursor = false;
Boolean GetColorCursors (acurHandle ballCursH, compiledAcurHandle compiledBallCursH) Boolean GetColorCursors (acurHandle ballCursH, compiledAcurHandle compiledBallCursH)
{ {
short i, j; short i, j;
CCrsrHandle cursHdl; IGpColorCursor *hwCursor;
Boolean result = true; Boolean result = true;
if (ballCursH) if (ballCursH)
@@ -67,18 +68,18 @@ Boolean GetColorCursors (acurHandle ballCursH, compiledAcurHandle compiledBallCu
HideCursor(); // Hide the cursor HideCursor(); // Hide the cursor
for (i = 0; i < j; i++) // Walk through the acur resource for (i = 0; i < j; i++) // Walk through the acur resource
{ {
cursHdl = GetCCursor((*ballCursH)->frame[i].resID); // Get the cursor hwCursor = PortabilityLayer::HostDisplayDriver::GetInstance()->LoadColorCursor((*ballCursH)->frame[i].resID); // Get the cursor
if (cursHdl == nil) // Make sure a real cursor was returned if (hwCursor == nil) // Make sure a real cursor was returned
{ // If not, trash all cursors loaded { // If not, trash all cursors loaded
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
DisposeCCursor((CCrsrHandle)(*compiledBallCursH)->frame[j].cursorHdl); (*compiledBallCursH)->frame[j].hwCursor->Destroy();
result = false; // Tell calling proc we failed result = false; // Tell calling proc we failed
break; // And break out of the loop break; // And break out of the loop
} }
else // But, if the cursor loaded ok else // But, if the cursor loaded ok
{ // add it to our list or cursor handles { // add it to our list or cursor handles
(*compiledBallCursH)->frame[i].cursorHdl = cursHdl; (*compiledBallCursH)->frame[i].hwCursor = hwCursor;
SetCCursor((CCrsrHandle)(*compiledBallCursH)->frame[i].cursorHdl); PortabilityLayer::HostDisplayDriver::GetInstance()->SetColorCursor(hwCursor);
} }
} }
InitCursor(); // Show the cursor again (as arrow) InitCursor(); // Show the cursor again (as arrow)
@@ -92,10 +93,8 @@ Boolean GetColorCursors (acurHandle ballCursH, compiledAcurHandle compiledBallCu
void InitAnimatedCursor (acurHandle ballCursH) void InitAnimatedCursor (acurHandle ballCursH)
{ {
Boolean useColor;
compiledAcurHandle compiledBallCursorH; compiledAcurHandle compiledBallCursorH;
useColor = thisMac.hasColor;
if (ballCursH == nil) if (ballCursH == nil)
ballCursH = GetResource('acur', 128).StaticCast<acurRec>(); ballCursH = GetResource('acur', 128).StaticCast<acurRec>();
if (ballCursH && ballCursH != animCursorH) if (ballCursH && ballCursH != animCursorH)
@@ -104,13 +103,11 @@ void InitAnimatedCursor (acurHandle ballCursH)
if (!compiledBallCursorH) if (!compiledBallCursorH)
RedAlert(kErrFailedResourceLoad); RedAlert(kErrFailedResourceLoad);
if (useColor) GetColorCursors(ballCursH, compiledBallCursorH);
useColor = GetColorCursors(ballCursH, compiledBallCursorH);
DisposCursors(); DisposCursors();
animCursorH = ballCursH; animCursorH = ballCursH;
compiledAnimCursorH = compiledBallCursorH; compiledAnimCursorH = compiledBallCursorH;
useColorCursor = useColor;
(*ballCursH)->index = 0; (*ballCursH)->index = 0;
} }
else else
@@ -138,22 +135,13 @@ void DisposCursors (void)
if (compiledAnimCursorH != nil) if (compiledAnimCursorH != nil)
{ {
j = (*animCursorH)->n; j = (*animCursorH)->n;
if (useColorCursor)
for (i = 0; i < j; i++)
{ {
for (i = 0; i < j; i++) if ((*compiledAnimCursorH)->frame[i].hwCursor != nil)
{ (*compiledAnimCursorH)->frame[i].hwCursor->Destroy();
if ((*compiledAnimCursorH)->frame[i].cursorHdl != nil)
DisposeCCursor((CCrsrHandle)(*compiledAnimCursorH)->frame[i].cursorHdl);
}
}
else
{
for (i = 0; i < j; i++)
{
if ((*compiledAnimCursorH)->frame[i].cursorHdl != nil)
(*compiledAnimCursorH)->frame[i].cursorHdl.Dispose();
}
} }
compiledAnimCursorH.Dispose(); compiledAnimCursorH.Dispose();
compiledAnimCursorH = nil; compiledAnimCursorH = nil;
} }
@@ -177,16 +165,8 @@ void IncrementCursor (void)
{ {
(*animCursorH)->index++; (*animCursorH)->index++;
(*animCursorH)->index %= (*animCursorH)->n; (*animCursorH)->index %= (*animCursorH)->n;
if (useColorCursor)
{ PortabilityLayer::HostDisplayDriver::GetInstance()->SetColorCursor((*compiledAnimCursorH)->frame[(*animCursorH)->index].hwCursor);
SetCCursor((CCrsrHandle)(*compiledAnimCursorH)->
frame[(*animCursorH)->index].cursorHdl);
}
else
{
SetCursor((CursPtr)*(*compiledAnimCursorH)->
frame[(*animCursorH)->index].cursorHdl);
}
} }
else else
SetBuiltinCursor(watchCursor); SetBuiltinCursor(watchCursor);
@@ -205,16 +185,8 @@ void DecrementCursor (void)
(*animCursorH)->index--; (*animCursorH)->index--;
if (((*animCursorH)->index) < 0) if (((*animCursorH)->index) < 0)
(*animCursorH)->index = ((*animCursorH)->n) - 1; (*animCursorH)->index = ((*animCursorH)->n) - 1;
if (useColorCursor)
{ PortabilityLayer::HostDisplayDriver::GetInstance()->SetColorCursor((*compiledAnimCursorH)->frame[(*animCursorH)->index].hwCursor);
SetCCursor((CCrsrHandle)(*compiledAnimCursorH)->
frame[(*animCursorH)->index].cursorHdl);
}
else
{
SetCursor((CursPtr)*(*compiledAnimCursorH)->
frame[(*animCursorH)->index].cursorHdl);
}
} }
else else
SetBuiltinCursor(watchCursor); SetBuiltinCursor(watchCursor);

View File

@@ -1,4 +1,4 @@
#pragma once #pragma once
struct IGpColorCursor struct IGpColorCursor
{ {

View File

@@ -89,33 +89,6 @@ CursHandle GetCursor(int cursorID)
return GetResource('CURS', cursorID).ReinterpretCast<Cursor>(); return GetResource('CURS', cursorID).ReinterpretCast<Cursor>();
} }
CCrsrHandle GetCCursor(int cursorID)
{
PortabilityLayer::HostDisplayDriver *driver = PortabilityLayer::HostDisplayDriver::GetInstance();
IGpColorCursor *hwCursor = driver->LoadColorCursor(cursorID);
if (!hwCursor)
return nullptr;
CCrsrHandle hdl = PortabilityLayer::MemoryManager::GetInstance()->NewHandle<CCursor>();
if (!hdl)
{
hwCursor->Destroy();
return nullptr;
}
CCursor *ccursor = *hdl;
ccursor->hwCursor = hwCursor;
return hdl;
}
void SetCCursor(CCrsrHandle handle)
{
assert(handle);
PortabilityLayer::HostDisplayDriver::GetInstance()->SetColorCursor((*handle)->hwCursor);
}
void HideCursor() void HideCursor()
{ {
PortabilityLayer::HostDisplayDriver::GetInstance()->SetStandardCursor(EGpStandardCursors::kHidden); PortabilityLayer::HostDisplayDriver::GetInstance()->SetStandardCursor(EGpStandardCursors::kHidden);
@@ -131,13 +104,6 @@ void SetBuiltinCursor(int builtinCursor)
PL_NotYetImplemented(); PL_NotYetImplemented();
} }
void DisposeCCursor(CCrsrHandle handle)
{
(*handle)->hwCursor->Destroy();
PortabilityLayer::MemoryManager::GetInstance()->ReleaseHandle(handle.MMBlock());
}
void Delay(int ticks, UInt32 *endTickCount) void Delay(int ticks, UInt32 *endTickCount)
{ {
PLSysCalls::Sleep(ticks); PLSysCalls::Sleep(ticks);

View File

@@ -96,11 +96,6 @@ struct Cursor
{ {
}; };
struct CCursor
{
IGpColorCursor *hwCursor;
};
struct Window struct Window
{ {
Window(); Window();
@@ -186,13 +181,11 @@ struct EventRecord
typedef Window *WindowPtr; typedef Window *WindowPtr;
typedef Cursor *CursPtr; typedef Cursor *CursPtr;
typedef CCursor *CCrsrPtr;
typedef Menu *MenuPtr; typedef Menu *MenuPtr;
typedef CInfoPBRec *CInfoPBPtr; typedef CInfoPBRec *CInfoPBPtr;
typedef VersionRecord *VersRecPtr; typedef VersionRecord *VersRecPtr;
typedef THandle<Cursor> CursHandle; typedef THandle<Cursor> CursHandle;
typedef THandle<CCursor> CCrsrHandle;
typedef THandle<Menu> MenuHandle; typedef THandle<Menu> MenuHandle;
typedef THandle<VersionRecord> VersRecHndl; typedef THandle<VersionRecord> VersRecHndl;
@@ -262,15 +255,11 @@ static const int nullEvent = 0;
void InitCursor(); void InitCursor();
CursHandle GetCursor(int cursorID); CursHandle GetCursor(int cursorID);
CCrsrHandle GetCCursor(int cursorID);
void SetCCursor(CCrsrHandle handle);
void HideCursor(); void HideCursor();
void SetCursor(CursPtr cursor); void SetCursor(CursPtr cursor);
void SetBuiltinCursor(int builtinCursor); void SetBuiltinCursor(int builtinCursor);
void DisposeCCursor(CCrsrHandle handle);
void Delay(int ticks, UInt32 *endTickCount); void Delay(int ticks, UInt32 *endTickCount);
short Alert(int dialogID, void *unknown); short Alert(int dialogID, void *unknown);