Skip to content

Commit 16de641

Browse files
committed
fix issues with themes on HiDPI screens and strict aliasing violations in byte swapping
1 parent 0bcdfdb commit 16de641

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

src/endian-utils.h

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <cstddef>
1010
#include <cstdint>
1111
#include <cstring>
12+
#include <type_traits>
1213

1314
//! Endianness indicator
1415
enum class Endian
@@ -46,24 +47,39 @@ inline Endian host_endian() { return is_little_endian() ? Endian::Little : Endia
4647
template <typename T>
4748
inline T swap_bytes(T value)
4849
{
50+
static_assert(std::is_trivially_copyable_v<T>, "swap_bytes requires trivially copyable types");
51+
4952
if constexpr (sizeof(T) == 1)
5053
{
5154
return value;
5255
}
56+
5357
else if constexpr (sizeof(T) == 2)
5458
{
55-
uint16_t swapped = byte_swap_16(*reinterpret_cast<uint16_t *>(&value));
56-
return *reinterpret_cast<T *>(&swapped);
59+
uint16_t tmp = 0;
60+
std::memcpy(&tmp, &value, sizeof(tmp));
61+
tmp = byte_swap_16(tmp);
62+
T out;
63+
std::memcpy(&out, &tmp, sizeof(tmp));
64+
return out;
5765
}
5866
else if constexpr (sizeof(T) == 4)
5967
{
60-
uint32_t swapped = byte_swap_32(*reinterpret_cast<uint32_t *>(&value));
61-
return *reinterpret_cast<T *>(&swapped);
68+
uint32_t tmp = 0;
69+
std::memcpy(&tmp, &value, sizeof(tmp));
70+
tmp = byte_swap_32(tmp);
71+
T out;
72+
std::memcpy(&out, &tmp, sizeof(tmp));
73+
return out;
6274
}
6375
else if constexpr (sizeof(T) == 8)
6476
{
65-
uint64_t swapped = byte_swap_64(*reinterpret_cast<uint64_t *>(&value));
66-
return *reinterpret_cast<T *>(&swapped);
77+
uint64_t tmp = 0;
78+
std::memcpy(&tmp, &value, sizeof(tmp));
79+
tmp = byte_swap_64(tmp);
80+
T out;
81+
std::memcpy(&out, &tmp, sizeof(tmp));
82+
return out;
6783
}
6884
else
6985
{

src/imageio/exif.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "exif.h"
22
#include "endian-utils.h"
3-
#include "fwd.h"
43
#include "json.h"
54
#include <cstdint>
65
#include <cstdio>
@@ -96,8 +95,9 @@ static json get_value(int format, size_t components, const uint8_t *data, Endian
9695
vector<double> vals;
9796
for (unsigned int i = 0; i < components; i++)
9897
{
99-
auto r = read_as<uint2>(&data[sizeof(uint2) * i], data_endian);
100-
vals.push_back(double(r.x) / r.y);
98+
auto num = read_as<uint32_t>(&data[sizeof(uint32_t) * (2 * i + 0)], data_endian);
99+
auto den = read_as<uint32_t>(&data[sizeof(uint32_t) * (2 * i + 1)], data_endian);
100+
vals.push_back(double(num) / den);
101101
}
102102
return vals.size() == 1 ? json(vals[0]) : json(vals);
103103
}
@@ -107,8 +107,9 @@ static json get_value(int format, size_t components, const uint8_t *data, Endian
107107
vector<double> vals;
108108
for (unsigned int i = 0; i < components; i++)
109109
{
110-
auto r = read_as<int2>(&data[sizeof(int2) * i], data_endian);
111-
vals.push_back(double(r.x) / r.y);
110+
auto num = read_as<int32_t>(&data[sizeof(int32_t) * (2 * i + 0)], data_endian);
111+
auto den = read_as<int32_t>(&data[sizeof(int32_t) * (2 * i + 1)], data_endian);
112+
vals.push_back(double(num) / den);
112113
}
113114
return vals.size() == 1 ? json(vals[0]) : json(vals);
114115
}

src/theme.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ static void apply_hdrview_dark_theme()
1717
ImGuiStyle &style = ImGui::GetStyle();
1818
style = ImGuiStyle(); // resets all fields to default values
1919

20-
style.FontSizeBase = 14.0f; // base font size
21-
// style._NextFrameFontSizeBase = style.FontSizeBase; // FIXME: Temporary hack until we finish remaining work.
2220
// make things like radio buttons look nice and round
2321
style.CircleTessellationMaxError = 0.1f;
2422

@@ -109,8 +107,6 @@ static void apply_hdrview_light_theme()
109107
ImGuiStyle &style = ImGui::GetStyle();
110108
style = ImGuiStyle(); // resets all fields to default values
111109

112-
style.FontSizeBase = 14.0f; // base font size
113-
// style._NextFrameFontSizeBase = style.FontSizeBase; // FIXME: Temporary hack until we finish remaining work.
114110
// make things like radio buttons look nice and round
115111
style.CircleTessellationMaxError = 0.1f;
116112

0 commit comments

Comments
 (0)