blob: d5e13bfd2e4a3e9666cf6f28fa3a932ff60a70e9 [file]
/*
* Copyright 2012 Google, Inc. All Rights Reserved.
*
* Google Author(s): Behdad Esfahbod, Maysum Panju
*/
#ifndef DEMO_COMMON_H
#define DEMO_COMMON_H
#include <hb.h>
#include <hb-gpu.h>
#include "hb.hh"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <algorithm>
#include <vector>
#ifndef HB_GPU_NO_GLFW
#include <GL/glew.h>
#ifdef __APPLE__
# define GL_SILENCE_DEPRECATION
# include <OpenGL/OpenGL.h>
#endif
#include <GLFW/glfw3.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
extern int hb_gpu_demo_quiet;
#ifdef __cplusplus
}
#endif
#define LOGI(...) ((void) (hb_gpu_demo_quiet ? 0 : fprintf (stderr, __VA_ARGS__)))
#define LOGW(...) ((void) fprintf (stderr, __VA_ARGS__))
#define LOGE(...) ((void) fprintf (stderr, __VA_ARGS__), abort ())
#define ARRAY_LEN(Array) (sizeof (Array) / sizeof (*Array))
#define gl(name) \
for (GLint __ee, __ii = 0; \
__ii < 1; \
(__ii++, \
(__ee = glGetError()) && \
(fprintf (stderr, "gl" #name " failed with error %d on line %d\n", __ee, __LINE__), abort (), 0))) \
gl##name
static inline void
die (const char *msg)
{
fprintf (stderr, "%s\n", msg);
exit (1);
}
template <typename T>
T clamp (T v, T m, T M)
{
return v < m ? m : v > M ? M : v;
}
/* Simple extents/point types for the demo, matching glyphy's layout */
typedef struct {
double x;
double y;
} demo_point_t;
typedef struct {
double min_x;
double min_y;
double max_x;
double max_y;
} demo_extents_t;
static inline void
demo_extents_clear (demo_extents_t *extents)
{
extents->min_x = extents->min_y = 1e308;
extents->max_x = extents->max_y = -1e308;
}
static inline int
demo_extents_is_empty (const demo_extents_t *extents)
{
return extents->min_x > extents->max_x;
}
static inline void
demo_extents_add (demo_extents_t *extents, const demo_point_t *p)
{
if (demo_extents_is_empty (extents)) {
extents->min_x = extents->max_x = p->x;
extents->min_y = extents->max_y = p->y;
return;
}
extents->min_x = hb_min (extents->min_x, p->x);
extents->min_y = hb_min (extents->min_y, p->y);
extents->max_x = hb_max (extents->max_x, p->x);
extents->max_y = hb_max (extents->max_y, p->y);
}
static inline void
demo_extents_extend (demo_extents_t *extents, const demo_extents_t *other)
{
if (demo_extents_is_empty (other))
return;
if (demo_extents_is_empty (extents)) {
*extents = *other;
return;
}
extents->min_x = hb_min (extents->min_x, other->min_x);
extents->min_y = hb_min (extents->min_y, other->min_y);
extents->max_x = hb_max (extents->max_x, other->max_x);
extents->max_y = hb_max (extents->max_y, other->max_y);
}
#endif /* DEMO_COMMON_H */