[fpc-devel] HTML string to TFPColor
Michael Van Canneyt
michael at freepascal.org
Sun Jul 23 14:58:25 CEST 2017
Hi,
Can you refactor the huge case to use a local proc?
it hurts my eyes...
Michael.
On Sun, 23 Jul 2017, Bart wrote:
> On 7/23/17, Bart <bartjunk64 at gmail.com> wrote:
>
>
>> My try ...
>
> Forget previous post...
> This should make more sense.
>
>
> resourcestring
> SInvalidHtmlColor = '"%s" is not a valid Html color';
>
> { Try to translate HTML color code into TFPColor
> Supports following formats
> '#rgb'
> '#rrggbb'
> W3C Html color name
> }
> function TryHtmlToFPColor(const S: String; out FPColor: TFPColor): Boolean;
> function TryHexStrToWord(const Hex: String; out W: Word): Boolean;
> var
> Code: Integer;
> begin
> Val('$'+Hex, W, Code);
> Result := (Code = 0);
> if not Result then W := 0;
> end;
>
> begin
> Result := False;
> FPColor.red := 0;
> FPColor.green := 0;
> FPColor.blue := 0;
> FPColor.alpha := alphaOpaque;
> if (Length(S) = 0) then
> Exit;
> if (S[1] = '#') then
> begin
> if Length(S) = 4 then
> begin // #rgb
> Result := (TryHexstrToWord(S[2]+S[2], FPColor.red) and
> TryHexstrToWord(S[3]+S[3], FPColor.green) and
> TryHexstrToWord(S[4]+S[4], FPColor.blue));
> end
> else if Length(S) = 7 then
> begin // #rrggbb
> Result := (TryHexstrToWord(S[2]+S[3], FPColor.red) and
> TryHexstrToWord(S[4]+S[5], FPColor.green) and
> TryHexstrToWord(S[6]+S[7], FPColor.blue));
> end;
> end
> else
> begin
> case LowerCase(S) of
> 'white' : begin Result := True; FPColor.red := $ff;
> FPColor.green := $ff; FPColor.blue := $ff; end;
> 'silver' : begin Result := True; FPColor.red := $c0;
> FPColor.green := $c0; FPColor.blue := $c0; end;
> 'gray' : begin Result := True; FPColor.red := $80;
> FPColor.green := $80; FPColor.blue := $80; end;
> 'black' : begin Result := True; FPColor.red := $00;
> FPColor.green := $00; FPColor.blue := $00; end;
> 'red' : begin Result := True; FPColor.red := $ff;
> FPColor.green := $00; FPColor.blue := $00; end;
> 'maroon' : begin Result := True; FPColor.red := $80;
> FPColor.green := $00; FPColor.blue := $00; end;
> 'yellow' : begin Result := True; FPColor.red := $ff;
> FPColor.green := $00; FPColor.blue := $00; end;
> 'olive' : begin Result := True; FPColor.red := $80;
> FPColor.green := $80; FPColor.blue := $00; end;
> 'lime' : begin Result := True; FPColor.red := $00;
> FPColor.green := $ff; FPColor.blue := $00; end;
> 'green' : begin Result := True; FPColor.red := $00;
> FPColor.green := $80; FPColor.blue := $00; end;
> 'aqua' : begin Result := True; FPColor.red := $00;
> FPColor.green := $ff; FPColor.blue := $ff; end;
> 'teal' : begin Result := True; FPColor.red := $00;
> FPColor.green := $80; FPColor.blue := $80; end;
> 'blue' : begin Result := True; FPColor.red := $00;
> FPColor.green := $00; FPColor.blue := $ff; end;
> 'navy' : begin Result := True; FPColor.red := $00;
> FPColor.green := $00; FPColor.blue := $80; end;
> 'fuchsia': begin Result := True; FPColor.red := $ff;
> FPColor.green := $00; FPColor.blue := $ff; end;
> 'purple' : begin Result := True; FPColor.red := $80;
> FPColor.green := $00; FPColor.blue := $80; end;
> end;
> end;
> end;
>
> function HtmlToFPColorDef(const S: String; out FPColor: TFpColor; Def:
> TFPColor): TFPColor;
> begin
> if not TryHtmlToFPColor(S, Result) then
> Result := Def;
> end;
>
> function HtmlToFpColor(const S: String): TFPColor;
> begin
> if not TryHtmlToFpColor(S, Result) then
> raise EConvertError.CreateFmt(SInvalidHtmlColor, [S]);
> end;
>
> Bart
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
More information about the fpc-devel
mailing list