summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
Commit message (Collapse)AuthorAgeFilesLines
* renderer: improve usability of rectangle_combine()Dr.Smile2019-05-201-6/+6
|
* renderer: improve handling of subpixel shiftDr.Smile2019-05-201-33/+41
| | | | | | | Integral pixel shift is extracted in quantization function now, taking account of full glyph transformation and not only translation part of it. It makes program logic more straight and ensures that subpixel shift from cache key never exceed full pixel.
* renderer: implement correct error estimation for strokingDr.Smile2019-05-201-74/+109
| | | | | Accuracy of border outline calculation should depend on subsequent transformation.
* renderer: move outline stroking immediately before rasterizationDr.Smile2019-05-201-64/+56
|
* Consolidate and quantize all transformationsDr.Smile2019-05-201-352/+487
| | | | | | | | | | | | | | This commit defers all outline transformations until rasterization stage. Combined transformation is then quantized and used as bitmap key. That should improve performance of slow animations. Also caching of initial and stroked outlines and bitmaps is now separate in preparation to proper error estimation for stroker stage. Note that Z-clipping for perspective transformations is now done differently compared to VSFilter. That clipping is mostly safety feature to protect from overflows and divisions by zero and is almost never triggered in real-world subtitles.
* renderer: fix potential memory leakDr.Smile2019-05-191-1/+3
|
* font: extract transformation from ass_font_get_glyph()Dr.Smile2019-05-191-9/+9
|
* drawing: extract transformation from parsingDr.Smile2019-05-191-28/+38
|
* cache: construct cache values only from corresponding keysDr.Smile2019-05-191-318/+313
| | | | | | | | | | | | | | | | | | | | This commit forces construction of cache values using only data available in its companion keys. That ensures logical correctness: keys are guaranteed to have all the necessary data, and prevents accidental collisions. Most fixes of cache logic correspond to minor problem when rendering is done with double parameter but cache key stores its approximate fixed-point representation. The only serious problem is missing scale of clip drawing. Also this commit removes unused scale parameters from glyph metrics cache key. Due to missing scale clip shapes that differed only in scale treated by cache system as identical. That can lead to incorrect reuse of cached bitmap of different scale instead of correct one. The only hack left is in glyph metrics cache with its unicode >= VERTICAL_LOWER_BOUND check.
* renderer: rewrite measure_text() to correctly account for leading newlinesDr.Smile2019-05-191-31/+22
|
* font: remove dependency on symbol codesDr.Smile2019-05-191-3/+5
| | | | | Leading newlines are now rendered, but still incorrectly: at full height rather than at half-height as required.
* renderer: use C99 features in some functionsDr.Smile2019-05-191-37/+30
| | | | | Note that return value is reversed in parse_events(), ass_render_event() and ass_start_frame() functions.
* drawing: separate drawing text reading from outline constructionDr.Smile2019-05-191-51/+46
| | | | Purpose of this commit is to simplify logic behind drawing handling.
* Eliminate advance.y from drawings and glyphsDr.Smile2019-05-191-12/+8
| | | | | Drawings always have advance.y = 0 and FreeType guarantees that for horizontal writing.
* drawing: remove unnecessary fields from ASS_Drawing structDr.Smile2019-05-191-2/+0
|
* font: remove unused fieldDr.Smile2019-05-191-2/+1
|
* render: simplify detection of hard overridesDr.Smile2018-01-211-7/+7
| | | | | | | | | | | Previously each \r triggered full rescan of event string. After this commit such scanning is done once in init_render_context(). Additionally some lines have moved around to correctly account for state.evt_type (calculated in apply_transition_effects) and state.explicit (used in reset_render_context). That should fix cases with incorrectly applied style overrides for subs with banner scrolling effect before the first \r.
* parse_tags: handle argumentless \t inside \t() like VSFilterOleg Oshmyan2018-01-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | \t with no parantheses inside \t() resets the animation parameters of the \t() for subsequent tags, so they are animated as if the \t() was the single-argument version regardless of the actual number of arguments the \t() has. Equivalently, you could say parentheses are implied for \t inside \t(). For example, \t(20,60,\frx0\t\fry0\frz0) animates \frx from 20 to 60 ms and animates \fry and \frz for the whole duration of the line, just like \t(20,60,\frx0)\t(\fry0\frz0) or \t(20,60,\frx0\t(\fry0\frz0)). Technically, VSFilter simply resets the animation parameters for any \t it encounters but parses the embedded tags only if the \t has the right number of arguments. However, top-level animation parameters don't matter because top-level tags are not animated, while any nested \t that has parentheses terminates the containing \t because they share the closing parenthesis, so the fact that a nested \t with empty parentheses or with at least four arguments changes the animation parameters also doesn't matter because the containing \t immediately ends and the changed parameters have nothing to apply to. Thus the only situation where this has a visible effect is a nested \t without parentheses. Closes https://github.com/libass/libass/pull/296.
* Move parse_tag loop into parse_tag itself, now called parse_tagsOleg Oshmyan2018-01-051-2/+1
| | | | This commit is mostly transparent to `git blame -w`.
* Consolidate bounding box operationsDr.Smile2017-09-171-10/+3
|
* Rename DBBox to ASS_DRect for uniformityDr.Smile2017-09-171-43/+34
|
* Reorganize outline transformation functionsDr.Smile2017-09-171-55/+56
|
* Switch to more efficient representation of outlinesDr.Smile2017-09-171-8/+14
|
* Switch to native coordinate system for outlinesDr.Smile2017-09-171-16/+16
|
* Replace FreeType types with libass native typesDr.Smile2017-09-171-44/+35
| | | | | | FT_Vector and FT_BBox types are based on FT_Pos, which is alias of long. FreeType treats it as 32-bit integer, but on some platforms long can be 64-bit. That leads to wasted memory and suboptimal performance.
* renderer: fix border existence checkDr.Smile2017-08-011-1/+1
| | | | Found by coverity scan.
* renderer: fix handling of empty outlinesDr.Smile2017-07-311-18/+27
|
* renderer: switch to using two border outlines instead of oneDr.Smile2017-07-311-58/+44
|
* renderer: remove legacy FreeType rasterizerDr.Smile2017-07-311-4/+0
|
* stroker: implement fast two-outline strokerDr.Smile2017-07-311-124/+10
|
* rasterizer: implement simultaneous rasterization of two outlinesDr.Smile2017-07-311-1/+4
|
* cosmetic: extract most of the outline-related functions into separate fileDr.Smile2017-07-311-0/+1
|
* Allow using shadow offset to adjust size of text backgroundRicardo Constantino2017-06-011-4/+8
| | | | | | | | | | | | Text background refers to the libass-only BorderStyle 4, which is similar to 3, but isn't affected by outline/border size and doesn't render shadow, so shadow offset can be used. You can override the horizontal and vertical box size separately with override tags, just like you can override the color with shadow color. Closes #270
* Reduce precision of border width in outline cache keysOleg Oshmyan2017-01-311-4/+4
| | | | | | | The value used to generate outline cache values is 26.6, so there is no point in storing the more precise 16.16 in the cache key. Indeed, this can only reduce the efficiency of the cache and provide an extra opportunity for overflow.
* Reflect border_scale in outline cache keysOleg Oshmyan2017-01-311-4/+4
| | | | | | | | | border_scale can change, e. g. when ass_render_frame is called twice with the same renderer but different tracks. Glyphs with equal \bord tag values but different border_scale values produce different border outlines and hence should be distinguished in outline cache keys. To this end, store scaled border widths (which are really used when generating the outlines) in cache keys instead of \bord tag values.
* render: remove redundant has_clipsDr.Smile2017-01-311-18/+4
| | | | | | | | | | | | | has_clips was a workaround for the case where a new image reused the same memory address as another image used in the previous frame. In case of such reuse, comparison by pointer address failed to distinguish the different images in ass_detect_change(). After commit dd06ca30ea79ce50116a43cc5521d4eaf60a017e, images in the previous frame are no longer freed before the comparison with current frame. Thus no such reuse can occur, and the workaround is redundant. See https://github.com/libass/libass/pull/258.
* render: clip BorderStyle=4 against screenwm42017-01-111-7/+15
| | | | | | | | ASS_Images returned by libass are guaranteed to be clipped. Not doing this will cause invalid memory accesses in applications which try to use this guarantee. Fixes #254.
* Add text justificationDan Oscarsson2016-11-121-3/+37
| | | | | | | | | | | | | | | | | | | | | | | Subtitle recommendations often include that multi line subtitles should be left justified as this is easier for the eyes. This is also the standard used by several television companies. This add the possibility to define how subtitles are to be justified, independently of where they are aligned. The most common way could be to set justify to left, and have alignment to center. But you can, for example, have alignment to left and justify to center, giving subtitles to the left but justifed on the center (instead of normal left justified). Using justify right and alignment of center, might be good choice for Arabic. If justify is not defined, all works like before. If justify is defined, subtitles are aligned as defined by alignment and justified as defined by justify. ASS is not extended by this, justify can only be defined by setting Justify to wanted justification.
* Remove unused variableGrigori Goronzy2016-10-051-3/+0
|
* Fix line wrapping mode 0/3 bugsGrigori Goronzy2016-10-051-1/+4
| | | | | | | | | | | | | | | | | | This fixes two separate bugs: a) Don't move a linebreak into the first symbol. This results in a empty line at the front, which does not help to equalize line lengths at all. Instead, merge line with the second one. b) When moving a linebreak into a symbol that already is a break, the number of lines must be decremented. Otherwise, uninitialized memory is possibly used for later layout operations. Found by fuzzer test case id:000085,sig:11,src:003377+003350,op:splice,rep:8. This might also affect and hopefully fix libass#229. v2: change semantics according to review
* bitmap: use calloc instead of malloc/memsetRodger Combs2016-09-241-5/+6
| | | | This can improve perf somewhat with large bitmaps
* render: add refcounting functionality to image listsDr.Smile2016-06-301-24/+38
|
* render: keep track of any associated resources within ASS_ImageDr.Smile2016-06-301-105/+78
| | | | | That resources can be cached composite bitmap or raw bitmap buffer. Consequently, free lists are no longer needed.
* cache: keep ref_count of all active objects nonzeroDr.Smile2016-06-301-22/+56
|
* cache: replace size_func with parameter in ass_cache_commit()Dr.Smile2016-06-301-8/+18
|
* cache: remove ass_cache_cancel(), cache failures insteadDr.Smile2016-06-301-79/+68
|
* cache: switch to gradual cache clearingDr.Smile2016-06-301-87/+79
| | | | | | | | | | | Advantages over the old algorithm consist of the following. * There are no glitches due to full cache clearing. Items are arranged into linked list ordered by time of last use. Only the oldest items get deleted at the clearing event. * Each item now keeps track of number of references. Referenced cache values are immune to clearing. * Reduced amount of total cache memory for the same performance. * Reduced number of memory allocations per cache item.
* Fully fix compilation with MSVC/ICLOleg Oshmyan2015-09-171-0/+1
| | | | | | | | | As before, this does not add any build system support: a config.h file and a project must still be manually created (or the compiler can be run manually instead of using a project). Signed-off-by: Grigori Goronzy <greg@kinoho.net> Signed-off-by: Oleg Oshmyan <chortos@inbox.lv>
* ass_render: fix potential NULL derefwm42015-09-071-1/+1
| | | | Fixes CID 146421.
* ass_render: fix potential NULL derefwm42015-09-071-2/+2
| | | | | | | | | | The logic here is pretty complicated. The caller of this function guards it with "if(info->bm || info->bm_o){", and generally indeed only one of them is set. But in some cases, both are needed. fix_outline() definitely dereferences both. This is not necessarily guaranteed, e.g. on out of memory errors. Add the missing checks. Fixes CID 146125.
* Merge branch 'fonts'Grigori Goronzy2015-09-071-5/+8
|\
| * fontselect: simplify cmap lookup for embedded fontsGrigori Goronzy2015-07-101-2/+2
| | | | | | | | | | FreeType can do it for us and is probably more efficient. Also fixes deinitialization order of ASS_Renderer to make this work.
| * Custom font matching and font sourcesGrigori Goronzy2015-07-101-4/+7
| | | | | | | | | | | | | | Implement a simple font sorter (FontSelector) and an interface to deal with multiple font sources (FontProvider). Unfinished business, but works for the most part. Currently the only implemented FontProvider uses fontconfig.
* | Properly skip glyphs for multiple consecutive line breaksOleg Oshmyan2015-08-031-1/+1
|/ | | | | | | | | This corrects the calculated width of events that contain \N\N, which previously included the width of the glyph corresponding to '\n' (more generally, for n consecutive line breaks, only the first glyph was skipped and n-1 glyphs were included). Reported on IRC.
* Implement cascade gaussian blurDr.Smile2015-07-041-10/+2
| | | | | | | | | | That's complete version with SSE2/AVX2 assembly. Should be much faster than old algorithm even in pure C. Algorithm description can be found in this article (PDF): https://github.com/MrSmile/CascadeBlur/releases Close #9
* Switch to virtual function tableDr.Smile2015-06-261-75/+35
| | | | | | | | | | Use one pointer to table of functions instead of scattered bunch of function pointers. Different versions of these tables can be constructed in compile time. Also, bitmap memory alignment now depends only on SSE2/AVX2 support and is constant for every width. That simplifies code without noticeable performance penalty.
* Merge pull request #160 from astiob/beGrigori Goronzy2015-06-231-1/+1
|\ | | | | \be fixes including clipping and value range
| * Add enough padding for \be to avoid clippingOleg Oshmyan2015-02-101-1/+1
| | | | | | | | | | To avoid making bitmaps unnecessarily large, use just the necessary amount of padding for the given \be value.
* | Fix crash when stroked outline overflows SHRT_MAXDr.Smile2015-06-141-1/+1
| |
* | Do not apply ass_set_line_position() to positioned eventswm42015-06-111-3/+4
| | | | | | | | | | Even if we wanted this, the result would be inconsistent if e.g. \clip is used.
* | Remove several dead storesGrigori Goronzy2015-06-071-6/+4
| | | | | | | | Reported by clang scan-build static analysis.
* | Check possible NULL dereferenceGrigori Goronzy2015-06-071-1/+1
| | | | | | | | | | | | Reported by clang scan-build static analysis. This cannot happen with the current code, but the check might make this more robust in case anything changes.
* | Strictly clip non-dialog events against the video rectanglewm42015-05-251-0/+13
| | | | | | | | | | | | Only normal dialog lines are allowed to appear outside. Fixes #177.
* | Apply fade only when the fade alpha is positive (like VSFilter)Oleg Oshmyan2015-05-251-2/+4
| |
* | Fix memory leak with drawingswm42015-05-101-1/+6
| | | | | | | | | | | | What. Closes #175.
* | Remove RenderContext.drawingwm42015-05-101-19/+19
| | | | | | | | | | This really didn't make a lot of sense. This is a simplification, and should not affect actual program behavior.
* | Don't use margins for events that should not be overriddenwm42015-03-161-0/+12
| | | | | | | | | | | | | | libass already does not use the margins for events using \pos. This is not quite complete: there are other tags that we consider as "not dialogue", and which should not be overridden. These tags do not use EVENT_POSITIONED, and thus use the margins, which can mess up rendering.
* | Reorder functionswm42015-03-161-12/+12
| | | | | | | | Just move the *_pos ones about the variants without this postfix.
* | Fix BorderStyle=3 with zero Outline and ShadowDr.Smile2015-03-061-1/+5
| |
* | Prevent selective style overrides with scrollingwm42015-03-061-2/+3
| | | | | | | | Similar to xy-VSFilter.
* | Refine list of tags that prevent selective style overrideswm42015-03-061-1/+1
| | | | | | | | | | | | |