4 * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #define KW_NUDGE _("nudge")
26 #define KW_COLOR _("color")
27 #define KW_ALPHA _("alpha")
28 #define KW_FONT _("font")
29 #define KW_SIZE _("size")
30 #define KW_BOLD _("bold")
31 #define KW_ITALIC _("italic")
32 #define KW_CAPS _("caps")
34 #define KW_BLINK _("blink")
35 #define KW_FIXED _("fixed")
36 #define KW_SUP _("sup")
37 #define KW_PNG _("png")
54 class TitleOutlinePackage;
55 class TitleOutlineUnit;
56 class TitleOutlineEngine;
57 class TitleTranslatePackage;
58 class TitleTranslateUnit;
76 #include "bcfontentry.h"
78 #include "indexable.inc"
79 #include "loadbalance.h"
81 #include "overlayframe.inc"
82 #include "pluginvclient.h"
83 #include "renderengine.inc"
84 #include "titlerwindow.h"
87 #include FT_FREETYPE_H
88 #include <sys/types.h>
95 #define BOTTOM_TO_TOP 0x1
96 #define TOP_TO_BOTTOM 0x2
97 #define RIGHT_TO_LEFT 0x3
98 #define LEFT_TO_RIGHT 0x4
100 // Horizontal justification
101 #define JUSTIFY_LEFT 0x0
102 #define JUSTIFY_CENTER 0x1
103 #define JUSTIFY_RIGHT 0x2
105 // Vertical justification
106 #define JUSTIFY_TOP 0x0
107 #define JUSTIFY_MID 0x1
108 #define JUSTIFY_BOTTOM 0x2
114 #define FLAG_UNDER 0x0001
115 #define FLAG_FIXED 0x0002
116 #define FLAG_SUPER 0x0004
117 #define FLAG_SUBER 0x0008
118 #define FLAG_BLINK 0x0010
126 void to_wtext(const char *from_enc, const char *text, int tlen);
127 // Only used to clear glyphs
128 int equivalent(TitleConfig &that);
129 void copy_from(TitleConfig &that);
130 void interpolate(TitleConfig &prev,
134 int64_t current_frame);
137 char font[BCTEXTLEN];
138 // Encoding to convert from
139 char encoding[BCTEXTLEN];
149 int motion_strategy; // Motion of title across frame
151 int loop; // Loop motion path
154 // Number of seconds the fade in and fade out of the title take
155 double fade_in, fade_out;
156 float pixels_per_second; // Speed of motion
158 wchar_t wtext[BCTEXTLEN];
160 // Position in frame relative to top left
161 float title_x, title_y;
162 int title_w, title_h;
164 int window_w, window_h;
165 // Calculated during every frame for motion strategy
166 int64_t prev_keyframe_position;
167 int64_t next_keyframe_position;
172 char background_path[BCTEXTLEN];
180 // loop background playback
193 int width, height, style;
196 int left, top, right, bottom;
197 VFrame *data, *data_stroke;
199 class TitleGlyphs : public ArrayList<TitleGlyph *> {
201 void clear() { remove_all_objects(); }
202 int count() { return size(); }
205 ~TitleGlyphs() { clear(); }
213 TitleImage(const char *path, VFrame *vfrm);
216 class TitleImages : public ArrayList<TitleImage *> {
218 void clear() { remove_all_objects(); }
219 int count() { return size(); }
222 ~TitleImages() { clear(); }
226 // Position of each image box in a row
238 TitleChar *init(int typ, void *vp);
240 class TitleChars : public ArrayList<TitleChar *> {
243 void reset() { next = 0; }
244 void clear() { remove_all_objects(); reset(); }
245 int count() { return next; }
246 TitleChar *add(int typ, void *vp) {
247 TitleChar *ret = next < size() ? get(next++) : 0;
248 if( !ret ) { append(ret = new TitleChar()); next = size(); }
249 return ret->init(typ, vp);
251 TitleChars() { reset(); }
252 ~TitleChars() { clear(); }
257 float x0, y0, x1, y1, x2, y2;
259 void bound(float lt, float tp, float rt, float bt) {
260 if( x1 > lt ) x1 = lt;
261 if( y1 < tp ) y1 = tp;
262 if( x2 < rt ) x2 = rt;
263 if( y2 > bt ) y2 = bt;
266 class TitleRows : public ArrayList<TitleRow *> {
269 void reset() { next = 0; }
270 void clear() { remove_all_objects(); reset(); }
271 int count() { return next; }
273 TitleRow *ret = next < size() ? get(next++) : 0;
274 if( !ret ) { append(ret = new TitleRow()); next = size(); }
277 TitleRows() { reset(); }
278 ~TitleRows() { clear(); }
281 // Draw a single character into the glyph cache
283 class GlyphPackage : public LoadPackage
291 class GlyphUnit : public LoadClient
294 GlyphUnit(TitleMain *plugin, GlyphEngine *server);
296 void process_package(LoadPackage *package);
299 FT_Library freetype_library; // Freetype library
300 FT_Face freetype_face;
303 class GlyphEngine : public LoadServer
306 GlyphEngine(TitleMain *plugin, int cpus);
307 void init_packages();
308 LoadClient* new_client();
309 LoadPackage* new_package();
314 // Copy a single character to the text mask
315 class TitlePackage : public LoadPackage
328 class TitleUnit : public LoadClient
331 TitleUnit(TitleMain *plugin, TitleEngine *server);
332 void process_package(LoadPackage *package);
333 void draw_frame(int mode, VFrame *dst, VFrame *src, int x, int y);
340 class TitleEngine : public LoadServer
343 TitleEngine(TitleMain *plugin, int cpus);
344 void init_packages();
345 LoadClient* new_client();
346 LoadPackage* new_package();
353 class TitleOutlinePackage : public LoadPackage
356 TitleOutlinePackage();
361 class TitleOutlineUnit : public LoadClient
364 TitleOutlineUnit(TitleMain *plugin, TitleOutlineEngine *server);
365 void process_package(LoadPackage *package);
367 TitleOutlineEngine *engine;
370 class TitleOutlineEngine : public LoadServer
373 TitleOutlineEngine(TitleMain *plugin, int cpus);
374 void init_packages();
376 LoadClient* new_client();
377 LoadPackage* new_package();
383 // Overlay text mask with fractional translation
384 // We don't use OverlayFrame to enable alpha blending on non alpha
386 class TitleTranslatePackage : public LoadPackage
389 TitleTranslatePackage();
396 int in_x2; // Might be same as in_x1 for boundary
398 float output_fraction;
401 class TitleTranslateUnit : public LoadClient
404 TitleTranslateUnit(TitleMain *plugin, TitleTranslate *server);
406 static void translation_array_f(transfer_table_f* &table,
407 float out_x1, float out_x2, int out_total,
408 float in_x1, float in_x2, int in_total,
409 int &x1_out, int &x2_out);
410 void process_package(LoadPackage *package);
414 class TitleTranslate : public LoadServer
417 TitleTranslate(TitleMain *plugin, int cpus);
419 void init_packages();
421 LoadClient* new_client();
422 LoadPackage* new_package();
424 transfer_table_f *y_table;
425 transfer_table_f *x_table;
431 template<class typ> class TitleStack : public ArrayList<typ>
433 typ &last() { return ArrayList<typ>::last(); }
434 int size() { return ArrayList<typ>::size(); }
435 typ &append(typ &v) { return ArrayList<typ>::append(v); }
436 void remove() { return ArrayList<typ>::remove(); }
439 TitleStack(TitleParser *p, typ v) : parser(p) { append(v); }
440 operator typ&() { return last(); }
441 typ &push(typ &v) { return append(v); }
442 int pop() { return size()>1 ? (remove(),0) : 1; }
443 int set(const char *txt);
444 int unset(const char *txt);
447 template<class typ> int TitleStack<typ>::set(const char *txt)
449 typ v = !*txt ? 1 : strtol(txt,(char **)&txt,0);
450 if( *txt || v < 0 || v > 1 ) return 1;
454 template<class typ> int TitleStack<typ>::unset(const char *txt)
459 class TitleCurNudge : public TitleStack<int> {
461 TitleCurNudge(TitleParser *parser, TitleMain *plugin);
462 int set(const char *txt);
465 class TitleCurColor : public TitleStack<int> {
467 TitleCurColor(TitleParser *parser, TitleMain *plugin);
468 int set(const char *txt);
471 class TitleCurAlpha : public TitleStack<int> {
473 TitleCurAlpha(TitleParser *parser, TitleMain *plugin);
474 int set(const char *txt);
477 class TitleCurSize : public TitleStack<float> {
479 TitleCurSize(TitleParser *parser, TitleMain *plugin);
480 int set(const char *txt);
481 int unset(const char *txt);
484 class TitleCurBold : public TitleStack<int> {
486 TitleCurBold(TitleParser *parser, TitleMain *plugin);
487 int set(const char *txt);
488 int unset(const char *txt);
491 class TitleCurItalic : public TitleStack<int> {
493 TitleCurItalic(TitleParser *parser, TitleMain *plugin);
494 int set(const char *txt);
495 int unset(const char *txt);
498 class TitleCurFont : public TitleStack<BC_FontEntry*>
501 BC_FontEntry *get(const char *txt, int style);
502 BC_FontEntry *set(const char *txt, int style);
504 virtual int set(const char *txt=0);
505 virtual int unset(const char *txt);
506 TitleCurFont(TitleParser *parser, TitleMain *plugin);
509 class TitleCurCaps : public TitleStack<int> {
511 TitleCurCaps(TitleParser *parser, TitleMain *plugin);
512 int set(const char *txt);
515 class TitleCurUnder : public TitleStack<int> {
517 TitleCurUnder(TitleParser *parser, TitleMain *plugin);
520 class TitleCurBlink : public TitleStack<float> {
522 TitleCurBlink(TitleParser *parser, TitleMain *plugin);
523 int set(const char *txt);
526 class TitleCurFixed : public TitleStack<int> {
528 TitleCurFixed(TitleParser *parser, TitleMain *plugin);
529 int set(const char *txt);
532 class TitleCurSuper : public TitleStack<int> {
534 TitleCurSuper(TitleParser *parser, TitleMain *plugin);
535 int set(const char *txt);
541 const wchar_t *bfr, *out, *lmt;
545 long tell() { return out - bfr; }
546 void seek(long pos) { out = bfr + pos; }
547 bool eof() { return out >= lmt; }
548 int wcur() { return eof() ? -1 : *out; }
549 int wnext() { return eof() ? -1 : *out++; }
550 int wget(wchar_t &wch);
551 int tget(wchar_t &wch);
552 wchar_t wid[BCSTRLEN], wtxt[BCTEXTLEN];
553 char id[BCSTRLEN], text[BCTEXTLEN];
554 int set_attributes(int ret);
556 TitleCurNudge cur_nudge;
557 TitleCurColor cur_color;
558 TitleCurAlpha cur_alpha;
559 TitleCurSize cur_size;
560 TitleCurBold cur_bold;
561 TitleCurItalic cur_italic;
562 TitleCurFont cur_font;
563 TitleCurCaps cur_caps;
564 TitleCurUnder cur_under;
565 TitleCurBlink cur_blink;
566 TitleCurFixed cur_fixed;
567 TitleCurSuper cur_super;
569 TitleParser(TitleMain *main);
573 class TitleMain : public PluginVClient
576 TitleMain(PluginServer *server);
579 // required for all realtime plugins
580 PLUGIN_CLASS_MEMBERS(TitleConfig)
581 int process_realtime(VFrame *input_ptr, VFrame *output_ptr);
585 void save_data(KeyFrame *keyframe);
586 void read_data(KeyFrame *keyframe);
587 void insert_text(const wchar_t *wtxt, int pos);
589 void build_previews(TitleWindow *gui);
592 int set_font(BC_FontEntry*&font, const char *txt);
593 int set_font(BC_FontEntry*&font, const char *txt, int style);
594 int set_size(int &size, const char *txt);
595 int set_color(int &color, const char *txt);
596 int set_bold(int &bold, const char *txt);
597 int set_italic(int &italic, const char *txt);
598 int set_caps(int &caps, const char *txt);
599 int set_under(int &under, const char *txt);
601 int draw_text(int need_redraw);
602 int draw_underline(VFrame *mask, int alpha);
606 int get_visible_text();
607 int check_char_code_path(FT_Library &freetype_library,
608 char *path_old, FT_ULong &char_code, char *path_new);
609 int load_freetype_face(FT_Library &freetype_library,
610 FT_Face &freetype_face, const char *path);
611 int load_font(BC_FontEntry *font);
612 Indexable *open_background(const char *filename);
613 int read_background(VFrame *frame, int64_t position, int color_model);
614 void draw_background();
615 static BC_FontEntry* get_font(const char *font_name, int style);
616 BC_FontEntry* config_font();
617 TitleGlyph *get_glyph(FT_ULong char_code, BC_FontEntry *font, int size, int style);
618 int get_width(TitleGlyph *cur, TitleGlyph *nxt);
620 VFrame *add_image(const char *path);
621 VFrame *get_image(const char *path);
623 // backward compatibility
624 void convert_encoding();
625 static const char* motion_to_text(int motion);
626 static int text_to_motion(const char *text);
630 GlyphEngine *glyph_engine;
631 TitleEngine *title_engine;
632 VFrame *outline_mask;
633 TitleOutlineEngine *outline_engine;
634 TitleTranslate *translate;
636 TitleChars title_chars;
637 TitleRows title_rows;
638 TitleGlyphs title_glyphs;
639 TitleImages title_images;
641 FT_Library freetype_library;
642 FT_Face freetype_face;
643 char text_font[BCTEXTLEN];
645 int window_w, window_h;
646 int fuzz, fuzz1, fuzz2;
647 int title_x, title_y, title_w, title_h;
649 float text_x, text_y, text_w, text_h;
650 float text_x1, text_y1, text_x2, text_y2;
652 int mask_x, mask_y; int mask_w, mask_h;
653 int mask_x1, mask_y1, mask_x2, mask_y2;
656 int visible_row1, visible_char1;
657 int visible_row2, visible_char2;
660 VFrame *input, *output;
661 int output_model, text_model, mask_model;
663 Indexable *background;
666 RenderEngine *render_engine;
667 CICache *video_cache;
668 OverlayFrame *overlay_frame;
670 int64_t last_position;
671 int need_reconfigure;