Exemplo n.º 1
0
int bp2d_insert(bp2d_node *node, const bp2d_size *in_size, bp2d_position *out_pos)
{
	if (node->left != NULL || node->right != NULL) {
		int ret = bp2d_insert(node->left, in_size, out_pos);
		if (ret == 0) {
			return bp2d_insert(node->right, in_size, out_pos);
		}
		return ret;
	} else {
		if (node->filled)
			return 0;

		if (in_size->w > node->rect.w || in_size->h > node->rect.h)
			return 0;

		if (in_size->w == node->rect.w && in_size->h == node->rect.h) {
			out_pos->x = node->rect.x;
			out_pos->y = node->rect.y;
			node->filled = 1;
			return 1;
		}

		int dw = node->rect.w - in_size->w;
		int dh = node->rect.h - in_size->h;

		bp2d_rectangle left_rect, right_rect;

		if (dw > dh) {
			left_rect.x = node->rect.x;
			left_rect.y = node->rect.y;
			left_rect.w = in_size->w;
			left_rect.h = node->rect.h;

			right_rect.x = node->rect.x + in_size->w;
			right_rect.y = node->rect.y;
			right_rect.w = node->rect.w - in_size->w;
			right_rect.h = node->rect.h;
		} else {
			left_rect.x = node->rect.x;
			left_rect.y = node->rect.y;
			left_rect.w = node->rect.w;
			left_rect.h = in_size->h;

			right_rect.x = node->rect.x;
			right_rect.y = node->rect.y + in_size->h;
			right_rect.w = node->rect.w;
			right_rect.h = node->rect.h - in_size->h;
		}

		node->left = bp2d_create(&left_rect);
		node->right = bp2d_create(&right_rect);

		return bp2d_insert(node->left, in_size, out_pos);
	}
}
Exemplo n.º 2
0
int texture_atlas_insert(texture_atlas *atlas, unsigned int character, const void *image, int width, int height, int bitmap_left, int bitmap_top, int advance_x, int advance_y, int glyph_size)
{
	bp2d_size size;
	size.w = width;
	size.h = height;

	bp2d_position pos;
	if (bp2d_insert(atlas->bp_root, &size, &pos) == 0)
		return 0;

	atlas_htab_entry *entry = malloc(sizeof(*entry));

	entry->rect.x = pos.x;
	entry->rect.y = pos.y;
	entry->rect.w = width;
	entry->rect.h = height;
	entry->bitmap_left = bitmap_left;
	entry->bitmap_top = bitmap_top;
	entry->advance_x = advance_x;
	entry->advance_y = advance_y;
	entry->glyph_size = glyph_size;

	int_htab_insert(atlas->htab, character, entry);

	void *tex_data = vita2d_texture_get_datap(atlas->tex);
	unsigned int tex_width = vita2d_texture_get_width(atlas->tex);

	int i;
	for (i = 0; i < height; i++) {
		memcpy(tex_data + (pos.x + (pos.y + i)*tex_width), image + i*width, width);
	}

	return 1;
}