diff options
author | Ben Wagner <bungeman@google.com> | 2017-07-31 15:41:14 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-31 20:24:47 +0000 |
commit | 0500ebafec1879a7c5f76fe40ee30bdab17ac3db (patch) | |
tree | 09c6bb735ae81e3ebc16f64eadc6d46209182350 | |
parent | 49f58a3825ca7f7745d7f311baa2b65c5eb46c02 (diff) |
Remove union from SkFontStyle.
This is prompted by a bug in vc++ reported at
https://developercommunity.visualstudio.com/content/problem/86829/constexpr-initializing-struct-in-union-only-zero-i.html
Visual C++ will not properly constexpr initialize a struct inside a
union. Removing this construct also allows us to avoid writing and
reading from different members of a union.
Change-Id: I76e069ecce77ef21b7ad3821bf9c29e1b0843618
Reviewed-on: https://skia-review.googlesource.com/28300
Commit-Queue: Mike Klein <mtklein@chromium.org>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
-rw-r--r-- | include/core/SkFontStyle.h | 29 | ||||
-rw-r--r-- | src/core/SkFontStyle.cpp | 7 |
2 files changed, 11 insertions, 25 deletions
diff --git a/include/core/SkFontStyle.h b/include/core/SkFontStyle.h index 306895d78f..a5e3034e1d 100644 --- a/include/core/SkFontStyle.h +++ b/include/core/SkFontStyle.h @@ -44,23 +44,23 @@ public: kOblique_Slant, }; - SkFontStyle(); + constexpr SkFontStyle(int weight, int width, Slant slant) : fValue( + (SkTPin<int>(weight, kInvisible_Weight, kExtraBlack_Weight)) + + (SkTPin<int>(width, kUltraCondensed_Width, kUltraExpanded_Width) << 16) + + (SkTPin<int>(slant, kUpright_Slant, kOblique_Slant) << 24) + ) { } - constexpr SkFontStyle(int weight, int width, Slant slant) : fUnion {{ - static_cast<uint16_t>(SkTPin<int>(weight, kInvisible_Weight, kExtraBlack_Weight)), - static_cast<uint8_t >(SkTPin<int>(width, kUltraCondensed_Width, kUltraExpanded_Width)), - static_cast<uint8_t >(SkTPin<int>(slant, kUpright_Slant, kOblique_Slant)) - }} { } + constexpr SkFontStyle() : SkFontStyle{kNormal_Weight, kNormal_Width, kUpright_Slant} { } static SkFontStyle FromOldStyle(unsigned oldStyle); bool operator==(const SkFontStyle& rhs) const { - return fUnion.fU32 == rhs.fUnion.fU32; + return fValue == rhs.fValue; } - int weight() const { return fUnion.fR.fWeight; } - int width() const { return fUnion.fR.fWidth; } - Slant slant() const { return (Slant)fUnion.fR.fSlant; } + int weight() const { return fValue & 0xFFFF; } + int width() const { return (fValue >> 16) & 0xFF; } + Slant slant() const { return (Slant)((fValue >> 24) & 0xFF); } static constexpr SkFontStyle Normal() { return SkFontStyle(kNormal_Weight, kNormal_Width, kUpright_Slant); @@ -76,14 +76,7 @@ public: } private: - union { - struct { - uint16_t fWeight; // 100 .. 900 - uint8_t fWidth; // 1 .. 9 - uint8_t fSlant; // 0 .. 2 - } fR; - uint32_t fU32; - } fUnion; + uint32_t fValue; }; #endif diff --git a/src/core/SkFontStyle.cpp b/src/core/SkFontStyle.cpp index 24ee645a4f..996d383402 100644 --- a/src/core/SkFontStyle.cpp +++ b/src/core/SkFontStyle.cpp @@ -9,13 +9,6 @@ #include "SkTypeface.h" #include "SkTypes.h" -SkFontStyle::SkFontStyle() { - fUnion.fU32 = 0; - fUnion.fR.fWeight = kNormal_Weight; - fUnion.fR.fWidth = kNormal_Width; - fUnion.fR.fSlant = kUpright_Slant; -} - /*static*/SkFontStyle SkFontStyle::FromOldStyle(unsigned oldStyle) { return SkFontStyle((oldStyle & SkTypeface::kBold) ? SkFontStyle::kBold_Weight : SkFontStyle::kNormal_Weight, |