diff --git a/Apps/Sandcastle/gallery/Labels.html b/Apps/Sandcastle/gallery/Labels.html index cfd65f9124df..13e8ba54db2d 100644 --- a/Apps/Sandcastle/gallery/Labels.html +++ b/Apps/Sandcastle/gallery/Labels.html @@ -78,7 +78,7 @@ image : image }, label : { - text : 'Label on top of scaling billboard', + text : 'Label on top of \n scaling billboard', font : '20px sans-serif', horizontalOrigin : Cesium.HorizontalOrigin.CENTER, pixelOffset : new Cesium.Cartesian2(0.0, -image.height), diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 287bb0398801..3078763797dd 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -213,44 +213,71 @@ define([ function repositionAllGlyphs(label, resolutionScale) { var glyphs = label._glyphs; + var text = label._text; var glyph; var dimensions; - var totalWidth = 0; + var lineWidth = 0; + var maxWidth = 0; var maxHeight = 0; + var numberNewlines = 0; var glyphIndex = 0; var glyphLength = glyphs.length; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; - totalWidth += dimensions.computedWidth; - maxHeight = Math.max(maxHeight, dimensions.height); + lineWidth += dimensions.width; + maxWidth = Math.max(maxWidth, lineWidth); + maxHeight = Math.max(maxHeight, dimensions.height + dimensions.descent); + if (text.charAt(glyphIndex) === '\n') { + numberNewlines += 1; + lineWidth = 0; + } } var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; var widthOffset = 0; if (horizontalOrigin === HorizontalOrigin.CENTER) { - widthOffset -= totalWidth / 2 * scale; + widthOffset -= maxWidth / 2 * scale; } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { - widthOffset -= totalWidth * scale; + widthOffset -= maxWidth * scale; + } + + var heightOffset = 0; + var totalHeight = maxHeight * numberNewlines; + var verticalOrigin = label._verticalOrigin; + if (verticalOrigin === VerticalOrigin.CENTER) { + heightOffset -= totalHeight / 2 * scale; + } else if (verticalOrigin === VerticalOrigin.TOP) { + heightOffset -= totalHeight * scale; + } + else if (verticalOrigin === VerticalOrigin.BOTTOM) { + heightOffset += totalHeight * scale; } glyphPixelOffset.x = widthOffset * resolutionScale; glyphPixelOffset.y = 0; - var verticalOrigin = label._verticalOrigin; + var glyphNewlineOffset = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { glyph = glyphs[glyphIndex]; dimensions = glyph.dimensions; if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxHeight) { - glyphPixelOffset.y = -dimensions.descent * scale; + glyphPixelOffset.y = heightOffset - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) * scale - dimensions.descent * scale; + glyphPixelOffset.y = heightOffset - (maxHeight - dimensions.height) * scale - dimensions.descent * scale; } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + glyphPixelOffset.y = heightOffset - (maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + } + + if (text.charAt(glyphIndex) === '\n') { + glyphNewlineOffset += maxHeight * scale; + glyphPixelOffset.x = widthOffset; + continue; } + glyphPixelOffset.y -= glyphNewlineOffset; glyphPixelOffset.y *= resolutionScale;