From 0d02568ff8bd59cd9be9f7e09a444e9cf6689ae2 Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:26:55 +0200 Subject: [PATCH] Update ICU and msdfgen. --- modules/msdfgen/SCsub | 3 +- modules/text_server_adv/SCsub | 1 + .../gdextension_build/SConstruct | 4 +- modules/text_server_adv/text_server_adv.cpp | 6 + modules/text_server_fb/SCsub | 1 + .../gdextension_build/SConstruct | 2 + modules/text_server_fb/text_server_fb.cpp | 6 + thirdparty/README.md | 4 +- thirdparty/icu4c/common/unicode/uvernum.h | 6 +- thirdparty/icu4c/icudt74l.dat | Bin 4419920 -> 4419952 bytes thirdparty/msdfgen/LICENSE.txt | 2 +- thirdparty/msdfgen/core/Bitmap.h | 10 +- thirdparty/msdfgen/core/Bitmap.hpp | 10 +- thirdparty/msdfgen/core/BitmapRef.hpp | 8 +- thirdparty/msdfgen/core/Contour.cpp | 2 +- thirdparty/msdfgen/core/Contour.h | 2 +- thirdparty/msdfgen/core/EdgeColor.h | 2 + thirdparty/msdfgen/core/EdgeHolder.cpp | 12 +- thirdparty/msdfgen/core/EdgeHolder.h | 12 +- .../msdfgen/core/MSDFErrorCorrection.cpp | 8 +- thirdparty/msdfgen/core/Projection.h | 2 +- thirdparty/msdfgen/core/Scanline.cpp | 2 +- thirdparty/msdfgen/core/Scanline.h | 1 + thirdparty/msdfgen/core/Shape.cpp | 41 +++-- thirdparty/msdfgen/core/Shape.h | 2 +- thirdparty/msdfgen/core/ShapeDistanceFinder.h | 2 +- .../msdfgen/core/ShapeDistanceFinder.hpp | 6 +- thirdparty/msdfgen/core/SignedDistance.cpp | 29 --- thirdparty/msdfgen/core/SignedDistance.h | 23 --- thirdparty/msdfgen/core/SignedDistance.hpp | 38 ++++ thirdparty/msdfgen/core/Vector2.cpp | 146 --------------- thirdparty/msdfgen/core/Vector2.h | 66 ------- thirdparty/msdfgen/core/Vector2.hpp | 167 ++++++++++++++++++ thirdparty/msdfgen/core/arithmetics.hpp | 2 +- thirdparty/msdfgen/core/base.h | 16 ++ .../msdfgen/core/bitmap-interpolation.hpp | 2 +- thirdparty/msdfgen/core/contour-combiners.cpp | 4 +- thirdparty/msdfgen/core/contour-combiners.h | 4 +- thirdparty/msdfgen/core/edge-coloring.cpp | 11 +- thirdparty/msdfgen/core/edge-segments.cpp | 32 +++- thirdparty/msdfgen/core/edge-segments.h | 36 +++- thirdparty/msdfgen/core/edge-selectors.h | 4 +- thirdparty/msdfgen/core/equation-solver.cpp | 2 +- thirdparty/msdfgen/core/equation-solver.h | 2 + thirdparty/msdfgen/core/generator-config.h | 1 - .../msdfgen/core/msdf-error-correction.h | 2 +- thirdparty/msdfgen/core/pixel-conversion.hpp | 2 - thirdparty/msdfgen/core/rasterization.h | 2 +- thirdparty/msdfgen/core/render-sdf.h | 2 +- .../msdfgen/core/sdf-error-estimation.h | 2 +- thirdparty/msdfgen/core/shape-description.cpp | 59 ++++--- thirdparty/msdfgen/core/shape-description.h | 1 - thirdparty/msdfgen/msdfgen.h | 5 +- 53 files changed, 421 insertions(+), 396 deletions(-) delete mode 100644 thirdparty/msdfgen/core/SignedDistance.cpp delete mode 100644 thirdparty/msdfgen/core/SignedDistance.h create mode 100644 thirdparty/msdfgen/core/SignedDistance.hpp delete mode 100644 thirdparty/msdfgen/core/Vector2.cpp delete mode 100644 thirdparty/msdfgen/core/Vector2.h create mode 100644 thirdparty/msdfgen/core/Vector2.hpp create mode 100644 thirdparty/msdfgen/core/base.h diff --git a/modules/msdfgen/SCsub b/modules/msdfgen/SCsub index 0c269bc7f49..f4316a74e78 100644 --- a/modules/msdfgen/SCsub +++ b/modules/msdfgen/SCsub @@ -20,8 +20,6 @@ if env["builtin_msdfgen"]: "core/Projection.cpp", "core/Scanline.cpp", "core/Shape.cpp", - "core/SignedDistance.cpp", - "core/Vector2.cpp", "core/contour-combiners.cpp", "core/edge-coloring.cpp", "core/edge-segments.cpp", @@ -36,6 +34,7 @@ if env["builtin_msdfgen"]: ] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] + env_msdfgen.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) env_msdfgen.Prepend(CPPPATH=["#thirdparty/freetype/include", "#thirdparty/msdfgen", "#thirdparty/nanosvg"]) lib = env_msdfgen.add_library("msdfgen_builtin", thirdparty_sources) diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index 6b53353ec9f..b04ad77bc97 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -531,6 +531,7 @@ module_obj = [] if env["builtin_msdfgen"] and msdfgen_enabled: # Treat msdfgen headers as system headers to avoid raising warnings. Not supported on MSVC. + env_text_server_adv.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) if not env.msvc: env_text_server_adv.Append(CPPFLAGS=["-isystem", Dir("#thirdparty/msdfgen").path]) else: diff --git a/modules/text_server_adv/gdextension_build/SConstruct b/modules/text_server_adv/gdextension_build/SConstruct index cd4331b60e2..1f27f5ade98 100644 --- a/modules/text_server_adv/gdextension_build/SConstruct +++ b/modules/text_server_adv/gdextension_build/SConstruct @@ -133,8 +133,6 @@ if env["msdfgen_enabled"] and env["freetype_enabled"]: "core/Projection.cpp", "core/Scanline.cpp", "core/Shape.cpp", - "core/SignedDistance.cpp", - "core/Vector2.cpp", "core/contour-combiners.cpp", "core/edge-coloring.cpp", "core/edge-segments.cpp", @@ -149,8 +147,10 @@ if env["msdfgen_enabled"] and env["freetype_enabled"]: ] thirdparty_msdfgen_sources = [thirdparty_msdfgen_dir + file for file in thirdparty_msdfgen_sources] + env_msdfgen.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) env_msdfgen.Append(CPPPATH=["../../../thirdparty/freetype/include", "../../../thirdparty/msdfgen"]) env.Append(CPPPATH=["../../../thirdparty/msdfgen"]) + env.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) env.Append(CPPDEFINES=["MODULE_MSDFGEN_ENABLED"]) lib = env_msdfgen.Library( diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 5d9bc69d038..1a44e22ab2a 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -67,10 +67,16 @@ using namespace godot; // Thirdparty headers. #ifdef MODULE_MSDFGEN_ENABLED +#ifdef _MSC_VER +#pragma warning(disable : 4458) +#endif #include #include #include #include +#ifdef _MSC_VER +#pragma warning(default : 4458) +#endif #endif #ifdef MODULE_SVG_ENABLED diff --git a/modules/text_server_fb/SCsub b/modules/text_server_fb/SCsub index e808864512b..fc0a8727c61 100644 --- a/modules/text_server_fb/SCsub +++ b/modules/text_server_fb/SCsub @@ -17,6 +17,7 @@ if "svg" in env.module_list: if env["builtin_msdfgen"] and msdfgen_enabled: # Treat msdfgen headers as system headers to avoid raising warnings. Not supported on MSVC. + env_text_server_fb.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) if not env.msvc: env_text_server_fb.Append(CPPFLAGS=["-isystem", Dir("#thirdparty/msdfgen").path]) else: diff --git a/modules/text_server_fb/gdextension_build/SConstruct b/modules/text_server_fb/gdextension_build/SConstruct index 0efced0bfc1..29801ede8ea 100644 --- a/modules/text_server_fb/gdextension_build/SConstruct +++ b/modules/text_server_fb/gdextension_build/SConstruct @@ -144,8 +144,10 @@ if env["msdfgen_enabled"] and env["freetype_enabled"]: ] thirdparty_msdfgen_sources = [thirdparty_msdfgen_dir + file for file in thirdparty_msdfgen_sources] + env_msdfgen.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) env_msdfgen.Append(CPPPATH=["../../../thirdparty/freetype/include", "../../../thirdparty/msdfgen"]) env.Append(CPPPATH=["../../../thirdparty/msdfgen"]) + env.Append(CPPDEFINES=[("MSDFGEN_PUBLIC", "")]) env.Append(CPPDEFINES=["MODULE_MSDFGEN_ENABLED"]) lib = env_msdfgen.Library( diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 75374ecab46..44c5478dff5 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -59,10 +59,16 @@ using namespace godot; // Thirdparty headers. #ifdef MODULE_MSDFGEN_ENABLED +#ifdef _MSC_VER +#pragma warning(disable : 4458) +#endif #include #include #include #include +#ifdef _MSC_VER +#pragma warning(default : 4458) +#endif #endif #ifdef MODULE_SVG_ENABLED diff --git a/thirdparty/README.md b/thirdparty/README.md index a36a8f209f1..2c9bc36545a 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -390,7 +390,7 @@ Files extracted from upstream source: ## icu4c - Upstream: https://github.com/unicode-org/icu -- Version: 74.1 (9edac7b78327a1cb58db29e2714b15f9fa14e4d7, 2023) +- Version: 74.2 (2d029329c82c7792b985024b2bdab5fc7278fbc8, 2023) - License: Unicode Files extracted from upstream source: @@ -690,7 +690,7 @@ Collection of single-file libraries used in Godot components. ## msdfgen - Upstream: https://github.com/Chlumsky/msdfgen -- Version: 1.10 (64a91eec3ca3787e6f78b4c99fcd3052ad3e37c0, 2021) +- Version: 1.11 (f12d7ca00091a632a289865b85c3f2e0bfc6542d, 2023) - License: MIT Files extracted from the upstream source: diff --git a/thirdparty/icu4c/common/unicode/uvernum.h b/thirdparty/icu4c/common/unicode/uvernum.h index 9fc98e73807..1cdf8912f94 100644 --- a/thirdparty/icu4c/common/unicode/uvernum.h +++ b/thirdparty/icu4c/common/unicode/uvernum.h @@ -59,7 +59,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 1 +#define U_ICU_VERSION_MINOR_NUM 2 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -132,7 +132,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "74.1" +#define U_ICU_VERSION "74.2" /** * The current ICU library major version number as a string, for library name suffixes. @@ -151,7 +151,7 @@ /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "74.1" +#define U_ICU_DATA_VERSION "74.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/thirdparty/icu4c/icudt74l.dat b/thirdparty/icu4c/icudt74l.dat index 8576067fd0f4ab0983f37c95da029d9bf3e854a8..e4ce73e23c84ae8c580ff1eb44a4b7076e062fad 100644 GIT binary patch delta 96104 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%0DD(A2tBUEc5vx0B+%HpTVi;{6mKwkaO+ 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¥r0_fGHBm~Iy1X%TgZeeZ9Ce%J4CkJpP0 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 Hv&8=eUb{Em diff --git a/thirdparty/msdfgen/LICENSE.txt b/thirdparty/msdfgen/LICENSE.txt index 9757001664a..69054bd2e18 100644 --- a/thirdparty/msdfgen/LICENSE.txt +++ b/thirdparty/msdfgen/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 - 2022 Viktor Chlumsky +Copyright (c) 2016 - 2023 Viktor Chlumsky Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/thirdparty/msdfgen/core/Bitmap.h b/thirdparty/msdfgen/core/Bitmap.h index 14407d6c349..9a08749f47f 100644 --- a/thirdparty/msdfgen/core/Bitmap.h +++ b/thirdparty/msdfgen/core/Bitmap.h @@ -18,17 +18,17 @@ public: Bitmap(Bitmap &&orig); #endif ~Bitmap(); - Bitmap & operator=(const BitmapConstRef &orig); - Bitmap & operator=(const Bitmap &orig); + Bitmap &operator=(const BitmapConstRef &orig); + Bitmap &operator=(const Bitmap &orig); #ifdef MSDFGEN_USE_CPP11 - Bitmap & operator=(Bitmap &&orig); + Bitmap &operator=(Bitmap &&orig); #endif /// Bitmap width in pixels. int width() const; /// Bitmap height in pixels. int height() const; - T * operator()(int x, int y); - const T * operator()(int x, int y) const; + T *operator()(int x, int y); + const T *operator()(int x, int y) const; #ifdef MSDFGEN_USE_CPP11 explicit operator T *(); explicit operator const T *() const; diff --git a/thirdparty/msdfgen/core/Bitmap.hpp b/thirdparty/msdfgen/core/Bitmap.hpp index cb16cac8d4f..9404357788d 100644 --- a/thirdparty/msdfgen/core/Bitmap.hpp +++ b/thirdparty/msdfgen/core/Bitmap.hpp @@ -40,7 +40,7 @@ Bitmap::~Bitmap() { } template -Bitmap & Bitmap::operator=(const BitmapConstRef &orig) { +Bitmap &Bitmap::operator=(const BitmapConstRef &orig) { if (pixels != orig.pixels) { delete [] pixels; w = orig.width, h = orig.height; @@ -51,7 +51,7 @@ Bitmap & Bitmap::operator=(const BitmapConstRef &orig) { } template -Bitmap & Bitmap::operator=(const Bitmap &orig) { +Bitmap &Bitmap::operator=(const Bitmap &orig) { if (this != &orig) { delete [] pixels; w = orig.w, h = orig.h; @@ -63,7 +63,7 @@ Bitmap & Bitmap::operator=(const Bitmap &orig) { #ifdef MSDFGEN_USE_CPP11 template -Bitmap & Bitmap::operator=(Bitmap &&orig) { +Bitmap &Bitmap::operator=(Bitmap &&orig) { if (this != &orig) { delete [] pixels; pixels = orig.pixels; @@ -85,12 +85,12 @@ int Bitmap::height() const { } template -T * Bitmap::operator()(int x, int y) { +T *Bitmap::operator()(int x, int y) { return pixels+N*(w*y+x); } template -const T * Bitmap::operator()(int x, int y) const { +const T *Bitmap::operator()(int x, int y) const { return pixels+N*(w*y+x); } diff --git a/thirdparty/msdfgen/core/BitmapRef.hpp b/thirdparty/msdfgen/core/BitmapRef.hpp index 6f9620dcdfd..cb17f95dcb8 100644 --- a/thirdparty/msdfgen/core/BitmapRef.hpp +++ b/thirdparty/msdfgen/core/BitmapRef.hpp @@ -1,12 +1,10 @@ #pragma once -#include +#include "base.h" namespace msdfgen { -typedef unsigned char byte; - /// Reference to a 2D image bitmap or a buffer acting as one. Pixel storage not owned or managed by the object. template struct BitmapRef { @@ -17,7 +15,7 @@ struct BitmapRef { inline BitmapRef() : pixels(NULL), width(0), height(0) { } inline BitmapRef(T *pixels, int width, int height) : pixels(pixels), width(width), height(height) { } - inline T * operator()(int x, int y) const { + inline T *operator()(int x, int y) const { return pixels+N*(width*y+x); } @@ -34,7 +32,7 @@ struct BitmapConstRef { inline BitmapConstRef(const T *pixels, int width, int height) : pixels(pixels), width(width), height(height) { } inline BitmapConstRef(const BitmapRef &orig) : pixels(orig.pixels), width(orig.width), height(orig.height) { } - inline const T * operator()(int x, int y) const { + inline const T *operator()(int x, int y) const { return pixels+N*(width*y+x); } diff --git a/thirdparty/msdfgen/core/Contour.cpp b/thirdparty/msdfgen/core/Contour.cpp index ca80d3c55a2..57293dc58be 100644 --- a/thirdparty/msdfgen/core/Contour.cpp +++ b/thirdparty/msdfgen/core/Contour.cpp @@ -19,7 +19,7 @@ void Contour::addEdge(EdgeHolder &&edge) { } #endif -EdgeHolder & Contour::addEdge() { +EdgeHolder &Contour::addEdge() { edges.resize(edges.size()+1); return edges.back(); } diff --git a/thirdparty/msdfgen/core/Contour.h b/thirdparty/msdfgen/core/Contour.h index f79b2695822..4cae48fad75 100644 --- a/thirdparty/msdfgen/core/Contour.h +++ b/thirdparty/msdfgen/core/Contour.h @@ -19,7 +19,7 @@ public: void addEdge(EdgeHolder &&edge); #endif /// Creates a new edge in the contour and returns its reference. - EdgeHolder & addEdge(); + EdgeHolder &addEdge(); /// Adjusts the bounding box to fit the contour. void bound(double &l, double &b, double &r, double &t) const; /// Adjusts the bounding box to fit the contour border's mitered corners. diff --git a/thirdparty/msdfgen/core/EdgeColor.h b/thirdparty/msdfgen/core/EdgeColor.h index 9d49a5a89ef..5d3730c9a65 100644 --- a/thirdparty/msdfgen/core/EdgeColor.h +++ b/thirdparty/msdfgen/core/EdgeColor.h @@ -1,6 +1,8 @@ #pragma once +#include "base.h" + namespace msdfgen { /// Edge color specifies which color channels an edge belongs to. diff --git a/thirdparty/msdfgen/core/EdgeHolder.cpp b/thirdparty/msdfgen/core/EdgeHolder.cpp index 1a8c5f66e93..cffcff46d32 100644 --- a/thirdparty/msdfgen/core/EdgeHolder.cpp +++ b/thirdparty/msdfgen/core/EdgeHolder.cpp @@ -31,7 +31,7 @@ EdgeHolder::~EdgeHolder() { delete edgeSegment; } -EdgeHolder & EdgeHolder::operator=(const EdgeHolder &orig) { +EdgeHolder &EdgeHolder::operator=(const EdgeHolder &orig) { if (this != &orig) { delete edgeSegment; edgeSegment = orig.edgeSegment ? orig.edgeSegment->clone() : NULL; @@ -40,7 +40,7 @@ EdgeHolder & EdgeHolder::operator=(const EdgeHolder &orig) { } #ifdef MSDFGEN_USE_CPP11 -EdgeHolder & EdgeHolder::operator=(EdgeHolder &&orig) { +EdgeHolder &EdgeHolder::operator=(EdgeHolder &&orig) { if (this != &orig) { delete edgeSegment; edgeSegment = orig.edgeSegment; @@ -50,19 +50,19 @@ EdgeHolder & EdgeHolder::operator=(EdgeHolder &&orig) { } #endif -EdgeSegment & EdgeHolder::operator*() { +EdgeSegment &EdgeHolder::operator*() { return *edgeSegment; } -const EdgeSegment & EdgeHolder::operator*() const { +const EdgeSegment &EdgeHolder::operator*() const { return *edgeSegment; } -EdgeSegment * EdgeHolder::operator->() { +EdgeSegment *EdgeHolder::operator->() { return edgeSegment; } -const EdgeSegment * EdgeHolder::operator->() const { +const EdgeSegment *EdgeHolder::operator->() const { return edgeSegment; } diff --git a/thirdparty/msdfgen/core/EdgeHolder.h b/thirdparty/msdfgen/core/EdgeHolder.h index c4c5be76168..50a59b21891 100644 --- a/thirdparty/msdfgen/core/EdgeHolder.h +++ b/thirdparty/msdfgen/core/EdgeHolder.h @@ -22,14 +22,14 @@ public: EdgeHolder(EdgeHolder &&orig); #endif ~EdgeHolder(); - EdgeHolder & operator=(const EdgeHolder &orig); + EdgeHolder &operator=(const EdgeHolder &orig); #ifdef MSDFGEN_USE_CPP11 - EdgeHolder & operator=(EdgeHolder &&orig); + EdgeHolder &operator=(EdgeHolder &&orig); #endif - EdgeSegment & operator*(); - const EdgeSegment & operator*() const; - EdgeSegment * operator->(); - const EdgeSegment * operator->() const; + EdgeSegment &operator*(); + const EdgeSegment &operator*() const; + EdgeSegment *operator->(); + const EdgeSegment *operator->() const; operator EdgeSegment *(); operator const EdgeSegment *() const; diff --git a/thirdparty/msdfgen/core/MSDFErrorCorrection.cpp b/thirdparty/msdfgen/core/MSDFErrorCorrection.cpp index 7918597fd22..9a5cefe1287 100644 --- a/thirdparty/msdfgen/core/MSDFErrorCorrection.cpp +++ b/thirdparty/msdfgen/core/MSDFErrorCorrection.cpp @@ -19,8 +19,8 @@ namespace msdfgen { #define CLASSIFIER_FLAG_CANDIDATE 0x01 #define CLASSIFIER_FLAG_ARTIFACT 0x02 -const double ErrorCorrectionConfig::defaultMinDeviationRatio = 1.11111111111111111; -const double ErrorCorrectionConfig::defaultMinImproveRatio = 1.11111111111111111; +MSDFGEN_PUBLIC const double ErrorCorrectionConfig::defaultMinDeviationRatio = 1.11111111111111111; +MSDFGEN_PUBLIC const double ErrorCorrectionConfig::defaultMinImproveRatio = 1.11111111111111111; /// The base artifact classifier recognizes artifacts based on the contents of the SDF alone. class BaseArtifactClassifier { @@ -317,7 +317,7 @@ static bool hasDiagonalArtifactInner(const ArtifactClassifier &artifactClassifie em[0] = am, em[1] = dm; tEnd[tEx0 > t[i]] = tEx0; em[tEx0 > t[i]] = interpolatedMedian(a, l, q, tEx0); - rangeFlags |= artifactClassifier.rangeTest(tEnd[0], tEnd[1], t[i], am, dm, xm); + rangeFlags |= artifactClassifier.rangeTest(tEnd[0], tEnd[1], t[i], em[0], em[1], xm); } // tEx1 if (tEx1 > 0 && tEx1 < 1) { @@ -325,7 +325,7 @@ static bool hasDiagonalArtifactInner(const ArtifactClassifier &artifactClassifie em[0] = am, em[1] = dm; tEnd[tEx1 > t[i]] = tEx1; em[tEx1 > t[i]] = interpolatedMedian(a, l, q, tEx1); - rangeFlags |= artifactClassifier.rangeTest(tEnd[0], tEnd[1], t[i], am, dm, xm); + rangeFlags |= artifactClassifier.rangeTest(tEnd[0], tEnd[1], t[i], em[0], em[1], xm); } if (artifactClassifier.evaluate(t[i], xm, rangeFlags)) return true; diff --git a/thirdparty/msdfgen/core/Projection.h b/thirdparty/msdfgen/core/Projection.h index 7cdb1c307a6..3c457776acf 100644 --- a/thirdparty/msdfgen/core/Projection.h +++ b/thirdparty/msdfgen/core/Projection.h @@ -1,7 +1,7 @@ #pragma once -#include "Vector2.h" +#include "Vector2.hpp" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/Scanline.cpp b/thirdparty/msdfgen/core/Scanline.cpp index 8e5352dbf68..7407be41b56 100644 --- a/thirdparty/msdfgen/core/Scanline.cpp +++ b/thirdparty/msdfgen/core/Scanline.cpp @@ -1,7 +1,7 @@ #include "Scanline.h" -#include +#include #include "arithmetics.hpp" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/Scanline.h b/thirdparty/msdfgen/core/Scanline.h index 9c8f34044be..c0abc686429 100644 --- a/thirdparty/msdfgen/core/Scanline.h +++ b/thirdparty/msdfgen/core/Scanline.h @@ -2,6 +2,7 @@ #pragma once #include +#include "base.h" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/Shape.cpp b/thirdparty/msdfgen/core/Shape.cpp index 8d6f47c8071..cf99bd0f0c0 100644 --- a/thirdparty/msdfgen/core/Shape.cpp +++ b/thirdparty/msdfgen/core/Shape.cpp @@ -1,7 +1,7 @@ #include "Shape.h" -#include +#include #include "arithmetics.hpp" namespace msdfgen { @@ -18,7 +18,7 @@ void Shape::addContour(Contour &&contour) { } #endif -Contour & Shape::addContour() { +Contour &Shape::addContour() { contours.resize(contours.size()+1); return contours.back(); } @@ -40,15 +40,12 @@ bool Shape::validate() const { } static void deconvergeEdge(EdgeHolder &edgeHolder, int param) { - { - const QuadraticSegment *quadraticSegment = dynamic_cast(&*edgeHolder); - if (quadraticSegment) - edgeHolder = quadraticSegment->convertToCubic(); - } - { - CubicSegment *cubicSegment = dynamic_cast(&*edgeHolder); - if (cubicSegment) - cubicSegment->deconverge(param, MSDFGEN_DECONVERGENCE_FACTOR); + switch (edgeHolder->type()) { + case (int) QuadraticSegment::EDGE_TYPE: + edgeHolder = static_cast(&*edgeHolder)->convertToCubic(); + // fallthrough + case (int) CubicSegment::EDGE_TYPE: + static_cast(&*edgeHolder)->deconverge(param, MSDFGEN_DECONVERGENCE_FACTOR); } } @@ -162,16 +159,18 @@ void Shape::orientContours() { } } } - qsort(&intersections[0], intersections.size(), sizeof(Intersection), &Intersection::compare); - // Disqualify multiple intersections - for (int j = 1; j < (int) intersections.size(); ++j) - if (intersections[j].x == intersections[j-1].x) - intersections[j].direction = intersections[j-1].direction = 0; - // Inspect scanline and deduce orientations of intersected contours - for (int j = 0; j < (int) intersections.size(); ++j) - if (intersections[j].direction) - orientations[intersections[j].contourIndex] += 2*((j&1)^(intersections[j].direction > 0))-1; - intersections.clear(); + if (!intersections.empty()) { + qsort(&intersections[0], intersections.size(), sizeof(Intersection), &Intersection::compare); + // Disqualify multiple intersections + for (int j = 1; j < (int) intersections.size(); ++j) + if (intersections[j].x == intersections[j-1].x) + intersections[j].direction = intersections[j-1].direction = 0; + // Inspect scanline and deduce orientations of intersected contours + for (int j = 0; j < (int) intersections.size(); ++j) + if (intersections[j].direction) + orientations[intersections[j].contourIndex] += 2*((j&1)^(intersections[j].direction > 0))-1; + intersections.clear(); + } } } // Reverse contours that have the opposite orientation diff --git a/thirdparty/msdfgen/core/Shape.h b/thirdparty/msdfgen/core/Shape.h index 7539921ce7e..fd9222dbc4e 100644 --- a/thirdparty/msdfgen/core/Shape.h +++ b/thirdparty/msdfgen/core/Shape.h @@ -32,7 +32,7 @@ public: void addContour(Contour &&contour); #endif /// Adds a blank contour and returns its reference. - Contour & addContour(); + Contour &addContour(); /// Normalizes the shape geometry for distance field generation. void normalize(); /// Performs basic checks to determine if the object represents a valid shape. diff --git a/thirdparty/msdfgen/core/ShapeDistanceFinder.h b/thirdparty/msdfgen/core/ShapeDistanceFinder.h index 57df8d8e726..d8a584f6454 100644 --- a/thirdparty/msdfgen/core/ShapeDistanceFinder.h +++ b/thirdparty/msdfgen/core/ShapeDistanceFinder.h @@ -2,7 +2,7 @@ #pragma once #include -#include "Vector2.h" +#include "Vector2.hpp" #include "edge-selectors.h" #include "contour-combiners.h" diff --git a/thirdparty/msdfgen/core/ShapeDistanceFinder.hpp b/thirdparty/msdfgen/core/ShapeDistanceFinder.hpp index 028738e5c32..07fb5cdc0e6 100644 --- a/thirdparty/msdfgen/core/ShapeDistanceFinder.hpp +++ b/thirdparty/msdfgen/core/ShapeDistanceFinder.hpp @@ -9,7 +9,11 @@ ShapeDistanceFinder::ShapeDistanceFinder(const Shape &shape) : template typename ShapeDistanceFinder::DistanceType ShapeDistanceFinder::distance(const Point2 &origin) { contourCombiner.reset(origin); - typename ContourCombiner::EdgeSelectorType::EdgeCache *edgeCache = &shapeEdgeCache[0]; +#ifdef MSDFGEN_USE_CPP11 + typename ContourCombiner::EdgeSelectorType::EdgeCache *edgeCache = shapeEdgeCache.data(); +#else + typename ContourCombiner::EdgeSelectorType::EdgeCache *edgeCache = shapeEdgeCache.empty() ? NULL : &shapeEdgeCache[0]; +#endif for (std::vector::const_iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) { if (!contour->edges.empty()) { diff --git a/thirdparty/msdfgen/core/SignedDistance.cpp b/thirdparty/msdfgen/core/SignedDistance.cpp deleted file mode 100644 index be956d953e1..00000000000 --- a/thirdparty/msdfgen/core/SignedDistance.cpp +++ /dev/null @@ -1,29 +0,0 @@ - -#include "SignedDistance.h" - -#include -#include - -namespace msdfgen { - -SignedDistance::SignedDistance() : distance(-DBL_MAX), dot(1) { } - -SignedDistance::SignedDistance(double dist, double d) : distance(dist), dot(d) { } - -bool operator<(SignedDistance a, SignedDistance b) { - return fabs(a.distance) < fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot < b.dot); -} - -bool operator>(SignedDistance a, SignedDistance b) { - return fabs(a.distance) > fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot > b.dot); -} - -bool operator<=(SignedDistance a, SignedDistance b) { - return fabs(a.distance) < fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot <= b.dot); -} - -bool operator>=(SignedDistance a, SignedDistance b) { - return fabs(a.distance) > fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot >= b.dot); -} - -} diff --git a/thirdparty/msdfgen/core/SignedDistance.h b/thirdparty/msdfgen/core/SignedDistance.h deleted file mode 100644 index 91fee97600a..00000000000 --- a/thirdparty/msdfgen/core/SignedDistance.h +++ /dev/null @@ -1,23 +0,0 @@ - -#pragma once - -namespace msdfgen { - -/// Represents a signed distance and alignment, which together can be compared to uniquely determine the closest edge segment. -class SignedDistance { - -public: - double distance; - double dot; - - SignedDistance(); - SignedDistance(double dist, double d); - - friend bool operator<(SignedDistance a, SignedDistance b); - friend bool operator>(SignedDistance a, SignedDistance b); - friend bool operator<=(SignedDistance a, SignedDistance b); - friend bool operator>=(SignedDistance a, SignedDistance b); - -}; - -} diff --git a/thirdparty/msdfgen/core/SignedDistance.hpp b/thirdparty/msdfgen/core/SignedDistance.hpp new file mode 100644 index 00000000000..62e73c03aa9 --- /dev/null +++ b/thirdparty/msdfgen/core/SignedDistance.hpp @@ -0,0 +1,38 @@ + +#pragma once + +#include +#include +#include "base.h" + +namespace msdfgen { + +/// Represents a signed distance and alignment, which together can be compared to uniquely determine the closest edge segment. +class SignedDistance { + +public: + double distance; + double dot; + + inline SignedDistance() : distance(-DBL_MAX), dot(0) { } + inline SignedDistance(double dist, double d) : distance(dist), dot(d) { } + +}; + +inline bool operator<(const SignedDistance a, const SignedDistance b) { + return fabs(a.distance) < fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot < b.dot); +} + +inline bool operator>(const SignedDistance a, const SignedDistance b) { + return fabs(a.distance) > fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot > b.dot); +} + +inline bool operator<=(const SignedDistance a, const SignedDistance b) { + return fabs(a.distance) < fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot <= b.dot); +} + +inline bool operator>=(const SignedDistance a, const SignedDistance b) { + return fabs(a.distance) > fabs(b.distance) || (fabs(a.distance) == fabs(b.distance) && a.dot >= b.dot); +} + +} diff --git a/thirdparty/msdfgen/core/Vector2.cpp b/thirdparty/msdfgen/core/Vector2.cpp deleted file mode 100644 index 896963ff2cc..00000000000 --- a/thirdparty/msdfgen/core/Vector2.cpp +++ /dev/null @@ -1,146 +0,0 @@ - -#include "Vector2.h" - -namespace msdfgen { - -Vector2::Vector2(double val) : x(val), y(val) { } - -Vector2::Vector2(double x, double y) : x(x), y(y) { } - -void Vector2::reset() { - x = 0, y = 0; -} - -void Vector2::set(double x, double y) { - Vector2::x = x, Vector2::y = y; -} - -double Vector2::length() const { - return sqrt(x*x+y*y); -} - -double Vector2::direction() const { - return atan2(y, x); -} - -Vector2 Vector2::normalize(bool allowZero) const { - double len = length(); - if (len == 0) - return Vector2(0, !allowZero); - return Vector2(x/len, y/len); -} - -Vector2 Vector2::getOrthogonal(bool polarity) const { - return polarity ? Vector2(-y, x) : Vector2(y, -x); -} - -Vector2 Vector2::getOrthonormal(bool polarity, bool allowZero) const { - double len = length(); - if (len == 0) - return polarity ? Vector2(0, !allowZero) : Vector2(0, -!allowZero); - return polarity ? Vector2(-y/len, x/len) : Vector2(y/len, -x/len); -} - -Vector2 Vector2::project(const Vector2 &vector, bool positive) const { - Vector2 n = normalize(true); - double t = dotProduct(vector, n); - if (positive && t <= 0) - return Vector2(); - return t*n; -} - -Vector2::operator const void*() const { - return x || y ? this : NULL; -} - -bool Vector2::operator!() const { - return !x && !y; -} - -bool Vector2::operator==(const Vector2 &other) const { - return x == other.x && y == other.y; -} - -bool Vector2::operator!=(const Vector2 &other) const { - return x != other.x || y != other.y; -} - -Vector2 Vector2::operator+() const { - return *this; -} - -Vector2 Vector2::operator-() const { - return Vector2(-x, -y); -} - -Vector2 Vector2::operator+(const Vector2 &other) const { - return Vector2(x+other.x, y+other.y); -} - -Vector2 Vector2::operator-(const Vector2 &other) const { - return Vector2(x-other.x, y-other.y); -} - -Vector2 Vector2::operator*(const Vector2 &other) const { - return Vector2(x*other.x, y*other.y); -} - -Vector2 Vector2::operator/(const Vector2 &other) const { - return Vector2(x/other.x, y/other.y); -} - -Vector2 Vector2::operator*(double value) const { - return Vector2(x*value, y*value); -} - -Vector2 Vector2::operator/(double value) const { - return Vector2(x/value, y/value); -} - -Vector2 & Vector2::operator+=(const Vector2 &other) { - x += other.x, y += other.y; - return *this; -} - -Vector2 & Vector2::operator-=(const Vector2 &other) { - x -= other.x, y -= other.y; - return *this; -} - -Vector2 & Vector2::operator*=(const Vector2 &other) { - x *= other.x, y *= other.y; - return *this; -} - -Vector2 & Vector2::operator/=(const Vector2 &other) { - x /= other.x, y /= other.y; - return *this; -} - -Vector2 & Vector2::operator*=(double value) { - x *= value, y *= value; - return *this; -} - -Vector2 & Vector2::operator/=(double value) { - x /= value, y /= value; - return *this; -} - -double dotProduct(const Vector2 &a, const Vector2 &b) { - return a.x*b.x+a.y*b.y; -} - -double crossProduct(const Vector2 &a, const Vector2 &b) { - return a.x*b.y-a.y*b.x; -} - -Vector2 operator*(double value, const Vector2 &vector) { - return Vector2(value*vector.x, value*vector.y); -} - -Vector2 operator/(double value, const Vector2 &vector) { - return Vector2(value/vector.x, value/vector.y); -} - -} diff --git a/thirdparty/msdfgen/core/Vector2.h b/thirdparty/msdfgen/core/Vector2.h deleted file mode 100644 index 47ca637c3d4..00000000000 --- a/thirdparty/msdfgen/core/Vector2.h +++ /dev/null @@ -1,66 +0,0 @@ - -#pragma once - -#include -#include - -namespace msdfgen { - -/** -* A 2-dimensional euclidean vector with double precision. -* Implementation based on the Vector2 template from Artery Engine. -* @author Viktor Chlumsky -*/ -struct Vector2 { - - double x, y; - - Vector2(double val = 0); - Vector2(double x, double y); - /// Sets the vector to zero. - void reset(); - /// Sets individual elements of the vector. - void set(double x, double y); - /// Returns the vector's length. - double length() const; - /// Returns the angle of the vector in radians (atan2). - double direction() const; - /// Returns the normalized vector - one that has the same direction but unit length. - Vector2 normalize(bool allowZero = false) const; - /// Returns a vector with the same length that is orthogonal to this one. - Vector2 getOrthogonal(bool polarity = true) const; - /// Returns a vector with unit length that is orthogonal to this one. - Vector2 getOrthonormal(bool polarity = true, bool allowZero = false) const; - /// Returns a vector projected along this one. - Vector2 project(const Vector2 &vector, bool positive = false) const; - operator const void *() const; - bool operator!() const; - bool operator==(const Vector2 &other) const; - bool operator!=(const Vector2 &other) const; - Vector2 operator+() const; - Vector2 operator-() const; - Vector2 operator+(const Vector2 &other) const; - Vector2 operator-(const Vector2 &other) const; - Vector2 operator*(const Vector2 &other) const; - Vector2 operator/(const Vector2 &other) const; - Vector2 operator*(double value) const; - Vector2 operator/(double value) const; - Vector2 & operator+=(const Vector2 &other); - Vector2 & operator-=(const Vector2 &other); - Vector2 & operator*=(const Vector2 &other); - Vector2 & operator/=(const Vector2 &other); - Vector2 & operator*=(double value); - Vector2 & operator/=(double value); - /// Dot product of two vectors. - friend double dotProduct(const Vector2 &a, const Vector2 &b); - /// A special version of the cross product for 2D vectors (returns scalar value). - friend double crossProduct(const Vector2 &a, const Vector2 &b); - friend Vector2 operator*(double value, const Vector2 &vector); - friend Vector2 operator/(double value, const Vector2 &vector); - -}; - -/// A vector may also represent a point, which shall be differentiated semantically using the alias Point2. -typedef Vector2 Point2; - -} diff --git a/thirdparty/msdfgen/core/Vector2.hpp b/thirdparty/msdfgen/core/Vector2.hpp new file mode 100644 index 00000000000..0208c614971 --- /dev/null +++ b/thirdparty/msdfgen/core/Vector2.hpp @@ -0,0 +1,167 @@ + +#pragma once + +#include +#include "base.h" + +namespace msdfgen { + +/** + * A 2-dimensional euclidean floating-point vector. + * @author Viktor Chlumsky + */ +struct Vector2 { + + double x, y; + + inline Vector2(double val = 0) : x(val), y(val) { } + + inline Vector2(double x, double y) : x(x), y(y) { } + + /// Sets the vector to zero. + inline void reset() { + x = 0, y = 0; + } + + /// Sets individual elements of the vector. + inline void set(double x, double y) { + this->x = x, this->y = y; + } + + /// Returns the vector's squared length. + inline double squaredLength() const { + return x*x+y*y; + } + + /// Returns the vector's length. + inline double length() const { + return sqrt(x*x+y*y); + } + + /// Returns the normalized vector - one that has the same direction but unit length. + inline Vector2 normalize(bool allowZero = false) const { + if (double len = length()) + return Vector2(x/len, y/len); + return Vector2(0, !allowZero); + } + + /// Returns a vector with the same length that is orthogonal to this one. + inline Vector2 getOrthogonal(bool polarity = true) const { + return polarity ? Vector2(-y, x) : Vector2(y, -x); + } + + /// Returns a vector with unit length that is orthogonal to this one. + inline Vector2 getOrthonormal(bool polarity = true, bool allowZero = false) const { + if (double len = length()) + return polarity ? Vector2(-y/len, x/len) : Vector2(y/len, -x/len); + return polarity ? Vector2(0, !allowZero) : Vector2(0, -!allowZero); + } + +#ifdef MSDFGEN_USE_CPP11 + inline explicit operator bool() const { + return x || y; + } +#else + inline operator const void *() const { + return x || y ? this : NULL; + } +#endif + + inline Vector2 &operator+=(const Vector2 other) { + x += other.x, y += other.y; + return *this; + } + + inline Vector2 &operator-=(const Vector2 other) { + x -= other.x, y -= other.y; + return *this; + } + + inline Vector2 &operator*=(const Vector2 other) { + x *= other.x, y *= other.y; + return *this; + } + + inline Vector2 &operator/=(const Vector2 other) { + x /= other.x, y /= other.y; + return *this; + } + + inline Vector2 &operator*=(double value) { + x *= value, y *= value; + return *this; + } + + inline Vector2 &operator/=(double value) { + x /= value, y /= value; + return *this; + } + +}; + +/// A vector may also represent a point, which shall be differentiated semantically using the alias Point2. +typedef Vector2 Point2; + +/// Dot product of two vectors. +inline double dotProduct(const Vector2 a, const Vector2 b) { + return a.x*b.x+a.y*b.y; +} + +/// A special version of the cross product for 2D vectors (returns scalar value). +inline double crossProduct(const Vector2 a, const Vector2 b) { + return a.x*b.y-a.y*b.x; +} + +inline bool operator==(const Vector2 a, const Vector2 b) { + return a.x == b.x && a.y == b.y; +} + +inline bool operator!=(const Vector2 a, const Vector2 b) { + return a.x != b.x || a.y != b.y; +} + +inline Vector2 operator+(const Vector2 v) { + return v; +} + +inline Vector2 operator-(const Vector2 v) { + return Vector2(-v.x, -v.y); +} + +inline bool operator!(const Vector2 v) { + return !v.x && !v.y; +} + +inline Vector2 operator+(const Vector2 a, const Vector2 b) { + return Vector2(a.x+b.x, a.y+b.y); +} + +inline Vector2 operator-(const Vector2 a, const Vector2 b) { + return Vector2(a.x-b.x, a.y-b.y); +} + +inline Vector2 operator*(const Vector2 a, const Vector2 b) { + return Vector2(a.x*b.x, a.y*b.y); +} + +inline Vector2 operator/(const Vector2 a, const Vector2 b) { + return Vector2(a.x/b.x, a.y/b.y); +} + +inline Vector2 operator*(double a, const Vector2 b) { + return Vector2(a*b.x, a*b.y); +} + +inline Vector2 operator/(double a, const Vector2 b) { + return Vector2(a/b.x, a/b.y); +} + +inline Vector2 operator*(const Vector2 a, double b) { + return Vector2(a.x*b, a.y*b); +} + +inline Vector2 operator/(const Vector2 a, double b) { + return Vector2(a.x/b, a.y/b); +} + +} diff --git a/thirdparty/msdfgen/core/arithmetics.hpp b/thirdparty/msdfgen/core/arithmetics.hpp index 78c21d658ef..d5158ad0d3a 100644 --- a/thirdparty/msdfgen/core/arithmetics.hpp +++ b/thirdparty/msdfgen/core/arithmetics.hpp @@ -1,8 +1,8 @@ #pragma once -#include #include +#include "base.h" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/base.h b/thirdparty/msdfgen/core/base.h new file mode 100644 index 00000000000..ab85c136e12 --- /dev/null +++ b/thirdparty/msdfgen/core/base.h @@ -0,0 +1,16 @@ + +#pragma once + +// This file needs to be included first for all MSDFgen sources + +#ifndef MSDFGEN_PUBLIC +#include +#endif + +#include + +namespace msdfgen { + +typedef unsigned char byte; + +} diff --git a/thirdparty/msdfgen/core/bitmap-interpolation.hpp b/thirdparty/msdfgen/core/bitmap-interpolation.hpp index a14b0fb534d..ca2e48c080e 100644 --- a/thirdparty/msdfgen/core/bitmap-interpolation.hpp +++ b/thirdparty/msdfgen/core/bitmap-interpolation.hpp @@ -2,7 +2,7 @@ #pragma once #include "arithmetics.hpp" -#include "Vector2.h" +#include "Vector2.hpp" #include "BitmapRef.hpp" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/contour-combiners.cpp b/thirdparty/msdfgen/core/contour-combiners.cpp index 31f4c5da717..bac5534810d 100644 --- a/thirdparty/msdfgen/core/contour-combiners.cpp +++ b/thirdparty/msdfgen/core/contour-combiners.cpp @@ -33,7 +33,7 @@ void SimpleContourCombiner::reset(const Point2 &p) { } template -EdgeSelector & SimpleContourCombiner::edgeSelector(int) { +EdgeSelector &SimpleContourCombiner::edgeSelector(int) { return shapeEdgeSelector; } @@ -63,7 +63,7 @@ void OverlappingContourCombiner::reset(const Point2 &p) { } template -EdgeSelector & OverlappingContourCombiner::edgeSelector(int i) { +EdgeSelector &OverlappingContourCombiner::edgeSelector(int i) { return edgeSelectors[i]; } diff --git a/thirdparty/msdfgen/core/contour-combiners.h b/thirdparty/msdfgen/core/contour-combiners.h index 944b119aba8..04dbc342303 100644 --- a/thirdparty/msdfgen/core/contour-combiners.h +++ b/thirdparty/msdfgen/core/contour-combiners.h @@ -16,7 +16,7 @@ public: explicit SimpleContourCombiner(const Shape &shape); void reset(const Point2 &p); - EdgeSelector & edgeSelector(int i); + EdgeSelector &edgeSelector(int i); DistanceType distance() const; private: @@ -34,7 +34,7 @@ public: explicit OverlappingContourCombiner(const Shape &shape); void reset(const Point2 &p); - EdgeSelector & edgeSelector(int i); + EdgeSelector &edgeSelector(int i); DistanceType distance() const; private: diff --git a/thirdparty/msdfgen/core/edge-coloring.cpp b/thirdparty/msdfgen/core/edge-coloring.cpp index 6a87bba54d6..da9b0377358 100644 --- a/thirdparty/msdfgen/core/edge-coloring.cpp +++ b/thirdparty/msdfgen/core/edge-coloring.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "arithmetics.hpp" @@ -244,7 +245,7 @@ static double edgeToEdgeDistance(const EdgeSegment &a, const EdgeSegment &b, int return minDistance; } -static double splineToSplineDistance(EdgeSegment * const *edgeSegments, int aStart, int aEnd, int bStart, int bEnd, int precision) { +static double splineToSplineDistance(EdgeSegment *const *edgeSegments, int aStart, int aEnd, int bStart, int bEnd, int precision) { double minDistance = DBL_MAX; for (int ai = aStart; ai < aEnd; ++ai) for (int bi = bStart; bi < bEnd && minDistance; ++bi) { @@ -254,7 +255,7 @@ static double splineToSplineDistance(EdgeSegment * const *edgeSegments, int aSta return minDistance; } -static void colorSecondDegreeGraph(int *coloring, const int * const *edgeMatrix, int vertexCount, unsigned long long seed) { +static void colorSecondDegreeGraph(int *coloring, const int *const *edgeMatrix, int vertexCount, unsigned long long seed) { for (int i = 0; i < vertexCount; ++i) { int possibleColors = 7; for (int j = 0; j < i; ++j) { @@ -301,7 +302,7 @@ static int vertexPossibleColors(const int *coloring, const int *edgeVector, int return 7&~usedColors; } -static void uncolorSameNeighbors(std::queue &uncolored, int *coloring, const int * const *edgeMatrix, int vertex, int vertexCount) { +static void uncolorSameNeighbors(std::queue &uncolored, int *coloring, const int *const *edgeMatrix, int vertex, int vertexCount) { for (int i = vertex+1; i < vertexCount; ++i) { if (edgeMatrix[vertex][i] && coloring[i] == coloring[vertex]) { coloring[i] = -1; @@ -316,7 +317,7 @@ static void uncolorSameNeighbors(std::queue &uncolored, int *coloring, cons } } -static bool tryAddEdge(int *coloring, int * const *edgeMatrix, int vertexCount, int vertexA, int vertexB, int *coloringBuffer) { +static bool tryAddEdge(int *coloring, int *const *edgeMatrix, int vertexCount, int vertexA, int vertexB, int *coloringBuffer) { static const int FIRST_POSSIBLE_COLOR[8] = { -1, 0, 1, 0, 2, 2, 1, 0 }; edgeMatrix[vertexA][vertexB] = 1; edgeMatrix[vertexB][vertexA] = 1; @@ -358,7 +359,7 @@ static bool tryAddEdge(int *coloring, int * const *edgeMatrix, int vertexCount, } static int cmpDoublePtr(const void *a, const void *b) { - return sign(**reinterpret_cast(a)-**reinterpret_cast(b)); + return sign(**reinterpret_cast(a)-**reinterpret_cast(b)); } void edgeColoringByDistance(Shape &shape, double angleThreshold, unsigned long long seed) { diff --git a/thirdparty/msdfgen/core/edge-segments.cpp b/thirdparty/msdfgen/core/edge-segments.cpp index 5274a9a5a15..4fef89b95bc 100644 --- a/thirdparty/msdfgen/core/edge-segments.cpp +++ b/thirdparty/msdfgen/core/edge-segments.cpp @@ -56,18 +56,42 @@ CubicSegment::CubicSegment(Point2 p0, Point2 p1, Point2 p2, Point2 p3, EdgeColor p[3] = p3; } -LinearSegment * LinearSegment::clone() const { +LinearSegment *LinearSegment::clone() const { return new LinearSegment(p[0], p[1], color); } -QuadraticSegment * QuadraticSegment::clone() const { +QuadraticSegment *QuadraticSegment::clone() const { return new QuadraticSegment(p[0], p[1], p[2], color); } -CubicSegment * CubicSegment::clone() const { +CubicSegment *CubicSegment::clone() const { return new CubicSegment(p[0], p[1], p[2], p[3], color); } +int LinearSegment::type() const { + return (int) EDGE_TYPE; +} + +int QuadraticSegment::type() const { + return (int) EDGE_TYPE; +} + +int CubicSegment::type() const { + return (int) EDGE_TYPE; +} + +const Point2 *LinearSegment::controlPoints() const { + return p; +} + +const Point2 *QuadraticSegment::controlPoints() const { + return p; +} + +const Point2 *CubicSegment::controlPoints() const { + return p; +} + Point2 LinearSegment::point(double param) const { return mix(p[0], p[1], param); } @@ -483,7 +507,7 @@ void CubicSegment::splitInThirds(EdgeSegment *&part1, EdgeSegment *&part2, EdgeS part3 = new CubicSegment(point(2/3.), mix(mix(p[1], p[2], 2/3.), mix(p[2], p[3], 2/3.), 2/3.), p[2] == p[3] ? p[3] : mix(p[2], p[3], 2/3.), p[3], color); } -EdgeSegment * QuadraticSegment::convertToCubic() const { +EdgeSegment *QuadraticSegment::convertToCubic() const { return new CubicSegment(p[0], mix(p[0], p[1], 2/3.), mix(p[1], p[2], 1/3.), p[2], color); } diff --git a/thirdparty/msdfgen/core/edge-segments.h b/thirdparty/msdfgen/core/edge-segments.h index 1c8fb599ff2..71ce8fc4ab6 100644 --- a/thirdparty/msdfgen/core/edge-segments.h +++ b/thirdparty/msdfgen/core/edge-segments.h @@ -1,8 +1,8 @@ #pragma once -#include "Vector2.h" -#include "SignedDistance.h" +#include "Vector2.hpp" +#include "SignedDistance.hpp" #include "EdgeColor.h" namespace msdfgen { @@ -20,7 +20,11 @@ public: EdgeSegment(EdgeColor edgeColor = WHITE) : color(edgeColor) { } virtual ~EdgeSegment() { } /// Creates a copy of the edge segment. - virtual EdgeSegment * clone() const = 0; + virtual EdgeSegment *clone() const = 0; + /// Returns the numeric code of the edge segment's type. + virtual int type() const = 0; + /// Returns the array of control points. + virtual const Point2 *controlPoints() const = 0; /// Returns the point on the edge specified by the parameter (between 0 and 1). virtual Point2 point(double param) const = 0; /// Returns the direction the edge has at the point specified by the parameter. @@ -51,10 +55,16 @@ public: class LinearSegment : public EdgeSegment { public: + enum EdgeType { + EDGE_TYPE = 1 + }; + Point2 p[2]; LinearSegment(Point2 p0, Point2 p1, EdgeColor edgeColor = WHITE); - LinearSegment * clone() const; + LinearSegment *clone() const; + int type() const; + const Point2 *controlPoints() const; Point2 point(double param) const; Vector2 direction(double param) const; Vector2 directionChange(double param) const; @@ -74,10 +84,16 @@ public: class QuadraticSegment : public EdgeSegment { public: + enum EdgeType { + EDGE_TYPE = 2 + }; + Point2 p[3]; QuadraticSegment(Point2 p0, Point2 p1, Point2 p2, EdgeColor edgeColor = WHITE); - QuadraticSegment * clone() const; + QuadraticSegment *clone() const; + int type() const; + const Point2 *controlPoints() const; Point2 point(double param) const; Vector2 direction(double param) const; Vector2 directionChange(double param) const; @@ -91,7 +107,7 @@ public: void moveEndPoint(Point2 to); void splitInThirds(EdgeSegment *&part1, EdgeSegment *&part2, EdgeSegment *&part3) const; - EdgeSegment * convertToCubic() const; + EdgeSegment *convertToCubic() const; }; @@ -99,10 +115,16 @@ public: class CubicSegment : public EdgeSegment { public: + enum EdgeType { + EDGE_TYPE = 3 + }; + Point2 p[4]; CubicSegment(Point2 p0, Point2 p1, Point2 p2, Point2 p3, EdgeColor edgeColor = WHITE); - CubicSegment * clone() const; + CubicSegment *clone() const; + int type() const; + const Point2 *controlPoints() const; Point2 point(double param) const; Vector2 direction(double param) const; Vector2 directionChange(double param) const; diff --git a/thirdparty/msdfgen/core/edge-selectors.h b/thirdparty/msdfgen/core/edge-selectors.h index 3620999f82a..6b8e2d943f2 100644 --- a/thirdparty/msdfgen/core/edge-selectors.h +++ b/thirdparty/msdfgen/core/edge-selectors.h @@ -1,8 +1,8 @@ #pragma once -#include "Vector2.h" -#include "SignedDistance.h" +#include "Vector2.hpp" +#include "SignedDistance.hpp" #include "edge-segments.h" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/equation-solver.cpp b/thirdparty/msdfgen/core/equation-solver.cpp index 4144fa3340e..7c1cbb39f85 100644 --- a/thirdparty/msdfgen/core/equation-solver.cpp +++ b/thirdparty/msdfgen/core/equation-solver.cpp @@ -49,7 +49,7 @@ static int solveCubicNormed(double x[3], double a, double b, double c) { x[2] = q*cos(1/3.*(t-2*M_PI))-a; return 3; } else { - double u = (r < 0 ? 1 : -1)*pow(fabs(r)+sqrt(r2-q3), 1/3.); + double u = (r < 0 ? 1 : -1)*pow(fabs(r)+sqrt(r2-q3), 1/3.); double v = u == 0 ? 0 : q/u; x[0] = (u+v)-a; if (u == v || fabs(u-v) < 1e-12*fabs(u+v)) { diff --git a/thirdparty/msdfgen/core/equation-solver.h b/thirdparty/msdfgen/core/equation-solver.h index bae097b2b9a..bfeeb158230 100644 --- a/thirdparty/msdfgen/core/equation-solver.h +++ b/thirdparty/msdfgen/core/equation-solver.h @@ -1,6 +1,8 @@ #pragma once +#include "base.h" + namespace msdfgen { // ax^2 + bx + c = 0 diff --git a/thirdparty/msdfgen/core/generator-config.h b/thirdparty/msdfgen/core/generator-config.h index b430d37f3c4..b7b153477f6 100644 --- a/thirdparty/msdfgen/core/generator-config.h +++ b/thirdparty/msdfgen/core/generator-config.h @@ -1,7 +1,6 @@ #pragma once -#include #include "BitmapRef.hpp" #ifndef MSDFGEN_PUBLIC diff --git a/thirdparty/msdfgen/core/msdf-error-correction.h b/thirdparty/msdfgen/core/msdf-error-correction.h index d5384c93297..6318f184bbc 100644 --- a/thirdparty/msdfgen/core/msdf-error-correction.h +++ b/thirdparty/msdfgen/core/msdf-error-correction.h @@ -1,7 +1,7 @@ #pragma once -#include "Vector2.h" +#include "Vector2.hpp" #include "Projection.h" #include "Shape.h" #include "BitmapRef.hpp" diff --git a/thirdparty/msdfgen/core/pixel-conversion.hpp b/thirdparty/msdfgen/core/pixel-conversion.hpp index 7e9b6d08f0a..3ef8a2d1da8 100644 --- a/thirdparty/msdfgen/core/pixel-conversion.hpp +++ b/thirdparty/msdfgen/core/pixel-conversion.hpp @@ -5,8 +5,6 @@ namespace msdfgen { -typedef unsigned char byte; - inline byte pixelFloatToByte(float x) { return byte(clamp(256.f*x, 255.f)); } diff --git a/thirdparty/msdfgen/core/rasterization.h b/thirdparty/msdfgen/core/rasterization.h index 82d0c73d95e..8ba41cd6452 100644 --- a/thirdparty/msdfgen/core/rasterization.h +++ b/thirdparty/msdfgen/core/rasterization.h @@ -1,7 +1,7 @@ #pragma once -#include "Vector2.h" +#include "Vector2.hpp" #include "Shape.h" #include "Projection.h" #include "Scanline.h" diff --git a/thirdparty/msdfgen/core/render-sdf.h b/thirdparty/msdfgen/core/render-sdf.h index 7f2d270b673..0fa695acf6d 100644 --- a/thirdparty/msdfgen/core/render-sdf.h +++ b/thirdparty/msdfgen/core/render-sdf.h @@ -1,7 +1,7 @@ #pragma once -#include "Vector2.h" +#include "Vector2.hpp" #include "BitmapRef.hpp" namespace msdfgen { diff --git a/thirdparty/msdfgen/core/sdf-error-estimation.h b/thirdparty/msdfgen/core/sdf-error-estimation.h index d2fd40d2b8e..f9008222abc 100644 --- a/thirdparty/msdfgen/core/sdf-error-estimation.h +++ b/thirdparty/msdfgen/core/sdf-error-estimation.h @@ -1,7 +1,7 @@ #pragma once -#include "Vector2.h" +#include "Vector2.hpp" #include "Shape.h" #include "Projection.h" #include "Scanline.h" diff --git a/thirdparty/msdfgen/core/shape-description.cpp b/thirdparty/msdfgen/core/shape-description.cpp index a096fa25410..32c515d120e 100644 --- a/thirdparty/msdfgen/core/shape-description.cpp +++ b/thirdparty/msdfgen/core/shape-description.cpp @@ -244,34 +244,37 @@ bool writeShapeDescription(FILE *output, const Shape &shape) { default:; } } - if (const LinearSegment *e = dynamic_cast(&**edge)) { - fprintf(output, "\t"); - writeCoord(output, e->p[0]); - fprintf(output, ";\n"); - if (colorCode) - fprintf(output, "\t\t%c;\n", colorCode); - } - if (const QuadraticSegment *e = dynamic_cast(&**edge)) { - fprintf(output, "\t"); - writeCoord(output, e->p[0]); - fprintf(output, ";\n\t\t"); - if (colorCode) - fprintf(output, "%c", colorCode); - fprintf(output, "("); - writeCoord(output, e->p[1]); - fprintf(output, ");\n"); - } - if (const CubicSegment *e = dynamic_cast(&**edge)) { - fprintf(output, "\t"); - writeCoord(output, e->p[0]); - fprintf(output, ";\n\t\t"); - if (colorCode) - fprintf(output, "%c", colorCode); - fprintf(output, "("); - writeCoord(output, e->p[1]); - fprintf(output, "; "); - writeCoord(output, e->p[2]); - fprintf(output, ");\n"); + const Point2 *p = (*edge)->controlPoints(); + switch ((*edge)->type()) { + case (int) LinearSegment::EDGE_TYPE: + fprintf(output, "\t"); + writeCoord(output, p[0]); + fprintf(output, ";\n"); + if (colorCode) + fprintf(output, "\t\t%c;\n", colorCode); + break; + case (int) QuadraticSegment::EDGE_TYPE: + fprintf(output, "\t"); + writeCoord(output, p[0]); + fprintf(output, ";\n\t\t"); + if (colorCode) + fprintf(output, "%c", colorCode); + fprintf(output, "("); + writeCoord(output, p[1]); + fprintf(output, ");\n"); + break; + case (int) CubicSegment::EDGE_TYPE: + fprintf(output, "\t"); + writeCoord(output, p[0]); + fprintf(output, ";\n\t\t"); + if (colorCode) + fprintf(output, "%c", colorCode); + fprintf(output, "("); + writeCoord(output, p[1]); + fprintf(output, "; "); + writeCoord(output, p[2]); + fprintf(output, ");\n"); + break; } } fprintf(output, "\t#\n"); diff --git a/thirdparty/msdfgen/core/shape-description.h b/thirdparty/msdfgen/core/shape-description.h index 5df7c50a035..6e2e2236745 100644 --- a/thirdparty/msdfgen/core/shape-description.h +++ b/thirdparty/msdfgen/core/shape-description.h @@ -1,7 +1,6 @@ #pragma once -#include #include #include "Shape.h" diff --git a/thirdparty/msdfgen/msdfgen.h b/thirdparty/msdfgen/msdfgen.h index c9ae4f52dcc..dff8beb6347 100644 --- a/thirdparty/msdfgen/msdfgen.h +++ b/thirdparty/msdfgen/msdfgen.h @@ -4,7 +4,7 @@ /* * MULTI-CHANNEL SIGNED DISTANCE FIELD GENERATOR * --------------------------------------------- - * A utility by Viktor Chlumsky, (c) 2014 - 2022 + * A utility by Viktor Chlumsky, (c) 2014 - 2023 * * The technique used to generate multi-channel distance fields in this code * has been developed by Viktor Chlumsky in 2014 for his master's thesis, @@ -15,8 +15,9 @@ * */ +#include "core/base.h" #include "core/arithmetics.hpp" -#include "core/Vector2.h" +#include "core/Vector2.hpp" #include "core/Projection.h" #include "core/Scanline.h" #include "core/Shape.h"