Alexandre Julliard : unicode: Generate compositions on the fly based on the decomposition table.

Alexandre Julliard julliard at winehq.org
Mon Feb 17 15:42:15 CST 2020


Module: wine
Branch: master
Commit: ce41b32117ea0a94de54d745cd7cd3b301a46d91
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ce41b32117ea0a94de54d745cd7cd3b301a46d91

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Feb 17 11:48:30 2020 +0100

unicode: Generate compositions on the fly based on the decomposition table.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/make_unicode | 60 +++++++++++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/tools/make_unicode b/tools/make_unicode
index fa8d7a3dec..59b681e631 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -405,7 +405,6 @@ my @category_table = ();
 my @joining_table = ();
 my @direction_table = ();
 my @decomp_table = ();
-my @compose_table = ();
 my @combining_class_table = ();
 my @decomp_compat_table = ();
 my $default_char;
@@ -419,12 +418,22 @@ my %joining_forms =
    "medial" => []
 );
 
-sub get_utf16($)
+sub to_utf16(@)
 {
-    my $ch = shift;
-    return $ch if ($ch < 0x10000);
-    $ch -= 0x10000;
-    return ( 0xd800 | ($ch >> 10), 0xdc00 | ($ch & 0x3ff) );
+    my @ret;
+    foreach my $ch (@_)
+    {
+        if ($ch < 0x10000)
+        {
+            push @ret, $ch;
+        }
+        else
+        {
+            my $val = $ch - 0x10000;
+            push @ret, 0xd800 | ($val >> 10), 0xdc00 | ($val & 0x3ff);
+        }
+    }
+    return @ret;
 }
 
 ################################################################
@@ -465,14 +474,25 @@ sub get_decomposition($$)
     my ($char, $table) = @_;
     my @ret;
 
-    return get_utf16($char) unless defined ${$table}[$char];
-    foreach my $ch (@{${$table}[$char]})
+    return $char unless defined $table->[$char];
+    foreach my $ch (@{$table->[$char]})
     {
         push @ret, get_decomposition( $ch, $table );
     }
     return @ret;
 }
 
+################################################################
+# get the composition that results in a given character
+sub get_composition($$)
+{
+    my ($ch, $compat) = @_;
+    return () unless defined $decomp_table[$ch];  # no decomposition
+    my @ret = @{$decomp_table[$ch]};
+    return () if @ret < 2;                        # singleton decomposition
+    return @ret;
+}
+
 ################################################################
 # recursively build decompositions
 sub build_decompositions(@)
@@ -483,7 +503,7 @@ sub build_decompositions(@)
     for (my $i = 0; $i < @src; $i++)
     {
         next unless defined $src[$i];
-        my @decomp = get_decomposition( $i, \@src );
+        my @decomp = to_utf16( get_decomposition( $i, \@src ));
         $dst[$i] = \@decomp;
     }
     return @dst;
@@ -588,7 +608,6 @@ sub load_data()
             if ($decomp =~ /^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)$/)
             {
                 $decomp_table[$src] = $decomp_compat_table[$src] = [ hex $1, hex $2 ];
-                push @compose_table, [ hex $1, hex $2, $src ];
             }
             elsif ($decomp =~ /^([0-9a-fA-F]+)$/)
             {
@@ -2010,21 +2029,13 @@ sub dump_compose_table($)
     print OUTPUT "/* DO NOT EDIT!! */\n\n";
     print OUTPUT "#include \"windef.h\"\n\n";
 
-    my @filled = ();
-    foreach my $i (@compose_table)
-    {
-        my @comp = @$i;
-        push @{$filled[$comp[1]]}, [ $comp[0], $comp[2] ];
-    }
-
-    # count how many different second chars we have
-
-    my $count = 0;
+    my @filled;
     for (my $i = 0; $i <= $MAX_CHAR; $i++)
     {
-        next unless defined $filled[$i];
-        $count++;
+        my @comp = get_composition( $i, 0 );
+        push @{$filled[$comp[1]]}, [ $comp[0], $i ] if @comp;
     }
+    my $count = scalar grep defined, @filled;
 
     # build the table of second chars and offsets
 
@@ -2047,10 +2058,9 @@ sub dump_compose_table($)
     {
         next unless defined $filled[$i];
         my @table = ();
-        my @list = sort { $a->[0] <=> $b->[0] } @{$filled[$i]};
-        for (my $j = 0; $j <= $#list; $j++)
+        foreach my $map (sort { $a->[0] <=> $b->[0] } @{$filled[$i]})
         {
-            push @table, $list[$j][0], $list[$j][1];
+            push @table, $map->[0], $map->[1];
         }
         printf OUTPUT ",\n    /* 0x%04x */\n%s", $i, dump_array( 20, 0, @table );
     }




More information about the wine-cvs mailing list