#!/usr/bin/perl use warnings; use strict; # I used this to create the faded image content/style/block-fade.png # It outputs plain text description of the image to stdout, which you # then need to process with the 'sng' utility to create a PNG image. use Math::Round qw( round ); use Carp::Assert qw( assert ); die "Usage: $0 width start-colour end-colour >foo.sng\n" unless @ARGV == 3; my ($width, $start_col, $end_col) = @ARGV; my ($start_r, $start_g, $start_b) = parse_colour($start_col); my ($end_r, $end_g, $end_b) = parse_colour($end_col); print "#SNG:\n\n", "# Fade from $start_col ($start_r, $start_g, $start_b) to", " $end_col ($end_r, $end_g, $end_b).\n\n", "IHDR {\n", " width: $width;\n", " height: 1;\n", " bitdepth: 8;\n", " using color;\n", "}\n\n", "IMAGE {\n", " pixels hex\n"; my $done_pixels = 0; for (my $x = 0.0; $x < 1.00001; $x += (1.0 / ($width - 1))) { my $y = $x * $x; my $r = calc_colour($start_r, $end_r, $y); my $g = calc_colour($start_g, $end_g, $y); my $b = calc_colour($start_b, $end_b, $y); printf " %06X\n", ($r * 0x10000 + $g * 0x100 + $b); ++$done_pixels; } assert($done_pixels == $width); print "}\n"; sub parse_colour { my ($colour) = @_; die "Bad colour '$colour'\n" unless $colour =~ /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i; return map { hex } ($1, $2, $3); } sub calc_colour { my ($start, $end, $x) = @_; return round(($end / 255.0 * $x + $start / 255.0 * (1.0 - $x)) * 255.0); } # vi:ts=4 sw=4 expandtab