IIRC then on Windows at least the font color of a TSpeedButton is themed (so determined by the OS).
Yes, this is true. But why is this limitation there? The font color of a TSpeedButton should be themed only if default font is used - the same that is done in THintWindow.
Many of the components on the usual Lazarus component palettes are painted by the widgetset.
Yes, but this is not true for TSpeedButton. TSpeedButton is painted by the LCL and it is a bug that the Font.Color isn't taken into account.
See: speedbutton.inc -> TCustomSpeedButton.MeasureDraw, line 739: ThemeServices.DrawText
Compare TSpeedButton with THintWindow. THintWindow is painted by the LCL with Themes and yet it supports custom font. ThemeServices.DrawText should be used only if the fon't isn't changed - see the THintWindow how it is done:
hintwindow.inc -> THintWindow.Paint, line 210:
if ThemeFG then
ThemeServices.DrawText(Canvas, Details, Caption, ARect, GetDrawTextFlags, 0)
else
DrawText(Canvas.GetUpdatedHandle([csFontValid]), PChar(Caption),
Length(Caption), ARect, GetDrawTextFlags);
---
The attached patch adds support for custom font in TSpeedButton.