Lucas CHOLLET
7b72bf2910
LibGfx: Don't assume that image decoder plugin creation succeeds
...
An image with an incorrect header should fail at this step, so we have
to handle that without crashing.
2023-07-17 06:39:57 +01:00
Lucas CHOLLET
35dcd16ea6
LibGfx/TinyVG: Decode the header in create()
and remove initialize()
...
This is done as a part of #19893 .
2023-07-16 20:39:51 +02:00
MacDue
dcb7c299bf
LibGfx: Use stroke_to_fill() for Painter::stroke_path()
2023-07-16 18:52:38 +02:00
MacDue
a9b4e876d0
LibGfx: Only attempt to paint strokes with a width > 0
2023-07-16 18:52:38 +02:00
MacDue
1bc7b0320e
LibGfx: Approximate elliptical arcs with cubic beziers
...
Unlike all other primitives elliptical arcs are non-trivial to
manipulate, it's tricky to correctly apply a Gfx::AffineTransform to
them. Prior to this change, Path::copy_transformed() was still
incorrectly applying transforms such as flips and skews to arcs.
This patch very closely approximates arcs with cubic beziers (I can not
visually spot any differences), which can then be easily and correctly
transformed in all cases.
Most of the maths here was taken from:
https://mortoray.com/rendering-an-svg-elliptical-arc-as-bezier-curves/
(which came from https://www.joecridge.me/content/pdf/bezier-arcs.pdf ,
now a dead link).
2023-07-16 06:22:55 +02:00
MacDue
2a1bf63f9e
LibGfx: Use AK::sincos() and AK::Pi<double> in Path::elliptical_arc_to()
2023-07-16 06:22:55 +02:00
MacDue
8d4f90df4e
LibGfx: Pass angles as floats to Path::elliptical_arc_to()
...
These are stored as floats internally and other parameters are
FloatPoints, so taking doubles is a little inconsistent. Doubles are
needed for the endpoint -> center parametrization conversion, but that
does not need exposing in the API.
2023-07-16 06:22:55 +02:00
MacDue
cf05da131f
LibGfx/TinyVG: Close polygon path in OutlineFillPolygon
2023-07-15 21:36:28 +02:00
MacDue
a853f7b133
LibGfx/TinyVG: Map gradients to equivalent SVG gradients
2023-07-15 21:36:28 +02:00
MacDue
fb61082a6c
LibGfx/TinyVG: Don't move fill/stroke styles that are used in a loop
2023-07-15 21:36:28 +02:00
MacDue
bebfb81c85
LibGfx/TinyVG: Parse and ignore line_width
in paths
...
TinyVG allows varying the line width along a path, this is not supported
in LibGfx so we just ignore this (but still need to parse the field).
2023-07-15 21:36:28 +02:00
Shannon Booth
2b46e6f664
Everywhere: Update copyrights with my new serenityos.org e-mail :^)
2023-07-15 16:21:29 +02:00
Lucas CHOLLET
500097de82
LibGfx/GIF: Decode the header in create()
...
Again, header includes the logical screen descriptor here. This is done
as a part of #19893 .
2023-07-15 09:44:30 +02:00
Lucas CHOLLET
294217586b
LibGfx/GIF: Move the code to read the header to its own function
...
By header, I include the logical screen descriptor here, so all the
information that is not specific to each frame.
2023-07-15 09:44:30 +02:00
Lucas CHOLLET
b8bc84a3e8
LibGfx/GIF: Only use a FixedMemoryStream
...
This allows us to drop the data pointer in the `GIFLoadingContext`.
2023-07-15 09:44:30 +02:00
Lucas CHOLLET
1192e46c09
LibGfx/GIF: Don't read the header twice
...
This is already done in `load_gif_frame_descriptors()`. As the method
`initialize()` is now empty, we can delete it.
2023-07-15 09:44:30 +02:00
Lucas CHOLLET
e56809dda8
LibGfx: Register WebP as a supported image format
...
Basically, it means that we now render a thumbnail for WebP images.
2023-07-15 09:34:07 +02:00
Lucas CHOLLET
8ef5170bd5
LibGfx/WebP: Remove a typo
...
:redthakis:
2023-07-15 09:34:07 +02:00
Lucas CHOLLET
4adef05e6d
LibGfx/WebP: Decode the first chunk in create()
...
And remove `initialize()`.
This is done as a part of #19893 .
2023-07-15 09:34:07 +02:00
MacDue
57c81c1719
LibGfx: Lazily load TinyVG image data
...
This matches the behavior of other decoders, and ensures just getting
the size (e.g. for the `file` command) does not read the whole file.
2023-07-14 06:51:05 +02:00
MacDue
753cf04be8
LibGfx: Allow requesting vector graphic frames from ImageDecoder
...
Only supported for plugins that set is_vector() to true. This returns
the frames as Gfx::VectorGraphics, which allows painting/rasterizing
them with arbitrary transforms and scales.
2023-07-14 06:51:05 +02:00
MacDue
90e836deae
LibGfx: Fix elliptical arcs after non orientation preserving transform
...
That is flipping/reflecting the arc.
2023-07-14 06:51:05 +02:00
MacDue
9ecc78db1b
LibGfx: Add AffineTransform::determinant()
2023-07-14 06:51:05 +02:00
MacDue
16b487c270
LibGfx: Add simple VectorGraphic abstract base class
...
This is currently very bare-bones with just the size and a few methods
to rasterize/draw the graphic.
2023-07-14 06:51:05 +02:00
Lucas CHOLLET
b14d51ba1b
LibGfx/QOI: Decode the header in create()
and remove initialize()
...
This is done as a part of #19893 .
2023-07-14 06:17:12 +02:00
Lucas CHOLLET
5fd1ee0365
LibGfx/QOI: Remove useless parameters from member functions
...
Both `decode_[header,image]_and_update_context()` used to take a
`Stream&` as parameter, but they are always called with the field
`m_context.stream` so no need to take it as a parameter.
2023-07-14 06:17:12 +02:00
Lucas CHOLLET
1ae772c7d3
LibGfx/JPEG: Decode the header in create()
...
This is done as a part of #19893 .
2023-07-14 06:16:56 +02:00
Lucas CHOLLET
2f125b86aa
LibGfx/JPEG: Remove the unused method initialize()
2023-07-14 06:16:56 +02:00
Andreas Kling
d620dd516c
LibGfx: Add Rect::unite_{horizontally,vertically}()
...
These functions unite the rect with another rect, but only in one axis.
2023-07-13 05:09:08 +02:00
Lucas CHOLLET
92fa1efc76
LibGfx/TGA: Decode the header in create()
and remove initialize()
...
This is done as a part of #19893 .
2023-07-12 23:37:32 +02:00
Lucas CHOLLET
a05516bb3e
LibGfx/TGA: Make TGAImageDecoderPlugin::decode_tga_header()
fallible
2023-07-12 23:37:32 +02:00
Lucas CHOLLET
e0ff3fbfad
LibGfx/TGA: Default initialize the TGAHeader
in the context
2023-07-12 23:37:32 +02:00
Nico Weber
8c13b83a84
LibGfx/PNGWriter: Use a better limit for scanline capactiy
...
One scanline is width pixels long, not height pixels.
No measurable performance difference, but it annoys me every time I look
at this file.
2023-07-12 07:51:54 +01:00
Lucas CHOLLET
9ff706339b
LibGfx/PortableFormat: Read the header during initialization
...
This is done as a part of #19893 .
2023-07-11 14:16:33 +01:00
Lucas CHOLLET
f3ff9c26bc
LibGfx/PortableFormat: Simplify the State enum
...
This enum used to store very precise state about the decoding process,
let's simplify that by only including two steps: HeaderDecoder and
BitmapDecoded.
2023-07-11 14:16:33 +01:00
Lucas CHOLLET
f6ce06d56b
LibGfx/PortableFormat: Extract header reading in its own function
2023-07-11 14:16:33 +01:00
Lucas CHOLLET
e72293fbc7
LibGfx/PortableFormat: Remove PortableImageDecoderPlugin::initialize()
2023-07-11 14:16:33 +01:00
Nico Weber
f7f9f1f47f
LibGfx/PNG: Make invalid sRGB chunk size non-fatal
...
https://www.haiku-os.org/images/bg-page.png has a size of 0 for
example.
Just ignoring the chunk instead of assuming that the image is sRGB
and has Perceptual rendering intent matches what libpng does
(cf `png_handle_sRGB()`), so let's do that too.
(All other chunk handlers are still strict about size.)
2023-07-11 15:07:42 +02:00
MacDue
e1cf868e6e
LibGfx: Use AntiAliasingPainter::fill_path() for drawing font glyphs
...
Using the general AA painter fill_path() is indistinguishable from the
previous rasterizer, so this switch simply allows us to share more code.
2023-07-10 20:56:25 +02:00
Lucas CHOLLET
babe924da1
LibGfx: Provide a default implementation for ImageDecoder::initialize
...
In order to ease the removal of this function, let's provide a no-op
default implementation so decoders can stop implementing it one by one.
First step of #19893
2023-07-09 09:16:28 +01:00
Lucas CHOLLET
35599605c1
LibGfx/BMP: Move some const
to the east
2023-07-08 22:56:30 +01:00
Lucas CHOLLET
fd765d2031
LibGfx/ICO: Fix an erroneous condition
...
This is a remnant of the conversion to `ErrorOr` done in 492d5d7c
.
2023-07-08 22:56:30 +01:00
Timothy Flynn
c911781c21
Everywhere: Remove needless trailing semi-colons after functions
...
This is a new option in clang-format-16.
2023-07-08 10:32:56 +01:00
Lucas CHOLLET
e5b70837de
LibGfx: Remove ImageDecoder::set_[non]volatile()
...
These methods are unused so let's remove them.
2023-07-08 01:45:46 +01:00
Lucas CHOLLET
243e91f5de
LibGfx/JPEG: Don't return an error on empty icc profiles
...
An empty icc profile shouldn't stop our brave decoder.
2023-07-05 17:41:17 +01:00
Lucas CHOLLET
0ef61ab895
LibGfx/JPEG: Convert some west-consts to east-consts
2023-07-05 12:10:56 +01:00
Lucas CHOLLET
af14ed6b2e
LibGfx/JPEG: Accept grayscale images with an App14 segment
...
The adobe specification doesn't even consider JPEG images with a single
component. So let's not consider the content of the App14 segment for
grayscale images.
2023-07-05 12:10:56 +01:00
Lucas CHOLLET
a58c7fe322
LibGfx/JPEG: Take the quality as an argument instead of hardcoding it
2023-07-04 00:01:06 +02:00
Lucas CHOLLET
05c8ad4e91
LibGfx/JPEG: Write quantization tables in the zigzag ordering
...
This is clearly something I missed during the first implementation. The
specification is crystal clear about it: "The quantization elements
shall be specified in zig-zag scan order."
This patch fixes the weird behavior we had when using the quantization
table.
2023-07-04 00:01:06 +02:00
MacDue
bb5db0835d
LibGfx: Allow loading a Bitmap (from bytes) with an ideal size
2023-07-03 23:54:51 +02:00