You've already forked lazarus-ccr
fpspreadsheet: ods chart reader supports gradient styles.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9014 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -35,10 +35,23 @@ begin
|
|||||||
for j := 0 to chart.Hatches.Count-1 do
|
for j := 0 to chart.Hatches.Count-1 do
|
||||||
WriteLn(' "', chart.Hatches[j].Name, '" ',
|
WriteLn(' "', chart.Hatches[j].Name, '" ',
|
||||||
GetEnumName(TypeInfo(TsChartHatchStyle), ord(chart.Hatches[j].Style)), ' ',
|
GetEnumName(TypeInfo(TsChartHatchStyle), ord(chart.Hatches[j].Style)), ' ',
|
||||||
'Line color: ', IntToHex(chart.Hatches[j].LineColor, 6), ' ',
|
'Line color:', IntToHex(chart.Hatches[j].LineColor, 6), ' ',
|
||||||
'Distance: ', chart.Hatches[j].LineDistance:0:0, 'mm ',
|
'Distance:', chart.Hatches[j].LineDistance:0:0, 'mm ',
|
||||||
'Angle: ', chart.Hatches[j].LineAngle:0:0, 'deg ',
|
'Angle:', chart.Hatches[j].LineAngle:0:0, 'deg ',
|
||||||
'Filled: ', chart.Hatches[j].Filled);
|
'Filled:', chart.Hatches[j].Filled);
|
||||||
|
|
||||||
|
WriteLn (' Gradient styles: ');
|
||||||
|
for j := 0 to chart.Gradients.Count-1 do
|
||||||
|
WriteLn(' "', chart.Gradients[j].Name, '" ',
|
||||||
|
GetEnumName(TypeInfo(TsChartGradientStyle), ord(chart.Gradients[j].Style)), ' ',
|
||||||
|
'StartColor:', IntToHex(chart.Gradients[j].StartColor, 6), ' ',
|
||||||
|
'EndColor:', IntToHex(chart.Gradients[j].EndColor, 6), ' ',
|
||||||
|
// 'StartIntensity:', chart.Gradients[j].StartIntensity*100:0:0, '% ',
|
||||||
|
// 'EndIntensity:', chart.Gradients[j].EndIntensity*100:0:0, '% ',
|
||||||
|
'Border:', chart.Gradients[j].Border*100:0:0, '% ',
|
||||||
|
'Angle:', chart.Gradients[j].Angle:0:0, 'deg ',
|
||||||
|
'CenterX:', chart.Gradients[j].CenterX*100:0:0, '% ',
|
||||||
|
'CenterY:', chart.Gradients[j].CenterY*100:0:0, '% ');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
finally
|
finally
|
||||||
|
@@ -61,10 +61,11 @@ type
|
|||||||
private
|
private
|
||||||
function GetItem(AIndex: Integer): TsChartGradient;
|
function GetItem(AIndex: Integer): TsChartGradient;
|
||||||
procedure SetItem(AIndex: Integer; AValue: TsChartGradient);
|
procedure SetItem(AIndex: Integer; AValue: TsChartGradient);
|
||||||
|
public
|
||||||
function AddGradient(AName: String; AStyle: TsChartGradientStyle;
|
function AddGradient(AName: String; AStyle: TsChartGradientStyle;
|
||||||
AStartColor, AEndColor: TsColor; AStartIntensity, AEndIntensity: Double;
|
AStartColor, AEndColor: TsColor; AStartIntensity, AEndIntensity: Double;
|
||||||
ABorder, ACenterX, ACenterY, AAngle: Double): Integer;
|
ABorder, ACenterX, ACenterY, AAngle: Double): Integer;
|
||||||
public
|
|
||||||
function AddAxialGradient(AName: String; AStartColor, AEndColor: TsColor;
|
function AddAxialGradient(AName: String; AStartColor, AEndColor: TsColor;
|
||||||
AStartIntensity, AEndIntensity, ABorder, AAngle: Double): Integer;
|
AStartIntensity, AEndIntensity, ABorder, AAngle: Double): Integer;
|
||||||
function AddEllipticGradient(AName: String; AStartColor, AEndColor: TsColor;
|
function AddEllipticGradient(AName: String; AStartColor, AEndColor: TsColor;
|
||||||
|
@@ -20,6 +20,7 @@ type
|
|||||||
FChartFiles: TStrings;
|
FChartFiles: TStrings;
|
||||||
FPointSeparatorSettings: TFormatSettings;
|
FPointSeparatorSettings: TFormatSettings;
|
||||||
procedure ReadChartFiles(AStream: TStream; AFileList: String);
|
procedure ReadChartFiles(AStream: TStream; AFileList: String);
|
||||||
|
procedure ReadObjectGradientStyles(ANode: TDOMNode; AChart: TsChart);
|
||||||
procedure ReadObjectHatchStyles(ANode: TDOMNode; AChart: TsChart);
|
procedure ReadObjectHatchStyles(ANode: TDOMNode; AChart: TsChart);
|
||||||
procedure ReadObjectLineStyles(ANode: TDOMNode; AChart: TsChart);
|
procedure ReadObjectLineStyles(ANode: TDOMNode; AChart: TsChart);
|
||||||
procedure ReadObjectStyles(ANode: TDOMNode; AChart: TsChart);
|
procedure ReadObjectStyles(ANode: TDOMNode; AChart: TsChart);
|
||||||
@@ -355,12 +356,78 @@ begin
|
|||||||
'draw:hatch': // read hatch pattern
|
'draw:hatch': // read hatch pattern
|
||||||
ReadObjectHatchStyles(ANode, AChart);
|
ReadObjectHatchStyles(ANode, AChart);
|
||||||
'draw:gradient': // gradient definition
|
'draw:gradient': // gradient definition
|
||||||
;
|
ReadObjectGradientStyles(ANode, AChart);
|
||||||
end;
|
end;
|
||||||
ANode := ANode.NextSibling;
|
ANode := ANode.NextSibling;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TsSpreadOpenDocChartReader.ReadObjectGradientStyles(ANode: TDOMNode;
|
||||||
|
AChart: TsChart);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
s: String;
|
||||||
|
styleName: String;
|
||||||
|
gs: TsChartGradientStyle;
|
||||||
|
gradientStyle: TsChartGradientStyle = cgsLinear;
|
||||||
|
startColor: TsColor = scSilver;
|
||||||
|
endColor: TsColor = scWhite;
|
||||||
|
startIntensity, endIntensity: Double;
|
||||||
|
border, centerX, centerY: Double;
|
||||||
|
angle: Double = 0.0;
|
||||||
|
begin
|
||||||
|
styleName := GetAttrValue(ANode, 'draw:display-name');
|
||||||
|
if styleName ='' then
|
||||||
|
styleName := GetAttrValue(ANode, 'draw:name');
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:style');
|
||||||
|
if s <> '' then
|
||||||
|
for gs in TsChartGradientStyle do
|
||||||
|
if GRADIENT_STYLES[gs] = s then
|
||||||
|
begin
|
||||||
|
gradientStyle := gs;
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:start-color');
|
||||||
|
if s <> '' then
|
||||||
|
startColor := HTMLColorStrToColor(s);
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:end-color');
|
||||||
|
if s <> '' then
|
||||||
|
endColor := HTMLColorStrToColor(s);
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:start-intensity');
|
||||||
|
if not TryPercentStrToFloat(s, startIntensity) then
|
||||||
|
startIntensity := 1.0;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:end-intensity');
|
||||||
|
if not TryPercentStrToFloat(s, endIntensity) then
|
||||||
|
endIntensity := 1.0;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:border');
|
||||||
|
if not TryPercentStrToFloat(s, border) then
|
||||||
|
border := 0.0;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:angle');
|
||||||
|
if s <> '' then begin
|
||||||
|
for i := Length(s) downto 1 do
|
||||||
|
if not (s[i] in ['0'..'9', '.', '+', '-']) then Delete(s, i, 1);
|
||||||
|
angle := StrToFloatDef(s, 0.0, FPointSeparatorSettings);
|
||||||
|
end;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:cx');
|
||||||
|
if not TryPercentStrToFloat(s, centerX) then
|
||||||
|
centerX := 0.0;
|
||||||
|
|
||||||
|
s := GetAttrValue(ANode, 'draw:cy');
|
||||||
|
if not TryPercentStrToFloat(s, centerY) then
|
||||||
|
centerY := 0.0;
|
||||||
|
|
||||||
|
AChart.Gradients.AddGradient(styleName, gradientStyle, startColor, endColor,
|
||||||
|
startIntensity, endIntensity, border, centerX, centerY, angle);
|
||||||
|
end;
|
||||||
|
|
||||||
{ Read the hatch pattern stored in the "draw:hatch" nodes of the chart's
|
{ Read the hatch pattern stored in the "draw:hatch" nodes of the chart's
|
||||||
Object styles.xml file. }
|
Object styles.xml file. }
|
||||||
procedure TsSpreadOpenDocChartReader.ReadObjectHatchStyles(ANode: TDOMNode; AChart: TsChart);
|
procedure TsSpreadOpenDocChartReader.ReadObjectHatchStyles(ANode: TDOMNode; AChart: TsChart);
|
||||||
|
@@ -165,6 +165,8 @@ function TryStrToFloatAuto(AText: String; out ANumber: Double;
|
|||||||
function TryFractionStrToFloat(AText: String; out ANumber: Double;
|
function TryFractionStrToFloat(AText: String; out ANumber: Double;
|
||||||
out AIsMixed: Boolean; out AMaxDigits: Integer): Boolean;
|
out AIsMixed: Boolean; out AMaxDigits: Integer): Boolean;
|
||||||
|
|
||||||
|
function TryPercentStrToFloat(AText: String; out ANumber: Double): Boolean;
|
||||||
|
|
||||||
function Round(AValue: Double): Int64;
|
function Round(AValue: Double): Int64;
|
||||||
|
|
||||||
function cmToPts(AValue: Double): Double; inline;
|
function cmToPts(AValue: Double): Double; inline;
|
||||||
@@ -1976,6 +1978,24 @@ begin
|
|||||||
Result := true;
|
Result := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{@@ ----------------------------------------------------------------------------
|
||||||
|
Converts a percent-formatted string to a decimal number.
|
||||||
|
Example: '150%' --> 1.5
|
||||||
|
-------------------------------------------------------------------------------}
|
||||||
|
function TryPercentStrToFloat(AText: String; out ANumber: Double): boolean;
|
||||||
|
var
|
||||||
|
res: Integer;
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
if AText = '' then
|
||||||
|
exit;
|
||||||
|
if AText[Length(AText)] = '%' then Delete(AText, Length(AText), 1);
|
||||||
|
val(AText, ANumber, res);
|
||||||
|
Result := (res = 0);
|
||||||
|
if Result then
|
||||||
|
ANumber := ANumber * 0.01;
|
||||||
|
end;
|
||||||
|
|
||||||
{@@ ----------------------------------------------------------------------------
|
{@@ ----------------------------------------------------------------------------
|
||||||
Special rounding function which avoids banker's rounding
|
Special rounding function which avoids banker's rounding
|
||||||
-------------------------------------------------------------------------------}
|
-------------------------------------------------------------------------------}
|
||||||
|
Reference in New Issue
Block a user