Skip to content

Commit

Permalink
chore(windows): move global/delphi/visualkeyboard to common
Browse files Browse the repository at this point in the history
  • Loading branch information
mcdurdin committed Jun 12, 2022
1 parent 6a56fca commit 1eff4db
Show file tree
Hide file tree
Showing 39 changed files with 274 additions and 274 deletions.
Original file line number Diff line number Diff line change
@@ -1,135 +1,135 @@
unit VisualKeyboardLoaderBinary;

interface

uses
System.SysUtils,
System.Classes,
Vcl.Graphics,
Winapi.Windows,

VisualKeyboard;

//
// This originated with the TVisualKeyboardImportXML code but has now diverged for
// UI-clean single-file round-trippable consistency.
//

type
EVisualKeyboardLoaderBinary = class(EVisualKeyboardLoader);

TVisualKeyboardLoaderBinary = class(TVisualKeyboardLoader)
private
procedure LoadKey(Key: TVisualKeyboardKey; Stream: TStream);
procedure LoadHeader(Header: TVisualKeyboardHeader; Stream: TStream);
function ReadBitmap(Stream: TStream): Vcl.Graphics.TBitmap;
procedure ReadFont(Stream: TStream; FFont: TFont);
procedure LoadKeys(Keys: TVisualKeyboardKeyList; Stream: TStream);
function ReadString(Stream: TStream): string;
public
procedure LoadFromStream(Stream: TStream); override;
end;

implementation

{ TVisualKeyboardLoaderBinary }

function TVisualKeyboardLoaderBinary.ReadString(Stream: TStream): string;
var
w: Word;
str: string;
begin
Stream.Read(w, sizeof(w));
SetLength(str, w);
Stream.Read(PChar(str)^, w*2);
// The string read is a C-style null terminated string. We need
// to remove the null character because Pascal strings don't
// use null termination in the same way. Best way to do this is
// to cast it as a C-style string, which reliably terminates at
// first null byte.
Result := PWideChar(str);
end;

procedure TVisualKeyboardLoaderBinary.ReadFont(Stream: TStream; FFont: TFont);
var
n: Integer;
begin
FFont.Name := ReadString(Stream);
Stream.Read(n, sizeof(n));
FFont.Size := n;
Stream.Read(n, sizeof(n));
FFont.Color := TColor(n);
end;

function TVisualKeyboardLoaderBinary.ReadBitmap(Stream: TStream): Vcl.Graphics.TBitmap;
var
n: DWord;
mem: TMemoryStream;
begin
Stream.Read(n, Sizeof(n));
if n > 0 then
begin
mem := TMemoryStream.Create;
try
mem.CopyFrom(Stream, n);
mem.Position := 0;
Result := Vcl.Graphics.TBitmap.Create;
Result.LoadFromStream(mem);
finally
mem.Free;
end;
end
else
Result := nil;
end;

procedure TVisualKeyboardLoaderBinary.LoadHeader(Header: TVisualKeyboardHeader; Stream: TStream);
var
ch: array[0..4] of ansichar; // I3310
version: Integer;
f: TVisualKeyboardHeaderFlags;
begin
Stream.Read(ch, 4); ch[4] := #0;
if ch <> 'KVKF' then raise EVisualKeyboardLoader.Create('Not a valid Keyman Visual Keyboard File');
Stream.Read(version, 4);
if version <> $0600 then raise EVisualKeyboardLoader.Create('Version number not recognised');

Stream.Read(f, sizeof(f)); Header.Flags := f;
Header.AssociatedKeyboard := ReadString(Stream);
ReadFont(Stream, Header.ANSIFont);
ReadFont(Stream, Header.UnicodeFont);
end;

procedure TVisualKeyboardLoaderBinary.LoadKeys(Keys: TVisualKeyboardKeyList; Stream: TStream);
var
i, n: Integer;
item: TVisualKeyboardKey;
begin
Stream.Read(n, Sizeof(n));
for i := 0 to n - 1 do
begin
item := TVisualKeyboardKey.Create;
LoadKey(item, Stream);
Keys.Add(item);
end;
end;

procedure TVisualKeyboardLoaderBinary.LoadKey(Key: TVisualKeyboardKey; Stream: TStream);
var
Flags: TVisualKeyboardKeyFlags;
Shift, VKey: Word;
begin
Stream.Read(Flags, sizeof(Flags)); Key.Flags := Flags;
Stream.Read(Shift, sizeof(Shift)); Key.Shift := Shift;
Stream.Read(VKey, sizeof(VKey)); Key.VKey := VKey;
Key.Text := ReadString(Stream);
Key.Bitmap := ReadBitmap(Stream);
end;

procedure TVisualKeyboardLoaderBinary.LoadFromStream(Stream: TStream);
begin
LoadHeader(FKbd.Header, Stream);
LoadKeys(FKbd.Keys, Stream);
end;

end.
unit VisualKeyboardLoaderBinary;

interface

uses
System.SysUtils,
System.Classes,
Vcl.Graphics,
Winapi.Windows,

VisualKeyboard;

//
// This originated with the TVisualKeyboardImportXML code but has now diverged for
// UI-clean single-file round-trippable consistency.
//

type
EVisualKeyboardLoaderBinary = class(EVisualKeyboardLoader);

TVisualKeyboardLoaderBinary = class(TVisualKeyboardLoader)
private
procedure LoadKey(Key: TVisualKeyboardKey; Stream: TStream);
procedure LoadHeader(Header: TVisualKeyboardHeader; Stream: TStream);
function ReadBitmap(Stream: TStream): Vcl.Graphics.TBitmap;
procedure ReadFont(Stream: TStream; FFont: TFont);
procedure LoadKeys(Keys: TVisualKeyboardKeyList; Stream: TStream);
function ReadString(Stream: TStream): string;
public
procedure LoadFromStream(Stream: TStream); override;
end;

implementation

{ TVisualKeyboardLoaderBinary }

function TVisualKeyboardLoaderBinary.ReadString(Stream: TStream): string;
var
w: Word;
str: string;
begin
Stream.Read(w, sizeof(w));
SetLength(str, w);
Stream.Read(PChar(str)^, w*2);
// The string read is a C-style null terminated string. We need
// to remove the null character because Pascal strings don't
// use null termination in the same way. Best way to do this is
// to cast it as a C-style string, which reliably terminates at
// first null byte.
Result := PWideChar(str);
end;

procedure TVisualKeyboardLoaderBinary.ReadFont(Stream: TStream; FFont: TFont);
var
n: Integer;
begin
FFont.Name := ReadString(Stream);
Stream.Read(n, sizeof(n));
FFont.Size := n;
Stream.Read(n, sizeof(n));
FFont.Color := TColor(n);
end;

function TVisualKeyboardLoaderBinary.ReadBitmap(Stream: TStream): Vcl.Graphics.TBitmap;
var
n: DWord;
mem: TMemoryStream;
begin
Stream.Read(n, Sizeof(n));
if n > 0 then
begin
mem := TMemoryStream.Create;
try
mem.CopyFrom(Stream, n);
mem.Position := 0;
Result := Vcl.Graphics.TBitmap.Create;
Result.LoadFromStream(mem);
finally
mem.Free;
end;
end
else
Result := nil;
end;

procedure TVisualKeyboardLoaderBinary.LoadHeader(Header: TVisualKeyboardHeader; Stream: TStream);
var
ch: array[0..4] of ansichar; // I3310
version: Integer;
f: TVisualKeyboardHeaderFlags;
begin
Stream.Read(ch, 4); ch[4] := #0;
if ch <> 'KVKF' then raise EVisualKeyboardLoader.Create('Not a valid Keyman Visual Keyboard File');
Stream.Read(version, 4);
if version <> $0600 then raise EVisualKeyboardLoader.Create('Version number not recognised');

Stream.Read(f, sizeof(f)); Header.Flags := f;
Header.AssociatedKeyboard := ReadString(Stream);
ReadFont(Stream, Header.ANSIFont);
ReadFont(Stream, Header.UnicodeFont);
end;

procedure TVisualKeyboardLoaderBinary.LoadKeys(Keys: TVisualKeyboardKeyList; Stream: TStream);
var
i, n: Integer;
item: TVisualKeyboardKey;
begin
Stream.Read(n, Sizeof(n));
for i := 0 to n - 1 do
begin
item := TVisualKeyboardKey.Create;
LoadKey(item, Stream);
Keys.Add(item);
end;
end;

procedure TVisualKeyboardLoaderBinary.LoadKey(Key: TVisualKeyboardKey; Stream: TStream);
var
Flags: TVisualKeyboardKeyFlags;
Shift, VKey: Word;
begin
Stream.Read(Flags, sizeof(Flags)); Key.Flags := Flags;
Stream.Read(Shift, sizeof(Shift)); Key.Shift := Shift;
Stream.Read(VKey, sizeof(VKey)); Key.VKey := VKey;
Key.Text := ReadString(Stream);
Key.Bitmap := ReadBitmap(Stream);
end;

procedure TVisualKeyboardLoaderBinary.LoadFromStream(Stream: TStream);
begin
LoadHeader(FKbd.Header, Stream);
LoadKeys(FKbd.Keys, Stream);
end;

end.
10 changes: 5 additions & 5 deletions developer/src/kmcomp/kmcomp.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ uses
CompilePackageInstaller in '..\..\..\windows\src\global\delphi\general\CompilePackageInstaller.pas',
UTikeDebugMode in '..\tike\main\UTikeDebugMode.pas',
CompileKeymanWeb in '..\tike\compile\CompileKeymanWeb.pas',
VisualKeyboard in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboard.pas',
VisualKeyboard in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboard.pas',
KeymanWebKeyCodes in '..\tike\compile\KeymanWebKeyCodes.pas',
ExtShiftState in '..\..\..\windows\src\global\delphi\comp\ExtShiftState.pas',
kmxfileconsts in '..\..\..\windows\src\global\delphi\general\kmxfileconsts.pas',
Expand Down Expand Up @@ -81,10 +81,10 @@ uses
Keyman.Developer.System.Project.kvkProjectFile in '..\tike\project\Keyman.Developer.System.Project.kvkProjectFile.pas',
Keyman.Developer.System.Project.ProjectLog in '..\tike\project\Keyman.Developer.System.Project.ProjectLog.pas',
UserMessages in '..\..\..\windows\src\global\delphi\general\UserMessages.pas',
VisualKeyboardLoaderBinary in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
VisualKeyboardLoaderBinary in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
kccompilekvk in 'kccompilekvk.pas',
ValidateKeyboardInfo in '..\tike\compile\ValidateKeyboardInfo.pas',
MergeKeyboardInfo in '..\tike\compile\MergeKeyboardInfo.pas',
Expand Down
10 changes: 5 additions & 5 deletions developer/src/kmcomp/kmcomp.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
<DCCReference Include="..\..\..\windows\src\global\delphi\general\CompilePackageInstaller.pas"/>
<DCCReference Include="..\TIKE\main\UTikeDebugMode.pas"/>
<DCCReference Include="..\TIKE\compile\CompileKeymanWeb.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboard.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboard.pas"/>
<DCCReference Include="..\TIKE\compile\KeymanWebKeyCodes.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\comp\ExtShiftState.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\kmxfileconsts.pas"/>
Expand Down Expand Up @@ -232,10 +232,10 @@
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.ProjectLog.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\UMD5Hash.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\UserMessages.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverXML.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverXML.pas"/>
<DCCReference Include="kccompilekvk.pas"/>
<DCCReference Include="..\TIKE\compile\ValidateKeyboardInfo.pas"/>
<DCCReference Include="..\TIKE\compile\MergeKeyboardInfo.pas"/>
Expand Down
12 changes: 6 additions & 6 deletions developer/src/kmconvert/kmconvert.dpr
Original file line number Diff line number Diff line change
Expand Up @@ -60,17 +60,17 @@ uses
Keyman.Developer.System.Project.ProjectLoader in '..\TIKE\project\Keyman.Developer.System.Project.ProjectLoader.pas',
Keyman.Developer.System.Project.kmnProjectFile in '..\TIKE\project\Keyman.Developer.System.Project.kmnProjectFile.pas',
Keyman.Developer.System.Project.kpsProjectFile in '..\TIKE\project\Keyman.Developer.System.Project.kpsProjectFile.pas',
VisualKeyboard in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboard.pas',
VisualKeyboard in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboard.pas',
VKeyChars in '..\..\..\windows\src\global\delphi\general\VKeyChars.pas',
VisualKeyboardLoaderBinary in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
VisualKeyboardLoaderBinary in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
Keyman.Developer.System.KMConvertParameters in 'Keyman.Developer.System.KMConvertParameters.pas',
Keyman.Developer.System.ImportKeyboardDLL in 'Keyman.Developer.System.ImportKeyboardDLL.pas',
ScanCodeMap in '..\..\..\windows\src\global\delphi\general\ScanCodeMap.pas',
Keyman.Developer.System.TouchLayoutToVisualKeyboardConverter in 'Keyman.Developer.System.TouchLayoutToVisualKeyboardConverter.pas',
OnScreenKeyboardData in '..\..\..\windows\src\global\delphi\visualkeyboard\OnScreenKeyboardData.pas',
OnScreenKeyboardData in '..\..\..\common\windows\delphi\visualkeyboard\OnScreenKeyboardData.pas',
TouchLayout in '..\TIKE\oskbuilder\TouchLayout.pas',
TouchLayoutDefinitions in '..\TIKE\oskbuilder\TouchLayoutDefinitions.pas',
TouchLayoutUtils in '..\TIKE\oskbuilder\TouchLayoutUtils.pas',
Expand Down
12 changes: 6 additions & 6 deletions developer/src/kmconvert/kmconvert.dproj
Original file line number Diff line number Diff line change
Expand Up @@ -166,18 +166,18 @@
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.ProjectLoader.pas"/>
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.kmnProjectFile.pas"/>
<DCCReference Include="..\TIKE\project\Keyman.Developer.System.Project.kpsProjectFile.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboard.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboard.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\VKeyChars.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverXML.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverXML.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\UMD5Hash.pas"/>
<DCCReference Include="Keyman.Developer.System.KMConvertParameters.pas"/>
<DCCReference Include="Keyman.Developer.System.ImportKeyboardDLL.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\general\ScanCodeMap.pas"/>
<DCCReference Include="Keyman.Developer.System.TouchLayoutToVisualKeyboardConverter.pas"/>
<DCCReference Include="..\..\..\windows\src\global\delphi\visualkeyboard\OnScreenKeyboardData.pas"/>
<DCCReference Include="..\..\..\common\windows\delphi\visualkeyboard\OnScreenKeyboardData.pas"/>
<DCCReference Include="..\TIKE\oskbuilder\TouchLayout.pas"/>
<DCCReference Include="..\TIKE\oskbuilder\TouchLayoutDefinitions.pas"/>
<DCCReference Include="..\TIKE\oskbuilder\TouchLayoutUtils.pas"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ uses
DUnitX.TestFramework,
Keyman.Test.System.CompilePackageVersioningTest in 'Keyman.Test.System.CompilePackageVersioningTest.pas',
CompilePackage in '..\..\..\..\..\windows\src\global\delphi\general\CompilePackage.pas',
VisualKeyboard in '..\..\..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboard.pas',
VisualKeyboard in '..\..\..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboard.pas',
kmpinffile in '..\..\..\..\..\windows\src\global\delphi\general\kmpinffile.pas',
kpsfile in '..\..\..\..\..\windows\src\global\delphi\general\kpsfile.pas',
PackageFileFormats in '..\..\..\..\..\windows\src\global\delphi\general\PackageFileFormats.pas',
Expand All @@ -31,10 +31,10 @@ uses
GetOsVersion in '..\..\..\..\..\windows\src\global\delphi\general\GetOsVersion.pas',
VersionInfo in '..\..\..\..\..\windows\src\global\delphi\general\VersionInfo.pas',
ExtShiftState in '..\..\..\..\..\windows\src\global\delphi\comp\ExtShiftState.pas',
VisualKeyboardLoaderBinary in '..\..\..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\..\..\windows\src\global\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
VisualKeyboardLoaderBinary in '..\..\..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderBinary.pas',
VisualKeyboardLoaderXML in '..\..\..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardLoaderXML.pas',
VisualKeyboardSaverBinary in '..\..\..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverBinary.pas',
VisualKeyboardSaverXML in '..\..\..\..\..\common\windows\delphi\visualkeyboard\VisualKeyboardSaverXML.pas',
VKeyChars in '..\..\..\..\..\windows\src\global\delphi\general\VKeyChars.pas',
VKeys in '..\..\..\..\..\windows\src\global\delphi\general\VKeys.pas',
ErrorControlledRegistry in '..\..\..\..\..\windows\src\global\delphi\vcl\ErrorControlledRegistry.pas',
Expand Down
Loading

0 comments on commit 1eff4db

Please sign in to comment.