diff options
Diffstat (limited to 'src/ports/SkFontConfigInterface_direct.cpp')
-rw-r--r-- | src/ports/SkFontConfigInterface_direct.cpp | 127 |
1 files changed, 59 insertions, 68 deletions
diff --git a/src/ports/SkFontConfigInterface_direct.cpp b/src/ports/SkFontConfigInterface_direct.cpp index 875000daa5..56c8466e03 100644 --- a/src/ports/SkFontConfigInterface_direct.cpp +++ b/src/ports/SkFontConfigInterface_direct.cpp @@ -368,21 +368,21 @@ static int get_int(FcPattern* pattern, const char object[], int missing) { return value; } -static int map_range(SkFixed value, - SkFixed old_min, SkFixed old_max, - SkFixed new_min, SkFixed new_max) +static int map_range(SkScalar value, + SkScalar old_min, SkScalar old_max, + SkScalar new_min, SkScalar new_max) { SkASSERT(old_min < old_max); SkASSERT(new_min <= new_max); - return new_min + SkMulDiv(value - old_min, new_max - new_min, old_max - old_min); + return new_min + ((value - old_min) * (new_max - new_min) / (old_max - old_min)); } struct MapRanges { - SkFixed old_val; - SkFixed new_val; + SkScalar old_val; + SkScalar new_val; }; -static SkFixed map_ranges_fixed(SkFixed val, MapRanges const ranges[], int rangesCount) { +static SkScalar map_ranges(SkScalar val, MapRanges const ranges[], int rangesCount) { // -Inf to [0] if (val < ranges[0].old_val) { return ranges[0].new_val; @@ -401,15 +401,6 @@ static SkFixed map_ranges_fixed(SkFixed val, MapRanges const ranges[], int range return ranges[rangesCount-1].new_val; } -static int map_ranges(int val, MapRanges const ranges[], int rangesCount) { - return SkFixedRoundToInt(map_ranges_fixed(SkIntToFixed(val), ranges, rangesCount)); -} - -template<int n> struct SkTFixed { - static_assert(-32768 <= n && n <= 32767, "SkTFixed_n_not_in_range"); - static const SkFixed value = static_cast<SkFixed>(n << 16); -}; - #ifndef FC_WEIGHT_DEMILIGHT #define FC_WEIGHT_DEMILIGHT 65 #endif @@ -417,36 +408,36 @@ template<int n> struct SkTFixed { static SkFontStyle skfontstyle_from_fcpattern(FcPattern* pattern) { typedef SkFontStyle SkFS; - static const MapRanges weightRanges[] = { - { SkTFixed<FC_WEIGHT_THIN>::value, SkTFixed<SkFS::kThin_Weight>::value }, - { SkTFixed<FC_WEIGHT_EXTRALIGHT>::value, SkTFixed<SkFS::kExtraLight_Weight>::value }, - { SkTFixed<FC_WEIGHT_LIGHT>::value, SkTFixed<SkFS::kLight_Weight>::value }, - { SkTFixed<FC_WEIGHT_DEMILIGHT>::value, SkTFixed<350>::value }, - { SkTFixed<FC_WEIGHT_BOOK>::value, SkTFixed<380>::value }, - { SkTFixed<FC_WEIGHT_REGULAR>::value, SkTFixed<SkFS::kNormal_Weight>::value }, - { SkTFixed<FC_WEIGHT_MEDIUM>::value, SkTFixed<SkFS::kMedium_Weight>::value }, - { SkTFixed<FC_WEIGHT_DEMIBOLD>::value, SkTFixed<SkFS::kSemiBold_Weight>::value }, - { SkTFixed<FC_WEIGHT_BOLD>::value, SkTFixed<SkFS::kBold_Weight>::value }, - { SkTFixed<FC_WEIGHT_EXTRABOLD>::value, SkTFixed<SkFS::kExtraBold_Weight>::value }, - { SkTFixed<FC_WEIGHT_BLACK>::value, SkTFixed<SkFS::kBlack_Weight>::value }, - { SkTFixed<FC_WEIGHT_EXTRABLACK>::value, SkTFixed<SkFS::kExtraBlack_Weight>::value }, + static constexpr MapRanges weightRanges[] = { + { FC_WEIGHT_THIN, SkFS::kThin_Weight }, + { FC_WEIGHT_EXTRALIGHT, SkFS::kExtraLight_Weight }, + { FC_WEIGHT_LIGHT, SkFS::kLight_Weight }, + { FC_WEIGHT_DEMILIGHT, 350 }, + { FC_WEIGHT_BOOK, 380 }, + { FC_WEIGHT_REGULAR, SkFS::kNormal_Weight }, + { FC_WEIGHT_MEDIUM, SkFS::kMedium_Weight }, + { FC_WEIGHT_DEMIBOLD, SkFS::kSemiBold_Weight }, + { FC_WEIGHT_BOLD, SkFS::kBold_Weight }, + { FC_WEIGHT_EXTRABOLD, SkFS::kExtraBold_Weight }, + { FC_WEIGHT_BLACK, SkFS::kBlack_Weight }, + { FC_WEIGHT_EXTRABLACK, SkFS::kExtraBlack_Weight }, }; - int weight = map_ranges(get_int(pattern, FC_WEIGHT, FC_WEIGHT_REGULAR), - weightRanges, SK_ARRAY_COUNT(weightRanges)); - - static const MapRanges widthRanges[] = { - { SkTFixed<FC_WIDTH_ULTRACONDENSED>::value, SkTFixed<SkFS::kUltraCondensed_Width>::value }, - { SkTFixed<FC_WIDTH_EXTRACONDENSED>::value, SkTFixed<SkFS::kExtraCondensed_Width>::value }, - { SkTFixed<FC_WIDTH_CONDENSED>::value, SkTFixed<SkFS::kCondensed_Width>::value }, - { SkTFixed<FC_WIDTH_SEMICONDENSED>::value, SkTFixed<SkFS::kSemiCondensed_Width>::value }, - { SkTFixed<FC_WIDTH_NORMAL>::value, SkTFixed<SkFS::kNormal_Width>::value }, - { SkTFixed<FC_WIDTH_SEMIEXPANDED>::value, SkTFixed<SkFS::kSemiExpanded_Width>::value }, - { SkTFixed<FC_WIDTH_EXPANDED>::value, SkTFixed<SkFS::kExpanded_Width>::value }, - { SkTFixed<FC_WIDTH_EXTRAEXPANDED>::value, SkTFixed<SkFS::kExtraExpanded_Width>::value }, - { SkTFixed<FC_WIDTH_ULTRAEXPANDED>::value, SkTFixed<SkFS::kUltraExpanded_Width>::value }, + SkScalar weight = map_ranges(get_int(pattern, FC_WEIGHT, FC_WEIGHT_REGULAR), + weightRanges, SK_ARRAY_COUNT(weightRanges)); + + static constexpr MapRanges widthRanges[] = { + { FC_WIDTH_ULTRACONDENSED, SkFS::kUltraCondensed_Width }, + { FC_WIDTH_EXTRACONDENSED, SkFS::kExtraCondensed_Width }, + { FC_WIDTH_CONDENSED, SkFS::kCondensed_Width }, + { FC_WIDTH_SEMICONDENSED, SkFS::kSemiCondensed_Width }, + { FC_WIDTH_NORMAL, SkFS::kNormal_Width }, + { FC_WIDTH_SEMIEXPANDED, SkFS::kSemiExpanded_Width }, + { FC_WIDTH_EXPANDED, SkFS::kExpanded_Width }, + { FC_WIDTH_EXTRAEXPANDED, SkFS::kExtraExpanded_Width }, + { FC_WIDTH_ULTRAEXPANDED, SkFS::kUltraExpanded_Width }, }; - int width = map_ranges(get_int(pattern, FC_WIDTH, FC_WIDTH_NORMAL), - widthRanges, SK_ARRAY_COUNT(widthRanges)); + SkScalar width = map_ranges(get_int(pattern, FC_WIDTH, FC_WIDTH_NORMAL), + widthRanges, SK_ARRAY_COUNT(widthRanges)); SkFS::Slant slant = SkFS::kUpright_Slant; switch (get_int(pattern, FC_SLANT, FC_SLANT_ROMAN)) { @@ -456,38 +447,38 @@ static SkFontStyle skfontstyle_from_fcpattern(FcPattern* pattern) { default: SkASSERT(false); break; } - return SkFontStyle(weight, width, slant); + return SkFontStyle(SkScalarRoundToInt(weight), SkScalarRoundToInt(width), slant); } static void fcpattern_from_skfontstyle(SkFontStyle style, FcPattern* pattern) { typedef SkFontStyle SkFS; - static const MapRanges weightRanges[] = { - { SkTFixed<SkFS::kThin_Weight>::value, SkTFixed<FC_WEIGHT_THIN>::value }, - { SkTFixed<SkFS::kExtraLight_Weight>::value, SkTFixed<FC_WEIGHT_EXTRALIGHT>::value }, - { SkTFixed<SkFS::kLight_Weight>::value, SkTFixed<FC_WEIGHT_LIGHT>::value }, - { SkTFixed<350>::value, SkTFixed<FC_WEIGHT_DEMILIGHT>::value }, - { SkTFixed<380>::value, SkTFixed<FC_WEIGHT_BOOK>::value }, - { SkTFixed<SkFS::kNormal_Weight>::value, SkTFixed<FC_WEIGHT_REGULAR>::value }, - { SkTFixed<SkFS::kMedium_Weight>::value, SkTFixed<FC_WEIGHT_MEDIUM>::value }, - { SkTFixed<SkFS::kSemiBold_Weight>::value, SkTFixed<FC_WEIGHT_DEMIBOLD>::value }, - { SkTFixed<SkFS::kBold_Weight>::value, SkTFixed<FC_WEIGHT_BOLD>::value }, - { SkTFixed<SkFS::kExtraBold_Weight>::value, SkTFixed<FC_WEIGHT_EXTRABOLD>::value }, - { SkTFixed<SkFS::kBlack_Weight>::value, SkTFixed<FC_WEIGHT_BLACK>::value }, - { SkTFixed<SkFS::kExtraBlack_Weight>::value, SkTFixed<FC_WEIGHT_EXTRABLACK>::value }, + static constexpr MapRanges weightRanges[] = { + { SkFS::kThin_Weight, FC_WEIGHT_THIN }, + { SkFS::kExtraLight_Weight, FC_WEIGHT_EXTRALIGHT }, + { SkFS::kLight_Weight, FC_WEIGHT_LIGHT }, + { 350, FC_WEIGHT_DEMILIGHT }, + { 380, FC_WEIGHT_BOOK }, + { SkFS::kNormal_Weight, FC_WEIGHT_REGULAR }, + { SkFS::kMedium_Weight, FC_WEIGHT_MEDIUM }, + { SkFS::kSemiBold_Weight, FC_WEIGHT_DEMIBOLD }, + { SkFS::kBold_Weight, FC_WEIGHT_BOLD }, + { SkFS::kExtraBold_Weight, FC_WEIGHT_EXTRABOLD }, + { SkFS::kBlack_Weight, FC_WEIGHT_BLACK }, + { SkFS::kExtraBlack_Weight, FC_WEIGHT_EXTRABLACK }, }; int weight = map_ranges(style.weight(), weightRanges, SK_ARRAY_COUNT(weightRanges)); - static const MapRanges widthRanges[] = { - { SkTFixed<SkFS::kUltraCondensed_Width>::value, SkTFixed<FC_WIDTH_ULTRACONDENSED>::value }, - { SkTFixed<SkFS::kExtraCondensed_Width>::value, SkTFixed<FC_WIDTH_EXTRACONDENSED>::value }, - { SkTFixed<SkFS::kCondensed_Width>::value, SkTFixed<FC_WIDTH_CONDENSED>::value }, - { SkTFixed<SkFS::kSemiCondensed_Width>::value, SkTFixed<FC_WIDTH_SEMICONDENSED>::value }, - { SkTFixed<SkFS::kNormal_Width>::value, SkTFixed<FC_WIDTH_NORMAL>::value }, - { SkTFixed<SkFS::kSemiExpanded_Width>::value, SkTFixed<FC_WIDTH_SEMIEXPANDED>::value }, - { SkTFixed<SkFS::kExpanded_Width>::value, SkTFixed<FC_WIDTH_EXPANDED>::value }, - { SkTFixed<SkFS::kExtraExpanded_Width>::value, SkTFixed<FC_WIDTH_EXTRAEXPANDED>::value }, - { SkTFixed<SkFS::kUltraExpanded_Width>::value, SkTFixed<FC_WIDTH_ULTRAEXPANDED>::value }, + static constexpr MapRanges widthRanges[] = { + { SkFS::kUltraCondensed_Width, FC_WIDTH_ULTRACONDENSED }, + { SkFS::kExtraCondensed_Width, FC_WIDTH_EXTRACONDENSED }, + { SkFS::kCondensed_Width, FC_WIDTH_CONDENSED }, + { SkFS::kSemiCondensed_Width, FC_WIDTH_SEMICONDENSED }, + { SkFS::kNormal_Width, FC_WIDTH_NORMAL }, + { SkFS::kSemiExpanded_Width, FC_WIDTH_SEMIEXPANDED }, + { SkFS::kExpanded_Width, FC_WIDTH_EXPANDED }, + { SkFS::kExtraExpanded_Width, FC_WIDTH_EXTRAEXPANDED }, + { SkFS::kUltraExpanded_Width, FC_WIDTH_ULTRAEXPANDED }, }; int width = map_ranges(style.width(), widthRanges, SK_ARRAY_COUNT(widthRanges)); |