185 lines
4.3 KiB
C++
185 lines
4.3 KiB
C++
/* Freetype GL - A C OpenGL Freetype engine
|
|
*
|
|
* Distributed under the OSI-approved BSD 2-Clause License. See accompanying
|
|
* file `LICENSE` for more details.
|
|
* ============================================================================
|
|
*
|
|
*
|
|
* This source is based on the article by Jukka Jylänki :
|
|
* "A Thousand Ways to Pack the Bin - A Practical Approach to
|
|
* Two-Dimensional Rectangle Bin Packing", February 27, 2010.
|
|
*
|
|
* More precisely, this is an implementation of the Skyline Bottom-Left
|
|
* algorithm based on C++ sources provided by Jukka Jylänki at:
|
|
* http://clb.demon.fi/files/RectangleBinPack/
|
|
*
|
|
* ============================================================================
|
|
*/
|
|
#ifndef __TEXTURE_ATLAS_H__
|
|
#define __TEXTURE_ATLAS_H__
|
|
|
|
#include <stdlib.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "vector.h"
|
|
#include "vec234.h"
|
|
|
|
#ifdef __cplusplus
|
|
namespace ftgl
|
|
{
|
|
#endif
|
|
|
|
/**
|
|
* @file texture-atlas.h
|
|
* @author Nicolas Rougier (Nicolas.Rougier@inria.fr)
|
|
*
|
|
* @defgroup texture-atlas Texture atlas
|
|
*
|
|
* A texture atlas is used to pack several small regions into a single texture.
|
|
*
|
|
* The actual implementation is based on the article by Jukka Jylänki : "A
|
|
* Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional
|
|
* Rectangle Bin Packing", February 27, 2010.
|
|
* More precisely, this is an implementation of the Skyline Bottom-Left
|
|
* algorithm based on C++ sources provided by Jukka Jylänki at:
|
|
* http://clb.demon.fi/files/RectangleBinPack/
|
|
*
|
|
*
|
|
* Example Usage:
|
|
* @code
|
|
* #include "texture-atlas.h"
|
|
*
|
|
* ...
|
|
*
|
|
* / Creates a new atlas of 512x512 with a depth of 1
|
|
* texture_atlas_t * atlas = texture_atlas_new( 512, 512, 1 );
|
|
*
|
|
* // Allocates a region of 20x20
|
|
* ivec4 region = texture_atlas_get_region( atlas, 20, 20 );
|
|
*
|
|
* // Fill region with some data
|
|
* texture_atlas_set_region( atlas, region.x, region.y, region.width,
|
|
* region.height, data, stride )
|
|
*
|
|
* ...
|
|
*
|
|
* @endcode
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* A texture atlas is used to pack several small regions into a single texture.
|
|
*/
|
|
typedef struct texture_atlas_t
|
|
{
|
|
/**
|
|
* Allocated nodes
|
|
*/
|
|
vector_t *nodes;
|
|
|
|
/**
|
|
* Width (in pixels) of the underlying texture
|
|
*/
|
|
size_t width;
|
|
|
|
/**
|
|
* Height (in pixels) of the underlying texture
|
|
*/
|
|
size_t height;
|
|
|
|
/**
|
|
* Depth (in bytes) of the underlying texture
|
|
*/
|
|
size_t depth;
|
|
|
|
/**
|
|
* Allocated surface size
|
|
*/
|
|
size_t used;
|
|
|
|
/**
|
|
* Texture identity (OpenGL)
|
|
*/
|
|
unsigned int id;
|
|
|
|
/**
|
|
* Atlas data
|
|
*/
|
|
unsigned char *data;
|
|
|
|
/**
|
|
* Custom field
|
|
*/
|
|
char dirty;
|
|
|
|
} texture_atlas_t;
|
|
|
|
/**
|
|
* Creates a new empty texture atlas.
|
|
*
|
|
* @param width width of the atlas
|
|
* @param height height of the atlas
|
|
* @param depth bit depth of the atlas
|
|
* @return a new empty texture atlas.
|
|
*
|
|
*/
|
|
texture_atlas_t *texture_atlas_new(const size_t width, const size_t height,
|
|
const size_t depth);
|
|
|
|
/**
|
|
* Deletes a texture atlas.
|
|
*
|
|
* @param self a texture atlas structure
|
|
*
|
|
*/
|
|
void texture_atlas_delete(texture_atlas_t *self);
|
|
|
|
/**
|
|
* Allocate a new region in the atlas.
|
|
*
|
|
* @param self a texture atlas structure
|
|
* @param width width of the region to allocate
|
|
* @param height height of the region to allocate
|
|
* @return Coordinates of the allocated region
|
|
*
|
|
*/
|
|
ivec4 texture_atlas_get_region(texture_atlas_t *self, const size_t width,
|
|
const size_t height);
|
|
|
|
/**
|
|
* Upload data to the specified atlas region.
|
|
*
|
|
* @param self a texture atlas structure
|
|
* @param x x coordinate the region
|
|
* @param y y coordinate the region
|
|
* @param width width of the region
|
|
* @param height height of the region
|
|
* @param data data to be uploaded into the specified region
|
|
* @param stride stride of the data
|
|
*
|
|
*/
|
|
void texture_atlas_set_region(texture_atlas_t *self, const size_t x,
|
|
const size_t y, const size_t width,
|
|
const size_t height, const unsigned char *data,
|
|
const size_t stride);
|
|
|
|
/**
|
|
* Remove all allocated regions from the atlas.
|
|
*
|
|
* @param self a texture atlas structure
|
|
*/
|
|
void texture_atlas_clear(texture_atlas_t *self);
|
|
|
|
/** @} */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#endif /* __TEXTURE_ATLAS_H__ */
|