| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Finally implement the drawing mode, which allows drawing of custom
vector graphics. Drawings are intercepted in ass_render_event; a hash
of the drawing string is generated which is then used for looking
up drawings and bitmaps of drawings in the cache. The drawings
itself are "fake" glyphs. They are created by parsing the simple
drawing description language, evaluating the curves described (lines,
cubic beziers and/or a special kind of b-splines) and creating vector
outlines. Afterwards, these drawings are (with a few exceptions, e.g.
ascender/descender) exactly handled like regular glyphs.
Support for vector clippings is still missing, but otherwise the
implementation should be complete and compatible with VSFilter.
The libass integration of the drawing parsing/processing code is still a
bit sketchy and should be refactored.
History:
WIP: Drawing mode infrastructure
WIP: Drawing tokenizer
WIP: Parse drawing tokens, call evaluators
WIP: Bezier/b-spline evaluator
WIP: Final pieces for the drawing mode
WIP: Heavy modifications to the drawing parser/tokenizer
WIP: Dynamic outline memory allocation
WIP: Drawing position fixes
WIP: more drawing position fixup (similar to VSFilter now)
WIP: Lots of cleanup and fixes for drawings.
WIP: Drawing mode integration into ass_render_event
|
|
|
|
|
|
| |
read_file_recode is only used internally in ass_read_file and
shouldn't be exposed in the API. Remove the prototype from ass.h
and declare it static.
|
| |
|
|
|
|
|
|
|
|
| |
Rotations use a "magic" constant of, by default, 20000. This number
is more or less taken from VSFilter; I'm not even really sure what is
(viewing distance, maybe), but scaling it according to font_scale
solves problems with distortions of rotations in case the rendering
resolution differs from the video resolution.
|
|
|
|
|
|
| |
In ass_set_frame_size pixel_ratio will be set alongside aspect ratio to
the same value. This makes it possible to use libass without
explicitely specifying an aspect ratio.
|
|
|
|
|
|
|
|
|
| |
Inverse clipping means to display everything outside the clipping
rectangle. It is implemented by splitting up a bitmap into up
to 4 parts, as needed by the clipping rectangle. Afterwards, the
bitmap is clipped against the screen boundaries as usual. Finally,
each bitmap is split up into left and right and colored different,
in case \kf karaoke is in effect.
|
|
|
|
|
|
| |
The timing for the \kf karaoke which gradually fills the character from
left to right, uses clipping and isn't aware of subpixel accuracy. This
is simply fixed by casting these value to int.
|
|
|
|
|
|
| |
Instead of adding the subpixel shift to the glyph in transform_3d, do it
directly in get_bitmap_glyph. This saves a few cycles for glyphs that
are not transformed (rotated or sheared).
|
|
|
|
|
| |
Rename process_force_style to ass_process_force_style and make it
available in the DSO.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The most prominent ASS/SSA renderer (VSFilter) conveniently ignores the
real aspect ratio, and everyone seems to rely on that. This is fine
when the subtitles are rendered before anamorphic video is stretched
to its native aspect ratio, but results in wrongly stretched text with
native renderers (EOSD). It can be fixed by making libass aware of
the pixel ratio of the video. ass_set_aspect_ratio now requires an
extra argument that specifies the pixel ratio, which is just width /
height of the video after decoding.
Glyphs are stretched in x direction before transformation (rotation,
shearing), so there are still issues with transformed glyphs to be
fixed.
|
|
|
|
|
|
| |
Only export those symbols into the shared object which are defined in
the API (ass.h). A file libass.sym which contains a list of symbols
was added and libtool configured to use it.
|
|
|
|
|
|
|
|
| |
The two-pass stroker blindly assumed that the number of points of
the stroked glyph is the same, no matter the size of the stroker.
Unfortunately, this is not the case every time. In such cases, the
coordinates will only be replaced up to mininum of points of both
glyphs. It's incredibly hacky, but seems to work well (and look good).
|
|
|
|
|
| |
If end <= start for a time interval specification, set end to the end of
the event. VSFilter handles it like that, too.
|
|
|
|
| |
Do not rely on the compiler for optimizing a division into a shift.
|
|
|
|
|
|
|
|
|
| |
Shadows are handled different from glyph and outline. A shadow
is the sum of glyph and outline bitmap; therefore shifting to the
correct subpixel amount before rasterization is out of the question.
Instead, the bitmap is shifted by its subpixel amount after being
built from shadow and glyph.
The bitmap cache was extended for this.
|
|
|
|
|
|
| |
The subpixel shift calculation was off in case the device coordinates
were negative. This has been corrected and the calculation been
simplified.
|
| |
|
|
|
|
|
|
| |
Split up shadow displacement into x and y and allow parsing of the tags
\xshad and \yshad to set it. This makes it possible to displace a
shadow differently in x and y direction.
|
|
|
|
|
|
|
|
|
|
|
| |
Improve get_outline_glyph with a second pass which can be used for
stroking with different width in x and y direction. This is done
by first stroking in y direction, and if the stroke size for the x
direction differs, stroking a copy of the glyph in x direction again.
The x coordinates of the first stroker result are afterwards replaced
by the coordinates of the second stroking.
The cache hash keys for bitmaps and glyphs have been extended to carry
the new properties.
|
|
|
|
|
|
|
|
| |
render_overlap allocated memory for its hashmap key and values on the
heap, relying on the cache cleanup to free them. However, these
pointers are not directly inserted into the cache, but memcpy()'ed in
hashmap_insert, leading to a pretty bad memory leak.
Allocate the key and value on the stack instead to fix this problem.
|
|
|
|
|
| |
On two occassions strings where strdup()'ed but never freed. Fix these
two small memory leaks.
|
| |
|
|
|
|
|
| |
Add subpixel shift to the points after rotation transformations to fix
rotations and subpixel accuracy.
|
| |
|
|
|
|
|
|
| |
Move helper functions originating from MPlayer into ass_utils.c.
Remove some debugging code that is #if 0'ed for ages now. Delete
mputils.c and mputils.h and remove them from the build system.
|
| |
|
|
|
|
|
| |
Fix formatting of a few remaining declarations missed in the first
cleanup.
|
|
|
|
|
| |
Rename a few functions to avoid symbol clashes.
Clean up mputils.h.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Completely overhaul positioning for full subpixel accuracy (as much as
FreeType offers, 1/64 pixel) for all positioning/typesetting related
calculations and the final rendering.
Positions are now calculated with doubles. FreeType uses a fixed-point
26.6 representation internally. Where needed, these are converted into
double values as well.
Finally, for the on-screen rendering, a subpixel shift for the
rasterization is calculated (bitmaps cannot be rendered onto the video
with subpixel accuracy).
|
|
|
|
|
|
|
| |
Offset the next glyph by the total shear of the glyph before.
This is done before line-wrapping, so that a line that is vertically
sheared will get as much higher, as it is sheared. Fine by me, but
vsfilter probably does it in a different way.
|
|
|
|
|
|
|
| |
This adds support for the \fax and \fay override tags which can be used
for shearing the text horizontally and vertically. At the moment, this
works correctly on a per-glyph basis, however, the glyph positioning is
wrong, which is especially evident with \fay.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously the composite bitmap hash keys were compared and hashed
based on all the bytes in the struct, which could cause problems
because of padding bytes. Change the code to use field-by-field
operations as already done for other hash key types.
The composite hash key contains two bitmap hash keys. The hashing
function currently handles those by calling the function to calculate
the corresponding bitmap hash, and then updating the composite hash by
treating the result of the function call as a byte buffer. An
alternative would be to change the hash functions so that the initial
hash value could be passed as a parameter to the recursively called
function.
|
|
|
|
|
| |
The 'indent' program does not understand the macro trickery in this
file and the result was clearly worse than the original.
|
|
|
|
|
|
|
| |
Consecutive forced breaks (\N\N) can be used to create empty lines of
text in other renderers. This doesn't work with the current text
layouter (wrap_lines_smart). This hack inserts a space glyph between two
consecutive forced breaks to get around this limitation.
|
|
|
|
| |
A variable was needlessly static, this has been corrected.
|
|
|
|
|
|
|
| |
Optionally pass a fontconfig config file to the fontconfig
initialisation.
This changes the public API.
|
|
|
|
|
|
|
|
|
| |
ass_set_fonts_ was wrapped through ass_set_fonts and ass_set_fonts_nofc
to either use fontconfig or not. This is not very useful, since a simple
parameter to ass_set_fonts_ can be used instead. Remove the wrapper
functions and rename the real function to ass_set_fonts.
This changes the public API.
|
|
|
|
|
| |
Silence a few warnings that should be harmless and were introduced by
the -Wall option.
|
|
|
|
| |
Replace a manual fixed-point conversion to d16 by conversion function.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Reindent complete source code (*.c, *.h) with indent, the exact command
line being:
indent -kr -i4 -bap -nut -l76 *.c *.h
From now on, new code should use (more or less) K&R style,
only spaces and no tabs, 4 spaces indent width. Avoid long lines.
Fix function declaration pointer spacing.
Remove spaces that were added to many function declarations by indent,
like some_func(foo_t * bar).
Fix indenting of macros in ass.c
|
|
|
|
| |
message level to MSGL_INFO.
|
|
|
|
|
|
| |
This adds pre-processing to the stroker which removes certain contours
that'd lead to areas wrongly getting not filled. The approach is very
simple, but works well enough for most cases.
|
| |
|
| |
|
|
|
|
| |
memory and use reasonable initial sizes.
|
|
|
|
| |
that is part of ass_renderer.
|
| |
|
| |
|
|
|
|
| |
ass_settings, where appropriate.
|
|
|
|
| |
elimination.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Optionally output a warning when a \pos or \move is redefined in a
single subtitle line.
|
|
|
|
| |
Declare some functions only used in this file static.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The cache code did hash lookups by storing key values in struct fields
and then hashing and comparing the struct as a single memory block. In
at least one case such a struct contained uninitialized padding bytes
which prevented the complete memory area of the struct from matching
even though the fields did. As a result the code failed to find
existing objects in the cache and stored new versions of them, causing
gigabytes of memory use in some circumstances. Initializing the struct
memory to zero before writing the fields avoided such memory use in
tests but is not guaranteed to work if I interpret the C standard
correctly (the compiler is allowed to write garbage over padding bytes
when changing struct member values).
Change the code to use struct-specific hashing and comparison
functions that work field by field to guarantee correct behavior.
Create these by replacing the struct definition with a template that
lists the fields and can be used the generate each of struct
definition, hash function and compare function with some preprocessor
magic (otherwise every field would need to be listed separately in all
three).
|
| |
|
| |
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29367 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29305 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
|
|
| |
\n and \N still work.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29219 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29087 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
|
|
|
|
|
|
| |
This is consistent with the remaining code (which uses e.g. calloc) and makes
it easier to extend the structs in the future.
As a side effect it fixes several valgrind errors in hashmap_hash/hashmap_key_compare
caused by padding in the structures, but it is not a correct fix for that issue.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29086 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28977 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
|
|
|
| |
This fixes hangups with plaintext subtitles happening when
the first subtitle is about to be displayed.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28976 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28935 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28896 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
|
|
| |
Patch by Adrian Stutz (adrian sttz ch).
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28895 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28892 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
|
|
| |
Fixes http://bugzilla.mplayerhq.hu/show_bug.cgi?id=1421
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28891 b3059339-0415-0410-9bf9-f77b7e298cf2
|
|
|
|
| |
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28876 b3059339-0415-0410-9bf9-f77b7e298cf2
|