Back out a5a5d2c176f7 (bug 882865) because of Android test failures on a CLOSED TREE
[gecko.git] / gfx / src / nsBoundingMetrics.h
blob4665db24fd7922a3a212409830b8a870332380f4
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef __nsBoundingMetrics_h
7 #define __nsBoundingMetrics_h
9 #include "nsCoord.h"
10 #include <algorithm>
12 /* Struct used for accurate measurements of a string, in order to
13 * allow precise positioning when processing MathML. This is in its
14 * own header file because some very-widely-included headers need it
15 * but not the rest of nsFontMetrics, or vice versa.
18 struct nsBoundingMetrics {
20 ///////////
21 // Metrics that _exactly_ enclose the text:
23 // The character coordinate system is the one used on X Windows:
24 // 1. The origin is located at the intersection of the baseline
25 // with the left of the character's cell.
26 // 2. All horizontal bearings are oriented from left to right.
27 // 2. All horizontal bearings are oriented from left to right.
28 // 3. The ascent is oriented from bottom to top (being 0 at the orgin).
29 // 4. The descent is oriented from top to bottom (being 0 at the origin).
31 // Note that Win32/Mac/PostScript use a different convention for
32 // the descent (all vertical measurements are oriented from bottom
33 // to top on these palatforms). Make sure to flip the sign of the
34 // descent on these platforms for cross-platform compatibility.
36 // Any of the following member variables listed here can have
37 // positive or negative value.
39 nscoord leftBearing;
40 /* The horizontal distance from the origin of the drawing
41 operation to the left-most part of the drawn string. */
43 nscoord rightBearing;
44 /* The horizontal distance from the origin of the drawing
45 operation to the right-most part of the drawn string.
46 The _exact_ width of the string is therefore:
47 rightBearing - leftBearing */
49 nscoord ascent;
50 /* The vertical distance from the origin of the drawing
51 operation to the top-most part of the drawn string. */
53 nscoord descent;
54 /* The vertical distance from the origin of the drawing
55 operation to the bottom-most part of the drawn string.
56 The _exact_ height of the string is therefore:
57 ascent + descent */
59 nscoord width;
60 /* The horizontal distance from the origin of the drawing
61 operation to the correct origin for drawing another string
62 to follow the current one. Depending on the font, this
63 could be greater than or less than the right bearing. */
65 nsBoundingMetrics() : leftBearing(0), rightBearing(0),
66 ascent(0), descent(0), width(0)
69 void
70 operator += (const nsBoundingMetrics& bm) {
71 if (ascent + descent == 0 && rightBearing - leftBearing == 0) {
72 ascent = bm.ascent;
73 descent = bm.descent;
74 leftBearing = width + bm.leftBearing;
75 rightBearing = width + bm.rightBearing;
77 else {
78 if (ascent < bm.ascent) ascent = bm.ascent;
79 if (descent < bm.descent) descent = bm.descent;
80 leftBearing = std::min(leftBearing, width + bm.leftBearing);
81 rightBearing = std::max(rightBearing, width + bm.rightBearing);
83 width += bm.width;
87 #endif // __nsBoundingMetrics_h