Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

determine whether a font has bitmaps only when fetching glyphs #2198

Merged
merged 1 commit into from Dec 8, 2017

Conversation

@lsalzman
Copy link
Contributor

lsalzman commented Dec 8, 2017

This fixes downstream Gecko bug https://bugzilla.mozilla.org/show_bug.cgi?id=1422408

Some TTFs can contain both fixed size bitmap strikes and scalable outlines. The proper selection procedure is to check if there are strikes exactly matching the desired size, otherwise use the scalable outlines.

But we violate this currently by always trying to use the bitmap strikes if they are available even when scalable outlines are present. The problem is that we don't know the actual resolved size at the time we decide to mark a FontInstance with FontRenderMode::Bitmap when a FontInstance is newly created, so we never used that to make the decision.

To fix this, we need to delay deciding whether something is a bitmap until we actually go to fetch the glyph from the cache and essentially when we go to rasterize it. We let the font backend communicate that it is actually a bitmap via the new GlyphFormat::Bitmap (and the existing GlyphFormat::ColorBitmap for emoji).

We then need to make sure this gets down to the ps_text_run shader via TextShaderMode, so we can selectively disable subpixel offsets based on whether something is a bitmap. We can't disable subpixel offsetting earlier since we don't know if the font is a bitmap yet when gpu data is written out, and even then, this will depend on size, so a global decision can't be made for all sizes instances of a given TextRunPrimitiveCpu.


This change is Reviewable

@lsalzman lsalzman force-pushed the lsalzman:delayed-bitmaps branch 4 times, most recently from cc3903d to c3f68d1 Dec 8, 2017
@bors-servo
Copy link
Contributor

bors-servo commented Dec 8, 2017

The latest upstream changes (presumably #2192) made this pull request unmergeable. Please resolve the merge conflicts.

@lsalzman lsalzman force-pushed the lsalzman:delayed-bitmaps branch from c3f68d1 to e993346 Dec 8, 2017
@glennw
Copy link
Member

glennw commented Dec 8, 2017

Reviewed 13 of 13 files at r1.
Review status: all files reviewed at latest revision, all discussions resolved.


Comments from Reviewable

@glennw
Copy link
Member

glennw commented Dec 8, 2017

@bors-servo
Copy link
Contributor

bors-servo commented Dec 8, 2017

📌 Commit e993346 has been approved by glennw

@bors-servo
Copy link
Contributor

bors-servo commented Dec 8, 2017

Testing commit e993346 with merge 46f9d99...

bors-servo added a commit that referenced this pull request Dec 8, 2017
determine whether a font has bitmaps only when fetching glyphs

This fixes downstream Gecko bug https://bugzilla.mozilla.org/show_bug.cgi?id=1422408

Some TTFs can contain both fixed size bitmap strikes and scalable outlines. The proper selection procedure is to check if there are strikes *exactly* matching the desired size, otherwise use the scalable outlines.

But we violate this currently by always trying to use the bitmap strikes if they are available even when scalable outlines are present. The problem is that we don't know the actual resolved size at the time we decide to mark a FontInstance with FontRenderMode::Bitmap when a FontInstance is newly created, so we never used that to make the decision.

To fix this, we need to delay deciding whether something is a bitmap until we actually go to fetch the glyph from the cache and essentially when we go to rasterize it. We let the font backend communicate that it is actually a bitmap via the new GlyphFormat::Bitmap (and the existing GlyphFormat::ColorBitmap for emoji).

We then need to make sure this gets down to the ps_text_run shader via TextShaderMode, so we can selectively disable subpixel offsets based on whether something is a bitmap. We can't disable subpixel offsetting earlier since we don't know if the font is a bitmap yet when gpu data is written out, and even then, this will depend on size, so a global decision can't be made for all sizes instances of a given TextRunPrimitiveCpu.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/2198)
<!-- Reviewable:end -->
@bors-servo
Copy link
Contributor

bors-servo commented Dec 8, 2017

☀️ Test successful - status-appveyor, status-travis
Approved by: glennw
Pushing 46f9d99 to master...

@bors-servo bors-servo merged commit e993346 into servo:master Dec 8, 2017
4 checks passed
4 checks passed
Taskcluster (pull_request) TaskGroup: success
Details
code-review/reviewable 13 files reviewed
Details
continuous-integration/appveyor/pr AppVeyor build succeeded
Details
homu Test successful
Details
bors-servo added a commit that referenced this pull request Dec 9, 2017
pass subpixel dir to shader via glyph instances instead of text run

This is a follow-up to #2198. I overlooked cs_text_run, which will also need to know about subpx_dir. Since we don't break up batches for these text shadow glyphs, and since subpixel direction now depends on the glyph format which is size/transform dependent, it just made a lot more sense to pass it in via the (now) unused user_data2 in the glyph instance. This also moves some decision logic out of the shader. Since all these parameters get routed out of prim.user_dataN almost straight to fetch_glyph, it makes some sense to put subpx_dir there anyway.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/2207)
<!-- Reviewable:end -->
bors-servo added a commit that referenced this pull request Dec 9, 2017
pass subpixel dir to shader via glyph instances instead of text run

This is a follow-up to #2198. I overlooked cs_text_run, which will also need to know about subpx_dir. Since we don't break up batches for these text shadow glyphs, and since subpixel direction now depends on the glyph format which is size/transform dependent, it just made a lot more sense to pass it in via the (now) unused user_data2 in the glyph instance. This also moves some decision logic out of the shader. Since all these parameters get routed out of prim.user_dataN almost straight to fetch_glyph, it makes some sense to put subpx_dir there anyway.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/2207)
<!-- Reviewable:end -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked issues

Successfully merging this pull request may close these issues.

None yet

3 participants
You can’t perform that action at this time.