| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Before, the initial layout of a flex item would have inherited the
parent's sizing constraint. This almost worked, except when a descendant
of a flex item with an unspecified width would resolve its percentage
against this incorrectly inherited width - per standard, this must
resolve to auto.
Also, the shrink case was wrong, because it did not scale the unit to
the respective widths; the standard mandates this as well. Hopefully I
got it right this time.
Finally, this fixes positioned inline container blocks not being set
as the absolute container.
|
|
|
|
|
| |
* line, vector, matrix -> path
* twtuni, charcategory -> twtstr
|
|
|
|
| |
Looks like this no longer overflows the stack.
|
| |
|
|
|
|
|
|
|
|
|
| |
It broke styles like "margin-top: -5px; padding-top: 5px", because the
margin would be taken as-is, and the padding rounded to 0. Now they
cancel each other out again.
(I think I had added this to reduce error caused by line-height, but we
don't have line-height anymore.)
|
|
|
|
|
|
|
|
|
| |
you can't just set the BFC offset to your own offset when the BFC's
origin is your inner offset.
(in block layout, this is addressed by initBlockPositionStates & co,
but we don't call that for inline because the offset is already resolved
there anyway. so this is a special case)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* simplify "positioned" value calculation:
- don't include it in ResolvedSizes, since it's unused in most
layouts
- resolvePositioned for both absolute and relative positioning
- use "size" instead of "space" for absolute positioning
- include parent width in layout so that renderdocument does not
have to account for it
* return bottom margins as regular return values instead of var
* fix child bottom margins being discarded in inline floats
* fix inline float not including the parent block position in its BFC
position
|
|
|
|
|
|
|
|
|
|
|
|
| |
* factor out `margin' field from box state
* get rid of RootInlineFragment
* `nested' -> `children'
* get rid of repositionChildren pass; now we handle relative positioning
and -cha-center/-cha-right separately
* cha-center, cha-right no longer applies to floats
* use consistent naming scheme for tests
* fix float bottom margin strut not being flushed
* fix inline floats changing non-fit-content width
|
| |
|
|
|
|
| |
just a special case of position: absolute
|
|
|
|
|
|
|
|
|
|
| |
Nested position: absolute was broken, so fix it.
Also, it makes no sense to dispatch inside layoutBlockChild when we
know the expected resolution algorithm upon calling it anyway, so now we
do that statically.
Finally, fix some bugs in position: absolute size resolution.
|
| |
|
|
|
|
|
| |
As per standard, float "only applies to elements that [...] are not
absolutely positioned."
|
|
|
|
|
|
|
|
|
|
|
|
| |
Called -cha-reverse.
Mostly to solve the problem that code tags are indistinguishable from
regular text - on a graphical browser this is normally served by
monospace font, but we always use monospace...
So now the default ua.css adds reverse video to code and xmp. pre
remains as it was, because it means "preformatted", not "monospaced".
Also, it would mess with our whatever-to-HTML converter output.
|
|
|
|
|
|
| |
also fixes a bug in the previous commit where whitespacenum would be
reset on absolute positioning + missing absolute margin handling without
top/left/etc.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This fixes a) resolution of `position: absolute' percentage sizes with
an indefinite containing block size (wait what?), and b) positioning of
`position: absolute' inner block boxes inside inline boxes.
a) is possible because `position: absolute' does not affect its
parent's layout. I would love to have a long talk with whoever
thought that specifying it like this is a good idea. You know, just
because you can... anyways, shockingly enough, this was still the more
straightforward part.
b) forced me to change the box tree to allow blocks inside inlines,
which is ugly, but no big deal. Two questions then remained:
1. *where* to put such boxes, and
2. *how large* these boxes should be; this is hardly obvious since
an inline box does not have an unambiguous width or height.
Of course the CSS standard, never too eager to fulfill my basic
expectations, says nothing about this (other than "it's not defined").
So I first tried to reverse engineer what Gecko does, and after hours of
pain and suffering I realized... that it's broken LOL
https://bugzilla.mozilla.org/show_bug.cgi?id=489100
Therefore I ended up (partially) copying Blink behavior, which, while
equally nonsensical as Gecko (and of course divergent), at least does
not change after a partial layout. Thank you LayoutNG for saving my
sanity.
As for the practical benefits: this fixes the bug where Invidious
[video] tags wouldn't show up. Hey, it's something!
Still left to-do: `position: absolute' for `display: inline' boxes.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Substitute tabs with one of eight PUA characters based on their width,
and convert them back in the pager:
* TUI mode always prints spaces, but now handles tabs appropriately on
cursor movement
* dump mode tries to preserve hard tabs, but uses soft tabs when that is
not possible (e.g. tabs after a margin, tab with background color,
etc)
* selection mode always outputs hard tabs.
|
|
|
|
| |
the length check is not needed, we do that outside the loop already
|
|
|
|
|
|
| |
* split out CSSColor from CellColor; now CellColor is just 4 bytes
(which helps reduce FormatCell size)
* unify color function naming (still not perfect)
|
| |
|
|
|
|
|
|
| |
Also, kill twidth and its friends; we haven't been using it for a
while now. (In the future, a solution with PUA chars might be worth
exploring.)
|
|
|
|
| |
+ some misc refactorings
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Sixel can only represent transparency for fully transparent (alpha
= 0) and fully opaque (alpha = 255) pixels, i.e. we would have to
do blending ourselves to do this "properly". But what do you even
blend? Background color? Images? Clearly you can't do text...
So instead of going down the blending route, we now just approximate
the 8-bit channel with Sixel's 1-bit channel and then patch it up with
dither. It does look a bit weird, but it's not *that* bad, especially
compared to the previous strategy of "blend with some color which
hopefully happens to be the background color" (it rarely was).
Note that this requires us to handle transparent images specially
in term. That is, for opaque ones, we can leave out the "clear cells
affected by image" part, but for transparent ones, we must clear the
entire image every time.
|
|
|
|
| |
still not really great, because inline background is a mess too
|
|
|
|
|
| |
This was a bad idea that, despite my best efforts, never worked
properly.
|
|
|
|
|
| |
I've moved most image logic to adapter, so it doesn't really make
sense to have this subdir anymore.
|
|
|
|
| |
special case it in paintBackground so that it doesn't look so ugly
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
std/unicode has the following issues:
* Rune is an int32, which implies overflow checking. Also, it is
distinct, so you have to convert it manually to do arithmetic.
* QJS libunicode and Chagashi work with uint32, interfacing with these
required pointless type conversions.
* fastRuneAt is a template, meaning it's pasted into every call
site. Also, it decodes to UCS-4, so it generates two branches that
aren't even used. Overall this lead to quite some code bloat.
* fastRuneAt and lastRune have frustratingly different
interfaces. Writing code to handle both cases is error prone.
* On older Nim versions which we still support, std/unicode takes
strings, not openArray[char]'s.
Replace it with "twtuni", which includes some improved versions of
the few procedures from std/unicode that we actually use.
|
|
|
|
|
|
|
|
|
|
| |
* stream: and passFd is now client-based, and accessible for buffers
* Bitmap's width & height is now int, not uint64
* no more non-network Bitmap special case in the pager for canvas
I just shoehorned it into the static image model, so it still doesn't
render changes after page load. But at least now it doesn't crash the
browser.
|
|
|
|
|
| |
it's really min-height, not height; consistency is not CSS's strong
suit...
|
|
|
|
|
| |
avoid adding whitespace to the previous atom if it's not on the current
line
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
* buffer, pager, config: add meta-refresh value, which makes it possible
to follow http-equiv=refresh META tags.
* config: clean up redundant format mode parser
* timeout: accept varargs for params to pass on to functions
* pager: add "options" dict to JS gotoURL
* twtstr: remove redundant startsWithNoCase
|
|
|
|
| |
Great performance win on large documents.
|
|
|
|
|
|
|
| |
* properly wrap inline internal table boxes in inline-table (instead
of block-level table)
* fix missing baseline in table wrapper boxes
* fix wrong wrapping of misparented table/row/row group children
|
|
|
|
|
|
|
|
|
|
| |
* support position: absolute on flex items
* proper top/bottom/left/right calculation for position: relative
* push positioned flex box sizes to positioned stack
Still not perfect: position: absolute should always resolve percentage
sizes and top/bottom/left/right, meaning absolute layout needs to be
delayed until its containing box is fully layouted.
|
|
|
|
| |
It was broken for parent boxes with indefinite sizes.
|
|
|
|
|
|
|
| |
* fix max size trumping min size
* respect min-width/max-width/min-height/max-height for images
* fix xminwidth calculation for percentage-sized images with an
indefinite containing size
|
|
|
|
|
|
| |
* fix flex column item width not being stretched
* set minimum flex column height to the layouted item's height (to avoid
overlap)
|
|
|
|
|
|
|
|
| |
Paint the background with the current color, so that it gets associated
with the owner styled node.
(I didn't want to do this because it's slow, but otherwise image-mode
gets very annoying to use.)
|
| |
|
|
|
|
|
| |
Text data is no longer stored separately in InlineFragments; instead,
we now include refs to StyledNodes.
|
|
|
|
|
| |
top/left/right/bottom should only be used in renderdocument with
position: absolute.
|
| |
|
| |
|
|
|
|
| |
reduces images spilling out of their containers
|
|
|
|
| |
I doubt this is correct, but at least it's less broken than previously
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* resize images with stb_image_resize
* use tee for output handle redirection (redirectToFile blocks)
* cache original image files
* accept lseek in sandbox
* misc stbi fixes
For now, I just pulled in stb_image_resize v1. v2 is an extra 150K in
size, not sure if it's worth the cost. (Either way, we can always switch
later if needed, since the API is almost the same.)
Next step: move sixel/kitty encoders to CGI, and cache their output in
memory instead of the intermediate RGBA representation.
|