summaryrefslogtreecommitdiff
path: root/Services/ImageDecoder
diff options
context:
space:
mode:
Diffstat (limited to 'Services/ImageDecoder')
-rw-r--r--Services/ImageDecoder/CMakeLists.txt12
-rw-r--r--Services/ImageDecoder/ClientConnection.cpp102
-rw-r--r--Services/ImageDecoder/ClientConnection.h55
-rw-r--r--Services/ImageDecoder/Forward.h34
-rw-r--r--Services/ImageDecoder/ImageDecoderClient.ipc4
-rw-r--r--Services/ImageDecoder/ImageDecoderServer.ipc7
-rw-r--r--Services/ImageDecoder/main.cpp51
7 files changed, 265 insertions, 0 deletions
diff --git a/Services/ImageDecoder/CMakeLists.txt b/Services/ImageDecoder/CMakeLists.txt
new file mode 100644
index 0000000000..ce9ad077fc
--- /dev/null
+++ b/Services/ImageDecoder/CMakeLists.txt
@@ -0,0 +1,12 @@
+compile_ipc(ImageDecoderServer.ipc ImageDecoderServerEndpoint.h)
+compile_ipc(ImageDecoderClient.ipc ImageDecoderClientEndpoint.h)
+
+set(SOURCES
+ ClientConnection.cpp
+ main.cpp
+ ImageDecoderServerEndpoint.h
+ ImageDecoderClientEndpoint.h
+)
+
+serenity_bin(ImageDecoder)
+target_link_libraries(ImageDecoder LibIPC LibGfx)
diff --git a/Services/ImageDecoder/ClientConnection.cpp b/Services/ImageDecoder/ClientConnection.cpp
new file mode 100644
index 0000000000..ce7ec85d6b
--- /dev/null
+++ b/Services/ImageDecoder/ClientConnection.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <AK/Badge.h>
+#include <AK/SharedBuffer.h>
+#include <ImageDecoder/ClientConnection.h>
+#include <ImageDecoder/ImageDecoderClientEndpoint.h>
+#include <LibGfx/Bitmap.h>
+#include <LibGfx/ImageDecoder.h>
+#include <LibGfx/SystemTheme.h>
+
+namespace ImageDecoder {
+
+static HashMap<int, RefPtr<ClientConnection>> s_connections;
+
+ClientConnection::ClientConnection(Core::LocalSocket& socket, int client_id)
+ : IPC::ClientConnection<ImageDecoderServerEndpoint>(*this, socket, client_id)
+{
+ s_connections.set(client_id, *this);
+}
+
+ClientConnection::~ClientConnection()
+{
+}
+
+void ClientConnection::die()
+{
+ s_connections.remove(client_id());
+ exit(0);
+}
+
+OwnPtr<Messages::ImageDecoderServer::GreetResponse> ClientConnection::handle(const Messages::ImageDecoderServer::Greet& message)
+{
+ set_client_pid(message.client_pid());
+ return make<Messages::ImageDecoderServer::GreetResponse>(client_id(), getpid());
+}
+
+OwnPtr<Messages::ImageDecoderServer::DecodeImageResponse> ClientConnection::handle(const Messages::ImageDecoderServer::DecodeImage& message)
+{
+ auto encoded_buffer = SharedBuffer::create_from_shbuf_id(message.encoded_shbuf_id());
+ if (!encoded_buffer) {
+#ifdef IMAGE_DECODER_DEBUG
+ dbg() << "Could not map encoded data buffer";
+#endif
+ return nullptr;
+ }
+
+ if (message.encoded_size() > (size_t)encoded_buffer->size()) {
+#ifdef IMAGE_DECODER_DEBUG
+ dbg() << "Encoded buffer is smaller than encoded size";
+#endif
+ return nullptr;
+ }
+
+#ifdef IMAGE_DECODER_DEBUG
+ dbg() << "Trying to decode " << message.encoded_size() << " bytes of image(?) data in shbuf_id=" << message.encoded_shbuf_id() << " (shbuf size: " << encoded_buffer->size() << ")";
+#endif
+
+ auto decoder = Gfx::ImageDecoder::create((const u8*)encoded_buffer->data(), message.encoded_size());
+ auto bitmap = decoder->bitmap();
+
+ if (!bitmap) {
+#ifdef IMAGE_DECODER_DEBUG
+ dbg() << "Could not decode image from encoded data";
+#endif
+ return make<Messages::ImageDecoderServer::DecodeImageResponse>(-1, Gfx::IntSize(), (i32)Gfx::BitmapFormat::Invalid, Vector<u32>());
+ }
+
+ // FIXME: We should fix ShareableBitmap so you can send it in responses as well as requests..
+ m_shareable_bitmap = bitmap->to_bitmap_backed_by_shared_buffer();
+ m_shareable_bitmap->shared_buffer()->share_with(client_pid());
+ Vector<u32> palette;
+ if (m_shareable_bitmap->is_indexed()) {
+ palette = m_shareable_bitmap->palette_to_vector();
+ }
+ return make<Messages::ImageDecoderServer::DecodeImageResponse>(m_shareable_bitmap->shbuf_id(), m_shareable_bitmap->size(), (i32)m_shareable_bitmap->format(), palette);
+}
+
+}
diff --git a/Services/ImageDecoder/ClientConnection.h b/Services/ImageDecoder/ClientConnection.h
new file mode 100644
index 0000000000..3b47ed1894
--- /dev/null
+++ b/Services/ImageDecoder/ClientConnection.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <AK/HashMap.h>
+#include <ImageDecoder/Forward.h>
+#include <ImageDecoder/ImageDecoderServerEndpoint.h>
+#include <LibIPC/ClientConnection.h>
+#include <LibWeb/Forward.h>
+
+namespace ImageDecoder {
+
+class ClientConnection final
+ : public IPC::ClientConnection<ImageDecoderServerEndpoint>
+ , public ImageDecoderServerEndpoint {
+ C_OBJECT(ClientConnection);
+
+public:
+ explicit ClientConnection(Core::LocalSocket&, int client_id);
+ ~ClientConnection() override;
+
+ virtual void die() override;
+
+private:
+ virtual OwnPtr<Messages::ImageDecoderServer::GreetResponse> handle(const Messages::ImageDecoderServer::Greet&) override;
+ virtual OwnPtr<Messages::ImageDecoderServer::DecodeImageResponse> handle(const Messages::ImageDecoderServer::DecodeImage&) override;
+
+ RefPtr<Gfx::Bitmap> m_shareable_bitmap;
+};
+
+}
diff --git a/Services/ImageDecoder/Forward.h b/Services/ImageDecoder/Forward.h
new file mode 100644
index 0000000000..e43ca83960
--- /dev/null
+++ b/Services/ImageDecoder/Forward.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace WebContent {
+
+class ClientConnection;
+class PageHost;
+
+}
diff --git a/Services/ImageDecoder/ImageDecoderClient.ipc b/Services/ImageDecoder/ImageDecoderClient.ipc
new file mode 100644
index 0000000000..49dc3862c2
--- /dev/null
+++ b/Services/ImageDecoder/ImageDecoderClient.ipc
@@ -0,0 +1,4 @@
+endpoint ImageDecoderClient = 7002
+{
+ Dummy() =|
+}
diff --git a/Services/ImageDecoder/ImageDecoderServer.ipc b/Services/ImageDecoder/ImageDecoderServer.ipc
new file mode 100644
index 0000000000..295454282f
--- /dev/null
+++ b/Services/ImageDecoder/ImageDecoderServer.ipc
@@ -0,0 +1,7 @@
+endpoint ImageDecoderServer = 7001
+{
+ Greet(i32 client_pid) => (i32 client_id, i32 server_pid)
+
+ DecodeImage(i32 encoded_shbuf_id, u32 encoded_size) => (i32 decoded_shbuf_id, Gfx::IntSize size, i32 bitmap_format, Vector<u32> palette)
+
+}
diff --git a/Services/ImageDecoder/main.cpp b/Services/ImageDecoder/main.cpp
new file mode 100644
index 0000000000..1ee15b1496
--- /dev/null
+++ b/Services/ImageDecoder/main.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <LibCore/EventLoop.h>
+#include <LibCore/LocalServer.h>
+#include <LibIPC/ClientConnection.h>
+#include <ImageDecoder/ClientConnection.h>
+
+int main(int, char**)
+{
+ Core::EventLoop event_loop;
+ if (pledge("stdio shared_buffer unix", nullptr) < 0) {
+ perror("pledge");
+ return 1;
+ }
+ if (unveil(nullptr, nullptr) < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ auto socket = Core::LocalSocket::take_over_accepted_socket_from_system_server();
+ IPC::new_client_connection<ImageDecoder::ClientConnection>(*socket, 1);
+ if (pledge("stdio shared_buffer", nullptr) < 0) {
+ perror("pledge");
+ return 1;
+ }
+ return event_loop.exec();
+}