Jump to content
Korean Random
StranikS_Scan

XCPad - Мультифайловый текстовый редактор для XVM / PTC / PMOD / JSON / XML / INI конфигов (Версия: 1.2.0, Дата: 19.11.2023)

Пользуетесь ли вы XCPad  

352 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

 

 

Очень бы помогли, если бы смогли отловить при каких именно условиях вываливается ошибка. Какой-то нюанс не отработан, искать его в лоб буду долго, ваши подсказки бы пригодились.

 Ошибка выскакивает в любых случаях, даже если я нажимаю "Отмена".

Share this post


Link to post

Short link
Share on other sites

 Ошибка выскакивает в любых случаях, даже если я нажимаю "Отмена".

 

Подробнее нельзя? Я не телепат. Где чего когда нажимаете.

Share this post


Link to post

Short link
Share on other sites

А стрелочками с клавы

Очень привык к Adobe, поэтому про колесико вспомнил сразу.

Теперь про LCh (не LCH как в XCPad, а LCh именно, знаю, что занудство, но так правильно) - 

Слева Lab, по центру то, что выдает XCPad, справа то, что должно быть.

LCh.zip

Edited by DotNetFramework

Share this post


Link to post

Short link
Share on other sites

, я делал по формуле, выше и то что выдает программа совпадает с тыц. С той лишь разнице что в программе у меня c в % от sqrt(2)*128. В основном совпадет.

Откуда ты взял цифры в xml в последней колонке я не понял

 

Название LCH поменяю на Lch (как по аналогии с Lab)

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Подробнее нельзя? Я не телепат. Где чего когда нажимаете.

'Например такой вариант'

Запускаю XCPad. Выбираю Файл->Открыть.

post-17624-0-62137900-1412247322_thumb.jpg

post-17624-0-09126400-1412247323_thumb.jpg

Выбираю "ОК" или "Отмена"

post-17624-0-49883600-1412247323_thumb.jpg

Выскакивает ошибка

post-17624-0-30561500-1412247324_thumb.jpg

Нажимаю "Да", приложение закрывается. Опять выскакивает эта ошибка.

post-17624-0-98002300-1412247324_thumb.jpg

Нажимаю "Да", приложение закрывается. В диспетчере задач процесс остается и грузит полностью одно ядро.

post-17624-0-51878900-1412247325_thumb.jpg

Share this post


Link to post

Short link
Share on other sites

 

 

В основном совпадет

Значит у них какой-то косяк, какой - не пойму.

Фишка вот в чем. L в LCh должна СТРОГО совпадать с L в Lab.

C - это длина вектора (а;b), в нашем случае нормализованная. (тогда почему при L=0, a=-128, b=-128 насыщенность не максимальна?)

h - угол того же вектора от какой-то там точки отсчета.

 

Можешь код свой скинуть?


 

 

Откуда ты взял цифры в xml в последней колонке я не понял

Посчитал через

procedure LabToLCH(l, a, b: real; var lum, c, h: real);
begin
 h := ArcTan2(b, a);
 if h > 0 then
  h := (h/PI) * 180
 else
  h := 360 - (ABS(h)/PI) * 180;
 lum := l;
 c := SQRT(a*a + b*b);
end;

Только C смасштабировал.

Share this post


Link to post

Short link
Share on other sites

Подозреваю, что это погрешность промежуточных трансформаций. Возьми и начни варьировать RGB, и тогда увидишь что действительно L совпадает с L, но если варьировать скажем а или b то можно увидеть смешения по L у Lch.

 

Все преобразования идут через TColor, это делфийский формат цвета $-AABBGGRR...+AABBGGRR, так вроде пишется. Например я варьирую X-параметр в Y-формате, новые цифры из Y-формат конвертируются в TColor, после этого цвет из этого формата переводится во все остальные, округляется до целых чисел и выводится в окне. Я могут все формулы собрать, глянешь.

Share this post


Link to post

Short link
Share on other sites
Все преобразования идут через TColor

Ну вот в этом и косяк, 99%. Там же 8 бит/цвет.

Т.е. полная цепочка идет как Lab -> XYZ -> RGB -> (round) TColor-> XYZ -> Lab -> LCh, так?

Но тогда почему L при этом из Lab'а не копируется напрямую в LCh?

 

 

Я могут все формулы собрать, глянешь.

Гляну. 

@StranikS_Scan, может это всё переписать через real? Работы немного, простой Pascal код без объектов я накидать могу на всё. 

 

И еще в чем проблема использования RGB в качестве промежуточного цвета:

123di_color_spaces.jpg

Наш RGB это sRGB обычно, так вот при преобразовании в него и обратно отсекается огромная часть значений, которые могут быть представлены в Lab.

Вообще, внутри любого нормального цветового редактора цепочка преобразований выглядит так:

 

..............................HSL.....................................

.......................................................................

CMYKCMYRGBXYZLabLCh

.......................................................................

..............................HSB....................................

 

С учетом того, что "промежуточный" формат записи цвета должен быть как можно ближе к центру этого графа преобразований и как можно меньше должен "резать" цвета, то кандидат тут один - XYZ вместо TColor.

Edited by DotNetFramework

Share this post


Link to post

Short link
Share on other sites

, в делфе TColor  это -$7FFFFFFF-1..$7FFFFFFF, почему ты считаешь его "узким" я не понял?

 

Ну могу попробовать как промежуточный взять XYZ. А в твоей схеме конвертирования, какое местоположение занимает TColor?

 

Вот весь функционал, который мне сейчас доступен:

 

"Windows"

function RGB(r, g, b: Byte): COLORREF;
begin
  Result := (r or (g shl 8) or (b shl 16));
end;

function PaletteRGB(r, g, b: Byte): COLORREF;
begin
  Result := $02000000 or RGB(r,g,b);
end;

function PaletteIndex(i: Word): COLORREF;
begin
  Result := $01000000 or i;
end;

function GetRValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb);
end;

function GetGValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb shr 8);
end;

function GetBValue(rgb: DWORD): Byte;
begin
  Result := Byte(rgb shr 16);
end; 


"RGBHSLUtils"

unit RGBHSLUtils;

interface

uses
 Windows, Graphics, Math, Scanlines;

var //set these variables to your needs, e.g. 360, 255, 255
 MaxHue: integer = 360;
 MaxSat: integer = 255;
 MaxLum: integer = 255;

function HSLtoRGB (H, S, L: double): TColor;
function HSLRangeToRGB (H, S, L: integer): TColor;
procedure RGBtoHSLRange (RGB: TColor; var H1, S1, L1 : integer);
function GetHValue(AColor: TColor): integer;
function GetSValue(AColor: TColor): integer;
function GetLValue(AColor: TColor): integer;
procedure Clamp(var Input: integer; Min, Max: integer);
function HSLToRGBTriple(H, S, L : integer) : TRGBTriple;
function HSLToRGBQuad(H, S, L: integer): TRGBQuad;
procedure RGBTripleToHSL(RGBTriple : TRGBTriple; var h, s, l: integer);

implementation

function HSLtoRGB(H, S, L: double): TColor;
var
 M1, M2: double;

  function HueToColorValue(Hue: double): byte;
  var
   V : double;
  begin
   if Hue < 0 then
    Hue := Hue + 1
   else
    if Hue > 1 then
     Hue := Hue - 1;
   if 6 * Hue < 1 then
    V := M1 + (M2 - M1) * Hue * 6
   else
    if 2 * Hue < 1 then
     V := M2
    else
     if 3 * Hue < 2 then
      V := M1 + (M2 - M1) * (2/3 - Hue) * 6
     else
      V := M1;
   Result := round (255 * V)
  end;

var
 R, G, B: byte;
begin
 if S = 0 then
  begin
   R := round (MaxLum * L);
   G := R;
   B := R
  end
 else
  begin
   if L <= 0.5 then
    M2 := L * (1 + S)
   else
    M2 := L + S - L * S;
   M1 := 2 * L - M2;
   R := HueToColorValue (H + 1/3);
   G := HueToColorValue (H);
   B := HueToColorValue (H - 1/3)
  end;
 Result := RGB (R, G, B)
end;

function HSLRangeToRGB(H, S, L : integer): TColor;
begin
 if s > MaxSat then s := MaxSat;
 if s < 0 then s := 0;
 if l > MaxLum then l := MaxLum;
 if l < 0 then l := 0;
 Result := HSLToRGB(H / MaxHue, S / MaxSat, L / MaxLum);
end;

procedure RGBtoHSLRange(RGB: TColor; var H1, S1, L1 : integer);
var
  R, G, B, D, Cmax, Cmin, h, s, l: double;
begin
 H := h1;
 S := s1;
 L := l1;
 R := GetRValue (RGB) / 255;
 G := GetGValue (RGB) / 255;
 B := GetBValue (RGB) / 255;
 Cmax := Max (R, Max (G, B));
 Cmin := Min (R, Min (G, B));
 L := (Cmax + Cmin) / 2;
 if Cmax = Cmin then
  begin
   H := 0;
   S := 0;
  end
 else
  begin
   D := Cmax - Cmin;
   //calc L
   if L < 0.5 then
    S := D / (Cmax + Cmin)
   else
    S := D / (2 - Cmax - Cmin);
   //calc H
   if R = Cmax then
    H := (G - B) / D
   else
    if G = Cmax then
     H  := 2 + (B - R) /D
    else
     H := 4 + (R - G) / D;
   H := H / 6;
   if H < 0 then
    H := H + 1;
  end;
 H1 := round (H * MaxHue);
 S1 := round (S * MaxSat);
 L1 := round (L * MaxLum);
end;

function GetHValue(AColor: TColor): integer;
var
 d, h: integer;
begin
 RGBToHSLRange(AColor, h, d, d);
 Result := h;
end;

function GetSValue(AColor: TColor): integer;
var
 d, s: integer;
begin
 RGBToHSLRange(AColor, d, s, d);
 Result := s;
end;

function GetLValue(AColor: TColor): integer;
var
 d, l: integer;
begin
 RGBToHSLRange(AColor, d, d, l);
 Result := l;
end;

procedure Clamp(var Input: integer; Min, Max: integer);
begin
 if (Input < Min) then Input := Min;
 if (Input > Max) then Input := Max;
end;

function HSLToRGBTriple(H, S, L: integer): TRGBTriple;
const
 Divisor = 255*60;
var
 hTemp, f, LS, p, q, r: integer;
begin
 Clamp(H, 0, MaxHue);
 Clamp(S, 0, MaxSat);
 Clamp(L, 0, MaxLum);
 if (S = 0) then
   Result := RGBToRGBTriple(L, L, L)
 else
  begin
   hTemp := H mod MaxHue;
   f := hTemp mod 60;
   hTemp := hTemp div 60;
   LS := L*S;
   p := L - LS div MaxLum;
   q := L - (LS*f) div Divisor;
   r := L - (LS*(60 - f)) div Divisor;
   case hTemp of
    0: Result := RGBToRGBTriple(L, r, p);
    1: Result := RGBToRGBTriple(q, L, p);
    2: Result := RGBToRGBTriple(p, L, r);
    3: Result := RGBToRGBTriple(p, q, L);
    4: Result := RGBToRGBTriple(r, p, L);
    5: Result := RGBToRGBTriple(L, p, q);
   else
    Result  := RGBToRGBTriple(0, 0, 0);
   end;
  end;
end;

function HSLToRGBQuad(H, S, L: integer): TRGBQuad;
const
 Divisor = 255*60;
var
 hTemp, f, LS, p, q, r: integer;
begin
 Clamp(H, 0, MaxHue);
 Clamp(S, 0, MaxSat);
 Clamp(L, 0, MaxLum);
 if (S = 0) then
   Result := RGBToRGBQuad(L, L, L)
 else
  begin
   hTemp := H mod MaxHue;
   f := hTemp mod 60;
   hTemp := hTemp div 60;
   LS := L*S;
   p := L - LS div MaxLum;
   q := L - (LS*f) div Divisor;
   r := L - (LS*(60 - f)) div Divisor;
   case hTemp of
    0: Result := RGBToRGBQuad(L, r, p);
    1: Result := RGBToRGBQuad(q, L, p);
    2: Result := RGBToRGBQuad(p, L, r);
    3: Result := RGBToRGBQuad(p, q, L);
    4: Result := RGBToRGBQuad(r, p, L);
    5: Result := RGBToRGBQuad(L, p, q);
   else
    Result  := RGBToRGBQuad(0, 0, 0);
   end;
  end;
end;

procedure RGBTripleToHSL(RGBTriple: TRGBTriple; var h, s, l: integer);

 function RGBMaxValue(RGB: TRGBTriple): byte;
 begin
  Result  := RGB.rgbtRed;
  if (Result < RGB.rgbtGreen) then Result := RGB.rgbtGreen;
  if (Result < RGB.rgbtBlue) then Result := RGB.rgbtBlue;
 end;

 function RGBMinValue(RGB: TRGBTriple) : byte;
 begin
  Result  := RGB.rgbtRed;
  if (Result > RGB.rgbtGreen) then Result := RGB.rgbtGreen;
  if (Result > RGB.rgbtBlue) then Result := RGB.rgbtBlue;
 end;
var
 Delta, Min: byte;
begin
 L     := RGBMaxValue(RGBTriple);
 Min   := RGBMinValue(RGBTriple);
 Delta := L-Min;
 if (L = Min) then
  begin
   H := 0;
   S := 0;
  end
 else
  begin
   S := MulDiv(Delta, 255, L);
   with RGBTriple do
    begin
     if (rgbtRed = L) then
      H := MulDiv(60, rgbtGreen-rgbtBlue, Delta)
     else
      if (rgbtGreen = L) then
       H := MulDiv(60, rgbtBlue-rgbtRed,   Delta) + 120
      else
       if (rgbtBlue = L) then
        H := MulDiv(60, rgbtRed-rgbtGreen,  Delta) + 240;
     if (H < 0) then H := H + 360;
    end;
  end;
end;

end. 

"RGBHSVUtils"

unit RGBHSVUtils;

interface

uses
 Windows, SysUtils, Classes, Graphics, Math, Scanlines;

procedure Clamp(var Input: integer; Min, Max: integer);
function RGBtoRGBTriple(R, G, B: byte): TRGBTriple;
function RGBtoRGBQuad(R, G, B: byte): TRGBQuad;
function RGBTripleToColor(Triple: TRGBTriple): TColor;
procedure RGBToHSV(R,G,B: integer; var H,S,V: integer);
function HSVtoRGBTriple(H, S, V: integer): TRGBTriple;
function HSVtoRGBQuad(H, S, V: integer): TRGBQuad;
function HSVtoColor(H, S, V: integer): TColor;
function GetHValue(Color: TColor): integer;
function GetVValue(Color: TColor): integer;
function GetSValue(Color: TColor): integer;

implementation

procedure Clamp(var Input: integer; Min, Max: integer);
begin
 if Input < Min then Input := Min;
 if Input > Max then Input := Max;
end;

function RGBtoRGBTriple(R, G, B: byte): TRGBTriple;
begin
 with Result do
  begin
   rgbtRed := R;
   rgbtGreen := G;
   rgbtBlue := B;
  end
end;

function RGBtoRGBQuad(R, G, B: byte): TRGBQuad;
begin
 with Result do
  begin
   rgbRed := R;
   rgbGreen := G;
   rgbBlue := B;
   rgbReserved := 0;
  end
end;

function RGBTripleToColor(Triple: TRGBTriple): TColor;
begin
 Result := TColor(RGB(Triple.rgbtRed, Triple.rgbtGreen, Triple.rgbtBlue));
end;

procedure RGBToHSV(R, G, B: integer; var H, S, V: integer);
var
 Delta, Min, H1, S1: real;
begin
 h1 := h;
 s1 := s;
 Min := MinIntValue([R, G, B]);
 V := MaxIntValue([R, G, B]);
 Delta := V - Min;
 if V =  0.0 then S1 := 0 else S1 := Delta / V;
 if S1  = 0.0 then
  H1 := 0
 else
  begin
   if R = V then
    H1 := 60.0 * (G - B) / Delta
   else
    if G = V then
     H1 := 120.0 + 60.0 * (B - R) / Delta
    else
     if B = V then
      H1 := 240.0 + 60.0 * (R - G) / Delta;
   if H1 < 0.0 then H1 := H1 + 360.0;
  end;
 h := round(h1);
 s := round(s1*255);
end;

function HSVtoRGBTriple(H, S, V: integer): TRGBTriple;
const
 divisor: integer = 255*60;
var
 f, hTemp, p, q, t, VS: integer;
begin
 if H > 360 then H := H - 360;
 if H < 0 then H := H + 360;
 if s = 0 then
  Result := RGBtoRGBTriple(V, V, V)
 else
  begin
   if H = 360 then hTemp := 0 else hTemp := H;
   f := hTemp mod 60;
   hTemp := hTemp div 60;
   VS := V*S;
   p := V - VS div 255;
   q := V - (VS*f) div divisor;
   t := V - (VS*(60 - f)) div divisor;
   case hTemp of
    0: Result := RGBtoRGBTriple(V, t, p);
    1: Result := RGBtoRGBTriple(q, V, p);
    2: Result := RGBtoRGBTriple(p, V, t);
    3: Result := RGBtoRGBTriple(p, q, V);
    4: Result := RGBtoRGBTriple(t, p, V);
    5: Result := RGBtoRGBTriple(V, p, q);
   else Result := RGBtoRGBTriple(0,0,0)
   end;
  end;
end;

function HSVtoRGBQuad(H, S, V: integer): TRGBQuad;
const
 divisor: integer = 255*60;
var
 f, hTemp, p, q, t, VS: integer;
begin
 if H > 360 then H := H - 360;
 if H < 0 then H := H + 360;
 if s = 0 then
  Result := RGBtoRGBQuad(V, V, V)
 else
  begin
   if H = 360 then hTemp := 0 else hTemp := H;
   f := hTemp mod 60;
   hTemp := hTemp div 60;
   VS := V*S;
   p := V - VS div 255;
   q := V - (VS*f) div divisor;
   t := V - (VS*(60 - f)) div divisor;
   case hTemp of
    0: Result := RGBtoRGBQuad(V, t, p);
    1: Result := RGBtoRGBQuad(q, V, p);
    2: Result := RGBtoRGBQuad(p, V, t);
    3: Result := RGBtoRGBQuad(p, q, V);
    4: Result := RGBtoRGBQuad(t, p, V);
    5: Result := RGBtoRGBQuad(V, p, q);
   else Result := RGBtoRGBQuad(0,0,0)
   end;
  end;
end;

function HSVtoColor(H, S, V: integer): TColor;
begin
 Result := RGBTripleToColor(HSVtoRGBTriple(H, S, V));
end;

function GetHValue(Color: TColor): integer;
var
 s, v: integer;
begin
 RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), Result, s, v);
end;

function GetSValue(Color: TColor): integer;
var
 h, v: integer;
begin
 RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), h, Result, v);
end;

function GetVValue(Color: TColor): integer;
var
 h, s: integer;
begin
 RGBToHSV(GetRValue(Color), GetGValue(Color), GetBValue(Color), h, s, Result);
end;

end. 

"RGBCIEUtils"

unit RGBCIEUtils;

interface

uses
 SysUtils, Windows, Graphics, Math;

const
 {// Observer= 2°, Illuminant= D65    - Daylignt
 ref_X =  95.047;
 ref_Z = 108.883;
 // Observer= 10°, Illuminant= D65   - Daylight
 ref_X =  94.811;
 ref_Z = 35.2;

 // Observer= 2°, Illuminant= A      - Incadescent
 ref_X =  109.850;
 ref_Z = 35.585;
 // Observer= 10°, Illuminant= A     - Incadescent
 ref_X =  111.144;
 ref_Z = 35.2;

 // Observer= 2°, Illuminant= C
 ref_X =  98.074;
 ref_Z = 118.232;
 // Observer= 10°, Illuminant= C
 ref_X =  97.285;
 ref_Z = 116.145;
                }
 // Observer= 2°, Illuminant= D50
 ref_X =  96.422;
 ref_Z = 82.521;{
 // Observer= 10°, Illuminant= D50 - Photoshop
 ref_X =  96.72;
 ref_Z = 81.427; }

 {// Observer= 2°, Illuminant= D55
 ref_X =  95.682;
 ref_Z = 92.149;
 // Observer= 10°, Illuminant= D55
 ref_X =  95.799;
 ref_Z = 90.926;

 // Observer= 2°, Illuminant= D75
 ref_X =  94.972;
 ref_Z = 122.638;
 // Observer= 10°, Illuminant= D75
 ref_X =  94.416;
 ref_Z = 12.641;

 // Observer= 2°, Illuminant= F2     - Fluorescent
 ref_X =  99.187;
 ref_Z = 67.395;
 // Observer= 10°, Illuminant= F2    - Fluorescent
 ref_X =  103.28;
 ref_Z = 69.026;

 // Observer= 2°, Illuminant= F7
 ref_X =  95.044;
 ref_Z = 108.755;
 // Observer= 10°, Illuminant= F7
 ref_X =  95.792;
 ref_Z = 107.678;

 // Observer= 2°, Illuminant= F11
 ref_X =  100.966;
 ref_Z = 64.370;
 // Observer= 10°, Illuminant= F11
 ref_X =  103.866;
 ref_Z = 65.627;   }

type
 xyz = record
  x: real;
  y: real;
  z: real;
 end;

function LabToXYZ(l, a, b: real): xyz;
function XYZToRGB(space: xyz): TColor;
function LabToRGB(l, a, b: real): TColor;
function RGBToXYZ(c: TColor): xyz;
procedure RGBToLab(clr: TColor; var l, a, b: real);
procedure XYZToLab(space: xyz; var l, a, b: real);
procedure LCHToLab(lum, c, h: real; var l, a, b: real);
procedure LabToLCH(l, a, b: real; var lum, c, h: real);
function LCHToRGB(l, c, h: real): TColor;
procedure RGBToLCH(clr: TColor; var l, c, h: real);
function GetCIEXValue(c: TColor): real;
function GetCIEYValue(c: TColor): real;
function GetCIEZValue(c: TColor): real;
function GetCIELValue(c: TColor): real;
function GetCIEAValue(c: TColor): real;
function GetCIEBValue(c: TColor): real;
function GetCIECValue(c: TColor): real;
function GetCIEHValue(c: TColor): real;

implementation

function LabToXYZ(l, a, b: real): xyz;
var
 x, y, z: real;
begin
 y := (l + 16)/116;
 x := a/500 + y;
 z := y - b/200;
 if y > 0.2069 then
  y := IntPower(y, 3)
 else
  y := (y - 0.138)/7.787;
 if x > 0.2069 then
  x := IntPower(x, 3)
 else
  x := (x - 0.138)/7.787;
 if z > 0.2069 then
  z := IntPower(z, 3)
 else
  z := (z - 0.138)/7.787;
 Result.x := ref_X * x;
 Result.y := 100 * y;
 Result.z := ref_Z * z;
end;

function XYZToRGB(space: xyz): TColor;
var
 r, g, b, x, y, z: real;
begin
 x := space.x/100;
 y := space.y/100;
 z := space.z/100;
 r := x * 3.2406 + y * (-1.5372) + z * (-0.49);
 g := x * (-0.969) + y * 1.8758 + z * 0.0415;
 b := x * 0.0557 + y * (-0.2040) + z * 1.0570;
 if r > 0.00313 then
  r := 1.055 * Power(r, 1/2.4) - 0.055
 else
  r := 12.92 * r;
 if g > 0.00313 then
  g := 1.055 * Power(g, 1/2.4) - 0.055
 else
  g := 12.92 * g;
 if b > 0.00313 then
  b := 1.055 * Power(b, 1/2.4) - 0.055
 else
  b := 12.92 * b;

 if r < 0 then r := 0;
 if r > 1 then r := 1;
 if g < 0 then g := 0;
 if g > 1 then g := 1;
 if b < 0 then b := 0;
 if b > 1 then b := 1;
 Result := RGB(Round(r*255), Round(g*255), Round(b*255));
end;

function LabToRGB(l, a, b: real): TColor;
begin
 Result := XYZToRGB(LabToXYZ(l, a, b));
end;

function RGBToXYZ(c: TColor): xyz;
var
 r, g, b: real;
begin
 r := GetRValue(c)/255;
 g := GetGValue(c)/255;
 b := GetBValue(c)/255;
 if r > 0.04045 then
  r := Power((r + 0.055)/1.055, 2.4)
 else
  r := r/12.92;
 if g > 0.04045 then
  g := Power((g + 0.055)/1.055, 2.4)
 else
  g := g/12.92;
 if b > 0.04045 then
  b := Power((b + 0.055)/1.055, 2.4)
 else
  b := b/12.92;
 r := r * 100;
 g := g * 100;
 b := b * 100;
 // Observer= 2°, Illuminant= D65
 Result.x := r * 0.4124 + g * 0.3576 + b * 0.1805;
 Result.y := r * 0.2126 + g * 0.7152 + b * 0.0722;
 Result.z := r * 0.0193 + g * 0.1192 + b * 0.9505;
end;

procedure XYZToLab(space: xyz; var l, a, b: real);
var
x, y, z: real;
begin
 x := space.x/ref_X;
 y := space.y/100;
 z := space.z/ref_Z;
 if x > 0.008856 then
  x := Power(x, 1/3)
 else
  x := (7.787*x) + 0.138;
 if y > 0.008856 then
  y := Power(y, 1/3)
 else
  y := (7.787*y) + 0.138;
 if z > 0.008856 then
  z := Power(z, 1/3)
 else
  z := (7.787*z) + 0.138;
 l := (116*y) - 16;
 a := 500 * (x - y);
 b := 200 * (y - z);
 if l > 100 then l := 100;
 if l < 0 then l := 0;
 if a < -128 then a := -128;
 if a > 127 then a := 127;
 if b < -128 then b := -128;
 if b > 127 then b := 127;
end;

procedure RGBToLab(clr: TColor; var l, a, b: real);
var
 s: xyz;
begin
 s := RGBToXYZ(clr);
 XYZToLab(s, l, a, b);
end;

procedure LCHToLab(lum, c, h: real; var l, a, b: real);
begin
 l := lum;
 a := cos(DegToRad(h)) * c;
 b := sin(DegToRad(h)) * c;
end;

procedure LabToLCH(l, a, b: real; var lum, c, h: real);
begin
 h := ArcTan2(b, a);
 if h > 0 then
  h := (h/PI) * 180
 else
  h := 360 - (ABS(h)/PI) * 180;
 if h = 360 then //************************ STRANIKS_SCAN ***************** 02/10/2014
  h := 0;
 lum := l;
 c := SQRT(a*a + b*b);
end;

procedure RGBToLCH(clr: TColor; var l, c, h: real);
var
 a, b: real;
begin
 RGBToLab(clr, l, a, b);
 LabToLCH(l, a, b, l, c, h);
end;

function LCHToRGB(l, c, h: real): TColor;
var
 lum, a, b: real;
begin
 LCHToLab(l, c, h, lum, a, b);
 Result := LabToRGB(lum, a, b);
end;

function GetCIEXValue(c: TColor): real;
var
 d: xyz;
begin
 d := RGBToXYZ(c);
 Result := d.x;
end;

function GetCIEYValue(c: TColor): real;
var
 d: xyz;
begin
 d := RGBToXYZ(c);
 Result := d.y;
end;

function GetCIEZValue(c: TColor): real;
var
 d: xyz;
begin
 d := RGBToXYZ(c);
 Result := d.z;
end;

function GetCIELValue(c: TColor): real;
var
 d: real;
begin
 XYZToLab(RGBToXYZ(c), Result, d, d);
end;

function GetCIEAValue(c: TColor): real;
var
 d: real;
begin
 XYZToLab(RGBToXYZ(c), d, Result, d);
end;

function GetCIEBValue(c: TColor): real;
var
 d: real;
begin
 XYZToLab(RGBToXYZ(c), d, d, Result);
end;

function GetCIECValue(c: TColor): real;
var
 d: real;
begin
 RGBToLCH(c, d, Result, d);
end;

function GetCIEHValue(c: TColor): real;
var
 d: real;
begin
 RGBToLCH(c, d, d, Result);
end;

end.
 

"RGBCMYKUtils"

unit RGBCMYKUtils;

//StranikS_Scan Edition 30/10/2013

interface

uses
 Windows, Graphics, Math;

//function CMYtoTColor(C, M, Y: integer): TColor;
//procedure RGBtoCMY(clr: TColor; var C, M, Y: integer);
function CMYKToTColor (C, M, Y, K: integer): TColor;
procedure ColorToCMYK(clr: TColor; var C, M, Y, K: integer);
function GetCValue(c: TColor): integer;
function GetMValue(c: TColor): integer;
function GetYValue(c: TColor): integer;
function GetKValue(c: TColor): integer;

implementation

{function CMYtoTColor(C, M, Y: integer): TColor;
begin
 Result := RGB(255 - C, 255 - M, 255 - Y);
end;}

{procedure RGBtoCMY(clr: TColor; var C, M, Y: integer);
begin
 C := 255 - GetRValue(clr);
 M := 255 - GetGValue(clr);
 Y := 255 - GetBValue(clr);
end;}

function CMYKToTColor (C, M, Y, K: integer): TColor;
begin
{ Result := RGB(255 - (C + K), 255 - (M + K), 255 - (Y + K)); }
 Result := RGB(Round(255*(1-C/100)*(1-K/100)),Round(255*(1-M/100)*(1-K/100)),Round(255*(1-Y/100)*(1-K/100)));
end;

procedure ColorToCMYK(clr: TColor; var C, M, Y, K: integer);
var _C, _M, _Y, _K: Real;
begin
{ C := 255 - GetRValue(clr);
 M := 255 - GetGValue(clr);
 Y := 255 - GetBValue(clr);
 K := MinIntValue([C, M, Y]);
 C := C - K;
 M := M - K;
 Y := Y - K;   }
_C:=1-GetRValue(clr)/255;
_Y:=1-GetGValue(clr)/255;
_M:=1-GetBValue(clr)/255;
_K:=MinValue([_C,_Y,_M]);
if _K=1 then
 begin
 _C:=0;
 _M:=0;
 _Y:=0;
 end
else begin
     _C:=(_C-_K)/(1-_K);
     _M:=(_M-_K)/(1-_K);
     _Y:=(_Y-_K)/(1-_K);
     end;
C:=Round(100*_C);
M:=Round(100*_M);
Y:=Round(100*_Y);
K:=Round(100*_K);
end;

function GetCValue(c: TColor): integer;
var
 d: integer;
begin
 ColorToCMYK(c, Result, d, d, d);
end;

function GetMValue(c: TColor): integer;
var
 d: integer;
begin
 ColorToCMYK(c, d, Result, d, d);
end;

function GetYValue(c: TColor): integer;
var
 d: integer;
begin
 ColorToCMYK(c, d, d, Result, d);
end;

function GetKValue(c: TColor): integer;
var
 d: integer;
begin
 ColorToCMYK(c, d, d, d, Result);
end;

end. 

"HTMLColors"

unit HTMLColors;

interface

{$I mxs.inc}

uses
 SysUtils, Windows, Graphics{$IFDEF DELPHI_6_UP}, Variants{$ENDIF};

const
 SPECIAL_COUNT = 140;
 WEBSAFE_COUNT = 216;
 SYSTEM_COUNT = 28;
 BASIC_COUNT = 16;
 SPECIAL_HEX: array [0..139] of string = ('000000', 'FAEBD7', '00FFFF', '7FFFD4', 'F0FFFF', 'F5F5DC', 'FFE4C4',
                'F0F8FF', 'FFEBCD', '0000FF', '8A2BE2', 'A52A2A', 'DEB887', '5F9EA0',
                '7FFF00', 'D2691E', 'FF7F50', '6495ED', 'FFF8DC', 'DC143C', '00FFFF',
                '00008B', '008B8B', 'B8860B', 'A9A9A9', '006400', 'BDB76B', '8B008B',
                '556B2F', 'FF8C00', '9932CC', '8B0000', 'E9967A', '8FBC8B', '483D8B',
                '2F4F4F', '00CED1', '9400D3', 'FF1493', '00BFFF', '696969', '1E90FF',
                'B22222', 'FFFAF0', '228B22', 'FF00FF', 'DCDCDC', 'F8F8FF', 'FFD700',
                'DAA520', '808080', '008000', 'ADFF2F', 'F0FFF0', 'FF69B4', 'CD5C5C',
                '4B0082', 'FFFFF0', 'F0E68C', 'E6E6FA', 'FFF0F5', '7CFC00', 'FFFACD',
                'ADD8E6', 'F08080', 'E0FFFF', 'FAFAD2', '90EE90', 'D3D3D3', 'FFB6C1',
                'FFA07A', '20B2AA', '87CEFA', '778899', 'B0C4DE', 'FFFFE0', '00FF00',
                '32CD32', 'FAF0E6', 'FF00FF', '800000', '66CDAA', '0000CD', 'BA55D3',
                '9370DB', '3CB371', '7B68EE', '00FA9A', '48D1CC', 'C71585', '191970',
                'F5FFFA', 'FFE4E1', 'FFE4B5', 'FFDEAD', '000080', 'FDF5E6', '808000',
                '6B8E23', 'FFA500', 'FF4500', 'DA70D6', 'EEE8AA', '98FB98', 'AFEEEE',
                'DB7093', 'FFEFD5', 'FFDAB9', 'CD853F', 'FFC0CB', 'DDA0DD', 'B0E0E6',
                '800080', 'FF0000', 'BC8F8F', '4169E1', '8B4513', 'FA8072', 'F4A460',
                '2E8B57', 'FFF5EE', 'A0522D', 'C0C0C0', '87CEEB', '6A5ACD', '708090',
                'FFFAFA', '00FF7F', '4682B4', 'D2B48C', '008080', 'D8BFD8', 'FF6347',
                '40E0D0', 'EE82EE', 'F5DEB3', 'FFFFFF', 'F5F5F5', 'FFFF00', '9ACD32');
 SPECIAL_NAMES: array [0..139] of string = ('black', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige',
                'bisque', 'aliceblue', 'blanchedalmond', 'blue', 'blueviolet', 'brown',
                'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral',
                'cornflower', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan',
                'darkgoldenrod', 'darkgray', 'darkgreen', 'darkkhaki', 'darkmagenta',
                'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon',
                'darkseagreen', 'darkslateblue', 'darkslategray', 'darkturquoise',
                'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dodgerblue',
                'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro',
                'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow',
                'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender',
                'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral',
                'lightcyan', 'lightgoldenrodyellow', 'lightgreen', 'lightgray', 'lightpink',
                'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray',
                'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta',
                'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple',
                'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise',
                'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin',
                'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered',
                'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred',
                'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple',
                'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown',
                'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue',
                'slategray', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle',
                'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow',
                'yellowgreen');
 WEBSAFE_HEX: array [0..215] of string = ('000000' ,'000033' ,'000066' ,'000099' ,'0000cc' ,'0000ff',
                '003300' ,'003333' ,'003366' ,'003399' ,'0033cc' ,'0033ff',
                '006600' ,'006633' ,'006666' ,'006699' ,'0066cc' ,'0066ff',
                '009900' ,'009933' ,'009966' ,'009999' ,'0099cc' ,'0099ff',
                '00cc00' ,'00cc33' ,'00cc66' ,'00cc99' ,'00cccc' ,'00ccff',
                '00ff00' ,'00ff33' ,'00ff66' ,'00ff99' ,'00ffcc' ,'00ffff',
                '330000' ,'330033' ,'330066' ,'330099' ,'3300cc' ,'3300ff',
                '333300' ,'333333' ,'333366' ,'333399' ,'3333cc' ,'3333ff',
                '336600' ,'336633' ,'336666' ,'336699' ,'3366cc' ,'3366ff',
                '339900' ,'339933' ,'339966' ,'339999' ,'3399cc' ,'3399ff',
                '33cc00' ,'33cc33' ,'33cc66' ,'33cc99' ,'33cccc' ,'33ccff',
                '33ff00' ,'33ff33' ,'33ff66' ,'33ff99' ,'33ffcc' ,'33ffff',
                '660000' ,'660033' ,'660066' ,'660099' ,'6600cc' ,'6600ff',
                '663300' ,'663333' ,'663366' ,'663399' ,'6633cc' ,'6633ff',
                '666600' ,'666633' ,'666666' ,'666699' ,'6666cc' ,'6666ff',
                '669900' ,'669933' ,'669966' ,'669999' ,'6699cc' ,'6699ff',
                '66cc00' ,'66cc33' ,'66cc66' ,'66cc99' ,'66cccc' ,'66ccff',
                '66ff00' ,'66ff33' ,'66ff66' ,'66ff99' ,'66ffcc' ,'66ffff',
                '990000' ,'990033' ,'990066' ,'990099' ,'9900cc' ,'9900ff',
                '993300' ,'993333' ,'993366' ,'993399' ,'9933cc' ,'9933ff',
                '996600' ,'996633' ,'996666' ,'996699' ,'9966cc' ,'9966ff',
                '999900' ,'999933' ,'999966' ,'999999' ,'9999cc' ,'9999ff',
                '99cc00' ,'99cc33' ,'99cc66' ,'99cc99' ,'99cccc' ,'99ccff',
                '99ff00' ,'99ff33' ,'99ff66' ,'99ff99' ,'99ffcc' ,'99ffff',
                'cc0000' ,'cc0033' ,'cc0066' ,'cc0099' ,'cc00cc' ,'cc00ff',
                'cc3300' ,'cc3333' ,'cc3366' ,'cc3399' ,'cc33cc' ,'cc33ff',
                'cc6600' ,'cc6633' ,'cc6666' ,'cc6699' ,'cc66cc' ,'cc66ff',
                'cc9900' ,'cc9933' ,'cc9966' ,'cc9999' ,'cc99cc' ,'cc99ff',
                'cccc00' ,'cccc33' ,'cccc66' ,'cccc99' ,'cccccc' ,'ccccff',
                'ccff00' ,'ccff33' ,'CCFF66' ,'ccff99' ,'ccffcc' ,'ccffff',
                'ff0000' ,'ff0033' ,'ff0066' ,'ff0099' ,'ff00cc' ,'ff00ff',
                'ff3300' ,'ff3333' ,'ff3366' ,'ff3399' ,'ff33cc' ,'ff33ff',
                'ff6600' ,'ff6633' ,'ff6666' ,'ff6699' ,'ff66cc' ,'ff66ff',
                'ff9900' ,'ff9933' ,'ff9966' ,'ff9999' ,'ff99cc' ,'ff99ff',
                'ffcc00' ,'ffcc33' ,'ffcc66' ,'ffcc99' ,'ffcccc' ,'ffccff',
                'ffff00' ,'ffff33' ,'ffff66' ,'ffff99' ,'ffffcc' ,'ffffff');
 SYSTEM_VALUES: array [0..27] of TColor = (clActiveBorder, clActiveCaption, clAppWorkspace, clBackground,
                clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText,
                clGrayText, clHighlight, clHighlightText, clInactiveBorder,
                clInactiveCaption, clInactiveCaptionText, clInfoBk, clInfoText,
                clMenu, clMenuText, clScrollbar, cl3dDkShadow, cl3dLight,
                clBtnHighlight, clActiveBorder, clBtnShadow, clWindow,
                clWindowFrame, clWindowText);
 SYSTEM_NAMES: array [0..27] of string = ('activeborder', 'activecaption', 'appworkspace', 'background',
                'buttonface', 'buttonhighlight', 'buttonshadow', 'buttontext',
                'captiontext', 'graytext', 'highlight', 'highlighttext',
                'inactiveborder', 'inactivecaption', 'inactivecaptiontext',
                'infobackground', 'infotext', 'menu', 'menutext', 'scrollbar',
                'threeddarkshadow', 'threedface', 'threedhighlight',
                'threedlightshadow', 'threedshadow', 'window', 'windowframe',
                'windowtext');
 BASIC_VALUES: array [0..15] of TColor = (clBlack, clAqua, clBlue, clFuchsia, clGray, clGreen, clLime,
                clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal,
                clWhite, clYellow);
 BASIC_NAMES: array [0..15] of string = ('black', 'aqua', 'blue', 'fuchsia', 'gray', 'green', 'lime',
               'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal',
               'white', 'yellow');

procedure MakeIntoHex(var s: string);
function IsMember(a: array of string; n: integer; s: string): boolean;
function IsSpecialColor(s: string): boolean;
function FormatHexColor(S: string): string;
function ColorToHex(Color: TColor): string;
function HexToTColor(s: OleVariant): TColor;
function GetHexFromName(s: string): string;
function GetValueFromName(s: string): TColor;
function IsWebSafe(s: string): boolean; overload;
function IsWebSafe(c: TColor): boolean; overload;
function GetWebSafe(C: TColor): TColor;

implementation

var
 WS: array [0..255] of byte;

//------------------------------------------------------------------------------

//checks membership of a string array
function IsMember(a: array of string; n: integer; s: string): boolean;
var
 i: integer;
begin
 Result := false;
 for i := 0 to n - 1 do
  if SameText(s, a[i]) then
   Result := true;
end;

//------------------------------------------------------------------------------

//checks if the color's nam was used instead of hex
function IsSpecialColor(s: string): boolean;
begin
 Result := IsMember(BASIC_NAMES, BASIC_COUNT, s) or IsMember(SPECIAL_NAMES, SPECIAL_COUNT, s) or IsMember(SYSTEM_NAMES, SYSTEM_COUNT, s);
end;

//------------------------------------------------------------------------------

//is hex was used then remove the wrong characters
procedure MakeIntoHex(var s: string);
var
 i: integer;
begin
if s <> '' then
 for i := 1 to Length(s) do
  if not (s[i] in ['0'..'9', 'A'..'F', 'a'..'f']) then
   s[i] := '0';
end;

//------------------------------------------------------------------------------

//formats entered text into a true hex value
function FormatHexColor(S: string): string;
var
 c: string;
 i: integer;
begin
 c := '';
 if not IsSpecialColor(s) then
  begin
   if (s <> '') and (s[1] = '#') then
    Delete(s, 1, 1);

   if s <> '' then
    begin
     MakeIntoHex(c);
     if Length(c) = 6 then
      Result := c
     else
      begin
       if Length(c) > 6 then
        c := Copy(c, 1, 6);
       if Length(c) < 6 then
        for i := 0 to 6 - Length(c) - 1 do
          c := '0' + c;
       Result := c;
      end;
    end
   else
    Result := '000000';
  end
 else
  Result := s;
end;

//------------------------------------------------------------------------------

//gets a hex value from a color name from special colors
function GetHexFromName(s: string): string;
var
 i, k: integer;
begin
 k := 0;
 for i := 0 to SPECIAL_COUNT - 1 do
  if SameText(s, SPECIAL_NAMES[i]) then
   begin
    k := i;
    Break;
   end;
 Result := SPECIAL_HEX[k];
end;

//------------------------------------------------------------------------------

// gets a TColor value from a color name from basic or system colors
function GetValueFromName(s: string): TColor;
var
 i, k: integer;
begin
 k := 0;
 s := LowerCase(s);
 if IsMember(BASIC_NAMES, BASIC_COUNT, s) then
  begin
   for i := 0 to BASIC_COUNT - 1 do
    if SameText(s, BASIC_NAMES[i]) then
     begin
      k := i;
      Break;
     end;
   Result := BASIC_VALUES[k];
  end
 else
  if IsMember(SYSTEM_NAMES, SYSTEM_COUNT, s) then
   begin
    for i := 0 to SYSTEM_COUNT - 1 do
     if SameText(s, SYSTEM_NAMES[i]) then
      begin
       k := i;
       Break;
      end;
    Result := SYSTEM_VALUES[k];
   end
  else
   Result := clNone;
end;

//------------------------------------------------------------------------------

//converts a TColor value to a hex value
function ColorToHex(Color: TColor): string;
begin
 if Color <> $ then
  Result := IntToHex(GetRValue(Color), 2) + IntToHex(GetGValue(Color), 2) + IntToHex(GetBValue(Color), 2)
 else
  Result := '000000';
end;

//------------------------------------------------------------------------------

//converts a hex value to a TColor
function HexToTColor(s: OleVariant): TColor;
begin
 if s <> null then
  begin
   if not IsSpecialColor(s) then
    begin
     s := FormatHexColor(s);
     if s <> '' then
      Result := RGB(StrToInt('$'+Copy(S, 1, 2)), StrToInt('$'+Copy(S, 3, 2)), StrToInt('$'+Copy(S, 5, 2)))
     else
      Result := clNone;
    end
   else
    if IsMember(SPECIAL_NAMES, SPECIAL_COUNT, s) then
     begin
      s := GetHexFromName(s);
      Result := RGB(StrToInt('$'+Copy(S, 1, 2)), StrToInt('$'+Copy(S, 3, 2)), StrToInt('$'+Copy(S, 5, 2)));
     end
    else
     Result := GetValueFromName(s);
  end
 else
  Result := clNone;
end;

//------------------------------------------------------------------------------

//checks if a hex value belongs to the websafe palette
function IsWebSafe(s: string): boolean;
begin
 s := FormatHexColor(s);
 Result := IsMember(WEBSAFE_HEX, WEBSAFE_COUNT, s);
end;

//------------------------------------------------------------------------------

//checks if a color belongs to the websafe palette
function IsWebSafe(c: TColor): boolean;
var
 s: string;
begin
 s  := ColorToHex(c);
 Result := IsMember(WEBSAFE_HEX, WEBSAFE_COUNT, s);
end;

//------------------------------------------------------------------------------

//initializes the websafe comparison array
procedure InitializeWS;
 var
   i: integer;
 begin
  for i := 0 to 255 do
   WS[I] := ((i + $19) div $33) * $33;
 end;

//------------------------------------------------------------------------------

//returns the closest web safe color to the one given
function GetWebSafe(C: TColor): TColor;
begin
 Result := RGB(WS[GetRValue(C)], WS[GetGValue(C)], WS[GetBValue(C)]);
end;

//------------------------------------------------------------------------------

initialization
 InitializeWS;

end. 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

 

 

какое местоположение занимает TColor
 только для хранения значений, которые RGB. Объясню почему. Красный в RGB это ff0000. Но в природе есть "еще более красный", но для красного 255 - и потолок, краснее не сделаешь.

Но в пространствах Lab, LCh, XYZ он есть.

 

При этом, чтобы в RGB у тебя не было чисел больше 255, есть код:

 if r < 0 then r := 0;
 if r > 1 then r := 1;
 if g < 0 then g := 0;
 if g > 1 then g := 1;
 if b < 0 then b := 0;
 if b > 1 then b := 1;

Т.е. он обрезает выходящие за диапазон значения. А обрезать их можно только в случае вывода на экран циферок или при рисовании цвета. А при преобразовании Lab в LCh - там RGB вообще не нужен в расчетах.


Вообще, допустим я изменил L, C или h - при этом остальные поля должны обновиться в следующем порядке:

  • Lab.
  • из Lab'а мы считаем RGB.
  • из RGB - HSB/HSV/HSL/CMY/CMYK в любом порядке.

Но если после этого я тронул RGB, то "волна" расчетов должна идти от него.

Share this post


Link to post

Short link
Share on other sites

 

 

только для хранения значений, которые RGB. Объясню почему. Красный в RGB это ff0000. Но в природе есть "еще более красный", но для красного 255 - и потолок, краснее не сделаешь. Но в пространствах Lab, LCh, XYZ он есть.

 

Расширение цветовых пространств я знаю. Я просто не понял тебя в первый раз, подумал, что TColor имеет отличия от RGB, в то время как это одно и тоже пространство же. Короче разобрались.

 

По XYZ - ты прав его надо юзать как базовое пространство. А все остальные уже от него по схеме:

 

..............................HSL.....................................
................................⇅.......................................
CMYK ⇆ CMY ⇆ RGB ⇆ XYZ ⇆ Lab ⇆ LCh
................................⇅.......................................
..............................HSB....................................

Share this post


Link to post

Short link
Share on other sites

Ошибка. Если конфиг загружать через файл "xvm.xc", находящийся в папке "Config", то при выборе в меню "Обновлять дату в конфиге" выскакивает ошибка. При загрузке через файл "@xvm.xc" - всё нормально.

XCPad.exe_error.log

И ещё, Scroll в окне редактора, если программа не развернута на весь экран, масштабируется как будто программа развернута на весь экран.


К посту №285. Та же самая ошибка выскакивает при нажатие "ОК" или "Отмена" в окне поиска "Найти...". Может у меня в операционной системе чего то не хватает?

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

К постам 285 и 292. Нашел причину ошибки. В файле "hangar.xc" не было строки:

"comments": ${"comments.xc":"comments"}.

(В той ночной сборке XVM, этого файла еще не было.)

 

 

И ещё, Scroll в окне редактора, если программа не развернута на весь экран, масштабируется как будто программа развернута на весь экран.

А это без изменений.


Пожелание. Добавить в валидацию кода проверку на " ,} " (вроде такого сочетания знаков не может быть).

При загрузке всего конфига, не открываются файлы "markers****.xc". Возможно из-за разделения сниппетов на файлы. Прилагаю конфиг.

My.rar

 

P.S. У меня еще появилась пара "руководств", как получить окно с ошибкой, если надо, опишу.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites
У меня еще появилась пара "руководств", как получить окно с

 

Пиши, буду смотреть. 

 

" ,} "

 

Во многих парсерах это не ошибка, в парсере, который XVM юзает, это не считается ошибкой. Можно еще раз проверить.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

I. Ошибка.

   1) Если в файл "login.xc" из буфера обмена вставить несколько строк с заменой нескольких строк, выскакивает ошибка.

   2) Если просто вставить или с заменой одной строки, то все нормально.

   3) Если первый пункт делать после второго, то тоже все нормально.

II. Ошибка.

   Если конфиг загрузить через файл "@xvm.xc", то при попытки открыть через меню другой файл вылетает ошибка. С другими файлами проблем нет.


Во многих парсерах это не ошибка, в парсере, который XVM юзает, это не считается ошибкой. Можно еще раз проверить.

 

Считается ошибкой. Поставил запятую в конце файла "hitLog .xc". Вот что получилось:

post-17624-0-73154600-1412587032_thumb.jpgpost-17624-0-25015100-1412587019_thumb.jpg

P.S. Не считается ошибкой, если " ,} " в тестовой строке.

Edited by ktulho

Share this post


Link to post

Short link
Share on other sites

Крутой редактор)) ОООчень понравилась подсветка цвета линией этого же цвета, очень круто и удобно, не нужно шариться по редакторам постоянно и смотреть что же это за цвет))

Пару пожеланий имеется:

1. Добавить во вкладку "Вид" такое дело, как "Перенос строк". Не знаю, может уже предлагалось, может нет...

2. И очень удобно было бы следующее (сейчас постараюсь объяснить):

мы имеем 2 окна - в одном части конфига, в другом, собственно, сам конфиг. А если конфиг длинный, а нужно перемотать колесом прокрутки мышки вниз, то курсор нужно переместить окно с конфигом, и ОБЯЗАТЕЛЬНО кликнуть ЛКМ на окне в котором конфиг. Так вот хотелось бы чтобы не нужно было кликать на окно, что бы оно стало активным к прокрутке, а при перемещении курсора в любое окно без посредства клика ЛКМ оно становилось активным к прокрутке.

Надеюсь понятно предоставил свои мысли)

Share this post


Link to post

Short link
Share on other sites

1. Добавить во вкладку "Вид" такое дело, как "Перенос строк". Не знаю, может уже предлагалось, может нет...

 Перенос есть, ищи его в главном меню.

 

2. мы имеем 2 окна - в одном части конфига, в другом, собственно, сам конфиг. А если конфиг длинный, а нужно перемотать колесом прокрутки мышки вниз, то курсор нужно переместить окно с конфигом, и ОБЯЗАТЕЛЬНО кликнуть ЛКМ на окне в котором конфиг. Так вот хотелось бы чтобы не нужно было кликать на окно, что бы оно стало активным к прокрутке, а при перемещении курсора в любое окно без посредства клика ЛКМ оно становилось активным к прокрутке.

Надеюсь понятно предоставил свои мысли)

 

Короче над каким редактором оказывается курсор, тот редактор и делаем активным. Ладно гляну такой вариант.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

 

 

Перенос есть, ищи его в главном меню

C трудом, но нашел)) Вид -> Редактор -> Перенос длинных строк. Спасибо

 

 

Короче над каким редактором оказывается курсор, тот редактор и делаем активным. Ладно гляну такой вариант.

Во! Да да да, в двух словах это оно и есть)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Помогите пожалуйста. Как сделать через XCPad чтоб было как на картинках.

post-27366-0-27432400-1412069598_thumb.jpg
post-27366-0-83792000-1412069597_thumb.jpg
post-27366-0-34877000-1412069597_thumb.jpg
Маркеры над танками
2-й столбик после названия танка - его уровень.
5-й xvn8 и количество боёв
Edited by Evgeniy_4

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...