Coverage Report

Created: 2026-10-28 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libetonyek/src/lib/libetonyek_utils.h
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/*
3
 * This file is part of the libetonyek project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 */
9
10
#ifndef LIBETONYEK_UTILS_H_INCLUDED
11
#define LIBETONYEK_UTILS_H_INCLUDED
12
13
#ifdef HAVE_CONFIG_H
14
#include "config.h"
15
#endif
16
17
#include <cmath>
18
#include <memory>
19
#include <string>
20
21
#include <boost/cstdint.hpp>
22
23
#include <librevenge/librevenge.h>
24
#include <librevenge-stream/librevenge-stream.h>
25
26
#define ETONYEK_EPSILON 1e-9
27
#define ETONYEK_ALMOST_ZERO(x) (std::fabs(x) < ETONYEK_EPSILON)
28
29
0
#define ETONYEK_NUM_ELEMENTS(array) (sizeof(array) / sizeof((array)[0]))
30
31
#if defined(HAVE_FUNC_ATTRIBUTE_FORMAT)
32
#  define ETONYEK_ATTRIBUTE_PRINTF(fmt, arg) __attribute__((__format__(__printf__, fmt, arg)))
33
#else
34
#  define ETONYEK_ATTRIBUTE_PRINTF(fmt, arg)
35
#endif
36
37
#if defined(HAVE_CLANG_ATTRIBUTE_FALLTHROUGH)
38
0
#  define ETONYEK_FALLTHROUGH [[clang::fallthrough]]
39
#elif defined(HAVE_GCC_ATTRIBUTE_FALLTHROUGH)
40
#  define ETONYEK_FALLTHROUGH __attribute__((fallthrough))
41
#else
42
#  define ETONYEK_FALLTHROUGH ((void) 0)
43
#endif
44
45
// do nothing with debug messages in a release compile
46
#ifdef DEBUG
47
namespace libetonyek
48
{
49
void debugPrint(const char *format, ...) ETONYEK_ATTRIBUTE_PRINTF(1, 2);
50
}
51
#define ETONYEK_DEBUG_MSG(M) libetonyek::debugPrint M
52
#define ETONYEK_DEBUG(M) M
53
#else
54
#define ETONYEK_DEBUG_MSG(M)
55
#define ETONYEK_DEBUG(M)
56
#endif
57
58
namespace libetonyek
59
{
60
61
struct IWORKColor;
62
struct IWORKGradient;
63
struct IWORKStroke;
64
65
/* Constants */
66
const double etonyek_half_pi(1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404326e+00);
67
const double etonyek_third_pi(1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550e+00);
68
const double etonyek_pi(3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+00);
69
const double etonyek_two_pi(6.28318530717958647692528676655900576839433879875021164194988918461563281257241799725606965068423413596429617303e+00);
70
71
const double etonyek_root_three(1.73205080756887729352744634150587236694280525381038062805580697945193301690880003708114618675724857567562614142e+00);
72
const double etonyek_root_two(1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623e+00);
73
74
// Apple Numbers timestamp starts from 01 Jan 2001 00:00:00
75
const unsigned ETONYEK_EPOCH_BEGIN(978307200);
76
77
struct EtonyekDummyDeleter
78
{
79
11
  void operator()(void *) {}
80
};
81
82
typedef std::shared_ptr<librevenge::RVNGInputStream> RVNGInputStreamPtr_t;
83
84
uint8_t readU8(const RVNGInputStreamPtr_t &input, bool = false);
85
uint16_t readU16(const RVNGInputStreamPtr_t &input, bool bigEndian=false);
86
uint32_t readU32(const RVNGInputStreamPtr_t &input, bool bigEndian=false);
87
uint64_t readU64(const RVNGInputStreamPtr_t &input, bool bigEndian=false);
88
89
uint64_t readUVar(const RVNGInputStreamPtr_t &input);
90
int64_t readSVar(const RVNGInputStreamPtr_t &input);
91
92
double readDouble(const RVNGInputStreamPtr_t &input);
93
float readFloat(const RVNGInputStreamPtr_t &input);
94
95
unsigned long getLength(const RVNGInputStreamPtr_t &input);
96
unsigned long getRemainingLength(const RVNGInputStreamPtr_t &input);
97
98
/** Test two floating point numbers for equality.
99
  *
100
  * @arg[in] x first number
101
  * @arg[in] y second number
102
  * @arg[in] eps precision
103
  */
104
bool approxEqual(double x, double y, double eps = ETONYEK_EPSILON);
105
106
template<class T>
107
bool approxEqual(const T &left, const T &right, const double eps = ETONYEK_EPSILON)
108
{
109
  assert(left.length() == right.length());
110
111
  for (int i = 0; i != left.length(); ++i)
112
  {
113
    if (!approxEqual(left[i], right[i], eps))
114
      return false;
115
  }
116
  return true;
117
}
118
119
/** Convert a length from points to inches.
120
  *
121
  * @arg[in] d length in points
122
  * @returns length in inches
123
  */
124
double pt2in(double d);
125
126
/** Convert an angle from degrees to radians.
127
  *
128
  * @arg[in] value angle in degrees
129
  * @returns the same angle in radians
130
  */
131
double deg2rad(double value);
132
133
/** Convert an angle from radians to degrees.
134
  *
135
  * @arg[in] value angle in radians
136
  * @returns the same angle in degrees
137
  */
138
double rad2deg(double value);
139
140
librevenge::RVNGString makeColor(const IWORKColor &color);
141
/** Compute the average color of a gradient and return it as a string.
142
   */
143
librevenge::RVNGString makeColor(const IWORKGradient &gradient);
144
145
void writeBorder(const IWORKStroke &stroke, const char *name, librevenge::RVNGPropertyList &props);
146
147
std::string detectMimetype(const RVNGInputStreamPtr_t &stream);
148
bool detectImageDimension(const RVNGInputStreamPtr_t &stream, double &width, double &height);
149
150
class EndOfStreamException
151
{
152
};
153
154
class GenericException
155
{
156
};
157
158
} // namespace libetonyek
159
160
#endif // LIBETONYEK_UTILS_H_INCLUDED
161
162
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */