1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 03:58:12 +00:00
Commit graph

991 commits

Author SHA1 Message Date
Nico Weber
ec7a2058a2 LibGfx: Add ICCProfile support for multiLocalizedUnicodeType
This is used in v4 profiles for the required 'cprt' and 'desc' tags.
2023-01-22 15:25:58 +00:00
Nico Weber
3dfb012a1a LibGfx: Add ICCProfile support for textType
This is used in v2 profiles for the required 'cprt' tag.
2023-01-22 15:25:58 +00:00
Nico Weber
d33eef14a0 LibGfx: Minorly simplify a line of code in ICCProfile with OptionalNone
No behavior change.
2023-01-21 22:16:38 -05:00
Nico Weber
b56a145a67 LibGfx+icc: Make device manufacturer and device model clickable 2023-01-21 22:16:38 -05:00
Nico Weber
f28b052590 LibGfx: Add scaffolding for reading ICC tag table
The idea is that we'll have one type for each tag type.
For now, this treats all tag types as unknown, but it puts most
of the infrastructure for reading tags in place.
2023-01-20 21:44:36 +00:00
Nico Weber
5017d8fdcb LibGfx: Extract Profile::read_header() function 2023-01-20 21:44:36 +00:00
Nico Weber
e5234f582d LibGfx: Make ICCHeader use FourCC types for fourcc fields
No behavior change. Arguably more expressive.
2023-01-20 21:44:36 +00:00
Nico Weber
046c79b468 LibGfx: Make DistinctFourCC compatible with BigEndian 2023-01-20 21:44:36 +00:00
Tim Schumacher
3a16168ace LibGfx: Use Core::Stream to write bitmap fonts 2023-01-20 20:50:42 +00:00
Liav A
5b273f3823 LibGfx: Fix TGA decoder being out of boundary after calling frame method
This happened because the reader was incrementing the byte index of it
after each read of a byte from the Span, so by the end of the frame
method, we could be at the end of the mapped file, so the next call
on the same decoder will just resume from that point and will be quickly
out of boundary.
To ensure this doesn't happen we only set the bitmap to m_context member
at the end of the method, and call to that method again will just give
the already-generated bitmap.
In case of setting the bitmap as volatile, we test for that case and
re-generate a reader to read the frame again correctly.
2023-01-20 17:05:09 +00:00
Liav A
57e19a7e56 LibGfx: Re-structure the whole initialization pattern for image decoders
When trying to figure out the correct implementation, we now have a very
strong distinction on plugins that are well suited for sniffing, and
plugins that need a MIME type to be chosen.

Instead of having multiple calls to non-static virtual sniff methods for
each Image decoding plugin, we have 2 static methods for each
implementation:
1. The sniff method, which in contrast to the old method, gets a
    ReadonlyBytes parameter and ensures we can figure out the result
    with zero heap allocations for most implementations.
2. The create method, which just creates a new instance so we don't
    expose the constructor to everyone anymore.

In addition to that, we have a new virtual method called initialize,
which has a per-implementation initialization pattern to actually ensure
each implementation can construct a decoder object, and then have a
correct context being applied to it for the actual decoding.
2023-01-20 15:13:31 +00:00
Liav A
6e6999ce57 LibGfx: Re-work the abstractions of sending image for decoding over IPC
Originally I simply thought that passing file paths is quite OK, but as
Linus pointed to, it turned out that passing file paths to ensure some
files are able to be decoded is awkward because it does not work with
images being served over HTTP.

Therefore, ideally we should just use the MIME type as an optional
argument  to ensure that we can always fallback to use that in case
sniffing for the correct image type has failed so we can still detect
files like with the TGA format, which has no magic bytes.
2023-01-20 15:13:31 +00:00
Timothy Flynn
027aee2c66 Userland: Add missing Math.h and IntegralMath.h header includes
These are currently being implicitly including by FixedPoint.h by way of
Format.h. The former will soon be removed from the latter, which would
otherwise cause a compile error in these files.
2023-01-19 11:29:48 +00:00
Liav A
649f78d0a4 LibGfx+Ladybird+Userland: Don't sniff for TGA images with only raw bytes
Because TGA images don't have magic bytes as a signature to be detected,
instead assume a sequence of ReadonlyBytes is a possible TGA image only
if we are given a path so we could check the extension of the file and
see if it's a TGA image.

When we know the path of the file being loaded, we will try to first
check its extension, and only if there's no match to a known decoder,
based on simple extension lookup, then we would probe for other formats
as usual with the normal sniffing method.
2023-01-18 21:48:35 +01:00
Jelle Raaijmakers
6d93947212 LibGfx: Use ALWAYS_INLINE for inline Bitmap methods
`Bitmap::scanline_u8` started popping up in profiles. We can't be having
that of course.
2023-01-17 19:34:54 -05:00
Arda Cinar
9418586990 LibGfx: Remove an unnecessary FIXME
Clipping in diagonal line drawing has already been implemented a long
time ago.
2023-01-17 22:54:18 +01:00
Arda Cinar
c8d7bf5449 LibGfx: Implement drawing dotted/dashed diagonal Lines
The implementation simply tracks the number of pixels we have drawn so
far and draws pixels in an on-and-off pattern
2023-01-17 22:54:18 +01:00
Jelle Raaijmakers
5ed53b3474 LibGfx: Prevent reading OOB in TGA header decode 2023-01-15 19:59:33 +01:00
Liav A
2f2d808869 LibGfx: Add support for RLE compressed TGA images
RLE is an old technique being used for decades, as is known as
Run-Length-Encoding, which means that for repeating sequence of bytes,
we keep an indicator for the length of the sequence and only one sample
of it, to save storage space.

GIMP can generate lossless-compressed TGA images, with RLE compression
being used. It means that for a compressed image, the data is no longer
arranged in sequence of pixels, but a sequence of pixel packets.
There are two possible pixel packets:
- RLE packets, which are encoded with one byte for indicating the
  run-length and another one pixel (3 bytes for TrueColor pixel), so
  essentially in runtime, the TGA decoder will use the length to plot
  the same pixel in multiple pixels of the output pixel bitmap.
- Raw packets, which are encoded with one byte as indicator for the
  length of the whole pixel sequence and N-length pixel sequence
  afterwards.
  This is not used for any sort of compression by the TGA format, but
  still needed to be supported for full compatibility with TGA images
  that uses the RLE compression.
2023-01-15 12:43:03 +01:00
Liav A
a46df41265 LibGfx: Handle tga images with top-left and bottom-left orientation
GIMP allows a user to export a TGA image with either of these possible
orientations, so we can easily support it by looking at the X origin and
Y origin values to determine where to put the pixels in the bitmap.
2023-01-15 12:43:03 +01:00
Tom Needham
591bebe662 LibGfx: Add the TGA format into the list of bitmap formats :^) 2023-01-15 12:43:03 +01:00
Tom Needham
5bce58cd3e LibGfx: Plumb the TGALoader into ImageDecoder :^)
This patch plumbs the TGALoader into ImageDecoder
so TGA images can be decoded by the system
2023-01-15 12:43:03 +01:00
Tom Needham
21db070887 LibGfx: Add TGA Loader :^)
This patch adds a basic TGA Loader. Currently it can only handle
uncompressed files with a bit depth of 24 or 32 bits per pixel.
2023-01-15 12:43:03 +01:00
MacDue
768dc4cda1 LibGfx: Provide accessors to instruction data to OpenType::Font
These probably won't need to stick around forever, but will be helpful
for creating some debug utilities.
2023-01-12 11:27:57 +01:00
MacDue
4e5dc169a6 LibGfx: Parse the TTF fpgm and prep tables
These contain the font and CVT programs respectively.
2023-01-12 11:27:57 +01:00
MacDue
3b282ba8bb LibGfx: Add OpenType opcodes and helpers to parse instruction streams
This defines all the OpenType opcodes/instructions from the
specification:
https://learn.microsoft.com/en-us/typography/opentype/spec/tt_instructions

Each instructions has mnemonic and a range of possible opcodes (as some
of the bits are pretty much immediate value flags).

There's a little helper Instruction struct for accessing the flags and
any associated data (in the case of PUSH instructions).

Then the InstructionStream provides a way of iterating over all the
instructions in some bytes.
2023-01-12 11:27:57 +01:00
MacDue
c8c065b6b0 LibWeb+LibGfx: Migrate (most of) the CSS gradient painting to LibGfx
This moves the CSS gradient painting to the painter creating:

 - Painter::fill_rect_with_linear_gradient()
 - Painter::fill_rect_with_conic_gradient()
 - Painter::fill_rect_with_radial_gradient()

This has a few benefits:
 - The gradients can now easily respect the painter scale
 - The Painter::fill_pixels() escape hatch can be removed
 - We can remove the old fixed color stop gradient code
    - The old functions are  now just a shim
 - Anywhere can now easily use this gradient painting code!

This only leaves the color stop resolution in LibWeb (which is fine).
Just means in LibGfx you have to actually specify color stop positions.

(Also while here add a small optimization to avoid generating
excessively long gradient lines)
2023-01-10 10:25:58 +01:00
Timothy Flynn
f3db548a3d AK+Everywhere: Rename FlyString to DeprecatedFlyString
DeprecatedFlyString relies heavily on DeprecatedString's StringImpl, so
let's rename it to A) match the name of DeprecatedString, B) write a new
FlyString class that is tied to String.
2023-01-09 23:00:24 +00:00
Julian Offenhäuser
5b7dfe848d LibGfx: Implement TrimmedTable mappings for Cmaps 2023-01-09 22:38:40 +00:00
Julian Offenhäuser
04ee181b21 LibGfx: Implement ByteEncoding mappings for Cmaps 2023-01-09 22:38:40 +00:00
Julian Offenhäuser
0ff9f2b865 LibGfx: Select a valid TTF cmap subtable for the Macintosh platform
While this subtable ID is supposed to be deprecated, it is used heavily
in PDF files.

It supports mapping one or two-byte values, with quite a large list of
encodings to tell you which one to expect.
For our use case, we ignore this encoding ID and just pick the first
subtable with this platform ID. Unsupported encodings will get caught
by Subtable::glyph_id_for_code_point() anyway.
2023-01-09 22:38:40 +00:00
Andreas Kling
c55739bbc0 LibGfx: Make Rect::align_within() correct for TopCenter and BottomCenter
Also update the LibGfxDemo to actually show off these alignments.
2023-01-09 19:54:26 +01:00
Nico Weber
b8bfefd130 LibGfx: Add initializer for ICC::DistinctFourCC
These are currently only used in Optional<>s, so this is no effective
behavior change.
2023-01-08 23:41:14 +01:00
Nico Weber
db02cf2aa8 LibGfx: Add initializers for ICCProfile enum class fields 2023-01-08 23:41:14 +01:00
Nico Weber
1a907aa305 LibGfx: Add initializer for ICCProfile::m_creation_timestamp 2023-01-08 23:41:14 +01:00
Nico Weber
7ae97c9fc4 LibGfx+icc: Look at profile_size field
This trims the input bytes to the profile size stored in the file.
Alternatively, we could reject files where the stored size doesn't
match the handed in size. But ICC profiles can be embedded in other
files, and those could conceivably pad the ICC profile data some.
2023-01-08 23:41:14 +01:00
Nico Weber
7d4ec4fecf LibGfx: Rename ICC::DateTimeNumber::hour to hours to match spec 2023-01-08 23:41:14 +01:00
Nico Weber
aee7c44064 LibGfx+icc: Print primary platform
There's a small, old-timey list of platforms in the spec, but as far
as I can tell nobody is using additional platforms on Linux or Android
or what. So let's try going with an enum class instead of the FourCC
machinery for now.
2023-01-08 09:56:07 +00:00
Nico Weber
6d70b6a3a7 LibGfx: Put parse_device_attributes() in spec order 2023-01-08 09:56:07 +00:00
Nico Weber
8f4d2486dd LibGfx: Expand spec comment for parse_device_attributes() in ICCProfile 2023-01-07 13:41:41 +00:00
Nico Weber
fdbe501d3e LibGfx+icc: Print fields that are fourccs registered with the ICC
Namely:
- preferred CMM type
- device manufacturer
- device model
- profile creator

These all have in common that they can take arbitrary values, so I added
a FourCC class to deal with them, instead of using an enum class.
I made distinct types for each of them, so that they aren't accidentally
mixed up.
2023-01-07 13:41:41 +00:00
Nico Weber
d223477bc6 LibGfx+icc: Print device attribute flags
These flags are always 0 in practice in all profiles I've seen so far,
but hey, probably nice to dump them anyways.

And hey, it's just 86 lines to print 4 bits.
2023-01-06 21:33:46 +01:00
Nico Weber
915cc5d4e3 LibGfx: Fix incorrect bitmask in Gfx::ICC::Flags 2023-01-06 21:33:46 +01:00
Nico Weber
c00ce2fba0 LibGfx+icc: Verify ICCProfile ID at parse time instead of in icc
Always computing computing the md5 takes some time, but most
icc profiles are small. So that's probably fine.

If this ends up being a perf problem in the future, or if it ends up
rejecting tons of embedded proiles from images, we can row it back.
But let's see if we can get away with this first.
2023-01-06 20:26:14 +01:00
Nico Weber
31af741c66 LibGfx: Rename variable in parse_profile_id() to match spec better 2023-01-06 20:26:14 +01:00
Nico Weber
b0068c387b LibGfx: Verify ICC reserved header bytes are zero
I checked that they are zero for all profiles in Compact-ICC-Profiles
and for all .icc files in /Library/ColorSync and
/System/Library/ColorSync on my Mac (running macOS 12.6.2).
2023-01-06 19:17:22 +01:00
Nico Weber
090bd02a88 LibGfx: Extract all_bytes_are_zero() function in ICCProfile 2023-01-06 19:17:22 +01:00
Nico Weber
aa107ef2d6 LibGfx: Add quotes and reflow for glanceability 2023-01-06 19:17:22 +01:00
Nico Weber
478bd97b25 LibGfx: Rename ICCHeader::profile_md5 to profile_id to match spec 2023-01-06 19:17:22 +01:00
Simon Danner
b10fe7c136 LibGfx: Prefer largest image with best depth for ICO display
Some favicons contain multiple icons of the same size, but with
increasing depth. Use the largest one to make things look nicer.
2023-01-06 17:31:05 +01:00