| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
| |
Prefer DirectWrite before the cross-platform fontconfig, so that
DirectWrite is used by default if both are compiled into libass.
|
|
|
|
|
|
| |
This uses a faux rendering with a high-level interface of DirectWrite
to determine a suitable fallback. Choices are different from GDI,
but reasonable.
|
|
|
|
|
| |
This creates a sorted list of fallback fonts and reuses it, for speed.
Font sorting is very slow.
|
|
|
|
|
| |
If we can't find a matching font face (with glyph coverage), ask the
default font provider for a fallback family. The callback is optional.
|
|
|
|
|
| |
We want the best variant, but if it doesn't have the glyph coverage,
we may also use another variant from the same family.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
There were various issues with font scanning. This addresses the following:
- Synthesized font faces (bold/oblique) were added to the list. Just skip
those, this is handled internally by libass.
- Use the win32 font family names, if available. Traditionally, Windows
groups font families in a different way, so that the number of
variants is small (<= 4). With this, Arial Narrow and Arial Black
appear as a separate family, which is what we want.
- Full names are not mandatory. Correctly handle the case that there
are no full names.
- Don't use the bogus LOCALE_NAME_MAX_LENGTH constant to determine the
size of the name buffer. Names can be almost arbitrarily long.
Handle names up to 256 characters correctly and truncate longer names.
|
|
|
|
| |
The constants were swapped. In some cases this lead to incorrect matching.
|
|
|
|
|
|
|
|
|
| |
If allocations have the size zero, malloc/calloc implementations
can return a zero-size buffer or NULL. The earlier introduced malloc
checking blows up if an implementation returns NULL. Fix that by only
allocating and checking when it's actually needed.
Also fix a minor problem with iconv deinitialization in an error path.
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
Embedded fonts tend to be extra bad, so trim the names. I have
encountered fonts faces with untrimmed names.
Leave this at the discretion of the font provider for platform-specific
font providers.
|
|
|
|
| |
This is just a cleaner and safer interface for string trimming.
|
|
|
|
|
|
|
|
|
| |
Currently, it is not safe to change the embedded fonts
(ass_add_font/ass_clear_fonts) while an ASS_Renderer exists. We can
simplify how embedded fonts are looked up because of that.
At some point, ASS_Library and ASS_Renderer should be merged and we
can then implement a more flexible approach.
|
|
|
|
|
|
|
|
| |
Add malloc checks with useful semantics and error checks in some
specific cases. This should hopefully make fontselect more robust.
The platform-specific font providers (DirectWrite/CoreText/FontConfig)
still need to be checked for proper memory management.
|
|
|
|
|
| |
FreeType can do it for us and is probably more efficient. Also fixes
deinitialization order of ASS_Renderer to make this work.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Sorting the font list is overkill and not very useful. We are
interested in *exact* name matches only; all other font families don't
matter and we'll use another fallback mechanism for glyph fallbacks
(TBD).
Replace the sorting and glyph fallback search with a simple linear
scan. Fonts are first matched against family name first (to allow
further comparison against style attributes) and if that fails,
the fullname is considered.
|
|
|
|
|
| |
Add callbacks to introduce more sane fallback handling and font
alias substitutions.
|
|
|
|
|
| |
Add some documentation to the font provider callbacks and metadata
struct.
|
| |
|
| |
|
| |
|
|
|
|
| |
Fix that a single broken font could mess up the entire font scanning.
|
| |
|
|
|
|
| |
This is required for proper font matching.
|
| |
|
|
|
|
|
| |
Extract a function to set up FontFileStream and store it in a newly
introduced private struct. Fix memory management as well.
|
|
|
|
| |
Incomplete, leaks memory, but capable of rendering something.
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Apparently on some broken fonts, FreeType can return a NULL family name. Avoid
to crash in these cases.
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
This allows client code to query libass for the font providers it was compiled
with. It can be useful for clients so that they can show selection interfaces
to their users.
|
|
|
|
|
|
|
|
|
| |
Allow the user of libass to select the font provider from ass_set_fonts. This
API change actually doesn't break client code which was passing `fc=1`; now
the same value will autodetect a usable font provider.
Also add an api to list available font providers as that is useful for client
code to show drop down menus with a font provider to choose from.
|
|
|
|
|
|
|
|
|
| |
51f9e80b added a MatchFontsFunc callback which allows to lookup font names
directly on the font provider. This approach broke support for font fallback
which worked only with lookups from libass in-memory font database.
This commit moves the font fallback code in the font lookup function, so that
it is available for all font providers.
|
|
|
|
|
|
| |
The code incorrectly assumed that the utf8 characters could always be
represented with only one byte. This commit queries CFStringRef instances for
the actual amount of bytes needed.
|
|
|
|
|
| |
Previously, the lazy load of fonts was only using display name. Also use the
other names available through the CoreText API (FamilyName and PostScriptName).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Not all APIs cache everything the same way that fontconfig does. This allows
to first perform a match based on the font name and then score the matched
fonts using the common code using and in memory database approach.
The benefit is the application doesn't have to load all of the fonts and
query for weight, slant, width, path and fullnames.
I left both code paths inside ass_coretext.c. This allows to test matching
problems and have a term of comparison with the slower implementation.
To activate it one just has to flip the CT_FONTS_EAGER_LOAD define to 1.
Here are some benchmarks with a pretty typical OS X font library of ~600 fonts
and using Libass's test program to load a script with 'Helvetica Neue':
CT_FONTS_EAGER_LOAD=0
0.04s user 0.02s system 79% cpu 0.081 total
CT_FONTS_EAGER_LOAD=1
0.12s user 0.06s system 44% cpu 0.420 total
|
|
|
|
|
|
|
|
|
|
|
| |
Up until now fontselect used the face index to identify which font to load
from a font collection. While this pretty convenient when using something
freetype based like fontconfig, it seems to be somewhat freetype specific.
CoreText uses the PostScript name as the unique identifier of a font. This
commit allows to use that instead of the index to decide which face to open
with FT_New_Face. To use the PostScript name the provider must return a -1
index and the PostScript name.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fontconfig is known to be very slow on OS X and Windows, this has to do with
the extremely prohibitive cache times (which are getting even longer with
latest versions of Fontconfig).
This commits starts to address the problem by using CoreText on OS X to load
the font data. The commit uses the simplest possible approach to load all of
the data in memory and then use it to match. This causes a somewhat slow
startup time (around ~400ms on my i7) but it is already better than waiting
*minutes* for Fontconfig to cache the fonts data.
A later commit will improve the speed of the match by using a hybrid approach
that lazy loads in the libass database only the necessary fonts.
|
| |
|
|
|
|
|
|
| |
Some fonts use localized family names, especially CJK fonts, which
often have English and Japanese or Chinese names. Handle these cases
just like full names.
|
| |
|
|
|
|
|
|
| |
Add a width field to metadata. This is used for sorting fonts as
well. Fixes wrong matches with different width variants in the same
font family.
|
|
|
|
|
| |
This is faster in many cases, and more suitable for Windows' GetFontData
function.
|
|
|
|
|
| |
This is a bit nicer because we can actually see which physical font
has been selected for a certain logical font.
|
|
|
|
|
|
|
| |
Add wrapper to the ASS_Renderer to create a font provider from
its internal font selector and shuffle some code around to export
everything that's needed for font providers to the public. Document
font provider functions.
|
|
|
|
|
| |
Allow memory fonts with the get_face_data callback. This feature is
used for embedded fonts, but can be used by any font provider.
|
|
|
|
| |
We do not support memory-based fonts yet, so a path is mandatory.
|
| |
|
|
|
|
|
| |
When a provider is freed, iterate the font database, free all fonts
that belong to that provider and compact the database afterwards.
|
|
|
|
|
|
|
|
| |
There is no standard scale for slant. This is almost a boolean
attribute. However, a font can have a real italic variant, and/or a
simple oblique variant. fontconfig's notation supports both of these,
so it makes sense to reuse that notation for the sake of flexibility;
we might need to differentiate between them.
|
| |
|
|
|
|
|
| |
When adding a new font, check that weight and slant are valid. If
they're not, use reasonable defaults.
|
|
|
|
|
|
|
|
|
|
| |
fontconfig uses an unusual scale from 0-215 for the font weight. It
looks like it is somewhat derived from the typographic scale some font
families use, but is still rather nonstandard. Nowadays the TrueType
scale from 100-900 seems to be standard. CSS uses it, for example.
However, most importantly, VSFilter also uses the TrueType scale. So
let's use it in libass, too.
|
| |
|
|
|
|
|
| |
Add a small set of fixed fallback fonts, some of them with very wide
glyph coverage.
|
|
|
|
|
| |
Do not return a font face at all instead of using the last one. Fixes
fallback to the default font path.
|
|
|
|
|
|
|
|
|
|
|
| |
Pass the fontconfig configuration file option and enable switch
through into the font selector. This restores some of the old
functionality related to fontconfig.
However, the functionality to delay the fontconfig database update will
not come back. This is not a big problem. Later it will be possible to
manually add the fontconfig provider, which will delay the update in a
comparable way.
|
|
|
|
|
|
| |
Conditionally add the fontconfig provider. We can actually run
without fontconfig now! That is, if embedded fonts or fallbacks are
good enough.
|
| |
|
|
|
|
|
|
| |
This provides more flexibility than just referencing the callbacks:
we can identify the font provider (useful for removing fonts when a
provider is freed) and possibly access the font provider private data.
|
| |
|
| |
|
|
|
|
|
|
| |
Introduce a simple glyph coverage map (created when the font is added)
and use it for checking glyph coverage in font selection. This uses a
simple linear search at the moment.
|
|
|
|
|
|
| |
Introduce a unique ID per font face and check it in add_face to make
sure we never add a font face twice. This is useful in case the glyph
coverage report is unreliable.
|
|
|
|
| |
Did not correctly handle empty strings (only whitespace). Whoops.
|
|
|
|
|
| |
This adds a trimming utility function that is used for trimming strings
of font requests in the font sorter.
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|\
|