unit untTypes;

interface

uses
  Windows, SysUtils, Classes;

type
  TCapBlink = (
   capBlinkNone,  //     ,
   capBlinkAll,   //        
   capBlinkChar);  //     

  TLineModel = (lnUnknown, lnDPD201, lnVF2029, lnMDP1, lnMDP2,
    lnMDP3, lnPOS500, lnVirtual);
  TLineDirection = (dstNone, dstUP, dstDOWN, dstLEFT, dstRIGHT);
  TLineMarqueeType = (dmtNone, dmtUP, dmtDOWN, dmtLEFT, dmtRIGHT);
  TLineMarqueeFormat = (dmfNone, dmfWALK, dmfPLACE);
  TEntryCodeToName = record
    Code: Integer;
    Name: String;
  end;
  TSetOfByte = set of Byte;
  PSetOfByte = ^TSetOfByte;
  TLineBlinkType = (ddtNormal, ddtHBlink, ddtSBlink, ddtSWindow);
  TCapCharacterSet = (
   capCharacterNUMERIC,
   capCharacterALPHA,
   capCharacterASCII,
   capCharacterKANA,
   capCharacterKANJI);
  TCharacterSet = (chsNone, chs437, chs850, chsSlavonic { 852 }, chs860, chs863,
    chs865, chsRussia { 866 }, chsKatakana { 932 }, chsASCII { 998 },
    chsWindows { 999 <=> 1252});
  TCharacterSets = set of TCharacterSet;
   
  TBounds = packed record
    Left: Integer;
    Top: Integer;
    Width: Integer;
    Height: Integer;
  end;

const
  Class_LineLS5X: TGUID = '{AE66578E-7C02-4168-A2E9-956DAA0F7071}';
  
  { LineDirection }

  DISP_ST_NONE         = -1;
  DISP_ST_UP           = 1;
  DISP_ST_DOWN         = 2;
  DISP_ST_LEFT         = 3;
  DISP_ST_RIGHT        = 4;
  S_DISP_ST_NONE       = '()';
  S_DISP_ST_UP         = '';
  S_DISP_ST_DOWN       = '';
  S_DISP_ST_LEFT       = '';
  S_DISP_ST_RIGHT      = '';
  LineDirectionToStr: array[TLineDirection] of String =
    (S_DISP_ST_NONE, S_DISP_ST_UP, S_DISP_ST_DOWN, S_DISP_ST_LEFT, S_DISP_ST_RIGHT);
  MarqueeToLineDirection: array[TLineMarqueeType] of TLineDirection =
    (dstNone, dstUP, dstDOWN, dstLEFT, dstRIGHT);
  InverseLineDirection: array[TLineDirection] of TLineDirection =
    (dstNone, dstDown, dstUp, dstRight, dstLeft);
  LineX_Enabled_Directions: TSetOfByte =
    [DISP_ST_UP, DISP_ST_DOWN, DISP_ST_LEFT, DISP_ST_RIGHT];
  LineX_Directions: array[TLineDirection] of TEntryCodeToName =
  (
    (Code: DISP_ST_NONE;  Name: S_DISP_ST_NONE),
    (Code: DISP_ST_UP;    Name: S_DISP_ST_UP),
    (Code: DISP_ST_DOWN;  Name: S_DISP_ST_DOWN),
    (Code: DISP_ST_LEFT;  Name: S_DISP_ST_LEFT),
    (Code: DISP_ST_RIGHT; Name: S_DISP_ST_RIGHT)
  );

  { Blink }

  DISP_DT_NORMAL       = 0;
  DISP_DT_HBLINK       = 1;
  DISP_DT_SBLINK       = 2;
  DISP_DT_SWINDOW      = 3;
  S_DISP_DT_NORMAL     = '()';
  S_DISP_DT_HBLINK     = '';
  S_DISP_DT_SBLINK     = ' ';
  S_DISP_DT_SWINDOW    = ' ';
  DISP_CB_NOBLINK      = 0;
  DISP_CB_BLINKALL     = 1;
  DISP_CB_BLINKEACH    = 2;
  S_DISP_CB_NOBLINK      = '  ';
  S_DISP_CB_BLINKALL     = '   ';
  S_DISP_CB_BLINKEACH    = '  ';
  CapBlinkToInt: array[TCapBlink] of Integer =
    (DISP_CB_NOBLINK, DISP_CB_BLINKALL, DISP_CB_BLINKEACH);
  CapBlinkToStr: array[TCapBlink] of String =
    (S_DISP_CB_NOBLINK, S_DISP_CB_BLINKALL, S_DISP_CB_BLINKEACH);
  BlinkTypeToStr: array[TLineBlinkType] of String =
    (S_DISP_DT_NORMAL, S_DISP_DT_HBLINK, S_DISP_DT_SBLINK, S_DISP_DT_SWINDOW);
  BlinkTypeToInt: array[TLineBlinkType] of Integer = (DISP_DT_NORMAL,
    DISP_DT_HBLINK, DISP_DT_SBLINK, DISP_DT_SWINDOW);
  LineX_Enabled_BlinkTypes: TSetOfByte = [DISP_DT_NORMAL, DISP_DT_HBLINK, DISP_DT_SBLINK,
    DISP_DT_SWINDOW];
  LineX_BlinkTypes: array[TLineBlinkType] of TEntryCodeToName =
  (
    (Code: DISP_DT_NORMAL;  Name: S_DISP_DT_NORMAL),
    (Code: DISP_DT_HBLINK;  Name: S_DISP_DT_HBLINK),
    (Code: DISP_DT_SBLINK;  Name: S_DISP_DT_SBLINK),
    (Code: DISP_DT_SWINDOW; Name: S_DISP_DT_SWINDOW)
  );

  { MarqueeType }

  DISP_MT_NONE         = 0;
  DISP_MT_UP           = 1;
  DISP_MT_DOWN         = 2;
  DISP_MT_LEFT         = 3;
  DISP_MT_RIGHT        = 4;
  DISP_MT_INIT         = 5;
  S_DISP_MT_NONE       = '()';
  S_DISP_MT_UP         = '';
  S_DISP_MT_DOWN       = '';
  S_DISP_MT_LEFT       = '';
  S_DISP_MT_RIGHT      = '';
  MarqueeTypeToStr: array[TLineMarqueeType] of String =
    (S_DISP_MT_NONE, S_DISP_MT_UP, S_DISP_MT_DOWN, S_DISP_MT_LEFT, S_DISP_MT_RIGHT);
  MarqueeTypeToInt: array[TLineMarqueeType] of Integer =
    (DISP_MT_NONE, DISP_MT_UP, DISP_MT_DOWN, DISP_MT_LEFT, DISP_MT_RIGHT);
  LineX_Enabled_MarqueeTypes: TSetOfByte = [DISP_MT_NONE, DISP_MT_UP,
    DISP_MT_DOWN, DISP_MT_LEFT, DISP_MT_RIGHT];
  LineX_MarqueeTypes: array[TLineMarqueeType] of TEntryCodeToName =
  (
    (Code: DISP_MT_NONE; Name: S_DISP_MT_NONE),
    (Code: DISP_MT_UP; Name: S_DISP_MT_UP),
    (Code: DISP_MT_DOWN; Name: S_DISP_MT_DOWN),
    (Code: DISP_MT_LEFT; Name: S_DISP_MT_LEFT),
    (Code: DISP_MT_RIGHT; Name: S_DISP_MT_RIGHT)
  );

  { MarqueeFormat }

  DISP_MF_NONE         = -1;
  DISP_MF_WALK         = 0;
  DISP_MF_PLACE        = 1;
  S_DISP_MF_NONE       = '()';
  S_DISP_MF_WALK       = '';
  S_DISP_MF_PLACE      = '';
  MarqueeFormatToStr: array[TLineMarqueeFormat] of String =
    (S_DISP_MF_NONE, S_DISP_MF_WALK, S_DISP_MF_PLACE);
  MarqueeFormatToInt: array[TLineMarqueeFormat] of Integer = (DISP_MF_NONE,
    DISP_MF_WALK, DISP_MF_PLACE);
  // LineX_Enabled_MarqueeFormats = [DISP_MF_NONE, DISP_MF_WALK, DISP_MF_PLACE];
  LineX_MarqueeFormats: array[TLineMarqueeFormat] of TEntryCodeToName =
  (
    (Code: DISP_MF_NONE; Name: S_DISP_MF_NONE),
    (Code: DISP_MF_WALK; Name: S_DISP_MF_WALK),
    (Code: DISP_MF_PLACE; Name: S_DISP_MF_PLACE)
  );

  { CapCharacterSet }

  DISP_CCS_NUMERIC     =   0;
  DISP_CCS_ALPHA       =   1;
  DISP_CCS_ASCII       = 998;
  DISP_CCS_KANA        =  10;
  DISP_CCS_KANJI       =  11;
  S_DISP_CCS_NUMERIC   = ', , ,   ';
  S_DISP_CCS_ALPHA     = ' , , ,   ';
  S_DISP_CCS_ASCII     = '   ASCII-  20H   7FH';
  S_DISP_CCS_KANA      = '   ASCII-  20H   7FH' +
    '       1H - DFH';
  S_DISP_CCS_KANJI     =  '   ASCII-  20H   7FH' +
    '    932 ( )';
  CapCharacterSetToInt: array[TCapCharacterSet] of Integer = (
   DISP_CCS_NUMERIC, DISP_CCS_ALPHA, DISP_CCS_ASCII,
   DISP_CCS_KANA, DISP_CCS_KANJI);

  CapCharacterSetToStr: array[TCapCharacterSet] of String = (
   S_DISP_CCS_NUMERIC, S_DISP_CCS_ALPHA, S_DISP_CCS_ASCII,
   S_DISP_CCS_KANA, S_DISP_CCS_KANJI);

  { CharacterSet }

  DISP_CS_NONE        = -1;
  DISP_CS_437         = 437;
  DISP_CS_850         = 850;
  DISP_CS_SLAVONIC    = 852;
  DISP_CS_860         = 860;
  DISP_CS_863         = 863;
  DISP_CS_865         = 865;
  DISP_CS_RUSSIA      = 866;
  DISP_CS_KATAKANA    = 932;
  DISP_CS_ASCII       = 998;
  DISP_CS_WINDOWS     = 999; { <=> 1252 }
  S_DISP_CS_NONE        = '( )';
  S_DISP_CS_437         = '437';
  S_DISP_CS_850         = '850';
  S_DISP_CS_SLAVONIC    = '-852';
  S_DISP_CS_860         = '860';
  S_DISP_CS_863         = '863';
  S_DISP_CS_865         = '865';
  S_DISP_CS_RUSSIA      = '-866';
  S_DISP_CS_KATAKANA    = 'Katakana-932';
  S_DISP_CS_ASCII       = 'ASCII-998';
  S_DISP_CS_WINDOWS     = 'Windows-1252'; { <=> 1252 }
  CharacterSetToInt: array[TCharacterSet] of Integer = (
    DISP_CS_NONE,
    DISP_CS_437,
    DISP_CS_850,
    DISP_CS_SLAVONIC,
    DISP_CS_860,
    DISP_CS_863,
    DISP_CS_865,
    DISP_CS_RUSSIA,
    DISP_CS_KATAKANA,
    DISP_CS_ASCII,
    DISP_CS_WINDOWS
  );
  CharacterSetToStr: array[TCharacterSet] of String = (
    S_DISP_CS_NONE,
    S_DISP_CS_437,
    S_DISP_CS_850,
    S_DISP_CS_SLAVONIC,
    S_DISP_CS_860,
    S_DISP_CS_863,
    S_DISP_CS_865,
    S_DISP_CS_RUSSIA,
    S_DISP_CS_KATAKANA,
    S_DISP_CS_ASCII,
    S_DISP_CS_WINDOWS
  );
  MinValidCharacterSet = Ord(Low(TCharacterSet)) + 1;
  MaxValidCharacterSet = Ord(High(TCharacterSet));
  LineX_CharacterSets: array[MinValidCharacterSet..MaxValidCharacterSet] of
    TEntryCodeToName = (
    // (Code: DISP_CS_NONE; Name: S_DISP_CS_NONE),
    (Code: DISP_CS_437; Name: S_DISP_CS_437),
    (Code: DISP_CS_850; Name: S_DISP_CS_850),
    (Code: DISP_CS_SLAVONIC; Name: S_DISP_CS_SLAVONIC),
    (Code: DISP_CS_860; Name: S_DISP_CS_860),
    (Code: DISP_CS_863; Name: S_DISP_CS_863),
    (Code: DISP_CS_865; Name: S_DISP_CS_865),
    (Code: DISP_CS_RUSSIA; Name: S_DISP_CS_RUSSIA),
    (Code: DISP_CS_KATAKANA; Name: S_DISP_CS_KATAKANA),
    (Code: DISP_CS_ASCII; Name: S_DISP_CS_ASCII),
    (Code: DISP_CS_WINDOWS; Name: S_DISP_CS_WINDOWS)
  );
  LineDPDCharacterSets = [chsNone, chs437, chsRussia];
  LineMDPCharacterSets = [chsNone, chsRussia];
  LinePOS500CharacterSets = [chsNone, chsRussia];
  LineVirtualCharacterSets = [chsNone, chsWindows];
  LineVFDCharacterSets = [chsNone, chs437, chs850, chsSlavonic, chs860, chs863,
    chs865, chsRussia, chsKatakana];

  { LineModel }

  DISP_UNKNOWN         = -1;
  DISP_DPD201          = 0;
  DISP_VF2029          = 1;
  DISP_MDP1            = 2;
  DISP_MDP2            = 3;
  DISP_MDP3            = 4;
  DISP_POS500          = 5;
  DISP_VIRTUAL         = High(Byte);
  LineX_ModelCount = 7;

  LineX_Models: array[TLineModel] of TEntryCodeToName =
  (
    (Code: DISP_UNKNOWN; Name: '()'),
    (Code: DISP_DPD201; Name: 'DPD-201'),
    (Code: DISP_VF2029; Name: 'VF-2029'),
    (Code: DISP_MDP1; Name: ' -01'),
    (Code: DISP_MDP2; Name: ' -02'),
    (Code: DISP_MDP3; Name: ' -03'),
    (Code: DISP_POS500; Name: 'Flytech'),
    (Code: DISP_VIRTUAL; Name: '-')
  );
  LineModelToInt: array[TLineModel] of Integer = (
    DISP_UNKNOWN, DISP_DPD201, DISP_VF2029, DISP_MDP1, DISP_MDP2, DISP_MDP3,
    DISP_POS500, DISP_VIRTUAL);
  LineX_Enabled_Models: TSetOfByte = [
    DISP_DPD201, DISP_VF2029, DISP_MDP1, DISP_MDP2,
    DISP_MDP3, DISP_POS500, DISP_VIRTUAL];

function IntToCapBlink(const Value: Integer): TCapBlink;
procedure StringsAssignEntries(Strings: TStrings;
  Entries: array of TEntryCodeToName; EnabledCodes: PSetOfByte);

function MakeBounds(ALeft, ATop, AWidth, AHeight: Integer): TBounds;
procedure RectToBounds(const ARect: TRect; var ABounds: TBounds);
procedure BoundsToRect(const ABounds: TBounds; var ARect: TRect);
function IntToCapCharacterSet(Value: Integer): TCapCharacterSet;
function IntToLineModel(Value: Integer): TLineModel;

implementation

procedure StringsAssignEntries(Strings: TStrings;
  Entries: array of TEntryCodeToName; EnabledCodes: PSetOfByte);
var
  I: Integer;
  Entry: TEntryCodeToName;
begin
  with Strings do
  begin
    BeginUpdate;
    try
      Clear;
      for I := Low(Entries) to High(Entries) do
      begin
        Entry := Entries[I];
        if not Assigned(EnabledCodes) or (Entry.Code in EnabledCodes^) then
          AddObject(Entry.Name, TObject(Entry.Code));
      end;
    finally
      EndUpdate;
    end;
  end;
end;

function IntToCapBlink(const Value: Integer): TCapBlink;
begin
  if not (Value in LineX_Enabled_BlinkTypes) then
    raise Exception.Create('   ');
  for Result := Low(CapBlinkToInt) to High(CapBlinkToInt) do
    if CapBlinkToInt[Result] = Value then Exit;
  // Result := capBlinkNone;
  raise Exception.Create('   ');
end;

function MakeBounds(ALeft, ATop, AWidth, AHeight: Integer): TBounds;
begin
  Result.Left := ALeft;
  Result.Top := ATop;
  Result.Width := AWidth;
  Result.Height := AHeight;
end;

procedure RectToBounds(const ARect: TRect; var ABounds: TBounds);
begin
  ABounds.Left := ARect.Left;
  ABounds.Top := ARect.Top;
  ABounds.Width := ARect.Right - ARect.Left;
  ABounds.Height := ARect.Bottom - ARect.Top;
end;

procedure BoundsToRect(const ABounds: TBounds; var ARect: TRect);
begin
  with ABounds do
    ARect := Bounds(Left, Top, Width, Height);
end;

function IntToCapCharacterSet(Value: Integer): TCapCharacterSet;
begin
  for Result := Low(CapCharacterSetToInt) to High(CapCharacterSetToInt) do
    if CapCharacterSetToInt[Result] = Value then Exit;
  raise Exception.Create('   ');
end;

function IntToLineModel(Value: Integer): TLineModel;
begin
  for Result := Low(LineModelToInt) to High(LineModelToInt) do
    if LineModelToInt[Result] = Value then Exit;
  raise Exception.Create('    ');
end;

end.
