summaryrefslogtreecommitdiff
path: root/lib/App/VRR/Fakedisplay.pm.PL
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App/VRR/Fakedisplay.pm.PL')
-rw-r--r--lib/App/VRR/Fakedisplay.pm.PL187
1 files changed, 187 insertions, 0 deletions
diff --git a/lib/App/VRR/Fakedisplay.pm.PL b/lib/App/VRR/Fakedisplay.pm.PL
new file mode 100644
index 0000000..ebb436d
--- /dev/null
+++ b/lib/App/VRR/Fakedisplay.pm.PL
@@ -0,0 +1,187 @@
+#!/usr/bin/env perl;
+use strict;
+use warnings;
+use 5.010;
+use utf8;
+
+use GD;
+
+my ($out_file) = @ARGV;
+my $font = GD::Image->new('share/font.png');
+my $black = $font->colorClosest(0, 0, 0);
+
+open(my $out_fh, '>', $out_file) or die("open ${out_file}: $!");
+
+sub write_out {
+ my ($off_x, $off_y, $char) = @_;
+ my $char_w = 0;
+
+ say $out_fh "'${char}' => {";
+ say $out_fh 'matrix => [';
+
+ for my $pos_y ( $off_y .. ($off_y + 10)) {
+ print $out_fh '[ ';
+ for my $pos_x ( $off_x .. ($off_x + 10)) {
+ if ($font->getPixel($pos_x, $pos_y) == $black) {
+
+ if (($pos_x - $off_x) > $char_w) {
+ $char_w = $pos_x - $off_x;
+ }
+
+ print $out_fh '1, ';
+ }
+ else {
+ print $out_fh '0, ';
+ }
+ }
+ say $out_fh ' ],';
+ }
+
+ # spacing (one empty column)
+ $char_w++;
+
+ if ($char eq q{ }) {
+ $char_w = 5;
+ }
+
+ say $out_fh '],';
+ say $out_fh "width => ${char_w},";
+ say $out_fh '},';
+}
+
+sub parse_char_row {
+ my ($off_y, @chars) = @_;
+ my $off_x = 0;
+
+ for my $char (@chars) {
+ write_out($off_x, $off_y, $char);
+ $off_x += 10;
+ }
+
+ return;
+}
+
+
+print $out_fh <<'___CUT___';
+
+package App::VRR::Fakedisplay;
+
+use strict;
+use warnings;
+use 5.010;
+use utf8;
+
+use File::ShareDir qw(dist_file);
+use GD;
+
+our $VERSION = '0.00';
+
+sub new {
+ my ( $class, %opt ) = @_;
+
+ my $self = {
+ width => $opt{width} || 140,
+ height => $opt{height} || 40,
+ scale => 10,
+ offset_x => 0,
+ offset_y => 0,
+ };
+
+ $self->{image} = GD::Image->new($self->{width} * $self->{scale}, $self->{height} * $self->{scale});
+
+ $self->{color}->{bg} = $self->{image}->colorAllocate(0, 0, 0);
+ $self->{color}->{fg} = $self->{image}->colorAllocate(@{$opt{color} // [255, 0, 0]});
+
+ $self->{image}->filledRectangle(0, 0, ($self->{width} * $self->{scale}) -1,
+ ($self->{height} * $self->{scale}) - 1, $self->{color}->{bg});
+
+ $self->{font} = {
+
+___CUT___
+
+parse_char_row( 0, 'A' .. 'Z');
+parse_char_row(10, 'a' .. 'z');
+parse_char_row(20, '0' .. '9');
+parse_char_row(30, q{:}, q{-}, q{.}, q{,}, q{/}, q{ });
+parse_char_row(40, qw(ä ö ü));
+
+print $out_fh <<'___CUT___';
+
+ };
+
+ return bless( $self, $class );
+}
+
+sub draw_at {
+ my ($self, $offset_x, $text) = @_;
+
+ my $im = $self->{image};
+ my $font = $self->{font};
+
+ my $c_bg = $self->{color}{bg};
+ my $c_fg = $self->{color}{fg};
+
+ my $font_idx = $self->{font_idx};
+
+ my $scale = $self->{scale};
+
+ my ($off_x, $off_y) = ($offset_x, $self->{offset_y});
+
+ if ($off_y >= $self->{height} or $off_x >= $self->{width}) {
+ return;
+ }
+
+ for my $char (split(qr{}, $text)) {
+
+ if (not exists $self->{font}->{$char}) {
+ next;
+ }
+
+ my $w = $self->{font}->{$char}->{width};
+
+ for my $y ( 0 .. 10 ) {
+ for my $x ( 0 .. $w ) {
+ if ($self->{font}->{$char}->{matrix}->[$y]->[$x]) {
+ $im->filledEllipse(
+ ($off_x + $x) * $scale, ($off_y + $y) * $scale,
+ $scale, $scale,
+ $c_fg
+ );
+ }
+ }
+ }
+ $off_x += $w;
+ }
+
+ return;
+}
+
+sub new_line {
+ my ($self) = @_;
+ $self->{offset_y} += 10;
+
+ return;
+}
+
+sub png {
+ my ($self) = @_;
+
+ return $self->{image}->png;
+}
+
+sub write_image_to {
+ my ($self, $filename) = @_;
+
+ open(my $out_fh, '>', $filename) or die("Cannot open ${filename}: ${!}\n");
+ binmode $out_fh;
+ print $out_fh $self->{image}->png;
+ close($out_fh);
+
+ return;
+}
+
+1;
+
+___CUT___
+
+close($out_fh);