More updates.

This commit is contained in:
Dianne Skoll
2022-01-27 09:18:41 -05:00
parent dc07a3cf32
commit 2f8eaeacf0
2 changed files with 106 additions and 28 deletions

View File

@@ -14,7 +14,18 @@ sub new_from_hash
$class = 'Remind::PDF::Entry::UNKNOWN';
}
}
return bless($hash, $class);
bless($hash, $class);
$hash->adjust();
return $hash;
}
# Base class: Set the color to black
sub adjust
{
my ($self) = @_;
$self->{r} = 0;
$self->{g} = 0;
$self->{b} = 0;
}
package Remind::PDF::Entry::html;
@@ -27,8 +38,26 @@ package Remind::PDF::Entry::moon;
use base 'Remind::PDF::Entry';
package Remind::PDF::Entry::shade;
use base 'Remind::PDF::Entry';
sub adjust
{
my ($self) = @_;
if ($self->{body} =~ /^(\d+)\s+(\d+)\s+(\d+)/) {
$self->{r} = $1;
$self->{g} = $2;
$self->{b} = $3;
}
}
package Remind::PDF::Entry::color;
use base 'Remind::PDF::Entry';
# Strip the RGB prefix from body
sub adjust
{
my ($self) = @_;
$self->{body} =~ s/^\d+\s+\d+\s+\d+\s+//;
}
package Remind::PDF::Entry::postscript;
use base 'Remind::PDF::Entry';
package Remind::PDF::Entry::psfile;

View File

@@ -155,22 +155,19 @@ sub render
{
my ($self, $cr, $settings) = @_;
$self->{horiz_lines} = [];
$cr->set_line_cap('square');
my $so_far = $self->draw_title($cr, $settings);
# Top line
$cr->move_to($settings->{margin_left}, $so_far);
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
$cr->stroke();
push(@{$self->{horiz_lines}}, $so_far);
my $top_line = $so_far;
$so_far = $self->draw_daynames($cr, $settings, $so_far);
# Line under the days
$cr->move_to($settings->{margin_left}, $so_far);
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
$cr->stroke();
push(@{$self->{horiz_lines}}, $so_far);
# First column
my $first_col = $self->{firstwkday};
@@ -209,9 +206,7 @@ sub render
print STDERR "Drawing row $row $start_day $start_col\n";
$so_far = $self->draw_row($cr, $settings, $so_far, $row, $start_day, $start_col);
$start_day += 7 - $start_col;
$cr->move_to($settings->{margin_left}, $so_far);
$cr->line_to($settings->{width} - $settings->{margin_right}, $so_far);
$cr->stroke();
push(@{$self->{horiz_lines}}, $so_far);
}
# The vertical lines
@@ -221,6 +216,13 @@ sub render
$cr->line_to($settings->{margin_left} + $i * $cell, $so_far);
$cr->stroke();
}
# And the horizontal lines
foreach my $y (@{$self->{horiz_lines}}) {
$cr->move_to($settings->{margin_left}, $y);
$cr->line_to($settings->{width} - $settings->{margin_right}, $y);
$cr->stroke();
}
}
sub draw_row
@@ -230,20 +232,61 @@ sub draw_row
my $col = $start_col;
my $day = $start_day;
my $height = 0;
# Preview them to figure out the row height...
while ($col < 7) {
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col);
my $h = $self->draw_day($cr, $settings, $so_far, $day, $col, 0);
$height = $h if ($h > $height);
$day++;
$col++;
last if ($day > $self->{daysinmonth});
}
# Now draw for real
$col = $start_col;
$day = $start_day;
while ($col < 7) {
$self->draw_day($cr, $settings, $so_far, $day, $col, $height);
$day++;
$col++;
last if ($day > $self->{daysinmonth});
}
return $so_far + $height + $settings->{border_size};
}
sub col_box_coordinates
{
my ($self, $so_far, $col, $height, $settings) = @_;
my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7;
return (
$settings->{margin_left} + $cell * $col,
$so_far,
$settings->{margin_left} + $cell * ($col + 1),
$so_far + $height + $settings->{border_size},
);
}
sub draw_day
{
my ($self, $cr, $settings, $so_far, $day, $col) = @_;
my ($self, $cr, $settings, $so_far, $day, $col, $height) = @_;
my ($x1, $y1, $x2, $y2) = $self->col_box_coordinates($so_far, $col, $height, $settings);
# Do shading if we're in "for real" mode
if ($height) {
my $shade = $self->find_last_special('shade', $self->{entries}->[$day]);
if ($shade) {
$cr->save;
$cr->set_source_rgb($shade->{r} / 255,
$shade->{g} / 255,
$shade->{b} / 255);
$cr->rectangle($x1, $y1, $x2 - $x1, $y2 - $y1);
$cr->fill();
$cr->restore;
}
}
# Draw the day number
my $layout = Pango::Cairo::create_layout($cr);
$layout->set_text($day);
@@ -252,28 +295,34 @@ sub draw_day
$layout->set_font_description($desc);
my ($wid, $h) = $layout->get_pixel_size();
my $cell = ($settings->{width} - $settings->{margin_left} - $settings->{margin_right}) / 7;
$cr->save;
if ($settings->{numbers_on_left}) {
$cr->move_to($settings->{margin_left} + ($col * $cell) + $settings->{border_size}, $so_far + $settings->{border_size});
} else {
$cr->move_to($settings->{margin_left} + ($col * $cell) + $cell - $settings->{border_size} - $wid, $so_far + $settings->{border_size});
}
Pango::Cairo::show_layout($cr, $layout);
$cr->restore();
my $layout = Pango::Cairo::create_layout($cr);
$layout->set_width(($cell - 2 * $settings->{border_size}) * 1024);
# Don't actually draw if we're just previewing to get the cell height
if ($height) {
$cr->save;
if ($settings->{numbers_on_left}) {
$cr->move_to($x1 + $settings->{border_size}, $so_far + $settings->{border_size});
} else {
$cr->move_to($x2 - $settings->{border_size} - $wid, $so_far + $settings->{border_size});
}
Pango::Cairo::show_layout($cr, $layout);
$cr->restore();
}
$layout = Pango::Cairo::create_layout($cr);
$layout->set_width(($x2 - $x1 - 2 * $settings->{border_size}) * 1024);
$layout->set_wrap('word');
$layout->set_text("Bobby snorkle flump chump twinkle");
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size});
$desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size});
$layout->set_font_description($desc);
my ($wid2, $h2) = $layout->get_pixel_size();
$cr->save;
$cr->move_to($settings->{margin_left} + ($col * $cell) + $settings->{border_size}, $so_far + 2* $settings->{border_size} + $h);
Pango::Cairo::show_layout($cr, $layout);
$cr->restore();
if ($height) {
$cr->save;
$cr->move_to($x1 + $settings->{border_size}, $so_far + 2* $settings->{border_size} + $h);
Pango::Cairo::show_layout($cr, $layout);
$cr->restore();
}
return $h + $h2 + 2 * $settings->{border_size};
}