Compare commits
	
		
			7 Commits
		
	
	
		
			refact_and
			...
			dev-998000
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 998000aa3a | |||
| e66f4651d0 | |||
| 854d09f05c | |||
| 2d6a9acbb6 | |||
| b7f0ad6c9a | |||
| 43f8c22570 | |||
| 3c7bd2e2cb | 
							
								
								
									
										20
									
								
								.github/workflows/cd.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/cd.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,7 +7,7 @@ on:
 | 
			
		||||
    branches: [ master ]
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  BUILD_TYPE: Release
 | 
			
		||||
  BUILD_TYPE: RelWithDebInfo
 | 
			
		||||
  BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
@@ -17,7 +17,7 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-20.04
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -63,7 +63,7 @@ jobs:
 | 
			
		||||
    runs-on: windows-2019
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -75,8 +75,11 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        arch: amd64
 | 
			
		||||
 | 
			
		||||
    ## sdl_image vendored needs nasm for dav1d
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
 | 
			
		||||
@@ -114,7 +117,7 @@ jobs:
 | 
			
		||||
    runs-on: windows-2019
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -126,8 +129,11 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        arch: amd64
 | 
			
		||||
 | 
			
		||||
    ## sdl_image vendored needs nasm for dav1d
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DTOMATO_ASAN=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
 | 
			
		||||
@@ -172,7 +178,7 @@ jobs:
 | 
			
		||||
      contents: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							@@ -16,7 +16,7 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -35,7 +35,7 @@ jobs:
 | 
			
		||||
    runs-on: macos-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -49,12 +49,12 @@ jobs:
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
 | 
			
		||||
 | 
			
		||||
  windows:
 | 
			
		||||
    timeout-minutes: 10
 | 
			
		||||
    timeout-minutes: 15
 | 
			
		||||
 | 
			
		||||
    runs-on: windows-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
    - uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        submodules: recursive
 | 
			
		||||
 | 
			
		||||
@@ -66,8 +66,11 @@ jobs:
 | 
			
		||||
      with:
 | 
			
		||||
        arch: amd64
 | 
			
		||||
 | 
			
		||||
    ## sdl_image vendored needs nasm for dav1d
 | 
			
		||||
    #- uses: ilammy/setup-nasm@v1
 | 
			
		||||
 | 
			
		||||
    - name: Configure CMake
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static
 | 
			
		||||
      run: cmake -G Ninja -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static -DSDL3IMAGE_VENDORED=ON -DSDL3IMAGE_DEPS_SHARED=ON -DSDL3IMAGE_JXL=OFF -DSDL3IMAGE_AVIF=OFF
 | 
			
		||||
 | 
			
		||||
    - name: Build
 | 
			
		||||
      run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j 4
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								external/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								external/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@@ -21,4 +21,5 @@ add_subdirectory(./imgui)
 | 
			
		||||
add_subdirectory(./stb)
 | 
			
		||||
add_subdirectory(./libwebp)
 | 
			
		||||
add_subdirectory(./qoi)
 | 
			
		||||
add_subdirectory(./sdl_image)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								external/sdl_image/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								external/sdl_image/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.16...3.24 FATAL_ERROR)
 | 
			
		||||
 | 
			
		||||
include(FetchContent)
 | 
			
		||||
 | 
			
		||||
if (NOT TARGET SDL3_image::SDL3_image)
 | 
			
		||||
	set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
 | 
			
		||||
	# TODO: make pr to make this an option
 | 
			
		||||
	set(SDL3IMAGE_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
 | 
			
		||||
	set(SDL3IMAGE_BACKEND_STB OFF CACHE BOOL "" FORCE) # important for security
 | 
			
		||||
	set(SDL3IMAGE_BACKEND_IMAGEIO OFF CACHE BOOL "" FORCE) # some funky apple cmake bug
 | 
			
		||||
	#set(SDL3IMAGE_JXL ON CACHE BOOL "" FORCE) # default to off
 | 
			
		||||
	set(SDL3IMAGE_QOI OFF CACHE BOOL "" FORCE) # we have our own
 | 
			
		||||
	set(SDL3IMAGE_WEBP OFF CACHE BOOL "" FORCE) # we have our own
 | 
			
		||||
 | 
			
		||||
	FetchContent_Declare(SDL3_image
 | 
			
		||||
		GIT_REPOSITORY https://github.com/libsdl-org/SDL_image
 | 
			
		||||
		# waiting on the imgui pr to get merged so i can update sdl <.<
 | 
			
		||||
		GIT_TAG a45d6e5b84ccc0f3faae6ba7d561709ed600eee7 # tip last check
 | 
			
		||||
		FIND_PACKAGE_ARGS # for the future
 | 
			
		||||
	)
 | 
			
		||||
	FetchContent_MakeAvailable(SDL3_image)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								external/solanaceae_contact
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_contact
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_contact updated: e40271670b...7710da6c89
									
								
							
							
								
								
									
										2
									
								
								external/solanaceae_tox
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								external/solanaceae_tox
									
									
									
									
										vendored
									
									
								
							 Submodule external/solanaceae_tox updated: 25857b8aa7...1d724ef951
									
								
							
							
								
								
									
										32
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										32
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -5,11 +5,11 @@
 | 
			
		||||
        "systems": "systems"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1694529238,
 | 
			
		||||
        "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
 | 
			
		||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -20,11 +20,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1709953752,
 | 
			
		||||
        "narHash": "sha256-LW84B4vM1cn7E6cDNQn2LndT9iJXI1dRE5fwbNFbQa8=",
 | 
			
		||||
        "lastModified": 1713189761,
 | 
			
		||||
        "narHash": "sha256-MPp1dBhlY066IeBo+EPGEUN+s+aSUA+LWkvnzKh+rts=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "fcaa81ed3c273237217330cf342ef1873b77c80a",
 | 
			
		||||
        "rev": "ff44be4d8ff33f797ff3e3f87153d4f3b6a85ffb",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -56,7 +56,8 @@
 | 
			
		||||
        "flake-utils": "flake-utils",
 | 
			
		||||
        "nixpkgs": "nixpkgs",
 | 
			
		||||
        "nlohmann-json": "nlohmann-json",
 | 
			
		||||
        "sdl3": "sdl3"
 | 
			
		||||
        "sdl3": "sdl3",
 | 
			
		||||
        "sdl3_image": "sdl3_image"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sdl3": {
 | 
			
		||||
@@ -76,6 +77,23 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sdl3_image": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1712700609,
 | 
			
		||||
        "narHash": "sha256-PVPH1uJ6g65SzHUboeQE6ZkC+72doMz9t9SG2LBo+7I=",
 | 
			
		||||
        "owner": "libsdl-org",
 | 
			
		||||
        "repo": "SDL_image",
 | 
			
		||||
        "rev": "a45d6e5b84ccc0f3faae6ba7d561709ed600eee7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "libsdl-org",
 | 
			
		||||
        "repo": "SDL_image",
 | 
			
		||||
        "rev": "a45d6e5b84ccc0f3faae6ba7d561709ed600eee7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "systems": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1681028828,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								flake.nix
									
									
									
									
									
								
							@@ -14,9 +14,13 @@
 | 
			
		||||
      url = "github:libsdl-org/SDL/0429f5d6a36fc35b551bcc2acd4a40c2db6dab82"; # keep in sync this cmake
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    sdl3_image = {
 | 
			
		||||
      url = "github:libsdl-org/SDL_image/a45d6e5b84ccc0f3faae6ba7d561709ed600eee7";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  outputs = { self, nixpkgs, flake-utils, nlohmann-json, sdl3 }:
 | 
			
		||||
  outputs = { self, nixpkgs, flake-utils, nlohmann-json, sdl3, sdl3_image }:
 | 
			
		||||
    flake-utils.lib.eachDefaultSystem (system:
 | 
			
		||||
    let
 | 
			
		||||
      pkgs = import nixpkgs { inherit system; };
 | 
			
		||||
@@ -57,6 +61,13 @@
 | 
			
		||||
          libGL
 | 
			
		||||
 | 
			
		||||
          pipewire
 | 
			
		||||
 | 
			
		||||
          # sdl3_image:
 | 
			
		||||
          libpng
 | 
			
		||||
          libjpeg
 | 
			
		||||
          libjxl
 | 
			
		||||
          libavif
 | 
			
		||||
          #libwebp # still using our own loader
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        buildInputs = with pkgs; [
 | 
			
		||||
@@ -74,6 +85,8 @@
 | 
			
		||||
          "-DFETCHCONTENT_SOURCE_DIR_ZSTD=${pkgs.zstd.src}" # we dont care about the version (we use 1.4.x features)
 | 
			
		||||
          "-DFETCHCONTENT_SOURCE_DIR_LIBWEBP=${pkgs.libwebp.src}"
 | 
			
		||||
          "-DFETCHCONTENT_SOURCE_DIR_SDL3=${sdl3}"
 | 
			
		||||
          "-DFETCHCONTENT_SOURCE_DIR_SDL3_IMAGE=${sdl3_image}"
 | 
			
		||||
          "-DSDL3IMAGE_JXL=ON"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        # TODO: replace with install command
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ add_executable(tomato
 | 
			
		||||
	./image_loader_webp.cpp
 | 
			
		||||
	./image_loader_qoi.hpp
 | 
			
		||||
	./image_loader_qoi.cpp
 | 
			
		||||
	./image_loader_sdl_image.hpp
 | 
			
		||||
	./image_loader_sdl_image.cpp
 | 
			
		||||
 | 
			
		||||
	./texture_uploader.hpp
 | 
			
		||||
	./sdlrenderer_texture_uploader.hpp
 | 
			
		||||
@@ -98,5 +100,6 @@ target_link_libraries(tomato PUBLIC
 | 
			
		||||
	webpdemux
 | 
			
		||||
	libwebpmux # the f why (needed for anim encode)
 | 
			
		||||
	qoi
 | 
			
		||||
	SDL3_image::SDL3_image
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -197,9 +197,10 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
				sub_contacts = &_cr.get<Contact::Components::ParentOf>(*_selected_contact).subs;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			const bool highlight_private {!_cr.all_of<Contact::Components::TagPrivate>(*_selected_contact)};
 | 
			
		||||
 | 
			
		||||
			if (ImGui::BeginChild(chat_label.c_str(), {0, 0}, true)) {
 | 
			
		||||
				//if (_cr.all_of<Contact::Components::ParentOf>(*_selected_contact)) {
 | 
			
		||||
				if (sub_contacts != nullptr) {
 | 
			
		||||
				if (sub_contacts != nullptr && !_cr.all_of<Contact::Components::TagPrivate>(*_selected_contact) && _cr.all_of<Contact::Components::TagGroup>(*_selected_contact)) {
 | 
			
		||||
					if (!sub_contacts->empty()) {
 | 
			
		||||
						if (ImGui::BeginChild("subcontacts", {150, -100}, true)) {
 | 
			
		||||
							ImGui::Text("subs: %zu", sub_contacts->size());
 | 
			
		||||
@@ -417,7 +418,7 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
								std::optional<ImVec4> row_bg;
 | 
			
		||||
 | 
			
		||||
								// private group message
 | 
			
		||||
								if (_cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) {
 | 
			
		||||
								if (highlight_private && _cr.any_of<Contact::Components::TagSelfWeak, Contact::Components::TagSelfStrong>(c_to.c)) {
 | 
			
		||||
									const ImVec4 priv_msg_hi_col = ImVec4(0.5f, 0.2f, 0.5f, 0.35f);
 | 
			
		||||
									ImU32 row_bg_color = ImGui::GetColorU32(priv_msg_hi_col);
 | 
			
		||||
									ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, row_bg_color);
 | 
			
		||||
@@ -456,7 +457,10 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
							if (ImGui::TableNextColumn()) {
 | 
			
		||||
								// TODO: theming for hardcoded values
 | 
			
		||||
 | 
			
		||||
								if (msg_reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
 | 
			
		||||
								if (!msg_reg.all_of<Message::Components::Remote::TimestampReceived>(e)) {
 | 
			
		||||
									// TODO: dedup?
 | 
			
		||||
									ImGui::TextDisabled("_");
 | 
			
		||||
								} else {
 | 
			
		||||
									const auto list = msg_reg.get<Message::Components::Remote::TimestampReceived>(e).ts;
 | 
			
		||||
									// wrongly assumes contacts never get removed from a group
 | 
			
		||||
									if (sub_contacts != nullptr && list.size() < sub_contacts->size()) {
 | 
			
		||||
@@ -471,6 +475,7 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
										std::string synced_by_text {"delivery confirmed by:"};
 | 
			
		||||
										const int64_t now_ts_s = int64_t(Message::getTimeMS() / 1000u);
 | 
			
		||||
 | 
			
		||||
										size_t other_contacts {0};
 | 
			
		||||
										for (const auto& [c, syned_ts] : list) {
 | 
			
		||||
											if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
 | 
			
		||||
												//synced_by_text += "\n sself(!)"; // makes no sense
 | 
			
		||||
@@ -480,16 +485,19 @@ float ChatGui4::render(float time_delta) {
 | 
			
		||||
											} else {
 | 
			
		||||
												synced_by_text += "\n >" + (_cr.all_of<Contact::Components::Name>(c) ? _cr.get<Contact::Components::Name>(c).name : "<unk>");
 | 
			
		||||
											}
 | 
			
		||||
											other_contacts += 1;
 | 
			
		||||
											const int64_t seconds_ago = (int64_t(syned_ts / 1000u) - now_ts_s) * -1;
 | 
			
		||||
											synced_by_text += " (" + std::to_string(seconds_ago) + "sec ago)";
 | 
			
		||||
										}
 | 
			
		||||
 | 
			
		||||
										ImGui::Text("%s", synced_by_text.c_str());
 | 
			
		||||
										if (other_contacts > 0) {
 | 
			
		||||
											ImGui::Text("%s", synced_by_text.c_str());
 | 
			
		||||
										} else {
 | 
			
		||||
											ImGui::TextUnformatted("no delivery confirmation");
 | 
			
		||||
										}
 | 
			
		||||
 | 
			
		||||
										ImGui::EndTooltip();
 | 
			
		||||
									}
 | 
			
		||||
								} else {
 | 
			
		||||
									ImGui::TextDisabled("_");
 | 
			
		||||
								}
 | 
			
		||||
 | 
			
		||||
								ImGui::SameLine();
 | 
			
		||||
@@ -1051,7 +1059,7 @@ void ChatGui4::renderMessageExtra(Message3Registry& reg, const Message3 e) {
 | 
			
		||||
 | 
			
		||||
		for (const auto& [c, syned_ts] : reg.get<Message::Components::Remote::TimestampReceived>(e).ts) {
 | 
			
		||||
			if (_cr.all_of<Contact::Components::TagSelfStrong>(c)) {
 | 
			
		||||
				synced_by_text += "\n sself(!)"; // makes no sense
 | 
			
		||||
				synced_by_text += "\n sself"; // required (except when synced externally)
 | 
			
		||||
			} else if (_cr.all_of<Contact::Components::TagSelfWeak>(c)) {
 | 
			
		||||
				synced_by_text += "\n wself";
 | 
			
		||||
			} else {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										118
									
								
								src/image_loader_sdl_image.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/image_loader_sdl_image.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
 | 
			
		||||
#include <SDL3_image/SDL_image.h>
 | 
			
		||||
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
static std::optional<const char*> getExt(SDL_IOStream* ios) {
 | 
			
		||||
	if (IMG_isAVIF(ios)) {
 | 
			
		||||
		return "avif";
 | 
			
		||||
	} else if (IMG_isCUR(ios)) {
 | 
			
		||||
		return "cur";
 | 
			
		||||
	} else if (IMG_isICO(ios)) {
 | 
			
		||||
		return "ico";
 | 
			
		||||
	} else if (IMG_isBMP(ios)) {
 | 
			
		||||
		return "bmp";
 | 
			
		||||
	} else if (IMG_isGIF(ios)) {
 | 
			
		||||
		return "gif";
 | 
			
		||||
	} else if (IMG_isJPG(ios)) {
 | 
			
		||||
		return "jpg";
 | 
			
		||||
	} else if (IMG_isJXL(ios)) {
 | 
			
		||||
		return "jxl";
 | 
			
		||||
	} else if (IMG_isLBM(ios)) {
 | 
			
		||||
		return "lbm";
 | 
			
		||||
	} else if (IMG_isPCX(ios)) {
 | 
			
		||||
		return "pcx";
 | 
			
		||||
	} else if (IMG_isPNG(ios)) {
 | 
			
		||||
		return "png";
 | 
			
		||||
	} else if (IMG_isPNM(ios)) {
 | 
			
		||||
		return "pnm";
 | 
			
		||||
	} else if (IMG_isSVG(ios)) {
 | 
			
		||||
		return "svg";
 | 
			
		||||
	} else if (IMG_isTIF(ios)) {
 | 
			
		||||
		return "tiff";
 | 
			
		||||
	} else if (IMG_isXCF(ios)) {
 | 
			
		||||
		return "xcf";
 | 
			
		||||
	} else if (IMG_isXPM(ios)) {
 | 
			
		||||
		return "xpm";
 | 
			
		||||
	} else if (IMG_isXV(ios)) {
 | 
			
		||||
		return "xv";
 | 
			
		||||
	} else if (IMG_isWEBP(ios)) {
 | 
			
		||||
		return "webp";
 | 
			
		||||
	} else if (IMG_isQOI(ios)) {
 | 
			
		||||
		return "qoi";
 | 
			
		||||
	} else {
 | 
			
		||||
		return std::nullopt;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ImageLoaderSDLImage::ImageInfo ImageLoaderSDLImage::loadInfoFromMemory(const uint8_t* data, uint64_t data_size) {
 | 
			
		||||
	ImageInfo res;
 | 
			
		||||
 | 
			
		||||
	auto* ios = SDL_IOFromConstMem(data, data_size);
 | 
			
		||||
 | 
			
		||||
	// we ignore tga
 | 
			
		||||
	auto ext_opt = getExt(ios);
 | 
			
		||||
	if (!ext_opt.has_value()) {
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SDL_Surface* surf = IMG_Load_IO(ios, SDL_TRUE);
 | 
			
		||||
	if (surf == nullptr) {
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	res.width = surf->w;
 | 
			
		||||
	res.height = surf->h;
 | 
			
		||||
	res.file_ext = ext_opt.value();
 | 
			
		||||
 | 
			
		||||
	SDL_DestroySurface(surf);
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ImageLoaderSDLImage::ImageResult ImageLoaderSDLImage::loadFromMemoryRGBA(const uint8_t* data, uint64_t data_size) {
 | 
			
		||||
	ImageResult res;
 | 
			
		||||
 | 
			
		||||
	auto* ios = SDL_IOFromConstMem(data, data_size);
 | 
			
		||||
 | 
			
		||||
	// we ignore tga
 | 
			
		||||
	auto ext_opt = getExt(ios);
 | 
			
		||||
	if (!ext_opt.has_value()) {
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	IMG_Animation* anim = IMG_LoadAnimation_IO(ios, SDL_TRUE);
 | 
			
		||||
	if (anim == nullptr) {
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (int i = 0; i < anim->count; i++) {
 | 
			
		||||
		SDL_Surface* conv_surf = SDL_ConvertSurfaceFormat(anim->frames[i], SDL_PIXELFORMAT_RGBA32);
 | 
			
		||||
		if (conv_surf == nullptr) {
 | 
			
		||||
			return res;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		SDL_LockSurface(conv_surf);
 | 
			
		||||
 | 
			
		||||
		auto& new_frame = res.frames.emplace_back();
 | 
			
		||||
		new_frame.ms = anim->delays[i];
 | 
			
		||||
		new_frame.data.insert(new_frame.data.cbegin(), (const uint8_t*)conv_surf->pixels, ((const uint8_t*)conv_surf->pixels) + (anim->w*anim->h*4));
 | 
			
		||||
 | 
			
		||||
		SDL_UnlockSurface(conv_surf);
 | 
			
		||||
		SDL_DestroySurface(conv_surf);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	res.width = anim->w;
 | 
			
		||||
	res.height = anim->h;
 | 
			
		||||
	res.file_ext = ext_opt.value();
 | 
			
		||||
 | 
			
		||||
	IMG_FreeAnimation(anim);
 | 
			
		||||
 | 
			
		||||
	std::cout << "IL_SDLI: loaded img " << res.width << "x" << res.height << "\n";
 | 
			
		||||
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										9
									
								
								src/image_loader_sdl_image.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/image_loader_sdl_image.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "./image_loader.hpp"
 | 
			
		||||
 | 
			
		||||
struct ImageLoaderSDLImage : public ImageLoaderI {
 | 
			
		||||
	ImageInfo loadInfoFromMemory(const uint8_t* data, uint64_t data_size) override;
 | 
			
		||||
	ImageResult loadFromMemoryRGBA(const uint8_t* data, uint64_t data_size) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
#include "./image_loader_webp.hpp"
 | 
			
		||||
#include "./image_loader_sdl_bmp.hpp"
 | 
			
		||||
#include "./image_loader_qoi.hpp"
 | 
			
		||||
#include "./image_loader_stb.hpp"
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
 | 
			
		||||
#include <solanaceae/message3/components.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +79,7 @@ MediaMetaInfoLoader::MediaMetaInfoLoader(RegistryMessageModel& rmm) : _rmm(rmm)
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
 | 
			
		||||
 | 
			
		||||
	_rmm.subscribe(this, RegistryMessageModel_Event::message_construct);
 | 
			
		||||
	_rmm.subscribe(this, RegistryMessageModel_Event::message_updated);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,8 @@
 | 
			
		||||
 | 
			
		||||
#include "./image_loader_sdl_bmp.hpp"
 | 
			
		||||
#include "./image_loader_qoi.hpp"
 | 
			
		||||
#include "./image_loader_stb.hpp"
 | 
			
		||||
#include "./image_loader_webp.hpp"
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
#include "./media_meta_info_loader.hpp"
 | 
			
		||||
 | 
			
		||||
#include <solanaceae/message3/components.hpp>
 | 
			
		||||
@@ -22,7 +22,7 @@ MessageImageLoader::MessageImageLoader(void) {
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::optional<TextureEntry> MessageImageLoader::load(TextureUploaderI& tu, Message3Handle m) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
#include "./image_loader_stb.hpp"
 | 
			
		||||
#include "./image_loader_webp.hpp"
 | 
			
		||||
#include "./image_loader_qoi.hpp"
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
 | 
			
		||||
#include <imgui/imgui.h>
 | 
			
		||||
 | 
			
		||||
@@ -16,7 +17,7 @@ SendImagePopup::SendImagePopup(TextureUploaderI& tu) : _tu(tu) {
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SendImagePopup::reset(void) {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,8 @@
 | 
			
		||||
 | 
			
		||||
#include "./image_loader_sdl_bmp.hpp"
 | 
			
		||||
#include "./image_loader_qoi.hpp"
 | 
			
		||||
#include "./image_loader_stb.hpp"
 | 
			
		||||
#include "./image_loader_webp.hpp"
 | 
			
		||||
#include "./image_loader_sdl_image.hpp"
 | 
			
		||||
 | 
			
		||||
#include <solanaceae/contact/components.hpp>
 | 
			
		||||
#include <solanaceae/tox_contacts/components.hpp>
 | 
			
		||||
@@ -24,7 +24,7 @@ ToxAvatarLoader::ToxAvatarLoader(Contact3Registry& cr) : _cr(cr) {
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLBMP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderQOI>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderWebP>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSTB>());
 | 
			
		||||
	_image_loaders.push_back(std::make_unique<ImageLoaderSDLImage>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static float getHue_6bytes(const uint8_t* data) {
 | 
			
		||||
 
 | 
			
		||||
@@ -107,6 +107,12 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
 | 
			
		||||
	const uint64_t ts_now = Message::getTimeMS();
 | 
			
		||||
 | 
			
		||||
	if (!_cr.all_of<Contact::Components::Self>(c)) {
 | 
			
		||||
		return dfmc_Ret::NO_MSG; // error
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const auto self_c = _cr.get<Contact::Components::Self>(c).self;
 | 
			
		||||
 | 
			
		||||
	// filter for unconfirmed messages
 | 
			
		||||
 | 
			
		||||
	// we assume sorted
 | 
			
		||||
@@ -127,9 +133,8 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
			continue; // skip
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// exclude
 | 
			
		||||
		if (mr->any_of<
 | 
			
		||||
				Message::Components::Remote::TimestampReceived // this acts like a tag, which is wrong in groups
 | 
			
		||||
		if (!mr->any_of<
 | 
			
		||||
				Message::Components::Remote::TimestampReceived
 | 
			
		||||
			>(msg)
 | 
			
		||||
		) {
 | 
			
		||||
			continue; // skip
 | 
			
		||||
@@ -139,6 +144,16 @@ ToxFriendFauxOfflineMessaging::dfmc_Ret ToxFriendFauxOfflineMessaging::doFriendM
 | 
			
		||||
			continue; // not outbound (in private)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const auto& ts_received = mr->get<Message::Components::Remote::TimestampReceived>(msg).ts;
 | 
			
		||||
		// not target
 | 
			
		||||
		if (ts_received.contains(c)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		// needs to contain self
 | 
			
		||||
		if (!ts_received.contains(self_c)) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		valid_unsent = true;
 | 
			
		||||
 | 
			
		||||
		uint64_t msg_ts = msg_view.get<Message::Components::Timestamp>(msg).ts;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user