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); } }
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; }