/*
 * Copyright (c) 2012-2013 Etnaviv Project
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

/* Misc util */
#ifndef H_ETNA_UTIL
#define H_ETNA_UTIL

#include <stdint.h>
#include <stdlib.h>
#include <math.h>

#define ETNA_MALLOC(_size) malloc(_size)
#define ETNA_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
#define ETNA_CALLOC_STRUCT_ARRAY(N, T)   (struct T *) calloc((N), sizeof(struct T))
#define ETNA_FREE(_ptr) free(_ptr)

#define COND(bool, val) ((bool) ? (val) : 0)

/* align to a value divisable by granularity >= value, works only for powers of two */
static inline uint32_t etna_align_up(uint32_t value, uint32_t granularity)
{
    return (value + (granularity-1)) & (~(granularity-1));
}
/* align to a value divisable by granularity <= value, works only for powers of two */
static inline uint32_t etna_align_down(uint32_t value, uint32_t granularity)
{
    return (value) & (~(granularity-1));
}

static inline uint32_t etna_umin(uint32_t a, uint32_t b) { return (a<b)?a:b; }
static inline uint32_t etna_umax(uint32_t a, uint32_t b) { return (a>b)?a:b; }
static inline uint32_t etna_smin(int32_t a, int32_t b) { return (a<b)?a:b; }
static inline uint32_t etna_smax(int32_t a, int32_t b) { return (a>b)?a:b; }
static inline uint32_t etna_bits_ones(unsigned num) { return (1<<num)-1; }

/* clamped float [0.0 .. 1.0] -> [0 .. 255] */
static inline uint8_t etna_cfloat_to_uint8(float f)
{
    if(f<=0.0f) return 0;
    if(f>=(1.0f-1.0f/256.0f)) return 255;
    return f * 256.0f;
}

/* clamped float [0.0 .. 1.0] -> [0 .. (1<<bits)-1] */
static inline uint32_t etna_cfloat_to_uintN(float f, int bits)
{
    if(f<=0.0f) return 0;
    if(f>=(1.0f-1.0f/(1<<bits))) return (1<<bits)-1;
    return f * (1<<bits);
}

/* binary reinterpretation of f32 as u32 */
static inline uint32_t etna_f32_to_u32(float value)
{
    union {
        uint32_t u32;
        float f32;
    } x = { .f32 = value };
    return x.u32;
}

/* 1/log10(2) */
#define RCPLOG2 (1.4426950408889634f)

/* float to fixp 5.5 */
static inline uint32_t etna_float_to_fixp55(float f)
{
    if(f >= 15.953125f) return 511;
    if(f < -16.0f) return 512;
    return (int32_t) (f * 32.0f + 0.5f);
}

/* float to fixp 16.16 */
static inline uint32_t etna_f32_to_fixp16(float f)
{
    if(f >= (32768.0f-1.0f/65536.0f)) return 0x7fffffff;
    if(f < -32768.0f) return 0x80000000;
    return (int32_t) (f * 65536.0f + 0.5f);
}

/* texture size to log2 in fixp 5.5 format */
static inline uint32_t etna_log2_fixp55(unsigned width)
{
    return etna_float_to_fixp55(logf((float)width) * RCPLOG2);
}

/* clamp float to 0.0..1.0 */
static inline float etna_clampf(float x)
{
    if (x < 0.0f)
        return 0.0f;
    else if (x > 1.0f)
        return 1.0f;
    else
        return x;
}

#endif

