I've found a surprisinlgy simple workaround for this problem.
It seems the compiler is confused by the TLongWordRec usage in SwapEndianLongWord (ImagingUtility.pas) together with a call to this function with a pure constant value parameter: LongVal := SwapEndianLongWord(16); // Extra data size (4 (mask size) + 4 (ranges size) + 8 (name))It's perfectly good syntax, but the compiler gets confused and raises an internal error.
I've found 2 different ways of implementing a quick fix that both work (as far as I can see):
1. Create a simple variant record type and use that as a typecast instead of TLongWordRec.
TSimpleLWRec = packed record
B0, B1, B2, B3: byte;
end;
...
// In SwapEndianLongWord:
TSimpleLWRec(Result).B0 = TSimpleLWRec(Value).B3;
TSimpleLWRec(Result).B1 = TSimpleLWRec(Value).B2;
//etc...
2. Cheat on the compiler by not passing '16' as an argument, but use a local variable instead:
LongVal := 16;
LongVal := SwapEndianLongWord(LongVal); // Extra data size (4 (mask size) + 4 (ranges size) + 8 (name))
LongVal is already there and the assignment introduces little overhead.