diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /gfx/src/nsBoundingMetrics.h | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'gfx/src/nsBoundingMetrics.h')
-rw-r--r-- | gfx/src/nsBoundingMetrics.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gfx/src/nsBoundingMetrics.h b/gfx/src/nsBoundingMetrics.h new file mode 100644 index 000000000..4665db24f --- /dev/null +++ b/gfx/src/nsBoundingMetrics.h @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef __nsBoundingMetrics_h +#define __nsBoundingMetrics_h + +#include "nsCoord.h" +#include <algorithm> + +/* Struct used for accurate measurements of a string, in order to + * allow precise positioning when processing MathML. This is in its + * own header file because some very-widely-included headers need it + * but not the rest of nsFontMetrics, or vice versa. + */ + +struct nsBoundingMetrics { + + /////////// + // Metrics that _exactly_ enclose the text: + + // The character coordinate system is the one used on X Windows: + // 1. The origin is located at the intersection of the baseline + // with the left of the character's cell. + // 2. All horizontal bearings are oriented from left to right. + // 2. All horizontal bearings are oriented from left to right. + // 3. The ascent is oriented from bottom to top (being 0 at the orgin). + // 4. The descent is oriented from top to bottom (being 0 at the origin). + + // Note that Win32/Mac/PostScript use a different convention for + // the descent (all vertical measurements are oriented from bottom + // to top on these palatforms). Make sure to flip the sign of the + // descent on these platforms for cross-platform compatibility. + + // Any of the following member variables listed here can have + // positive or negative value. + + nscoord leftBearing; + /* The horizontal distance from the origin of the drawing + operation to the left-most part of the drawn string. */ + + nscoord rightBearing; + /* The horizontal distance from the origin of the drawing + operation to the right-most part of the drawn string. + The _exact_ width of the string is therefore: + rightBearing - leftBearing */ + + nscoord ascent; + /* The vertical distance from the origin of the drawing + operation to the top-most part of the drawn string. */ + + nscoord descent; + /* The vertical distance from the origin of the drawing + operation to the bottom-most part of the drawn string. + The _exact_ height of the string is therefore: + ascent + descent */ + + nscoord width; + /* The horizontal distance from the origin of the drawing + operation to the correct origin for drawing another string + to follow the current one. Depending on the font, this + could be greater than or less than the right bearing. */ + + nsBoundingMetrics() : leftBearing(0), rightBearing(0), + ascent(0), descent(0), width(0) + {} + + void + operator += (const nsBoundingMetrics& bm) { + if (ascent + descent == 0 && rightBearing - leftBearing == 0) { + ascent = bm.ascent; + descent = bm.descent; + leftBearing = width + bm.leftBearing; + rightBearing = width + bm.rightBearing; + } + else { + if (ascent < bm.ascent) ascent = bm.ascent; + if (descent < bm.descent) descent = bm.descent; + leftBearing = std::min(leftBearing, width + bm.leftBearing); + rightBearing = std::max(rightBearing, width + bm.rightBearing); + } + width += bm.width; + } +}; + +#endif // __nsBoundingMetrics_h |