src/libm/math_private.h
author Sam Lantinga <slouken@libsdl.org>
Mon, 22 Jun 2015 23:36:06 -0700
changeset 9776 952ff8a5076f
parent 9080 2e4e71ec140f
child 11683 48bcba563d9c
permissions -rw-r--r--
Fixed bug 3030 - SDL_RecreateWindow fails to restore title, icon, etc.

Adam M.

It loses the title and icon when window recreation fails. For instance, this may happen when trying to create an OpenGL ES window on a system that doesn't support it. But at that point, the title and icon have already been lost.
slouken@2756
     1
/*
slouken@2756
     2
 * ====================================================
slouken@2756
     3
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
slouken@2756
     4
 *
slouken@2756
     5
 * Developed at SunPro, a Sun Microsystems, Inc. business.
slouken@2756
     6
 * Permission to use, copy, modify, and distribute this
slouken@2756
     7
 * software is freely granted, provided that this notice
slouken@2756
     8
 * is preserved.
slouken@2756
     9
 * ====================================================
slouken@2756
    10
 */
slouken@2756
    11
slouken@2756
    12
/*
slouken@2756
    13
 * from: @(#)fdlibm.h 5.1 93/09/24
slouken@2756
    14
 * $Id: math_private.h,v 1.3 2004/02/09 07:10:38 andersen Exp $
slouken@2756
    15
 */
slouken@2756
    16
slouken@2756
    17
#ifndef _MATH_PRIVATE_H_
slouken@2756
    18
#define _MATH_PRIVATE_H_
slouken@2756
    19
gabomdq@7678
    20
/* #include <endian.h> */
Daniel@4909
    21
#include "SDL_endian.h"
gabomdq@7678
    22
/* #include <sys/types.h> */
slouken@2756
    23
slouken@2756
    24
#define attribute_hidden
slouken@2756
    25
#define libm_hidden_proto(x)
slouken@2756
    26
#define libm_hidden_def(x)
slouken@2756
    27
icculus@7404
    28
#ifndef __HAIKU__ /* already defined in a system header. */
slouken@2760
    29
typedef unsigned int u_int32_t;
icculus@7404
    30
#endif
slouken@2760
    31
slouken@7351
    32
#define atan            SDL_uclibc_atan
slouken@7351
    33
#define __ieee754_atan2 SDL_uclibc_atan2
slouken@7351
    34
#define copysign        SDL_uclibc_copysign
slouken@7351
    35
#define cos             SDL_uclibc_cos
slouken@7351
    36
#define fabs            SDL_uclibc_fabs
slouken@7351
    37
#define floor           SDL_uclibc_floor
slouken@7351
    38
#define __ieee754_log   SDL_uclibc_log
slouken@7351
    39
#define __ieee754_pow   SDL_uclibc_pow
slouken@7351
    40
#define scalbn          SDL_uclibc_scalbn
slouken@7351
    41
#define sin             SDL_uclibc_sin
slouken@7351
    42
#define __ieee754_sqrt  SDL_uclibc_sqrt
slouken@8840
    43
#define tan             SDL_uclibc_tan
slouken@7351
    44
slouken@2756
    45
/* The original fdlibm code used statements like:
slouken@2756
    46
	n0 = ((*(int*)&one)>>29)^1;		* index of high word *
slouken@2756
    47
	ix0 = *(n0+(int*)&x);			* high word of x *
slouken@2756
    48
	ix1 = *((1-n0)+(int*)&x);		* low word of x *
slouken@2756
    49
   to dig two 32 bit words out of the 64 bit IEEE floating point
slouken@2756
    50
   value.  That is non-ANSI, and, moreover, the gcc instruction
slouken@2756
    51
   scheduler gets it wrong.  We instead use the following macros.
slouken@2756
    52
   Unlike the original code, we determine the endianness at compile
slouken@2756
    53
   time, not at run time; I don't see much benefit to selecting
slouken@2756
    54
   endianness at run time.  */
slouken@2756
    55
slouken@2756
    56
/* A union which permits us to convert between a double and two 32 bit
slouken@2756
    57
   ints.  */
slouken@2756
    58
slouken@2756
    59
/*
slouken@2756
    60
 * Math on arm is special:
slouken@2756
    61
 * For FPA, float words are always big-endian.
slouken@2756
    62
 * For VFP, floats words follow the memory system mode.
slouken@2756
    63
 */
slouken@2756
    64
Daniel@4909
    65
#if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
slouken@2756
    66
slouken@2756
    67
typedef union
slouken@2756
    68
{
slouken@2756
    69
    double value;
slouken@2756
    70
    struct
slouken@2756
    71
    {
slouken@2756
    72
        u_int32_t msw;
slouken@2756
    73
        u_int32_t lsw;
slouken@2756
    74
    } parts;
slouken@2756
    75
} ieee_double_shape_type;
slouken@2756
    76
slouken@2756
    77
#else
slouken@2756
    78
slouken@2756
    79
typedef union
slouken@2756
    80
{
slouken@2756
    81
    double value;
slouken@2756
    82
    struct
slouken@2756
    83
    {
slouken@2756
    84
        u_int32_t lsw;
slouken@2756
    85
        u_int32_t msw;
slouken@2756
    86
    } parts;
slouken@2756
    87
} ieee_double_shape_type;
slouken@2756
    88
slouken@2756
    89
#endif
slouken@2756
    90
slouken@2756
    91
/* Get two 32 bit ints from a double.  */
slouken@2756
    92
slouken@2756
    93
#define EXTRACT_WORDS(ix0,ix1,d)				\
slouken@2756
    94
do {								\
slouken@2756
    95
  ieee_double_shape_type ew_u;					\
slouken@2756
    96
  ew_u.value = (d);						\
slouken@2756
    97
  (ix0) = ew_u.parts.msw;					\
slouken@2756
    98
  (ix1) = ew_u.parts.lsw;					\
slouken@2756
    99
} while (0)
slouken@2756
   100
slouken@2756
   101
/* Get the more significant 32 bit int from a double.  */
slouken@2756
   102
slouken@2756
   103
#define GET_HIGH_WORD(i,d)					\
slouken@2756
   104
do {								\
slouken@2756
   105
  ieee_double_shape_type gh_u;					\
slouken@2756
   106
  gh_u.value = (d);						\
slouken@2756
   107
  (i) = gh_u.parts.msw;						\
slouken@2756
   108
} while (0)
slouken@2756
   109
slouken@2756
   110
/* Get the less significant 32 bit int from a double.  */
slouken@2756
   111
slouken@2756
   112
#define GET_LOW_WORD(i,d)					\
slouken@2756
   113
do {								\
slouken@2756
   114
  ieee_double_shape_type gl_u;					\
slouken@2756
   115
  gl_u.value = (d);						\
slouken@2756
   116
  (i) = gl_u.parts.lsw;						\
slouken@2756
   117
} while (0)
slouken@2756
   118
slouken@2756
   119
/* Set a double from two 32 bit ints.  */
slouken@2756
   120
slouken@2756
   121
#define INSERT_WORDS(d,ix0,ix1)					\
slouken@2756
   122
do {								\
slouken@2756
   123
  ieee_double_shape_type iw_u;					\
slouken@2756
   124
  iw_u.parts.msw = (ix0);					\
slouken@2756
   125
  iw_u.parts.lsw = (ix1);					\
slouken@2756
   126
  (d) = iw_u.value;						\
slouken@2756
   127
} while (0)
slouken@2756
   128
slouken@2756
   129
/* Set the more significant 32 bits of a double from an int.  */
slouken@2756
   130
slouken@2756
   131
#define SET_HIGH_WORD(d,v)					\
slouken@2756
   132
do {								\
slouken@2756
   133
  ieee_double_shape_type sh_u;					\
slouken@2756
   134
  sh_u.value = (d);						\
slouken@2756
   135
  sh_u.parts.msw = (v);						\
slouken@2756
   136
  (d) = sh_u.value;						\
slouken@2756
   137
} while (0)
slouken@2756
   138
slouken@2756
   139
/* Set the less significant 32 bits of a double from an int.  */
slouken@2756
   140
slouken@2756
   141
#define SET_LOW_WORD(d,v)					\
slouken@2756
   142
do {								\
slouken@2756
   143
  ieee_double_shape_type sl_u;					\
slouken@2756
   144
  sl_u.value = (d);						\
slouken@2756
   145
  sl_u.parts.lsw = (v);						\
slouken@2756
   146
  (d) = sl_u.value;						\
slouken@2756
   147
} while (0)
slouken@2756
   148
slouken@2756
   149
/* A union which permits us to convert between a float and a 32 bit
slouken@2756
   150
   int.  */
slouken@2756
   151
slouken@2756
   152
typedef union
slouken@2756
   153
{
slouken@2756
   154
    float value;
slouken@2756
   155
    u_int32_t word;
slouken@2756
   156
} ieee_float_shape_type;
slouken@2756
   157
slouken@2756
   158
/* Get a 32 bit int from a float.  */
slouken@2756
   159
slouken@2756
   160
#define GET_FLOAT_WORD(i,d)					\
slouken@2756
   161
do {								\
slouken@2756
   162
  ieee_float_shape_type gf_u;					\
slouken@2756
   163
  gf_u.value = (d);						\
slouken@2756
   164
  (i) = gf_u.word;						\
slouken@2756
   165
} while (0)
slouken@2756
   166
slouken@2756
   167
/* Set a float from a 32 bit int.  */
slouken@2756
   168
slouken@2756
   169
#define SET_FLOAT_WORD(d,i)					\
slouken@2756
   170
do {								\
slouken@2756
   171
  ieee_float_shape_type sf_u;					\
slouken@2756
   172
  sf_u.word = (i);						\
slouken@2756
   173
  (d) = sf_u.value;						\
slouken@2756
   174
} while (0)
slouken@2756
   175
slouken@2756
   176
/* ieee style elementary functions */
slouken@2756
   177
extern double
slouken@2756
   178
__ieee754_sqrt(double)
slouken@2756
   179
    attribute_hidden;
slouken@2756
   180
     extern double __ieee754_acos(double) attribute_hidden;
slouken@2756
   181
     extern double __ieee754_acosh(double) attribute_hidden;
slouken@2756
   182
     extern double __ieee754_log(double) attribute_hidden;
slouken@2756
   183
     extern double __ieee754_atanh(double) attribute_hidden;
slouken@2756
   184
     extern double __ieee754_asin(double) attribute_hidden;
slouken@2756
   185
     extern double __ieee754_atan2(double, double) attribute_hidden;
slouken@2756
   186
     extern double __ieee754_exp(double) attribute_hidden;
slouken@2756
   187
     extern double __ieee754_cosh(double) attribute_hidden;
slouken@2756
   188
     extern double __ieee754_fmod(double, double) attribute_hidden;
slouken@2756
   189
     extern double __ieee754_pow(double, double) attribute_hidden;
slouken@2756
   190
     extern double __ieee754_lgamma_r(double, int *) attribute_hidden;
slouken@2756
   191
     extern double __ieee754_gamma_r(double, int *) attribute_hidden;
slouken@2756
   192
     extern double __ieee754_lgamma(double) attribute_hidden;
slouken@2756
   193
     extern double __ieee754_gamma(double) attribute_hidden;
slouken@2756
   194
     extern double __ieee754_log10(double) attribute_hidden;
slouken@2756
   195
     extern double __ieee754_sinh(double) attribute_hidden;
slouken@2756
   196
     extern double __ieee754_hypot(double, double) attribute_hidden;
slouken@2756
   197
     extern double __ieee754_j0(double) attribute_hidden;
slouken@2756
   198
     extern double __ieee754_j1(double) attribute_hidden;
slouken@2756
   199
     extern double __ieee754_y0(double) attribute_hidden;
slouken@2756
   200
     extern double __ieee754_y1(double) attribute_hidden;
slouken@2756
   201
     extern double __ieee754_jn(int, double) attribute_hidden;
slouken@2756
   202
     extern double __ieee754_yn(int, double) attribute_hidden;
slouken@2756
   203
     extern double __ieee754_remainder(double, double) attribute_hidden;
slouken@2756
   204
     extern int __ieee754_rem_pio2(double, double *) attribute_hidden;
slouken@2756
   205
#if defined(_SCALB_INT)
slouken@2756
   206
     extern double __ieee754_scalb(double, int) attribute_hidden;
slouken@2756
   207
#else
slouken@2756
   208
     extern double __ieee754_scalb(double, double) attribute_hidden;
slouken@2756
   209
#endif
slouken@2756
   210
slouken@2756
   211
/* fdlibm kernel function */
slouken@2756
   212
#ifndef _IEEE_LIBM
slouken@2756
   213
     extern double __kernel_standard(double, double, int) attribute_hidden;
slouken@2756
   214
#endif
slouken@2756
   215
     extern double __kernel_sin(double, double, int) attribute_hidden;
slouken@2756
   216
     extern double __kernel_cos(double, double) attribute_hidden;
slouken@2756
   217
     extern double __kernel_tan(double, double, int) attribute_hidden;
slouken@2756
   218
     extern int __kernel_rem_pio2(double *, double *, int, int, int,
slouken@2756
   219
                                  const int *) attribute_hidden;
slouken@2756
   220
slouken@2756
   221
#endif /* _MATH_PRIVATE_H_ */