(function(){ var vec2, Rect if ('window' in this) { vec2 = window.vec2 Rect = window.Rect } else { vec2 = require('./vec2') Rect = require('./rect') } var Surface = function (face){ this.width = 0 this.height = 0 this.faces = [] if (face) { this.add(face) } } Surface.prototype.add = function(rect){ this.faces.push(rect) this.width += rect.width() this.height = Math.max(this.height, rect.height()) } Surface.prototype.fits_scale = function(v, scale){ v = v.clone().mul(scale) return this.fits(v) } Surface.prototype.fits = function(v){ var faces = this.faces var scratch if (this.width < v.a || this.height < v.b) { return null } for (var i = 0; i < faces.length; i++) { if (faces[i].fits(v)) { return faces[i] } } scratch = new Rect (0,0,0,0) for (var i = 0; i < faces.length; i++) { if (faces[i].y.length() < v.b) { continue } scratch.x.a = faces[i].x.a scratch.x.b = faces[i].x.b scratch.y.a = faces[i].y.a scratch.y.b = faces[i].y.b SEARCH: for (var j = i+1; j < faces.length; j++) { if (faces[j].y.a > scratch.y.a) { scratch.y.a = faces[j].y.a } if (faces[j].y.b < scratch.y.b) { scratch.y.b = faces[j].y.b } if (scratch.y.b <= scratch.y.a || scratch.y.length() < v.b) { break SEARCH } scratch.x.b = faces[j].x.b if (scratch.fits(v)) { return scratch } } } return null } Surface.prototype.place = function(v, index){ var face, faces = this.faces } Surface.prototype.bounds = function(index){ var bounds = faces[index].clone() var height = faces[index].height() for (var i = index-1; i > 0; i--) { var face = faces[i] if (face.y.length() < height) { continue } if (face.y.a > bounds.y.a) { continue } if (face.y.b < bounds.y.b) { continue } bounds.x.a = bounds.x.a } for (var i = index+1; i < faces.length; i++) { var face = faces[i] if (face.y.length() < height) { continue } if (face.y.a > bounds.y.a) { continue } if (face.y.b < bounds.y.b) { continue } bounds.x.b = bounds.x.b } return bounds } if ('window' in this) { window.Surface = Surface } else { module.exports = Surface } })()