Since the last update, there has been progress on many features, but especially on the following ones to highlight:
GWorlds
The GWorld routines are practical utility functions for easy creation and handling of off-screen color ports, relieving the developer from a lot of mundane tasks for allocating the memory structures and house-keeping them. In the old “classic” QuickDraw, the developers were forced to do all this by themselves, but on other hand, the old-style QuickDraw had a lot less complexity and fewer data structures. The color QD requires maintenance of PixMap structures, and possibly “fake” GDevice handles with unique color tables and inverse color lookup tables, etc. The routines which color version were implemented this time were (* indicates ones that previously existed for “classic” QD’s GWorld wrappers):
- NewGWorld
- LockPixels*
- UnlockPixels*
- DisposeGWorld
- GetGWorld
- SetGWorld
- CTabChanged
- AllowPurgePixels
- NoPurgePixels
- GetPixelsState
- SetPixelsState
- GetPixBaseAddr
- GetGWorldPixMap
The games which benefitted most of the new GWorld routines were Wolfenstein 3D, SimCity 2000 and Civilization. It is also possible other games are utilizing them, but these were the ones first encountered in the test suite:

PixPat support
Another new feature added in the color QuickDraw are the PixPat patterns. As old QuickDraw only allowed 1-bit monochrome patterns, these PixPats have much more flexibility allowing multi-color patterns and also higher resolutions (most commonly seen as powers-of-two from 8 to 64 pixels, and up to 256 colors, although the PixPat data supports also “direct” pixel data).
The interesting feature of these “pixel patterns” is the fact that they actually use regular PixMap data as the pattern storage, so that a lot of internal routines for PixMap manipulation were directly helpful in the implementation of the color patterns. The most code needed for pixpat-specific drawing were the conversion to target depth (using the shader PixMap translators), and handling the special pattern modes in blitters, with repetition of pattern with variable-size dimensions.

The first games requiring use of PixPats were Glider 4.0 and Siege of Darkwood – but as a nice side effect, we now also have support for using color patterns on the desktop!
Other stuff
There were also many other minor improvements, some of which include:
- Finally a proper region-clipped color blitter (was on TODO list for a long time…)
- 32-bit PICT pixel data support, needed for Escape Velocity
- CopyBits & ScrollRect, for Civilization and SimCity 2000 map scrolling
- A bunch of new blitter modes
- Partial resouce read support for SimCity 2000
- Abstracted resource loading as a magic “CheckLoad” vector, to make AutoDoubler-compressed applications work (the one we encountered was the color version of Lemmings)
- MANY bug fixes and other improvements (complete list of everything at the end of this post)
New videos
Since the the last post, we have two new videos of test applications running in color mode. First is Glider 4.0, which seems to now be playable, benefitting especially from the most recent transparent arithmetic transfer mode support:
Also, here’s video of Wolfenstein 3D running (the lag is from QT video capture, game itself runs quite smoothly):
And of course as Sound Manager is not yet implemented, there is no audio in either videos.
Status of some of the color test applications
There are also some other games which are starting to get more functional in color mode, here’s a brief update on where they’re at right now:
Most of these games run nicely, but there are some common issues still to be resolved:
- Menu drawing still need to be updated to support color mode properly
- List Manager does not yet handle hilite mode properly
- Scroll Bars are still rendered as monochrome versions only
- Standard File dialogs have still issues with color mode (folder popup menu, hilite mode, etc)
- No sound yet because of incomplete Sound Manager implementation
- Horizontal stretching for pixmap data is not yet implemented (although vertical stretching is), so horizontally scaled text/images do not yet appear properly
- A lot of missing blitter modes (they will be written as needed in the first pass, but will be generalized and optimized later so that all cases will be properly covered)
There are also a couple cases with application-specific problems:
- Maelstrom is playable & smooth, but gets stuck at end of level screen probably because of missing Sound Manager Implementation
- Civilization has a rare bug where inverse color tables appear to break down after playing the game for some time
- SimCity 2000 has a palette manager bug where a couple of palette entries go to wrong slots, causing a couple specific colors to not display properly (mostly visible in the title screen, and “Dispatch Firefighters” map sprite)
- Escape Velocity gets to main menu, but crashes due to some unresolved 68k cpu emulation bugs which Pukka is investigating
The status page will be updated in the coming weeks to reflect this new status.
Full list of changes since last post
2020-04-07 00:38:42 +0300 • Add pixpat patOr mode for color rectangle blitter 2020-04-07 00:31:42 +0300 • Add srcBic support to color rectangle blitter 2020-04-07 00:30:52 +0300 • Fix outline/shadow text style in color text render 2020-04-06 21:29:15 +0300 • Do 68K VM stack guard magic check for native fra.. 2020-04-06 01:07:31 +0300 • Set bg color in SetWinColor, fix Siege of Darkwood 2020-04-06 00:39:03 +0300 • Fix crash when decoding pixpats from PICT resource 2020-04-05 23:10:26 +0300 • Fix GetPalette bitmasking (missing window redraws) 2020-04-05 05:21:26 +0300 • Indexed transparent arithmetic region renderer 2020-04-05 04:39:00 +0300 • Indexed transparent arithmetic rectangle renderer 2020-04-05 03:22:26 +0300 • Indexed transparent arithmetic scanline renderer 2020-04-04 16:53:34 +0300 • Clean up old commented-out legacy code 2020-04-04 16:52:27 +0300 • Handle undefined EnvDefaultColorDepth case 2020-04-04 16:51:21 +0300 • Handle arithmetic mode setup for color mapping 2020-04-01 22:24:46 +0300 • Update test desktop background pattern 2020-04-01 03:01:26 +0300 • Color desktop ppat (forced on for now for testing) 2020-04-01 02:47:14 +0300 • Fix 8x8 pixpat expansion 2020-04-01 01:59:00 +0300 • Implement (mostly) pixpat conversion & rendering 2020-04-01 01:57:35 +0300 • Separate pixel translation from stretch blitter 2020-04-01 01:43:46 +0300 • Clear CGrafPort refs to pixpat in DisposePixPat 2020-03-30 16:59:25 +0300 • Add (partial) FillCRect/Oval/Arc/Rgn/Poly 2020-03-30 16:00:04 +0300 • Add EnvDefaultColorDepth for app-specific default 2020-03-30 15:32:31 +0300 • Fix region masking bug of diagonal Line/LineTo 2020-03-30 15:30:07 +0300 • Fix ErasePoly (typo from copy-paste) 2020-03-30 11:53:03 +0300 • Fix right-to-left color rectblit & right-edge mask 2020-03-30 04:57:07 +0300 • Add srcXor mode for non-colorizing stretch blitter 2020-03-30 04:54:25 +0300 • Color QD version of polygon operations 2020-03-30 04:47:10 +0300 • Add region-clipped color blitter & fix LOT of bugs 2020-03-30 04:44:10 +0300 • Fix invalid masking in srcCopy in translating blit 2020-03-30 01:18:15 +0300 • Fix iteration of region 3-only non-rect case 2020-03-28 21:53:06 +0200 • Fix inverted hilite flag check in colorized WDEF 0 2020-03-27 21:39:58 +0200 • Fix TextEdit locals saved forecolor overlap bug 2020-03-27 20:45:13 +0200 • Add color support also to WDEF 0 zoom box drawing 2020-03-27 19:34:27 +0200 • Add color support to WDEF 0 growbox drawing 2020-03-27 16:36:51 +0200 • Add (partial) color QD support for ScrollRect 2020-03-27 15:18:16 +0200 • Add Loony Labyrinth test app to CMake JSON configs 2020-03-27 15:17:43 +0200 • Implement SaveFore/Back & RestoreFore/Back 2020-03-27 02:46:11 +0200 • Fix (again) AnimatePalette 2020-03-27 01:36:19 +0200 • Set default palette in GetNewWindow/GetNewCWindow 2020-03-26 23:12:07 +0200 • Implement ReadPartialResource in ResourceDispatch 2020-03-26 22:26:03 +0200 • Fix HCreateResFile (dirID mishandled) 2020-03-26 21:02:04 +0200 • Improve StdText CGrafPort/GWorld compatibility 2020-03-26 21:00:46 +0200 • Fix CloseResFile stack frame mismatch 2020-03-26 20:11:11 +0200 • Implement SetPixelsState and AllowPurgePixels 2020-03-26 19:54:40 +0200 • Implement GetPixelsState selector in QDExtensions 2020-03-26 19:46:06 +0200 • Implement SetGWorld selector in QDExtensions 2020-03-26 19:33:15 +0200 • Implement GetGWorldPixMap selector in QDExtensions 2020-03-26 19:16:17 +0200 • Implement GetGWorld in QDExtensions 2020-03-26 19:12:42 +0200 • Implement Palette2CTab 2020-03-26 18:45:36 +0200 • Add SimCity 2000 test app to CMake JSON configs 2020-03-26 17:24:03 +0200 • CopyBits improvements (fix Escape Velocity crash) 2020-03-26 02:59:02 +0200 • Add 32-bit to indexed color conversion to blitter 2020-03-26 02:57:00 +0200 • Fix rgb PICT data unpack for rowBytes > 250 2020-03-26 02:56:00 +0200 • Implement DisposeCIcon 2020-03-25 22:09:57 +0200 • Support 'PICT' packType=4 RGB data (run-packed) 2020-03-25 20:45:05 +0200 • Start collision check from current link, not next 2020-03-25 19:08:43 +0200 • Fix color blitter for <=32bit wide transfers 2020-03-25 18:35:49 +0200 • Conditionalize Paletter Manager debug log output 2020-03-25 18:34:59 +0200 • Handle collisions in inverse color table lookup 2020-03-25 14:08:12 +0200 • Validate input in SetEntries & clear cached fonts 2020-03-25 03:01:34 +0200 • Fix UInt16/SInt16 RGB delta bug in palette update 2020-03-25 01:13:22 +0200 • Add missing A6 setup for the CheckLoad wrapper 2020-03-25 01:05:40 +0200 • Add secret "CheckLoad" hook (AutoDoubler support) 2020-03-25 00:57:35 +0200 • Add color Lemmings JSON to CMake test apps configs 2020-03-24 22:34:47 +0200 • Clamp cursor hotspot between [0, 15] 2020-03-24 22:34:15 +0200 • Fix color CopyBits thePort/dstBits comparison bug 2020-03-24 19:55:58 +0200 • Extract color QD rect blitter to own module 2020-03-24 19:30:09 +0200 • Implement DisposeGDevice (used in DisposeGWorld) 2020-03-24 14:47:56 +0200 • Implement color QD version of ClosePort 2020-03-24 04:24:57 +0200 • Unreserve palette entry when cleared (single GD) 2020-03-24 04:23:41 +0200 • Set MemErr to noErr in ReservMem on success 2020-03-24 02:35:37 +0200 • Fix negative dstLeft corruption @ B/W stretch blit 2020-03-23 21:01:59 +0200 • Implement DeleteMCEntries 2020-03-23 20:50:33 +0200 • Paint window (and invalidate) on ActivatePalette 2020-03-23 20:49:14 +0200 • Draw desktop pattern for PaintOne(nil) case 2020-03-23 20:44:03 +0200 • Fix AnimatePalette for srcIndex > 0 cases 2020-03-23 01:41:36 +0200 • Fix GetCatInfo bug by previous fix (non-WDCB case) 2020-03-23 01:27:40 +0200 • Minor menu color entry manipulation tweaks 2020-03-23 01:25:58 +0200 • Fix monochrome QD compilation error 2020-03-22 23:36:53 +0200 • Implement SetEntryColor 2020-03-22 23:24:53 +0200 • Implement GetPalette trap for Palette Manager 2020-03-22 22:09:37 +0200 • Extract PaletteDispatch routines to own C module 2020-03-22 21:42:58 +0200 • Add Ultimate Doom test app to JSON configs 2020-03-22 21:42:24 +0200 • Add CTabChanged and (partial) DisposeGWorld 2020-03-22 07:33:06 +0200 • Give more CPU time for 68020+ mode 2020-03-22 06:46:10 +0200 • Fix buffer size bug in NewGWorld w/ pixelDepth = 0 2020-03-22 03:55:04 +0200 • Implement FCMPS in FP68K (SANE) for Wolf3D 2020-03-22 03:42:46 +0200 • Improve bits opcode (9x) for non-indexed support 2020-03-22 03:37:10 +0200 • Implement NoPurgePixels selector 2020-03-22 03:36:45 +0200 • Fix unassigned pmBounds.left bug in NewGWorld 2020-03-22 02:23:21 +0200 • Implement color QD version of NewGWorld 2020-03-22 02:22:18 +0200 • Resolve WDCB to DirID in GetCatInfo ioFDirIndex>1 2020-03-21 18:50:18 +0200 • Add 'qdrw' Gestalt selector (Quickdraw features) 2020-03-21 04:44:26 +0200 • Fix pixpat opcodes in DrawPicture 2020-03-21 04:42:32 +0200 • Implement unpacked pixmap data load in DrawPicture 2020-03-21 04:40:28 +0200 • Fix CloseWD crash (ignore ioNamePtr) 2020-03-21 03:43:35 +0200 • Implement CopyPixMap 2020-03-21 02:26:20 +0200 • Fix GetPenState bug (caused gray fills everywhere) 2020-03-21 01:33:43 +0200 • Implement color QD version of ScrnBitMap 2020-03-21 01:20:54 +0200 • Hack tmp SoundBase to make Glider 4 happy in color 2020-03-21 01:19:08 +0200 • Implement color CopyMask (untested!) 2020-03-21 01:17:37 +0200 • Fix missing argument deref in color pat conversion 2020-03-21 01:16:34 +0200 • Add 'vm ' Gestalt selector (returns 0 for no VM) 2020-03-21 01:14:12 +0200 • Add HWPriv & dummy FlushData/FlushInstructionCache 2020-03-20 19:18:33 +0200 • Fix colorQD highlight bug of radio/checkbox button 2020-03-20 19:09:02 +0200 • Implement grayishTextOr mode for StdText 2020-03-20 19:07:55 +0200 • Implement GetGray selector for PaletteDispatch 2020-03-20 19:06:06 +0200 • Tweak signature of rgb delta calculation to UInt16 2020-03-20 18:20:45 +0200 • Implement patBic mode in pattern rect blitter 2020-03-20 06:22:31 +0200 • Fix StdGetPic, handle byteCount as unsigned UInt16 2020-03-20 06:20:48 +0200 • Implement GetPixBaseAddr selector in QDExtensions 2020-03-20 05:27:15 +0200 • Fix masking bug in color stretch blitter 2020-03-20 03:38:11 +0200 • Add a bunch empty dummy SoundDispatch placeholders 2020-03-20 02:57:14 +0200 • Implement QDError trap 2020-03-20 02:54:26 +0200 • Implement FSpOpenResFile and FSpCreateResFile 2020-03-20 02:52:57 +0200 • Implement HCreateResFile 2020-03-20 02:29:20 +0200 • Add semi-dummy ResolveAliasFile selector 2020-03-20 02:08:52 +0200 • Add Escape Velocity test app to cmake configs 2020-03-20 02:08:30 +0200 • Add missing file from previous commit 2020-03-20 02:08:18 +0200 • Add Pack12 & Fix2SmallFract+SmallFract2Fix+RGB2HSL 2020-03-20 00:06:06 +0200 • Fix signature of SwapMMUMode 2020-03-19 23:25:45 +0200 • Fix text styling buffer overflow in color QD 2020-03-19 23:22:36 +0200 • Apply kernMax in color font renderer 2020-03-19 19:18:59 +0200 • Update & re-seed GDevice pmTable in SetEntries too 2020-03-19 16:01:13 +0200 • 4-bit debug palette view 2020-03-19 16:00:59 +0200 • Implement SetPortPix trap 2020-03-19 01:26:06 +0200 • Add fake SwapMMUMode trap 2020-03-19 01:24:19 +0200 • Add dummy 'snd ' Gestalt selector 2020-03-19 01:23:39 +0200 • Dummy SoundDispatch (& dummy SndPlayDoubleBuffer) 2020-03-19 00:40:09 +0200 • Add Maelstrom test app to cmake configs 2020-03-19 00:39:47 +0200 • Dispose auxCtlRec also in DisposeControl trap 2020-03-19 00:29:57 +0200 • Fix 'cctb' ID=0 bug 2020-03-19 00:15:34 +0200 • Implement ProtectEntry and ReserveEntry traps 2020-03-18 23:53:47 +0200 • Fix RS stack frame mismatch in FrameRect 2020-03-18 23:53:10 +0200 • Implement TestDeviceAttribute & SetDeviceAttribute 2020-03-18 23:44:13 +0200 • Implement GetCWMgrPort trap