]> git.ktnx.net Git - mobile-ledger.git/blob - tools/gen-styles
prepare 0.9.5/25 release
[mobile-ledger.git] / tools / gen-styles
1 #!/usr/bin/perl
2
3 use strict; use warnings; use utf8;
4
5 sub hexTuple {
6         my ($r, $g, $b) = @_;
7         return sprintf('%02x%02x%02x', int(255*$r+0.5), int(255*$g+0.5), int(255*$b+0.5));
8 }
9 sub hsvHex {
10         my ($hue, $sat, $val ) = @_;
11         my $h = int($hue * 6);
12         my $f = $hue * 6 - $h;
13         my $p = $val * (1 - $sat);
14         my $q = $val * ( 1 - $f * $sat);
15         my $t = $val * ( 1 - (1-$f) * $sat);
16
17         return hexTuple($val, $t, $p) if $h == 0 or $h == 6;
18         return hexTuple($q, $val, $p) if $h == 1;
19         return hexTuple($p, $val, $t) if $h == 2;
20         return hexTuple($p, $q, $val) if $h == 3;
21         return hexTuple($t, $p, $val) if $h == 4;
22         return hexTuple($val, $p, $q) if $h == 5;
23
24         die $h;
25 }
26
27 # https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL
28 sub hslHex {
29         my ($hue, $sat, $lig ) = @_;
30         my $h = ($hue * 6);
31         my $c = (1 - abs(2.0*$lig - 1)) * $sat;
32         my $h_mod_2 = $h - 2*int($h/2);
33         my $x = $c * (1 - abs($h_mod_2 - 1));
34         my ($r, $g, $b);
35         my $m = $lig - $c / 2.0;
36
37         return hexTuple($c + $m, $x + $m,  0 + $m) if $h < 1 or $h == 6;
38         return hexTuple($x + $m, $c + $m,  0 + $m) if $h < 2;
39         return hexTuple( 0 + $m, $c + $m, $x + $m) if $h < 3;
40         return hexTuple( 0 + $m, $x + $m, $c + $m) if $h < 4;
41         return hexTuple($x + $m,  0 + $m, $c + $m) if $h < 5;
42         return hexTuple($c + $m,  0 + $m, $x + $m) if $h < 6;
43
44         die $h;
45 }
46
47 my @hexDigit = split //, '0123456789abcdef';
48 my %hexValue = map(
49         (lc($hexDigit[$_]) => $_, uc($hexDigit[$_]) => $_ ),
50         0..15 );
51
52 sub min {
53         my $min = shift;
54
55         for (@_) { $min = $_ if $_ < $min }
56
57         return $min;
58 }
59
60 sub max {
61         my $max = shift;
62
63         for (@_) { $max = $_ if $_ > $max }
64
65         return $max;
66 }
67
68 sub hexToHSL {
69         my $hexTriplet = shift;
70         my ( $r,$g,$b ) = $hexTriplet =~ /^#?(..)(..)(..)/;
71         for ($r,$g,$b) {
72                 my @d = split(//);
73                 $_ = 16 * $hexValue{$d[0]} + $hexValue{$d[1]};
74         }
75
76         warn "$hexTriplet -> $r:$g:$b";
77
78         for ($r, $g, $b ) { $_ = $_ / 255.0 }
79
80         my $M = max($r, $g, $b);
81         my $m = min($r, $g, $b);
82         my $C = $M - $m;
83
84         my $h;
85         if ($C == 0) {
86                 $h = 0;
87         }
88         elsif ( $r == $M ) {
89                 $h = ($g-$b)/$C;
90                 $h -= 6*int($h/6.0);
91         }
92         elsif ( $g == $M ) {
93                 $h = ($b-$r)/$C + 2;
94         }
95         elsif ( $b == $M ) {
96                 $h = ($r-$g)/$C + 4;
97         }
98         else { die "$C, $M, $r, $g, $b"; }
99
100         my $H = 60 * $h;
101         my $L = ($M + $m) / 2;
102
103         my $S = ( $L <= 0.5 ) ? $C/(2*$L) : $C / (2-2*$L);
104
105         return( $H, $S, $L );
106 }
107
108 my $baseColorHSV = [ hexToHSL('#935ff2') ];
109 my $baseColorHue = $baseColorHSV->[0];
110 warn sprintf( 'H:%1.4f S:%1.4f L:%1.4f', @$baseColorHSV );
111 warn sprintf( 'H:%1.4f S:%1.4f L:%1.4f', hexToHSL('#3e148c') );
112
113 my $baseTheme = "AppTheme.NoActionBar";
114
115 # # hsb
116 # for( my $hue = 0; $hue < 360; $hue += 15 ) {
117 #       printf "<style name=\"%s.%d\" parent=\"%s\">\n",
118 #               $baseTheme, $hue, $baseTheme;
119 #       printf "  <item name=\"colorPrimary\">#%s</item>\n",
120 #                       hsvHex($hue/360.0, 0.61, 0.95);
121 #       printf "  <item name=\"colorPrimaryDark\">#%s</item>\n",
122 #                       hsvHex($hue/360.0, 0.86, 0.55);
123 #       printf "  <item name=\"colorAccent\">#%s</item>\n",
124 #                       hsvHex(($hue-4)/360.0, 0.72, 0.82);
125 #       printf "  <item name=\"drawer_background\">#ffffffff</item>\n";
126 #       printf "  <item name=\"table_row_dark_bg\">#28%s</item>\n",
127 #                       hsvHex($hue/360.0, 0.65, 0.83);
128 #       printf "  <item name=\"table_row_light_bg\">#28%s</item>\n",
129 #                       hsvHex($hue/360.0, 0.20, 1.00);
130 #       printf "  <item name=\"header_border\">#80%s</item>\n",
131 #                       hsvHex(($hue+6)/360.0, 0.86, 0.55);
132 #       printf "</style>\n";
133 # }
134
135 # HSL
136 hslStyleForHue($baseColorHue);
137 for( my $hue = 0; $hue < 360; $hue += 15 ) {
138         hslStyleForHue($hue, $baseTheme);
139 }
140
141 sub hslStyleForHue {
142         my $hue = shift;
143         my $base = shift;
144
145         if ($base) {
146                 printf "<style name=\"%s.%d\" parent=\"%s\">\n",
147                         $baseTheme, $hue, $baseTheme;
148         }
149         else {
150                 printf "<style name=\"%s\">\n",
151                         $baseTheme;
152                 printf "  <item name=\"windowActionBar\">false</item>\n";
153                 printf "  <item name=\"windowNoTitle\">true</item>\n";
154                 printf "  <item name=\"textColor\">#d0000000</item>\n";
155         }
156         printf "  <item name=\"colorPrimary\">#%s</item>\n",
157                 hslHex($hue/360.0, 0.60, 0.60);
158         printf "  <item name=\"colorPrimaryTransparent\">#00%s</item>\n",
159                 hslHex($hue/360.0, 0.60, 0.60);
160         printf "  <item name=\"colorAccent\">#%s</item>\n",
161                 hslHex($hue/360.0, 0.85, 0.50);
162         printf "  <item name=\"drawer_background\">#ffffffff</item>\n";
163         printf "  <item name=\"table_row_dark_bg\">#%s</item>\n",
164                 hslHex($hue/360.0, 0.85, 0.95);
165         printf "  <item name=\"table_row_light_bg\">#%s</item>\n",
166                 hslHex($hue/360.0, 0.85, 0.98);
167         printf "</style>\n";
168 }