I think I found the problem.
In customlabel.inc,
procedure TCustomLabel.DoDrawText(var Rect: TRect; Flags: Longint);
...
begin
...
TextOut(Canvas.Handle, 0,0,PChar(LabelText), Length(LabelText));
DrawText(Canvas.Handle, PChar(LabelText), Length(LabelText), Rect, Flags or DT_NOCLIP);
Canvas.Font.Color := OldFontColor;
end;
There is a TextOut call before the DrawText call. So the text is actually drawn 3 times:
(1) DoDrawText called with DT_CALCRECT, TextOut is called, and DrawText is used to calculate the rectangle.
(2) DoDrawText called without DT_CALCRECT, TextOut is called, then
(3) DrawText is called to draw the text.
I removed the TextOut call, and the TLabel looks fine.