128 lines
3.3 KiB
ObjectPascal
128 lines
3.3 KiB
ObjectPascal
unit FlameIO;
|
|
|
|
interface
|
|
|
|
uses
|
|
Controlpoint;
|
|
|
|
function FlameToXML(const cp1: TControlPoint; sheep: boolean; compact: boolean = false): string;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Classes, SysUtils, xForm, xFormMan;
|
|
|
|
function NumXForms(const cp: TControlPoint): integer;
|
|
var
|
|
i: integer;
|
|
begin
|
|
Result := NXFORMS;
|
|
for i := 0 to NXFORMS - 1 do begin
|
|
if cp.xform[i].density = 0 then
|
|
begin
|
|
Result := i;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function CleanXMLName(ident: string): string;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i := 0 to Length(ident) do
|
|
begin
|
|
if ident[i] = '*' then
|
|
ident[i] := '_'
|
|
else if ident[i] = '"' then
|
|
ident[i] := #39;
|
|
end;
|
|
Result := ident;
|
|
end;
|
|
|
|
|
|
function ColorToXmlCompact(cp1: TControlPoint): string;
|
|
var
|
|
i: integer;
|
|
begin
|
|
Result := ' <colors count="256" data="';
|
|
|
|
for i := 0 to 255 do begin
|
|
Result := Result + IntToHex(0,2)
|
|
+ IntToHex(cp1.cmap[i, 0],2)
|
|
+ IntToHex(cp1.cmap[i, 1],2)
|
|
+ IntToHex(cp1.cmap[i, 2],2);
|
|
end;
|
|
Result := Result + '"/>';
|
|
end;
|
|
|
|
|
|
function ColorToXml(cp1: TControlPoint): string;
|
|
var
|
|
i: integer;
|
|
begin
|
|
Result := '';
|
|
for i := 0 to 255 do begin
|
|
Result := Result + ' <color index="' + IntToStr(i) +
|
|
'" rgb="' + IntToStr(cp1.cmap[i, 0]) + ' ' +
|
|
IntToStr(cp1.cmap[i, 1]) + ' ' +
|
|
IntToStr(cp1.cmap[i, 2]) + '"/>' + #13#10;
|
|
end;
|
|
end;
|
|
|
|
|
|
function FlameToXML(const cp1: TControlPoint; sheep: boolean; compact: boolean = false): string;
|
|
var
|
|
t, i, j: integer;
|
|
FileList: TStringList;
|
|
x, y, a, b, cc, d, e, f: double;
|
|
varlist, nick, url, pal, hue: string;
|
|
begin
|
|
FileList := TStringList.create;
|
|
x := cp1.center[0];
|
|
y := cp1.center[1];
|
|
pal := ''; hue := '';
|
|
if sheep then
|
|
begin
|
|
pal := 'palette="' + IntToStr(cp1.cmapindex) + '" ';
|
|
hue := 'hue="' + format('%g', [cp1.hue_rotation]) + '" ';
|
|
end;
|
|
// if Trim(SheepNick) <> '' then nick := 'nick="' + Trim(SheepNick) + '"';
|
|
// if Trim(SheepURL) <> '' then url := 'url="' + Trim(SheepURL) + '" ';
|
|
try
|
|
FileList.Add('<flame name="' + CleanXMLName(cp1.name) + format('" time="%g" ', [cp1.time]) +
|
|
pal + 'size="' + IntToStr(cp1.width) + ' ' + IntToStr(cp1.height) +
|
|
format('" center="%g %g" ', [x, y]) +
|
|
format('scale="%g" ', [cp1.pixels_per_unit]) +
|
|
format('angle="%g" ', [cp1.FAngle]) +
|
|
format('rotate="%g" ', [-180 * cp1.FAngle/Pi]) +
|
|
format('zoom="%g" ', [cp1.zoom]) +
|
|
'oversample="' + IntToStr(cp1.spatial_oversample) +
|
|
format('" filter="%g" ', [cp1.spatial_filter_radius]) +
|
|
format('quality="%g" ', [cp1.sample_density]) +
|
|
'batches="' + IntToStr(cp1.nbatches) +
|
|
format('" background="%g %g %g" ', [cp1.background[0] / 255, cp1.background[1] / 255, cp1.background[2] / 255]) +
|
|
format('brightness="%g" ', [cp1.brightness]) +
|
|
format('gamma="%g" ', [cp1.gamma]) +
|
|
format('vibrancy="%g" ', [cp1.vibrancy]) + hue + url + nick + '>');
|
|
{ Write transform parameters }
|
|
t := NumXForms(cp1);
|
|
for i := 0 to t - 1 do begin
|
|
FileList.Add(cp1.xform[i].ToXMLString);
|
|
end;
|
|
{ Write palette data }
|
|
if not sheep then begin
|
|
if not compact then
|
|
FileList.Add(ColorToXml(cp1));
|
|
FileList.Add(ColorToXmlcompact(cp1));
|
|
end;
|
|
|
|
FileList.Add('</flame>');
|
|
result := FileList.text;
|
|
finally
|
|
FileList.free
|
|
end;
|
|
end;
|
|
|
|
end.
|