Behdad,

Thanks for the pointer to cu2qu, I'll take a look at it. I assume you're
suggesting we use that in place of GrPathUtils::convertCubicToQuads. I
believe in our case we chop at inflections to avoid artifacts from our
resolution independent curve rendering.

As far as scale for our SDFs, 1 unit in distance is one pixel. And Anuj,
I'm not sure 2.14 is enough precision in the integer part. It's been a
while, but I believe I got better results with at least 3 bits of integer.

On Wed, Jun 3, 2020 at 6:33 PM Behdad Esfahbod <beh...@behdad.org> wrote:

> Jim,
>
> I see that in your implementation you are converting cubics to quadratic
> spline.  That makes a lot of sense and I support that.  For the conversion
> though, I see a messy piece of code, which is typical of that kind
> of thing.  I like to introduce you to cu2qu algorithm which we designed and
> implemented back when I was at Google.  It has a much simpler algorithm,
> which is very robust by design and has been used in production of thousands
> of fonts in recent years with no bug report whatsoever.  The core algorithm
> is very simple:
>
>   https://github.com/googlefonts/cu2qu/blob/master/Lib/cu2qu/cu2qu.py#L218
>
> Here's a highlevel description of the algorithm:
>
>   https://github.com/googlefonts/cu2qu/issues/10
>
> This was specifically designed to have very good behavior for encoding the
> results in a 'glyf' table.  But is useful for more general uses as well.
>
> It would work much better if we break the input curve on cusps if any.
> But even that has not been an issue:
>
>   https://github.com/googlefonts/cu2qu/issues/6
>
> Cheers,
> behdad
>
>
> On Wed, Jun 3, 2020 at 3:16 PM Behdad Esfahbod <beh...@behdad.org> wrote:
>
>> Hi Jim, others,
>>
>> Thanks for your input.  I've been meaning to get into the discussion as
>> well but didn't get to.
>>
>> I support your suggestions: generate from vector instead of bitmap, as
>> well as 8-bit 3.5 fixed point or similar at least as an option.  In your
>> 3.5 fixed-point, does one unit reflect 1em, or 1 pixel at the SDF size?
>>
>> I think we do want a 8bit representation at least, and possible a higher
>> one.
>>
>> On Wed, Jun 3, 2020 at 10:26 AM Jim Van Verth <jvanve...@google.com>
>> wrote:
>>
>>> Forgive me for coming into this late -- a colleague pointed me to this
>>> thread a couple of days ago and I'm just catching up. I work on Skia, and
>>> we've been generating SDFs from glyphs for quite some time now, so the
>>> possibility of just getting them from Freetype is pretty exciting.
>>>
>>> I hope you don't mind some comments on what we have now. We currently
>>> use the Gustavson algorithm to generate them from bitmaps but it produces
>>> slightly fuzzy results. I have wanted to move to use this algorithm to
>>> generate them directly from the outline which might be useful to you:
>>>
>>> https://skia.googlesource.com/skia/+/refs/heads/master/src/gpu/GrDistanceFieldGenFromVector.cpp
>>> We use it to store atlased paths at the moment and it produces much
>>> better results.
>>>
>>> As far as format, we use an 8-bit 3.5 fixed point format, because it
>>> allows us to combine the SDF and bitmap glyphs into the same atlas to
>>> conserve space. There is a sacrifice in quality, but we only use the SDFs
>>> for larger glyphs so it's acceptable.
>>>
>>> If you would like more details on our implementation please let me know.
>>> I'm looking forward to seeing how this turns out.
>>>
>>>
>>
>> --
>> behdad
>> http://behdad.org/
>>
>
>
> --
> behdad
> http://behdad.org/
>


-- 

Jim Van Verth | Software Engineer | jvanve...@google.com | 919-210-7664

Reply via email to