| 158 | } |
| 159 | |
| 160 | glm::vec4 FontAtlas::getRegion(const size_t pWidth, const size_t pHeight) |
| 161 | { |
| 162 | glm::vec4 region(0, 0, pWidth, pHeight); |
| 163 | |
| 164 | size_t best_height = UINT_MAX; |
| 165 | size_t best_width = UINT_MAX; |
| 166 | |
| 167 | int best_index = -1; |
| 168 | int y; |
| 169 | |
| 170 | for(size_t i=0; i<nodes.size(); ++i) |
| 171 | { |
| 172 | y = fit(i, pWidth, pHeight); |
| 173 | |
| 174 | if (y >= 0) { |
| 175 | auto node = nodes[i]; |
| 176 | if ( ((y + pHeight) < best_height) || |
| 177 | (((y + pHeight) == best_height) && (node.z < best_width)) ) |
| 178 | { |
| 179 | best_height = y + pHeight; |
| 180 | best_index = int(i); |
| 181 | best_width = int(node.z); |
| 182 | region.x = node.x; |
| 183 | region.y = float(y); |
| 184 | } |
| 185 | } |
| 186 | } |
| 187 | |
| 188 | if (best_index == -1) { |
| 189 | region.x = -1; |
| 190 | region.y = -1; |
| 191 | region.z = 0; |
| 192 | region.w = 0; |
| 193 | return region; |
| 194 | } |
| 195 | |
| 196 | glm::vec3 node(region.x, region.y+pHeight, pWidth); |
| 197 | |
| 198 | nodes.insert(nodes.begin()+best_index, node); |
| 199 | |
| 200 | for(size_t i = best_index+1; i < nodes.size(); ++i) |
| 201 | { |
| 202 | glm::vec3& node = nodes[i]; |
| 203 | auto prev = nodes[i-1]; |
| 204 | |
| 205 | if (node.x < (prev.x + prev.z) ) |
| 206 | { |
| 207 | int shrink = int(prev.x + prev.z - node.x); |
| 208 | node.x += shrink; |
| 209 | node.z -= shrink; |
| 210 | if (node.z <= 0) { |
| 211 | nodes.erase(nodes.begin()+i); |
| 212 | --i; |
| 213 | } else { |
| 214 | break; |
| 215 | } |
| 216 | } else { |
| 217 | break; |
no test coverage detected