#!/usr/bin/perl
-use strict; use warnings; use utf8;
+use strict; use warnings; use utf8::all;
use autodie;
use Math::Trig;
use File::Basename qw(basename dirname);
use File::Temp qw(tempfile);
+use Getopt::Long;
+
+my $opt_night;
+
+GetOptions(
+ 'night!' => \$opt_night,
+) or exit 1;
+
+my $DEFAULT_HUE = 261.2245;
sub hexTuple {
my ($r, $g, $b) = @_;
my $hexTriplet = shift;
my ($r,$g,$b) = hexToRGB($hexTriplet);
- warn "$hexTriplet -> $r:$g:$b";
+ #warn "$hexTriplet -> $r:$g:$b";
for ($r, $g, $b ) { $_ = $_ / 255.0 }
return( $H, $S, $L );
}
-my $baseColorHSV = [ hexToHSL('#935ff2') ];
+my $baseColor = '#935ff2';
+my $baseColorHSV = [ hexToHSL($baseColor) ];
my $baseColorHue = $baseColorHSV->[0];
-warn sprintf( 'H:%1.4f S:%1.4f V:%1.4f', @$baseColorHSV );
-warn sprintf( 'H:%1.4f S:%1.4f L:%1.4f', hexToHSL('#3e148c') );
-my @target = hexToRGB('#935ff2');
+warn sprintf( '%s → H:%1.4f S:%1.4f V:%1.4f', $baseColor, @$baseColorHSV );
+my @target = hexToRGB($baseColor);
my ($best, $min_dist);
for (my $s = 0.50; $s < 0.90; $s += 0.001) {
for ( my $l = 0.50; $l <= 0.80; $l += 0.001 ) {
}
}
}
-warn sprintf( 's%1.3f, l%1.3f -> %s',
+warn sprintf( 's%1.3f, l%1.3f → %s',
@$best );
-my $baseTheme = "AppTheme.NoActionBar";
+my $baseTheme = "AppTheme";
+
+use constant STEP_DEGREES => 5;
# # hsb
-# for( my $hue = 0; $hue < 360; $hue += 15 ) {
-# printf "<style name=\"%s.%d\" parent=\"%s\">\n",
+# for( my $hue = 0; $hue < 360; $hue += STEP_DEGREES ) {
+# printf "<style name=\"%s.%03d\" parent=\"%s\">\n",
# $baseTheme, $hue, $baseTheme;
# printf " <item name=\"colorPrimary\">#%s</item>\n",
# hsvHex($hue/360.0, 0.61, 0.95);
# hsvHex($hue/360.0, 0.86, 0.55);
# printf " <item name=\"colorAccent\">#%s</item>\n",
# hsvHex(($hue-4)/360.0, 0.72, 0.82);
-# printf " <item name=\"drawer_background\">#ffffffff</item>\n";
# printf " <item name=\"table_row_dark_bg\">#28%s</item>\n",
# hsvHex($hue/360.0, 0.65, 0.83);
# printf " <item name=\"table_row_light_bg\">#28%s</item>\n",
sub outputThemes {
my $out = shift;
my $baseIndent = shift;
- $out->print(hslStyleForHue($baseColorHue, undef, $baseIndent));
- for( my $hue = 0; $hue < 360; $hue += 15 ) {
+ $out->print("\n");
+ $out->print(hslStyleForHue($DEFAULT_HUE, $baseTheme, $baseIndent, 'default'));
+ for( my $hue = 0; $hue < 360; $hue += STEP_DEGREES ) {
$out->print("\n");
$out->print(hslStyleForHue($hue, $baseTheme, $baseIndent));
}
my $hue = shift;
my $base = shift;
my $baseIndent = shift // '';
-
- my $blueL = 0.665;
- my $yellowL = 0.350;
-
- my $blueL2 = 0.350;
- my $yellowL2 = 0.500;
-
- # $y == 0 for yellow
- my $y = $hue - 60;
- $y += 360 if $y < 0;
- # $q == 0 for yellow, 1 for blue
- my $q = cos(deg2rad(abs($y-180)/2.0));
- my $l1 = $yellowL + ($blueL - $yellowL) * $q;
- my $l2 = 0.250 + 0.250 * $q;
- my $l3 = 0.950;
- my $l4 = 0.980;
+ my $subTheme = shift // sprintf('%03d', $hue);
+
+ my %lQ = (
+ 0 => 0.450, # red
+ 60 => 0.400, # yellow
+ 120 => 0.400, # green
+ 180 => 0.390, # cyan
+ 240 => 0.745, # blue
+ 300 => 0.505, # magenta
+ );
+ $lQ{360} = $lQ{0};
+
+ my ($x0, $x1, $y0, $y1);
+ $x0 = (int( $hue / 60 ) * 60) % 360;
+ $x1 = $x0 + 60;
+ $y0 = $lQ{$x0};
+ $y1 = $lQ{$x1};
+
+ # linear interpolation
+ my $l1 = $y0 + 1.0 * ( $hue - $x0 ) * ( $y1 - $y0 ) / ( $x1 - $x0 );
+
+ my $l2 = $l1 * 0.80;
+ my $l3 = $opt_night ? 0.150 : 0.950;
+ my $l4 = $opt_night ? 0.100 : 0.980;
my $result = "";
my $indent = "$baseIndent ";
if ($base) {
- $result .= sprintf "$baseIndent<style name=\"%s.%d\" parent=\"%s\">\n",
- $baseTheme, $hue, $baseTheme;
+ $result .= sprintf "$baseIndent<style name=\"%s.%s\" parent=\"%s\">\n",
+ $baseTheme, $subTheme, $baseTheme;
}
else {
$result .= sprintf "$baseIndent<style name=\"%s\">\n",
$baseTheme;
- $result .= "$indent<item name=\"windowActionBar\">false</item>\n";
- $result .= "$indent<item name=\"windowNoTitle\">true</item>\n";
- $result .= "$indent<item name=\"textColor\">#8a000000</item>\n";
+# $result .= "$indent<item name=\"windowActionBar\">false</item>\n";
+# $result .= "$indent<item name=\"windowNoTitle\">true</item>\n";
+# $result .= "$indent<item name=\"textColor\">#757575</item>\n";
}
my $S = 0.845;
- $result .= sprintf "$indent<item name=\"colorPrimary\">#%s</item>\n",
- hslHex($hue, $S, $l1);
- $result .= sprintf "$indent<item name=\"colorPrimaryTransparent\">#00%s</item>\n",
- hslHex($hue, $S, $l1);
- $result .= sprintf "$indent<item name=\"colorAccent\">#%s</item>\n",
- hslHex($hue, $S, $l2);
- $result .= "$indent<item name=\"drawer_background\">#ffffffff</item>\n";
- $result .= sprintf "$indent<item name=\"table_row_dark_bg\">#%s</item>\n",
- hslHex($hue, $S, $l3);
- $result .= sprintf "$indent<item name=\"table_row_light_bg\">#%s</item>\n",
- hslHex($hue, $S, $l4);
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'colorPrimary', hslHex( $hue, $S, $l1 );
+ $result .= sprintf "$indent<item name=\"%s\">#00%s</item>\n",
+ 'colorPrimaryTransparent', hslHex( $hue, $S, $l1 );
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'colorSecondary', hslHex( $hue, $S, $l2 );
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'colorAccent', hslHex( $hue, $S, $l2 );
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'colorPrimaryDark', hslHex( $hue, $S, $l2 );
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'table_row_dark_bg', hslHex( $hue, $S, $l3 );
+ $result .= sprintf "$indent<item name=\"%s\">#%s</item>\n",
+ 'table_row_light_bg', hslHex( $hue, $S, $l4 );
$result .= "$baseIndent</style>\n";
return $result;
my $start_marker = '<!-- theme list start -->';
my $end_marker = '<!-- theme list end -->';
my ($fh, $filename) = tempfile(basename($0).'.XXXXXXXX', DIR => dirname($xml));
+ $fh->binmode(':utf8');
open(my $in, '<', $xml);
my $base_indent = '';
my $state = 'waiting-for-start-marker';