mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 03:54:59 +00:00

Exif metadata have two tags to store the pixel density along each axis. If both values are different and no action is taken, the resulting image will appear deformed. This commit scales the displayed bitmap accordingly to these tags in order to show the image in its intended shape. This unfortunately includes a lot of plumbing to get this information through IPC.
44 lines
1 KiB
C++
44 lines
1 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/HashMap.h>
|
|
#include <ImageDecoder/ImageDecoderClientEndpoint.h>
|
|
#include <ImageDecoder/ImageDecoderServerEndpoint.h>
|
|
#include <LibIPC/ConnectionToServer.h>
|
|
|
|
namespace ImageDecoderClient {
|
|
|
|
struct Frame {
|
|
NonnullRefPtr<Gfx::Bitmap> bitmap;
|
|
u32 duration { 0 };
|
|
};
|
|
|
|
struct DecodedImage {
|
|
bool is_animated { false };
|
|
Gfx::FloatPoint scale { 1, 1 };
|
|
u32 loop_count { 0 };
|
|
Vector<Frame> frames;
|
|
};
|
|
|
|
class Client final
|
|
: public IPC::ConnectionToServer<ImageDecoderClientEndpoint, ImageDecoderServerEndpoint>
|
|
, public ImageDecoderClientEndpoint {
|
|
IPC_CLIENT_CONNECTION(Client, "/tmp/session/%sid/portal/image"sv);
|
|
|
|
public:
|
|
Client(NonnullOwnPtr<Core::LocalSocket>);
|
|
|
|
Optional<DecodedImage> decode_image(ReadonlyBytes, Optional<Gfx::IntSize> ideal_size = {}, Optional<ByteString> mime_type = {});
|
|
|
|
Function<void()> on_death;
|
|
|
|
private:
|
|
virtual void die() override;
|
|
};
|
|
|
|
}
|