From 8f9a8bf81d128bbe52d301d08bc6cb1f94af3ba4 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Sat, 7 Jun 2003 19:05:19 +0000 Subject: [PATCH] * doc/subtitles/*, share/font-eutopiabold21.rle: new (smaller) font + scripts and instructions to generate new fonts. --- doc/subtitles/readme | 19 ++++ doc/subtitles/vlc-font.pl | 205 +++++++++++++++++++++++++++++++++++ doc/subtitles/vlc-gimp.pl | 132 ++++++++++++++++++++++ share/font-eutopiabold21.rle | Bin 0 -> 25021 bytes 4 files changed, 356 insertions(+) create mode 100644 doc/subtitles/readme create mode 100755 doc/subtitles/vlc-font.pl create mode 100755 doc/subtitles/vlc-gimp.pl create mode 100644 share/font-eutopiabold21.rle diff --git a/doc/subtitles/readme b/doc/subtitles/readme new file mode 100644 index 0000000000..236f103a8f --- /dev/null +++ b/doc/subtitles/readme @@ -0,0 +1,19 @@ +How to create new subtitles fonts +--------------------------------- + +VLC uses run-length encoded fonts. We already provide 2 of these fonts +(share/font-eutopiabold21.rle and share/font-eutopiabold36.rle) but you might +also want to generate your own. + +Two (very basic) perl scripts are provided to generate these fonts files, +vlc-gimp.pl and vlc-font.pl. vlc-gimp.pl is perl-fu, and uses gimp's font +plotting routines to create an image, which should be saved as an RAW PNM. +Installing vlc-gimp.pl with "gimptool --install-bin vlc-gimp.pl" will add a new +entry in the Xtns/Perl-Fu menu in gimp. +vlc-font.pl extracts the characters from the raw PNM, and creates a run-length +encoded font file which VLC can use. As already stated these scripts are quite +basic so you will have to hack them to your liking. + +Also note that the subtitler engine in VLC is currently being replaced to use +the freetype library which will allow the use of fonts already available on +your system and some other new powerful features. \ No newline at end of file diff --git a/doc/subtitles/vlc-font.pl b/doc/subtitles/vlc-font.pl new file mode 100755 index 0000000000..3dbe741ee4 --- /dev/null +++ b/doc/subtitles/vlc-font.pl @@ -0,0 +1,205 @@ +#! /usr/bin/perl + +$file_input="font.pnm"; +$file_output="eutopiabold36.rle"; +$border=-1; +$spaceborder=4; + +$|=1; + +open(INPUT,$file_input) || die "Couldn't open font: $!\n"; + +$tag=; chop($tag); +if($tag ne "P6") + { die "Couldn't process image: not a pnm file ($tag)"; } + +$comment=; + +$dimensions=; chop($dimensions); + +if($dimensions =~ /(\d+) (\d+)/) + { $width=$1; $height=$2; } +else + { die "Couldn't process image: couldn't get dimensions"; } + +$bits=; + +print "width $width height $height\n"; + +for($j=0; $j<$height; $j++) + { for($i=0; $i<$width; $i++) + { + $red[$i][$j]=ord(getc(INPUT)); + $green[$i][$j]=ord(getc(INPUT)); + $blue[$i][$j]=ord(getc(INPUT)); + } + print "."; + } + +print "\n"; + +close(INPUT); + +open(OUTPUT,">".$file_output) || die "Couldn't open output: $!\n"; + +# Put header +print OUTPUT pack("C2",0x36,0x05); + +# Put font height +print OUTPUT pack("C",$height); + +$xstart=0; + +# Search for space + +$xstart=2; +$x=$xstart; $blank=0; +while($x<$width && !$blank) + { $blank=1; + for($y=0; $y<$height; $y++) + { if($blue[$x][$y]!=255) + { $blank=0; } + } + if(!$blank) + { $x++; } + } + +$xstart=$x; + +$x=$xstart; $blank=1; +while($x<$width && $blank) + { $blank=1; + for($y=0; $y<$height; $y++) + { if($blue[$x][$y]!=255) + { $blank=0; } + } + if($blank) + { $x++; } + } +$xend=$x; + +$spacewidth=$xend-$xstart+$spaceborder; +$spacewidth=$spacewidth/2; +if($spacewidth==0) + { $spacewidth=1; } + +print "space start=$xstart end=$xend -> width=$spacewidth\n\n"; + +# Put space character code +print OUTPUT pack("C",32); + +# Put space width +print OUTPUT pack("C",$spacewidth); + +# Put space RLE data +for($y=0;$y<$height;$y++) + { print OUTPUT pack("C",1); + print OUTPUT pack("C",0); + print OUTPUT pack("C",$spacewidth); + } + +$char=33; + +while($xstart<$width) + { + print "looking for character $char \"".chr($char)."\"\n"; + + $x=$xstart; $blank=1; + while($x<$width && $blank) + { $blank=1; + for($y=0; $y<$height; $y++) + { if($blue[$x][$y]!=255) + { $blank=0; } + } + if($blank) + { $x++; } + } + $xstart=$x; + + $x=$xstart; $blank=0; + while($x<$width && !$blank) + { $blank=1; + for($y=0; $y<$height; $y++) + { if($blue[$x][$y]!=255) + { $blank=0; } + } + if(!$blank) + { $x++; } + } + $xend=$x; + print "start=$xstart end=$xend\n"; + + $dstart=$xstart-$border; + if($dstart < 0) + { $dstart = 0; } + $dend=$xend+$border; + if($dend > $width) + { $dend = $width; } + + # Put character + print OUTPUT pack("C",$char); + + # Put character width + print OUTPUT pack("C",$dend-$dstart); + + for($y=0; $y<$height; $y++) + { $linecode=""; $bytecode=""; $lastcolour=-1; $count=0; + for($x=$dstart; $x<$dend; $x++) + { + # Transparent background + $c=":"; $colour=0; + + # Anti-aliased foreground + if($blue[$x][$y]<255 && $red[$x][$y]>0) + { $c="+"; $colour=1; } + + # Solid foreground + if($blue[$x][$y]==255 && $red[$x][$y]==255 ) + { $c="#"; $colour=2; } + + # Anti-aliased shadow (same as shadow) + if($blue[$x][$y]<255 && $red[$x][$y]==0) + { $c="."; $colour=3; } + + # Solid shadow + if($blue[$x][$y]==0 && $red[$x][$y]==0) + { $c=" "; $colour=3; } + + print $c; + + if($colour != $lastcolour) + { + if($lastcolour!=-1) + { $linecode.=" $lastcolour,$count"; + $bytecode.=pack("C2",$lastcolour,$count); + } + $lastcolour=$colour; $count=1; + } + else + { $count++; } + } + if($lastcolour!=-1) + { $linecode.=" $lastcolour,$count"; + $bytecode.=pack("C2",$lastcolour,$count); + } + print " [$linecode]\n"; + + # Put length of RLE line + print OUTPUT pack("C*",length($bytecode)/2); + + # Put RLE line + print OUTPUT $bytecode; + + } + + print "\n"; + + $xstart=$xend+1; + $char++; + } + +print OUTPUT pack("C",255); + +print "Done!\n"; + +close(OUTPUT); diff --git a/doc/subtitles/vlc-gimp.pl b/doc/subtitles/vlc-gimp.pl new file mode 100755 index 0000000000..25619f5f23 --- /dev/null +++ b/doc/subtitles/vlc-gimp.pl @@ -0,0 +1,132 @@ +#!/usr/bin/perl + +use Gimp ":auto"; +use Gimp::Fu; + +sub vlc_subtitler_font +{ + + $shadowcolour=[0,0,0]; + $textcolour=[255,255,255]; + $backcolour=[0,0,255]; + $font="-*-utopia-bold-r-*-*-21-*-*-*-*-*-*-*"; + $border=3; + $alias=1; + + $text="_ "; + for($i=33; $i<127; $i++) + { $text.=chr($i); $text.=" "; } + + # Create a new image of an arbitrary size with + $img = gimp_image_new(100, 100, RGB); + + # Create a new layer for the background of arbitrary size, and + # add it to the image + my $background = gimp_layer_new($img, 100, 100, + RGB, "Background", 100, + NORMAL_MODE); + gimp_image_add_layer($background, 1); + + # Choose color of text + gimp_palette_set_foreground($textcolour); + + # Create the text layer. Using -1 as the drawable creates a new layer. + my $text_layer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + + # Get size of the text drawable and resize the image and the + # background layer to this size. + my($width, $height) = ($text_layer->width, $text_layer->height); + gimp_image_resize($img, $width, $height, 0, 0); + gimp_layer_resize($background, $width, $height, 0, 0); + + gimp_layer_delete($text_layer); + + # Fill the background layer now when it has the right size. + gimp_palette_set_background($backcolour); + gimp_edit_fill($background, BG_IMAGE_FILL); + + my $shadowlayer, $textlayer; + + # Plot eight shadow copies of the text + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, -2, 0); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, 2, 0); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, 0, -2); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, 0, 2); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, -1, -1); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, -1, 1); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, 1, -1); + gimp_image_flatten($img); + + gimp_palette_set_foreground($shadowcolour); + $shadowlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_layer_translate($shadowlayer, 1, 1); + gimp_image_flatten($img); + + # Plot the text itself + gimp_palette_set_foreground($textcolour); + $textlayer = gimp_text_fontname($img, -1, 0, 0, $text, + $border, $alias, + xlfd_size($font), $font); + gimp_image_flatten($img); + + return $img; +} + +# register the script +register "vlc_subtitler_font", + "vlc subtitler font", + "vlc subtitler font", + "Andrew Flintham", + "Andrew Flintham", + "2002-06-18", + "/Xtns/Perl-Fu/VLC Subtitles Font", + "*", + [], + \&vlc_subtitler_font; + +# Handle over control to gimp +exit main(); diff --git a/share/font-eutopiabold21.rle b/share/font-eutopiabold21.rle new file mode 100644 index 0000000000000000000000000000000000000000..3680c60bfb0d813717daed53dc8d4c8f4fbca170 GIT binary patch literal 25021 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