view TOOLS/subfont-gimp/mplayer_subfont @ 16429:84174804804b

Updates to NUT spec: 1. remove average_bitrate 2. add other_stream_header, for subtitles and metadata 3. add max_pts to index 4. index_ptr - a 64 bit integer to say the total length of all index packets 5. specify how to write "multiple" indexes 6. change forward_ptr behavior, starts right after forward_ptr, ends after checksum 7. remove stream_id <-> stream_class limitation. 8. time_base_nom must also be non zero. 9. rename time_base_nom and time_base_denom, now timebase means the length of a tick, not amounts of ticks 10. remove (old?) sample_rate_mul stuff. 11. specify what exactly the checksum covers. 12. specify that stream classes which have multiple streams must have an info packet.. (in new Semantic requirements section) 13. Rename 'timestamp' to pts. 14. Change date of draft... 15. Add myself to authors...
author ods15
date Fri, 09 Sep 2005 10:26:21 +0000
parents 22996ab2d78f
children
line wrap: on
line source

#!/usr/bin/perl
use 5.6.0;
use warnings;
use strict;
use Gtk; # just so that compilation fails without it
use Gimp qw(:auto);
use Gimp::Feature qw(gimp-1.2);
use Gimp::Fu;

my $head = <<EOF;
[files]
alpha arpi_osd_a.raw
bitmap arpi_osd_b.raw

[characters]
0x01 0 36
0x02 35 71
0x03 70 106
0x04 116 152
0x05 164 200
0x06 209 245
0x07 256 292
0x08 305 342
0x09 354 400
0x0A 407 442
0x0B 457 494

[files]
alpha arpi_progress_a.raw
bitmap arpi_progress_b.raw

[characters]
0x10 4 21
0x11 30 41
0x12 50 66
0x13 74 85

EOF

sub geninfo {
  my ($font, $height) = @_;

  my $size = (split("-", $font))[7];
  $font = (split("-", $font))[2];
  
  return(sprintf(<<EOF, $font, $size, int($size/2), -3-int($size/10), $size));
[info]
name "%s \@%d; created in gimp; plugin by lanzz\@lanzz.org"
descversion 1
spacewidth %d
charspace %d
height %d

EOF
}

sub basename($) {
  my ($f) = @_;
  $f =~ m#([^/]*)$#;
  return($1);
}

sub render_subfont {
  my ($font, $bfile, $afile, $dfile, $keep) = @_;

  my ($raw) = gimp_procedural_db_query("^file_raw_save\$", "","","","","","");
  if ($raw ne "file_raw_save") {
    gimp_message("HSI Raw plugin not installed");
    return(undef);
  }

  unless (open(D, "> $dfile")) {
    gimp_message("Cannot write to $dfile");
    return(undef);
  }

  my @size = xlfd_size($font);
  $size[0] *= 2;

  my (undef, $h) = gimp_text_get_extents_fontname(join("", map(chr($_), 33 .. 255)), @size, $font);
  $h += 10;
  my $w = 0;
  gimp_palette_set_foreground([255, 255, 255]);
  gimp_palette_set_background([0, 0, 0]);

  my $img = gimp_image_new(1, $h, GRAY);
  gimp_image_undo_disable($img);
  gimp_image_set_filename($img, $bfile);
  my $draw = gimp_layer_new($img, 1, $h, GRAY_IMAGE, "subfont", 100, NORMAL_MODE);
  gimp_image_add_layer($img, $draw, 0);
  gimp_edit_fill($draw, BG_IMAGE_FILL);

  my $x = 0;
  print D (geninfo($font));
  print D ($head);
  printf D (<<EOF, basename($afile), basename($bfile));
[files]
alpha %s
bitmap %s

EOF
  
  print D ("[characters]\n");
  gimp_progress_init("Rendering font...");
  for (my $c = 33; $c <= 255; $c++) {
    my ($cw) = gimp_text_get_extents_fontname(chr($c), @size, $font);
    printf D ("0x%02X %d %d\n", $c, int($x / 2), int(($x + $cw + 5) / 2));
    $cw = (int($cw / 8) + 2) * 8;
    $w += $cw;
    gimp_image_resize($img, $w, $h, 0, 0);
    gimp_layer_resize($draw, $w, $h, 0, 0);
    gimp_floating_sel_anchor(gimp_text_fontname($img, $draw, $x + 5, 5, chr($c), -1, 1, @size, $font));
    $x += $cw;
    gimp_progress_update(($c - 33) / 222);
  }
  close(D);

  gimp_image_scale($img, int($w / 2), int($h / 2));
  gimp_image_undo_enable($img);
  file_raw_save($img, $draw, $bfile, $bfile);

  my $aimg = gimp_channel_ops_duplicate($img);
  gimp_image_undo_disable($aimg);
  gimp_image_set_filename($aimg, $afile);
  $draw = gimp_image_flatten($aimg);
  gimp_by_color_select($draw, [0, 0, 0], 15, REPLACE, 1, 0, 0, 0);
  gimp_selection_invert($aimg);
  gimp_selection_grow($aimg, 1);
  gimp_edit_fill($draw, FG_IMAGE_FILL);
  gimp_selection_clear($aimg);
  plug_in_gauss_rle2($img, $draw, 3, 3);
  gimp_image_undo_enable($aimg);
  file_raw_save($aimg, $draw, $afile, $afile);

  gimp_message(<<EOF);
Render done.

Bitmap: $bfile
Alpha: $afile
Desc: $dfile
EOF
  if ($keep) {
    gimp_image_clean_all($img);
    gimp_image_clean_all($aimg);
    return($img, $aimg);
  } else {
    return(undef);
  }
}

sub render_subfont_alpha {
  my ($img) = @_;
  
  my $aimg = gimp_channel_ops_duplicate($img);
  gimp_image_undo_disable($aimg);
  gimp_image_set_filename($aimg, "alpha.raw");
  my $draw = gimp_image_flatten($aimg);
  gimp_by_color_select($draw, [0, 0, 0], 15, REPLACE, 1, 0, 0, 0);
  gimp_selection_invert($aimg);
  gimp_selection_grow($aimg, 1);
  gimp_edit_fill($draw, FG_IMAGE_FILL);
  gimp_selection_clear($aimg);
  plug_in_gauss_rle2($img, $draw, 3, 3);
  gimp_image_undo_enable($aimg);

  return($aimg);
}

register(
  "render_subfont",
  "Render a grayscale MPlayer subtitle font",
  "No help (yet)",
  "lanzz\@lanzz.org",
  "Copyright 2001, lanzz\@lanzz.org",
  "2001-07-31",
  "<Toolbox>/Xtns/MPlayer/Render Subfont",
  undef,
  [
    [PF_FONT, "font", "", "-*-arial-medium-r-normal-*-16-*-*-*-*-*-*-*", undef],
    [PF_FILE, "bitmap", "", "bitmap.raw", undef],
    [PF_FILE, "alpha", "", "alpha.raw", undef],
    [PF_FILE, "desc", "", "font.desc", undef],
    [PF_TOGGLE, "toggle", "Keep images opened", 0, undef]
  ],
  [ ],
  [ ],
  \&render_subfont
);

register(
  "render_subfont_alpha",
  "Render alpha shadow for MPlayer subtitle font",
  "No help (yet)",
  "lanzz\@lanzz.org",
  "Copyright 2001, lanzz\@lanzz.org",
  "2001-07-31",
  "<Image>/Filters/MPlayer/Render Shadow",
  "GRAY",
  [ ],
  [ PF_IMAGE ],
  [ ],
  \&render_subfont_alpha
);

exit(main());