Ticket #2076: libass-de409235f4a3.patch
| File libass-de409235f4a3.patch, 14.4 KB (added by , 14 years ago) |
|---|
-
ass.c
191 191 style->MarginL = style->MarginR = style->MarginV = 20; 192 192 } 193 193 194 /**195 * \brief find style by name196 * \param track track197 * \param name style name198 * \return index in track->styles199 * Returnes 0 if no styles found => expects at least 1 style.200 * Parsing code always adds "Default" style in the end.201 */202 static int lookup_style(ASS_Track *track, char *name)203 {204 int i;205 if (*name == '*')206 ++name; // FIXME: what does '*' really mean ?207 for (i = track->n_styles - 1; i >= 0; --i) {208 if (strcmp(track->styles[i].Name, name) == 0)209 return i;210 }211 i = track->default_style;212 ass_msg(track->library, MSGL_WARN,213 "[%p]: Warning: no style named '%s' found, using '%s'",214 track, name, track->styles[i].Name);215 return i; // use the first style216 }217 218 194 static uint32_t string2color(ASS_Library *library, char *p) 219 195 { 220 196 uint32_t tmp; -
ass_parse.c
105 105 } 106 106 107 107 /** 108 * \brief Change border width 109 * negative value resets border to style value 108 * \brief Calculate valid border size. Makes sure the border sizes make sense. 109 * 110 * \param priv renderer state object 111 * \param border_x requested x border size 112 * \param border_y requested y border size 110 113 */ 111 void change_border(ASS_Renderer *render_priv, double border_x, 112 double border_y) 114 void calc_border(ASS_Renderer *priv, double border_x, double border_y) 113 115 { 114 int bord;115 if (!render_priv->state.font)116 return;117 118 116 if (border_x < 0 && border_y < 0) { 119 if ( render_priv->state.style->BorderStyle == 1 ||120 render_priv->state.style->BorderStyle == 3)121 border_x = border_y = render_priv->state.style->Outline;117 if (priv->state.style->BorderStyle == 1 || 118 priv->state.style->BorderStyle == 3) 119 border_x = border_y = priv->state.style->Outline; 122 120 else 123 121 border_x = border_y = 1.; 124 122 } 125 123 126 render_priv->state.border_x = border_x; 127 render_priv->state.border_y = border_y; 124 priv->state.border_x = border_x; 125 priv->state.border_y = border_y; 126 } 128 127 129 bord = 64 * border_x * render_priv->border_scale; 128 /** 129 * \brief Change border width 130 * 131 * \param render_priv renderer state object 132 * \param info glyph state object 133 */ 134 void change_border(ASS_Renderer *render_priv, double border_x, double border_y) 135 { 136 int bord = 64 * border_x * render_priv->border_scale; 130 137 if (bord > 0 && border_x == border_y) { 131 138 if (!render_priv->state.stroker) { 132 139 int error; … … 138 145 "failed to get stroker"); 139 146 render_priv->state.stroker = 0; 140 147 } 141 } 142 if (render_priv->state.stroker) 148 render_priv->state.stroker_radius = -1.0; 149 } 150 if (render_priv->state.stroker && render_priv->state.stroker_radius != bord) { 143 151 FT_Stroker_Set(render_priv->state.stroker, bord, 144 152 FT_STROKER_LINECAP_ROUND, 145 153 FT_STROKER_LINEJOIN_ROUND, 0); 154 render_priv->state.stroker_radius = bord; 155 } 146 156 } else { 147 157 FT_Stroker_Done(render_priv->state.stroker); 148 158 render_priv->state.stroker = 0; … … 256 266 val = render_priv->state.border_x * (1 - pwr) + val * pwr; 257 267 else 258 268 val = -1.; 259 c hange_border(render_priv, val, render_priv->state.border_y);269 calc_border(render_priv, val, render_priv->state.border_y); 260 270 render_priv->state.bm_run_id++; 261 271 } else if (mystrcmp(&p, "ybord")) { 262 272 double val; … … 264 274 val = render_priv->state.border_y * (1 - pwr) + val * pwr; 265 275 else 266 276 val = -1.; 267 change_border(render_priv, render_priv->state.border_x, val); 277 calc_border(render_priv, render_priv->state.border_x, val); 278 render_priv->state.bm_run_id++; 268 279 } else if (mystrcmp(&p, "xshad")) { 269 280 double val; 270 281 if (mystrtod(&p, &val)) … … 388 399 } else if (mystrcmp(&p, "bord")) { 389 400 double val; 390 401 if (mystrtod(&p, &val)) { 391 if (render_priv->state.border_x == render_priv->state.border_y)392 402 val = render_priv->state.border_x * (1 - pwr) + val * pwr; 393 403 } else 394 404 val = -1.; // reset to default 395 c hange_border(render_priv, val, val);405 calc_border(render_priv, val, val); 396 406 render_priv->state.bm_run_id++; 397 407 } else if (mystrcmp(&p, "move")) { 398 408 double x1, x2, y1, y2; … … 730 740 ass_msg(render_priv->library, MSGL_DBG2, "single c/a at %f: %c%c = %X", 731 741 pwr, n, cmd, render_priv->state.c[cidx]); 732 742 } else if (mystrcmp(&p, "r")) { 733 reset_render_context(render_priv); 743 char *start = p; 744 char *style; 745 skip_to('\\'); 746 if (p > start) { 747 style = malloc(p - start + 1); 748 strncpy(style, start, p - start); 749 style[p - start] = '\0'; 750 reset_render_context(render_priv, 751 render_priv->track->styles + lookup_style(render_priv->track, style)); 752 free(style); 753 } else 754 reset_render_context(render_priv, NULL); 734 755 } else if (mystrcmp(&p, "be")) { 735 756 int val; 736 757 if (mystrtoi(&p, &val)) { -
ass_parse.h
28 28 29 29 void update_font(ASS_Renderer *render_priv); 30 30 double ensure_font_size(ASS_Renderer *priv, double size); 31 void calc_border(ASS_Renderer *priv, double border_x, double border_y); 31 32 void change_border(ASS_Renderer *render_priv, double border_x, 32 33 double border_y); 33 34 void apply_transition_effects(ASS_Renderer *render_priv, ASS_Event *event); -
ass_render.c
841 841 * \brief partially reset render_context to style values 842 842 * Works like {\r}: resets some style overrides 843 843 */ 844 void reset_render_context(ASS_Renderer *render_priv )844 void reset_render_context(ASS_Renderer *render_priv, ASS_Style *style) 845 845 { 846 render_priv->state.c[0] = render_priv->state.style->PrimaryColour; 847 render_priv->state.c[1] = render_priv->state.style->SecondaryColour; 848 render_priv->state.c[2] = render_priv->state.style->OutlineColour; 849 render_priv->state.c[3] = render_priv->state.style->BackColour; 846 if (!style) 847 style = render_priv->state.style; 848 849 render_priv->state.c[0] = style->PrimaryColour; 850 render_priv->state.c[1] = style->SecondaryColour; 851 render_priv->state.c[2] = style->OutlineColour; 852 render_priv->state.c[3] = style->BackColour; 850 853 render_priv->state.flags = 851 ( render_priv->state.style->Underline ? DECO_UNDERLINE : 0) |852 ( render_priv->state.style->StrikeOut ? DECO_STRIKETHROUGH : 0);853 render_priv->state.font_size = render_priv->state.style->FontSize;854 (style->Underline ? DECO_UNDERLINE : 0) | 855 (style->StrikeOut ? DECO_STRIKETHROUGH : 0); 856 render_priv->state.font_size = style->FontSize; 854 857 855 858 free(render_priv->state.family); 856 859 render_priv->state.family = NULL; 857 render_priv->state.family = strdup( render_priv->state.style->FontName);860 render_priv->state.family = strdup(style->FontName); 858 861 render_priv->state.treat_family_as_pattern = 859 render_priv->state.style->treat_fontname_as_pattern;860 render_priv->state.bold = render_priv->state.style->Bold;861 render_priv->state.italic = render_priv->state.style->Italic;862 style->treat_fontname_as_pattern; 863 render_priv->state.bold = style->Bold; 864 render_priv->state.italic = style->Italic; 862 865 update_font(render_priv); 863 866 864 change_border(render_priv, -1., -1.); 865 render_priv->state.scale_x = render_priv->state.style->ScaleX; 866 render_priv->state.scale_y = render_priv->state.style->ScaleY; 867 render_priv->state.hspacing = render_priv->state.style->Spacing; 867 calc_border(render_priv, style->Outline, style->Outline); 868 change_border(render_priv, render_priv->state.border_x, render_priv->state.border_y); 869 render_priv->state.scale_x = style->ScaleX; 870 render_priv->state.scale_y = style->ScaleY; 871 render_priv->state.hspacing = style->Spacing; 868 872 render_priv->state.be = 0; 869 873 render_priv->state.blur = 0.0; 870 render_priv->state.shadow_x = render_priv->state.style->Shadow;871 render_priv->state.shadow_y = render_priv->state.style->Shadow;874 render_priv->state.shadow_x = style->Shadow; 875 render_priv->state.shadow_y = style->Shadow; 872 876 render_priv->state.frx = render_priv->state.fry = 0.; 873 render_priv->state.frz = M_PI * render_priv->state.style->Angle / 180.;877 render_priv->state.frz = M_PI * style->Angle / 180.; 874 878 render_priv->state.fax = render_priv->state.fay = 0.; 875 879 render_priv->state.wrap_style = render_priv->track->WrapStyle; 876 render_priv->state.font_encoding = render_priv->state.style->Encoding;880 render_priv->state.font_encoding = style->Encoding; 877 881 } 878 882 879 883 /** … … 886 890 render_priv->state.style = render_priv->track->styles + event->Style; 887 891 render_priv->state.parsed_tags = 0; 888 892 889 reset_render_context(render_priv );893 reset_render_context(render_priv, render_priv->state.style); 890 894 891 895 render_priv->state.evt_type = EVENT_NORMAL; 892 896 render_priv->state.alignment = render_priv->state.style->Alignment; … … 1141 1145 } else if ((info->border_x > 0 || info->border_y > 0) 1142 1146 && double_to_d6(info->scale_x) && double_to_d6(info->scale_y)) { 1143 1147 1144 outline_copy(priv->ftlibrary, v.outline, &v.border); 1148 change_border(priv, info->border_x, info->border_y); 1149 outline_copy(priv->ftlibrary, v.outline, &v.border); 1145 1150 stroke_outline(priv, v.border, 1146 1151 double_to_d6(info->border_x * priv->border_scale), 1147 1152 double_to_d6(info->border_y * priv->border_scale)); … … 1772 1777 glyphs[text_info->length].scale_y = render_priv->state.scale_y; 1773 1778 glyphs[text_info->length].border_x= render_priv->state.border_x; 1774 1779 glyphs[text_info->length].border_y = render_priv->state.border_y; 1780 glyphs[text_info->length].hspacing = render_priv->state.hspacing; 1775 1781 glyphs[text_info->length].bold = render_priv->state.bold; 1776 1782 glyphs[text_info->length].italic = render_priv->state.italic; 1777 1783 glyphs[text_info->length].flags = render_priv->state.flags; … … 1829 1835 } 1830 1836 1831 1837 // add horizontal letter spacing 1832 info->cluster_advance.x += double_to_d6( render_priv->state.hspacing *1838 info->cluster_advance.x += double_to_d6(info->hspacing * 1833 1839 render_priv->font_scale * info->scale_x); 1834 1840 1835 1841 // add displacement for vertical shearing -
ass_render.h
134 134 double fax, fay; // text shearing 135 135 double scale_x, scale_y; 136 136 double border_x, border_y; 137 double hspacing; 137 138 unsigned italic; 138 139 unsigned bold; 139 140 int flags; … … 174 175 int flags; // decoration flags (underline/strike-through) 175 176 176 177 FT_Stroker stroker; 178 int stroker_radius; // last stroker radius, for caching stroker objects 177 179 int alignment; // alignment overrides go here; if zero, style value will be used 178 180 double frx, fry, frz; 179 181 double fax, fay; // text shearing … … 289 291 int ha, hb; // left and width 290 292 } Segment; 291 293 292 void reset_render_context(ASS_Renderer *render_priv );294 void reset_render_context(ASS_Renderer *render_priv, ASS_Style *style); 293 295 void ass_free_images(ASS_Image *img); 294 296 295 297 // XXX: this is actually in ass.c, includes should be fixed later on -
ass_shaper.c
655 655 // Skip direction override control characters 656 656 // NOTE: Behdad said HarfBuzz is supposed to remove these, but this hasn't 657 657 // been implemented yet 658 if (glyphs[i].symbol <= 0x202F && glyphs[i].symbol >= 0x202a) { 658 if ((glyphs[i].symbol <= 0x202e && glyphs[i].symbol >= 0x202a) 659 || (glyphs[i].symbol <= 0x200f && glyphs[i].symbol >= 0x200c)) { 659 660 glyphs[i].symbol = 0; 660 661 glyphs[i].skip++; 661 662 } -
ass_utils.c
160 160 return c; 161 161 } 162 162 163 /** 164 * \brief find style by name 165 * \param track track 166 * \param name style name 167 * \return index in track->styles 168 * Returnes 0 if no styles found => expects at least 1 style. 169 * Parsing code always adds "Default" style in the end. 170 */ 171 int lookup_style(ASS_Track *track, char *name) 172 { 173 int i; 174 if (*name == '*') 175 ++name; // FIXME: what does '*' really mean ? 176 for (i = track->n_styles - 1; i >= 0; --i) { 177 if (strcmp(track->styles[i].Name, name) == 0) 178 return i; 179 } 180 i = track->default_style; 181 ass_msg(track->library, MSGL_WARN, 182 "[%p]: Warning: no style named '%s' found, using '%s'", 183 track, name, track->styles[i].Name); 184 return i; // use the first style 185 } 186 163 187 #ifdef CONFIG_ENCA 164 188 void *ass_guess_buffer_cp(ASS_Library *library, unsigned char *buffer, 165 189 int buflen, char *preferred_language, -
ass_utils.h
51 51 char parse_bool(char *str); 52 52 unsigned ass_utf8_get_char(char **str); 53 53 void ass_msg(ASS_Library *priv, int lvl, char *fmt, ...); 54 int lookup_style(ASS_Track *track, char *name); 54 55 #ifdef CONFIG_ENCA 55 56 void *ass_guess_buffer_cp(ASS_Library *library, unsigned char *buffer, 56 57 int buflen, char *preferred_language,
