From 5c9493b34878267b65879270951026982507917b Mon Sep 17 00:00:00 2001 From: kgv Date: Tue, 6 Apr 2021 22:25:38 +0300 Subject: [PATCH] 0031087: Configuration - make FreeType dependency optional Added option USE_FREETYPE to CMake configuration, enabled by default. Added handling of HAVE_FREETYPE macros. genproj now overrides env.bat/env.sh on template change. --- CMakeLists.txt | 40 ++++++------ adm/cmake/occt_csf.cmake | 4 +- adm/cmake/vardescr.cmake | 5 +- adm/genconf.tcl | 28 +++++---- adm/genconfdeps.tcl | 5 +- adm/genproj.tcl | 43 +++++++------ adm/qmake/OccToolkit.pri | 4 +- adm/templates/env.bat | 14 +++-- adm/templates/env.sh | 2 + dox/build/build_occt/building_occt.md | 4 +- src/Draw/Draw_BasicCommands.cxx | 5 ++ src/Font/Font_FTFont.cxx | 89 ++++++++++++++++++++++++++- src/Font/Font_FTLibrary.cxx | 10 ++- src/Font/Font_FontMgr.cxx | 32 +++++++--- src/StdPrs/StdPrs_BRepFont.cxx | 23 +++++-- 15 files changed, 228 insertions(+), 80 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index abe4a8fa7d..3c6ad000e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -364,6 +364,14 @@ if (MSVC) endif() # whether use optional 3rdparty or not +set (USE_FREETYPE ON CACHE BOOL "${USE_FREETYPE_DESCR}") +set (USE_FREEIMAGE OFF CACHE BOOL "${USE_FREEIMAGE_DESCR}") +set (USE_FFMPEG OFF CACHE BOOL "${USE_FFMPEG_DESCR}") +set (USE_OPENVR OFF CACHE BOOL "${USE_OPENVR_DESCR}") +set (USE_RAPIDJSON OFF CACHE BOOL "${USE_RAPIDJSON_DESCR}") +set (USE_TBB OFF CACHE BOOL "${USE_TBB_DESCR}") +set (USE_EIGEN OFF CACHE BOOL "${USE_EIGEN_DESCR}") + if (APPLE) set (USE_GLX OFF CACHE BOOL "${USE_GLX_DESCR}") else() @@ -493,7 +501,7 @@ endif() # search for CSF variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_FreeImagePlus CAN_USE_FREEIMAGE) OCCT_IS_PRODUCT_REQUIRED (CSF_TclLibs USE_TCL) -OCCT_IS_PRODUCT_REQUIRED (CSF_FREETYPE USE_FREETYPE) +OCCT_IS_PRODUCT_REQUIRED (CSF_FREETYPE CAN_USE_FREETYPE) OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlLibs CAN_USE_OPENGL) OCCT_IS_PRODUCT_REQUIRED (CSF_OpenGlesLibs CAN_USE_GLES2) OCCT_IS_PRODUCT_REQUIRED (CSF_TBB CAN_USE_TBB) @@ -516,13 +524,21 @@ else() OCCT_CHECK_AND_UNSET ("INSTALL_TK") endif() -if (USE_FREETYPE) - message (STATUS "Info: Freetype is used by OCCT") - OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freetype") +# FreeType +if (CAN_USE_FREETYPE) + if (USE_FREETYPE) + message (STATUS "Info: FreeType is used by OCCT") + add_definitions (-DHAVE_FREETYPE) + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freetype") + else() + OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREETYPE") + OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2") + OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build") + OCCT_CHECK_AND_UNSET ("INSTALL_FREETYPE") + endif() else() + OCCT_CHECK_AND_UNSET ("USE_FREETYPE") OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_FREETYPE") - OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2") - OCCT_CHECK_AND_UNSET ("3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build") OCCT_CHECK_AND_UNSET ("INSTALL_FREETYPE") endif() @@ -550,8 +566,6 @@ endif() # FREEIMAGE if (CAN_USE_FREEIMAGE) - set (USE_FREEIMAGE OFF CACHE BOOL "${USE_FREEIMAGE_DESCR}") - if (USE_FREEIMAGE) add_definitions (-DHAVE_FREEIMAGE) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/freeimage") @@ -570,8 +584,6 @@ endif() # search for CSF_OpenVR variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_OpenVR CAN_USE_OPENVR) if (CAN_USE_OPENVR) - set (USE_OPENVR OFF CACHE BOOL "${USE_OPENVR_DESCR}") - if (USE_OPENVR) add_definitions (-DHAVE_OPENVR) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/openvr") @@ -591,8 +603,6 @@ endif() OCCT_IS_PRODUCT_REQUIRED (CSF_FFmpeg CAN_USE_FFMPEG) if (CAN_USE_FFMPEG) - set (USE_FFMPEG OFF CACHE BOOL "${USE_FFMPEG_DESCR}") - if (USE_FFMPEG) add_definitions (-DHAVE_FFMPEG) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/ffmpeg") @@ -655,8 +665,6 @@ endif() # TBB if (NOT DEFINED ANDROID AND CAN_USE_TBB) - set (USE_TBB OFF CACHE BOOL "${USE_TBB_DESCR}") - if (USE_TBB) add_definitions (-DHAVE_TBB) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tbb") @@ -677,8 +685,6 @@ endif() # search for CSF_RapidJSON variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_RapidJSON CAN_USE_RAPIDJSON) if (CAN_USE_RAPIDJSON) - set (USE_RAPIDJSON OFF CACHE BOOL "${USE_RAPIDJSON_DESCR}") - if (USE_RAPIDJSON) add_definitions (-DHAVE_RAPIDJSON) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/rapidjson") @@ -695,8 +701,6 @@ endif() # EIGEN if (CAN_USE_EIGEN) - set (USE_EIGEN OFF CACHE BOOL "${USE_EIGEN_DESCR}") - if (USE_EIGEN) add_definitions (-DHAVE_EIGEN) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/eigen") diff --git a/adm/cmake/occt_csf.cmake b/adm/cmake/occt_csf.cmake index 4d716241b0..c283e6c601 100644 --- a/adm/cmake/occt_csf.cmake +++ b/adm/cmake/occt_csf.cmake @@ -118,6 +118,8 @@ else() set (CSF_OpenGlesLibs "EGL GLESv2") set (CSF_XwLibs "X11 Xext Xmu Xi") set (CSF_dl "dl") - set (CSF_fontconfig "fontconfig") + if (USE_FREETYPE) + set (CSF_fontconfig "fontconfig") + endif() endif() endif() diff --git a/adm/cmake/vardescr.cmake b/adm/cmake/vardescr.cmake index 19182d8e9b..f04395ca92 100644 --- a/adm/cmake/vardescr.cmake +++ b/adm/cmake/vardescr.cmake @@ -155,12 +155,15 @@ set (3RDPARTY_DIR_DESCR third-party product have been found - corresponding CMake variables will be specified (VTK: 3RDPARTY_VTK_DIR, 3RDPARTY_VTK_INCLUDE_DIR, 3RDPARTY_VTK_LIBRARY_DIR)") +set (USE_FREETYPE_DESCR +"Indicates whether FreeType product should be used in OCCT for text rendering using external font files") + set (USE_FFMPEG_DESCR "Indicates whether FFmpeg framework is used or not. FFmpeg stands for multimedia data handling, open-source software libraries used for video encoding and decoding.") set (USE_FREEIMAGE_DESCR -"Indicates whether Freeimage product should be used in OCCT visualization +"Indicates whether FreeImage product should be used in OCCT visualization module for support of popular graphics image formats (PNG, BMP etc)") set (USE_OPENVR_DESCR diff --git a/adm/genconf.tcl b/adm/genconf.tcl index ce39bc4745..bc8a09ec2b 100644 --- a/adm/genconf.tcl +++ b/adm/genconf.tcl @@ -175,7 +175,9 @@ proc wokdep:gui:UpdateList {} { set anBin32Errs {} set anBin64Errs {} wokdep:SearchTclTk anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs - wokdep:SearchFreeType anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs + if { "$::HAVE_FREETYPE" == "true" } { + wokdep:SearchFreeType anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs + } wokdep:SearchX11 anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs if { "$::HAVE_GLES2" == "true" } { wokdep:SearchEGL anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs @@ -471,6 +473,8 @@ ttk::label .myFrame.myHxxChecks.myScutsLbl -text "Strategy for filling he ttk::label .myFrame.mySrchLbl -text "3rd-parties search path:" -padding {5 5 80 5} entry .myFrame.mySrchEntry -textvariable PRODUCTS_PATH_INPUT -width 80 ttk::button .myFrame.mySrchBrowseBtn -text "Browse" -command wokdep:gui:BrowsePartiesRoot +checkbutton .myFrame.myChecks.myFreeTypeCheck -offvalue "false" -onvalue "true" -variable HAVE_FREETYPE -command wokdep:gui:UpdateList +ttk::label .myFrame.myChecks.myFreeTypeLbl -text "Use FreeType" checkbutton .myFrame.myChecks.myFImageCheck -offvalue "false" -onvalue "true" -variable HAVE_FREEIMAGE -command wokdep:gui:UpdateList ttk::label .myFrame.myChecks.myFImageLbl -text "Use FreeImage" checkbutton .myFrame.myChecks.myTbbCheck -offvalue "false" -onvalue "true" -variable HAVE_TBB -command wokdep:gui:UpdateList @@ -604,10 +608,10 @@ incr aRowIter grid .myFrame.myChecks -row $aRowIter -column 0 -columnspan 10 -sticky w incr aRowIter -grid .myFrame.myChecks.myFImageCheck -row $aCheckRowIter -column 0 -sticky e -grid .myFrame.myChecks.myFImageLbl -row $aCheckRowIter -column 1 -sticky w -grid .myFrame.myChecks.myTbbCheck -row $aCheckRowIter -column 2 -sticky e -grid .myFrame.myChecks.myTbbLbl -row $aCheckRowIter -column 3 -sticky w +grid .myFrame.myChecks.myFreeTypeCheck -row $aCheckRowIter -column 0 -sticky e +grid .myFrame.myChecks.myFreeTypeLbl -row $aCheckRowIter -column 1 -sticky w +grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 2 -sticky e +grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 3 -sticky w if { "$::tcl_platform(os)" != "Darwin" } { grid .myFrame.myChecks.myGlesCheck -row $aCheckRowIter -column 4 -sticky e grid .myFrame.myChecks.myGlesLbl -row $aCheckRowIter -column 5 -sticky w @@ -621,10 +625,10 @@ grid .myFrame.myChecks.myQtCheck -row $aCheckRowIter -column 12 -sticky e grid .myFrame.myChecks.myQtLbl -row $aCheckRowIter -column 13 -sticky w incr aCheckRowIter -grid .myFrame.myChecks.myFFmpegCheck -row $aCheckRowIter -column 0 -sticky e -grid .myFrame.myChecks.myFFmpegLbl -row $aCheckRowIter -column 1 -sticky w -grid .myFrame.myChecks.myVtkCheck -row $aCheckRowIter -column 2 -sticky e -grid .myFrame.myChecks.myVtkLbl -row $aCheckRowIter -column 3 -sticky w +grid .myFrame.myChecks.myFImageCheck -row $aCheckRowIter -column 0 -sticky e +grid .myFrame.myChecks.myFImageLbl -row $aCheckRowIter -column 1 -sticky w +grid .myFrame.myChecks.myTbbCheck -row $aCheckRowIter -column 2 -sticky e +grid .myFrame.myChecks.myTbbLbl -row $aCheckRowIter -column 3 -sticky w if { "$::tcl_platform(platform)" == "windows" } { grid .myFrame.myChecks.myD3dCheck -row $aCheckRowIter -column 4 -sticky e grid .myFrame.myChecks.myD3dLbl -row $aCheckRowIter -column 5 -sticky w @@ -638,8 +642,10 @@ grid .myFrame.myChecks.myJDKCheck -row $aCheckRowIter -column 12 -sticky e grid .myFrame.myChecks.myJDKLbl -row $aCheckRowIter -column 13 -sticky w incr aCheckRowIter -grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 0 -sticky e -grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 1 -sticky w +grid .myFrame.myChecks.myFFmpegCheck -row $aCheckRowIter -column 0 -sticky e +grid .myFrame.myChecks.myFFmpegLbl -row $aCheckRowIter -column 1 -sticky w +grid .myFrame.myChecks.myVtkCheck -row $aCheckRowIter -column 2 -sticky e +grid .myFrame.myChecks.myVtkLbl -row $aCheckRowIter -column 3 -sticky w grid .myFrame.myChecks.myOpenVrCheck -row $aCheckRowIter -column 4 -sticky e grid .myFrame.myChecks.myOpenVrLbl -row $aCheckRowIter -column 5 -sticky w grid .myFrame.myChecks.myE57Check -row $aCheckRowIter -column 6 -sticky e diff --git a/adm/genconfdeps.tcl b/adm/genconfdeps.tcl index 85715cfa45..0054c92b60 100644 --- a/adm/genconfdeps.tcl +++ b/adm/genconfdeps.tcl @@ -68,9 +68,10 @@ if { [info exists ::env(SHORTCUT_HEADERS)] } { } # fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name -set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector} +set THE_ENV_VARIABLES {HAVE_FREETYPE HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector} +foreach anEnvIter $THE_ENV_VARIABLES { set ${anEnvIter} "false" } +set HAVE_FREETYPE "true" foreach anEnvIter $THE_ENV_VARIABLES { - set ${anEnvIter} "false" if { [info exists ::env(${anEnvIter})] } { set ${anEnvIter} "$::env(${anEnvIter})" } diff --git a/adm/genproj.tcl b/adm/genproj.tcl index fe11d4ff2e..64e0eb2b27 100644 --- a/adm/genproj.tcl +++ b/adm/genproj.tcl @@ -129,7 +129,7 @@ proc osutils:isEqualContent { theContent1 theContent2 } { # Auxiliary function for writing new file content only if it has been actually changed # (e.g. to preserve file timestamp on no change). # Useful for automatically (re)generated files. -proc osutils:writeTextFile { theFile theContent {theEol lf} } { +proc osutils:writeTextFile { theFile theContent {theEol lf} {theToBackup false} } { if {[file exists "${theFile}"]} { set aFileOld [open "${theFile}" rb] fconfigure $aFileOld -translation crlf @@ -143,6 +143,10 @@ proc osutils:writeTextFile { theFile theContent {theEol lf} } { return false } + if { $theToBackup == true } { + puts "Warning: file ${theFile} is updated. Old content is saved to ${theFile}.bak" + file copy -force -- "${theFile}" "${theFile}.bak" + } file delete -force "${theFile}" } @@ -373,29 +377,28 @@ proc copy_with_warning {from to} { # Generate auxiliary scripts for launching IDE. proc genprojbat {theFormat thePlatform theSolution} { set aTargetPlatformExt sh + set aTargetEol lf if { $thePlatform == "wnt" || $thePlatform == "uwp" } { set aTargetPlatformExt bat + set aTargetEol crlf } if {"$theFormat" != "cmake"} { - # copy env.bat/sh only if not yet present - if { ! [file exists "$::path/env.${aTargetPlatformExt}"] } { - set anEnvTmplFile [open "$::THE_CASROOT/adm/templates/env.${aTargetPlatformExt}" "r"] - set anEnvTmpl [read $anEnvTmplFile] - close $anEnvTmplFile + # generate env.bat/sh + set anEnvTmplFilePath "$::THE_CASROOT/adm/templates/env.${aTargetPlatformExt}" + set anEnvTmplFile [open "$anEnvTmplFilePath" "r"] + set anEnvTmpl [read $anEnvTmplFile] + close $anEnvTmplFile - set aCasRoot "" - if { [file normalize "$::path"] != [file normalize "$::THE_CASROOT"] } { - set aCasRoot [relativePath "$::path" "$::THE_CASROOT"] - } - - regsub -all -- {__CASROOT__} $anEnvTmpl "$aCasRoot" anEnvTmpl - - set anEnvFile [open "$::path/env.${aTargetPlatformExt}" "w"] - puts $anEnvFile $anEnvTmpl - close $anEnvFile + set aCasRoot "" + if { [file normalize "$::path"] != [file normalize "$::THE_CASROOT"] } { + set aCasRoot [relativePath "$::path" "$::THE_CASROOT"] } + regsub -all -- {__CASROOT__} $anEnvTmpl "$aCasRoot" anEnvTmpl + set aLineList [split $anEnvTmpl "\n"] + osutils:writeTextFile "$::path/env.${aTargetPlatformExt}" $aLineList $aTargetEol true + copy_with_warning "$::THE_CASROOT/adm/templates/draw.${aTargetPlatformExt}" "$::path/draw.${aTargetPlatformExt}" if { "$::BUILD_Inspector" == "true" } { @@ -1409,7 +1412,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} { unset theCsfLibsMap unset theCsfFrmsMap - set aLibsMap(CSF_FREETYPE) "freetype" + if { "$::HAVE_FREETYPE" == "true" } { + set aLibsMap(CSF_FREETYPE) "freetype" + } set aLibsMap(CSF_TclLibs) "tcl8.6" set aLibsMap(CSF_TclTkLibs) "tk8.6" if { "$::HAVE_FREEIMAGE" == "true" } { @@ -1504,7 +1509,9 @@ proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} { } elseif { "$theOS" == "android" } { set aLibsMap(CSF_androidlog) "log" } else { - set aLibsMap(CSF_fontconfig) "fontconfig" + if { "$::HAVE_FREETYPE" == "true" } { + set aLibsMap(CSF_fontconfig) "fontconfig" + } if { "$theOS" == "qnx" } { # CSF_ThreadLibs - pthread API is part of libc on QNX } else { diff --git a/adm/qmake/OccToolkit.pri b/adm/qmake/OccToolkit.pri index c7398ae4f9..e5c5671549 100644 --- a/adm/qmake/OccToolkit.pri +++ b/adm/qmake/OccToolkit.pri @@ -18,7 +18,7 @@ aHxxRoot = $$OccGitRoot/inc INCLUDEPATH += $$aHxxRoot # CSF variables -CSF_FREETYPE = -lfreetype +HAVE_FREETYPE { CSF_FREETYPE = -lfreetype } CSF_TclLibs = -ltcl8.6 CSF_TclTkLibs = -ltk8.6 HAVE_FREEIMAGE { CSF_FreeImagePlus = -lfreeimage } else:win32 { CSF_FreeImagePlus = -lwindowscodecs -lole32 } @@ -64,7 +64,7 @@ win32 { CSF_TclTkLibs = -lX11 -ltk8.6 CSF_XwLibs = -lX11 -lXext -lXmu -lXi CSF_MotifLibs = -lX11 - CSF_fontconfig = -lfontconfig + HAVE_FREETYPE { CSF_fontconfig = -lfontconfig } } for (aCfgIter, CONFIG) { diff --git a/adm/templates/env.bat b/adm/templates/env.bat index 4b26b4ccb9..1a53234c76 100644 --- a/adm/templates/env.bat +++ b/adm/templates/env.bat @@ -17,6 +17,7 @@ set "ARCH=64" set "VCVARS=" set "HAVE_TBB=false" set "HAVE_OPENCL=false" +set "HAVE_FREETYPE=true" set "HAVE_FREEIMAGE=false" set "HAVE_FFMPEG=false" set "HAVE_VTK=false" @@ -56,9 +57,9 @@ rem Decode VCVER variable and define related ones: rem rem VCFMT - "vc" followed by full version number of Visual Studio toolset rem (same as VCVER without optional suffix "-uwp") -rem VCLIB - name of folder contining binaries +rem VCLIB - name of folder containing binaries rem (same as VCVER except without third version in number) -rem VCPROP - name of required Visual Studion Workload (starting with VS 2017) +rem VCPROP - name of required Visual Studio Workload (starting with VS 2017) rem rem Note that for VS before 2015 (vc14) always rem VCFMT=VCLIB=VCVER and VCPROP=NativeDesktop @@ -182,6 +183,7 @@ set "CSF_OPT_CMPL=" set "PRODUCTS_DEFINES=" if ["%HAVE_TBB%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_TBB" & set "CSF_DEFINES=HAVE_TBB;%CSF_DEFINES%" if ["%HAVE_OPENCL%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_OPENCL" & set "CSF_DEFINES=HAVE_OPENCL;%CSF_DEFINES%" +if ["%HAVE_FREETYPE%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FREEIMAGE" & set "CSF_DEFINES=HAVE_FREETYPE;%CSF_DEFINES%" if ["%HAVE_FREEIMAGE%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FREEIMAGE" & set "CSF_DEFINES=HAVE_FREEIMAGE;%CSF_DEFINES%" if ["%HAVE_FFMPEG%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_FFMPEG" & set "CSF_DEFINES=HAVE_FFMPEG;%CSF_DEFINES%" if ["%HAVE_VTK%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_VTK" & set "CSF_DEFINES=HAVE_VTK;%CSF_DEFINES%" @@ -199,20 +201,20 @@ if ["%CSF_DEFINES%"] == [""] set "CSF_DEFINES=;" rem ----- Optional 3rd-parties should be enabled by HAVE macros ----- if not ["%PRODUCTS_DEFINES%"] == [""] set "CSF_OPT_CMPL=%CSF_OPT_CMPL% %PRODUCTS_DEFINES%" -rem ----- Colect 3rd-parties additional include paths into compiler options ----- +rem ----- Collect 3rd-parties additional include paths into compiler options ----- for %%a in ("%CSF_OPT_INC:;=";"%") do ( set "anItem=%%~a" if not ["%%~a"] == [""] call :concatCmplInc %%~a ) -rem ----- Colect 3rd-parties additional library paths (32-bit) into linker options ----- +rem ----- Collect 3rd-parties additional library paths (32-bit) into linker options ----- set "OPT_LIB32=" for %%a in ("%CSF_OPT_LIB32:;=";"%") do ( set "anItem=%%~a" if not ["%%~a"] == [""] call :concatLib32 %%~a ) -rem ----- Colect 3rd-parties additional library paths (64-bit) into linker options ----- +rem ----- Collect 3rd-parties additional library paths (64-bit) into linker options ----- set "OPT_LIB64=" for %%a in ("%CSF_OPT_LIB64:;=";"%") do ( set "anItem=%%~a" @@ -244,7 +246,7 @@ if ["%CASDEB%"] == ["d"] if ["%ARCH%"] == ["64"] set "PATH=%CSF_OPT_BIN64D%;%PAT if ["%CASDEB%"] == ["i"] if ["%ARCH%"] == ["32"] set "PATH=%CSF_OPT_BIN32I%;%PATH%" if ["%CASDEB%"] == ["i"] if ["%ARCH%"] == ["64"] set "PATH=%CSF_OPT_BIN64I%;%PATH%" -rem ----- Set envoronment variables used by OCCT ----- +rem ----- Set environment variables used by OCCT ----- set CSF_LANGUAGE=us set MMGT_CLEAR=1 set "CSF_SHMessage=%CSF_OCCTResourcePath%\SHMessage" diff --git a/adm/templates/env.sh b/adm/templates/env.sh index 91a59315db..e3f1483eda 100644 --- a/adm/templates/env.sh +++ b/adm/templates/env.sh @@ -9,6 +9,7 @@ export CASDEB="" export PRJFMT=""; export HAVE_TBB="false"; export HAVE_OPENCL="false"; +export HAVE_FREETYPE="true"; export HAVE_FREEIMAGE="false"; export HAVE_FFMPEG="false"; export HAVE_VTK="false"; @@ -100,6 +101,7 @@ export CSF_OPT_CMPL="" # Optiona 3rd-parties should be enabled by HAVE macros if [ "$HAVE_TBB" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_TBB"; fi if [ "$HAVE_OPENCL" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_OPENCL"; fi +if [ "$HAVE_FREETYPE" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FREETYPE"; fi if [ "$HAVE_FREEIMAGE" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FREEIMAGE"; fi if [ "$HAVE_FFMPEG" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_FFMPEG"; fi if [ "$HAVE_GLES2" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_GLES2_EXT"; fi diff --git a/dox/build/build_occt/building_occt.md b/dox/build/build_occt/building_occt.md index c49f228519..748ffba835 100644 --- a/dox/build/build_occt/building_occt.md +++ b/dox/build/build_occt/building_occt.md @@ -471,7 +471,7 @@ The environment is defined in the file *custom.sh* which can be edited directly: * "HardLink* - hard links to headers located in *src* will be created. * For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: ~~~~~ - export HAVE_GL2PS=false + export HAVE_FREEIMAGE=false ~~~~~ Alternatively, or when *custom.sh* does not exist, you can launch *genconf.sh* to configure environment interactively: @@ -544,7 +544,7 @@ directly: * "HardLink* - hard links to headers located in *src* will be created. * For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: ~~~~~ - export HAVE_GL2PS=false + export HAVE_FREEIMAGE=false ~~~~~ Alternatively, or when *custom.sh* or *custom.bat* does not exist, you can launch **genconf** tool to configure diff --git a/src/Draw/Draw_BasicCommands.cxx b/src/Draw/Draw_BasicCommands.cxx index 138e8831c8..4657d70c1f 100644 --- a/src/Draw/Draw_BasicCommands.cxx +++ b/src/Draw/Draw_BasicCommands.cxx @@ -348,6 +348,11 @@ static Standard_Integer dversion(Draw_Interpretor& di, Standard_Integer, const c #else di << "TBB disabled\n"; #endif +#ifdef HAVE_FREETYPE + di << "FreeType enabled (HAVE_FREETYPE)\n"; +#else + di << "FreeType disabled\n"; +#endif #ifdef HAVE_FREEIMAGE di << "FreeImage enabled (HAVE_FREEIMAGE)\n"; #else diff --git a/src/Font/Font_FTFont.cxx b/src/Font/Font_FTFont.cxx index 5464195e2a..02c6cff538 100755 --- a/src/Font/Font_FTFont.cxx +++ b/src/Font/Font_FTFont.cxx @@ -23,8 +23,10 @@ #include -#include -#include FT_FREETYPE_H +#ifdef HAVE_FREETYPE + #include + #include FT_FREETYPE_H +#endif IMPLEMENT_STANDARD_RTTIEXT(Font_FTFont,Standard_Transient) @@ -38,7 +40,11 @@ Font_FTFont::Font_FTFont (const Handle(Font_FTLibrary)& theFTLib) myActiveFTFace(NULL), myFontAspect (Font_FontAspect_Regular), myWidthScaling(1.0), +#ifdef HAVE_FREETYPE myLoadFlags (FT_LOAD_NO_HINTING | FT_LOAD_TARGET_NORMAL), +#else + myLoadFlags (0), +#endif myUChar (0U), myToUseUnicodeSubsetFallback (Font_FontMgr::ToUseUnicodeSubsetFallback()) { @@ -68,7 +74,9 @@ void Font_FTFont::Release() myUChar = 0; if (myFTFace != NULL) { + #ifdef HAVE_FREETYPE FT_Done_Face (myFTFace); + #endif myFTFace = NULL; } myActiveFTFace = NULL; @@ -95,6 +103,7 @@ bool Font_FTFont::Init (const Handle(NCollection_Buffer)& theData, return false; } +#ifdef HAVE_FREETYPE if (!theData.IsNull()) { if (FT_New_Memory_Face (myFTLib->Instance(), theData->Data(), (FT_Long )theData->Size(), (FT_Long )theFaceId, &myFTFace) != 0) @@ -144,6 +153,10 @@ bool Font_FTFont::Init (const Handle(NCollection_Buffer)& theData, } myActiveFTFace = myFTFace; return true; +#else + (void )theFaceId; + return false; +#endif } // ======================================================================= @@ -174,6 +187,7 @@ Handle(Font_FTFont) Font_FTFont::FindAndCreate (const TCollection_AsciiString& t return aFont; } } +#ifdef HAVE_FREETYPE else if (theStrictLevel == Font_StrictLevel_Any) { switch (theFontAspect) @@ -196,6 +210,7 @@ Handle(Font_FTFont) Font_FTFont::FindAndCreate (const TCollection_AsciiString& t return aFont; } } +#endif return Handle(Font_FTFont)(); } @@ -222,6 +237,7 @@ bool Font_FTFont::FindAndInit (const TCollection_AsciiString& theFontName, const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (myFontAspect, aParams.ToSynthesizeItalic, aFaceId); return Init (aPath, aParams, aFaceId); } +#ifdef HAVE_FREETYPE else if (theStrictLevel == Font_StrictLevel_Any) { if (theFontAspect == Font_FontAspect_Italic @@ -231,6 +247,7 @@ bool Font_FTFont::FindAndInit (const TCollection_AsciiString& theFontName, } return Init (Font_FontMgr::EmbedFallbackFont(), "Embed Fallback Font", aParams, 0); } +#endif Release(); return false; } @@ -246,6 +263,7 @@ bool Font_FTFont::findAndInitFallback (Font_UnicodeSubset theSubset) return myFallbackFaces[theSubset]->IsValid(); } +#ifdef HAVE_FREETYPE myFallbackFaces[theSubset] = new Font_FTFont (myFTLib); myFallbackFaces[theSubset]->myToUseUnicodeSubsetFallback = false; // no recursion @@ -263,6 +281,7 @@ bool Font_FTFont::findAndInitFallback (Font_UnicodeSubset theSubset) + " for symbols unsupported by '" + myFTFace->family_name + "'"); } } +#endif return myFallbackFaces[theSubset]->IsValid(); } @@ -272,7 +291,12 @@ bool Font_FTFont::findAndInitFallback (Font_UnicodeSubset theSubset) // ======================================================================= bool Font_FTFont::HasSymbol (Standard_Utf32Char theUChar) const { +#ifdef HAVE_FREETYPE return FT_Get_Char_Index (myFTFace, theUChar) != 0; +#else + (void )theUChar; + return false; +#endif } // ======================================================================= @@ -286,6 +310,7 @@ bool Font_FTFont::loadGlyph (const Standard_Utf32Char theUChar) return myUChar != 0; } +#ifdef HAVE_FREETYPE myGlyphImg.Clear(); myUChar = 0; myActiveFTFace = myFTFace; @@ -314,6 +339,9 @@ bool Font_FTFont::loadGlyph (const Standard_Utf32Char theUChar) myUChar = theUChar; return true; +#else + return false; +#endif } // ======================================================================= @@ -326,6 +354,7 @@ bool Font_FTFont::RenderGlyph (const Standard_Utf32Char theUChar) myUChar = 0; myActiveFTFace = myFTFace; +#ifdef HAVE_FREETYPE if (theUChar != 0 && myToUseUnicodeSubsetFallback && !HasSymbol (theUChar)) @@ -387,6 +416,10 @@ bool Font_FTFont::RenderGlyph (const Standard_Utf32Char theUChar) myUChar = theUChar; return true; +#else + (void )theUChar; + return false; +#endif } // ======================================================================= @@ -395,6 +428,7 @@ bool Font_FTFont::RenderGlyph (const Standard_Utf32Char theUChar) // ======================================================================= unsigned int Font_FTFont::GlyphMaxSizeX (bool theToIncludeFallback) const { +#ifdef HAVE_FREETYPE if (!theToIncludeFallback) { float aWidth = (FT_IS_SCALABLE(myFTFace) != 0) @@ -416,6 +450,10 @@ unsigned int Font_FTFont::GlyphMaxSizeX (bool theToIncludeFallback) const } } return aWidth; +#else + (void )theToIncludeFallback; + return 0; +#endif } // ======================================================================= @@ -424,6 +462,7 @@ unsigned int Font_FTFont::GlyphMaxSizeX (bool theToIncludeFallback) const // ======================================================================= unsigned int Font_FTFont::GlyphMaxSizeY (bool theToIncludeFallback) const { +#ifdef HAVE_FREETYPE if (!theToIncludeFallback) { float aHeight = (FT_IS_SCALABLE(myFTFace) != 0) @@ -445,6 +484,10 @@ unsigned int Font_FTFont::GlyphMaxSizeY (bool theToIncludeFallback) const } } return aHeight; +#else + (void )theToIncludeFallback; + return 0; +#endif } // ======================================================================= @@ -453,7 +496,11 @@ unsigned int Font_FTFont::GlyphMaxSizeY (bool theToIncludeFallback) const // ======================================================================= float Font_FTFont::Ascender() const { +#ifdef HAVE_FREETYPE return float(myFTFace->ascender) * (float(myFTFace->size->metrics.y_ppem) / float(myFTFace->units_per_EM)); +#else + return 0.0f; +#endif } // ======================================================================= @@ -462,7 +509,11 @@ float Font_FTFont::Ascender() const // ======================================================================= float Font_FTFont::Descender() const { +#ifdef HAVE_FREETYPE return float(myFTFace->descender) * (float(myFTFace->size->metrics.y_ppem) / float(myFTFace->units_per_EM)); +#else + return 0.0f; +#endif } // ======================================================================= @@ -471,7 +522,11 @@ float Font_FTFont::Descender() const // ======================================================================= float Font_FTFont::LineSpacing() const { +#ifdef HAVE_FREETYPE return float(myFTFace->height) * (float(myFTFace->size->metrics.y_ppem) / float(myFTFace->units_per_EM)); +#else + return 0.0f; +#endif } // ======================================================================= @@ -504,6 +559,7 @@ bool Font_FTFont::getKerning (FT_Vector& theKern, Standard_Utf32Char theUCharCurr, Standard_Utf32Char theUCharNext) const { +#ifdef HAVE_FREETYPE theKern.x = 0; theKern.y = 0; if (theUCharNext != 0 && FT_HAS_KERNING(myActiveFTFace) != 0) @@ -519,6 +575,11 @@ bool Font_FTFont::getKerning (FT_Vector& theKern, } return true; } +#else + (void )theKern; + (void )theUCharCurr; + (void )theUCharNext; +#endif return false; } @@ -533,9 +594,14 @@ float Font_FTFont::AdvanceX (Standard_Utf32Char theUCharNext) const return 0.0f; } +#ifdef HAVE_FREETYPE FT_Vector aKern; getKerning (aKern, myUChar, theUCharNext); return myWidthScaling * fromFTPoints (myActiveFTFace->glyph->advance.x + aKern.x); +#else + (void )theUCharNext; + return 0.0f; +#endif } // ======================================================================= @@ -549,9 +615,14 @@ float Font_FTFont::AdvanceY (Standard_Utf32Char theUCharNext) const return 0.0f; } +#ifdef HAVE_FREETYPE FT_Vector aKern; getKerning (aKern, myUChar, theUCharNext); return fromFTPoints (myActiveFTFace->glyph->advance.y + aKern.y); +#else + (void )theUCharNext; + return 0.0f; +#endif } // ======================================================================= @@ -560,6 +631,7 @@ float Font_FTFont::AdvanceY (Standard_Utf32Char theUCharNext) const // ======================================================================= Standard_Integer Font_FTFont::GlyphsNumber (bool theToIncludeFallback) const { +#ifdef HAVE_FREETYPE Standard_Integer aNbGlyphs = myFTFace->num_glyphs; if (theToIncludeFallback) { @@ -573,6 +645,10 @@ Standard_Integer Font_FTFont::GlyphsNumber (bool theToIncludeFallback) const } } return aNbGlyphs; +#else + (void )theToIncludeFallback; + return 0; +#endif } // ======================================================================= @@ -581,11 +657,15 @@ Standard_Integer Font_FTFont::GlyphsNumber (bool theToIncludeFallback) const // ======================================================================= void Font_FTFont::GlyphRect (Font_Rect& theRect) const { +#ifdef HAVE_FREETYPE const FT_Bitmap& aBitmap = myActiveFTFace->glyph->bitmap; theRect.Left = float(myActiveFTFace->glyph->bitmap_left); theRect.Top = float(myActiveFTFace->glyph->bitmap_top); theRect.Right = float(myActiveFTFace->glyph->bitmap_left + (int )aBitmap.width); theRect.Bottom = float(myActiveFTFace->glyph->bitmap_top - (int )aBitmap.rows); +#else + (void )theRect; +#endif } // ======================================================================= @@ -614,10 +694,15 @@ Font_Rect Font_FTFont::BoundingBox (const NCollection_String& theS // ======================================================================= const FT_Outline* Font_FTFont::renderGlyphOutline (const Standard_Utf32Char theChar) { +#ifdef HAVE_FREETYPE if (!loadGlyph (theChar) || myActiveFTFace->glyph->format != FT_GLYPH_FORMAT_OUTLINE) { return 0; } return &myActiveFTFace->glyph->outline; +#else + (void )theChar; + return 0; +#endif } diff --git a/src/Font/Font_FTLibrary.cxx b/src/Font/Font_FTLibrary.cxx index 31976bffc3..826b4f7f27 100755 --- a/src/Font/Font_FTLibrary.cxx +++ b/src/Font/Font_FTLibrary.cxx @@ -15,8 +15,10 @@ #include -#include -#include FT_FREETYPE_H +#ifdef HAVE_FREETYPE + #include + #include FT_FREETYPE_H +#endif IMPLEMENT_STANDARD_RTTIEXT(Font_FTLibrary,Standard_Transient) @@ -27,10 +29,12 @@ IMPLEMENT_STANDARD_RTTIEXT(Font_FTLibrary,Standard_Transient) Font_FTLibrary::Font_FTLibrary() : myFTLib (NULL) { +#ifdef HAVE_FREETYPE if (FT_Init_FreeType (&myFTLib) != 0) { myFTLib = NULL; } +#endif } // ======================================================================= @@ -41,6 +45,8 @@ Font_FTLibrary::~Font_FTLibrary() { if (IsValid()) { + #ifdef HAVE_FREETYPE FT_Done_FreeType (myFTLib); + #endif } } diff --git a/src/Font/Font_FontMgr.cxx b/src/Font/Font_FontMgr.cxx index 620f841018..b9b2d47e8f 100644 --- a/src/Font/Font_FontMgr.cxx +++ b/src/Font/Font_FontMgr.cxx @@ -28,10 +28,12 @@ #include #include -#include "Font_DejavuSans_Latin_woff.pxx" +#ifdef HAVE_FREETYPE + #include "Font_DejavuSans_Latin_woff.pxx" -#include -#include FT_FREETYPE_H + #include + #include FT_FREETYPE_H +#endif IMPLEMENT_STANDARD_RTTIEXT(Font_FontMgr,Standard_Transient) #if defined(_WIN32) @@ -39,7 +41,7 @@ IMPLEMENT_STANDARD_RTTIEXT(Font_FontMgr,Standard_Transient) #include #include - #ifdef _MSC_VER + #if defined(_MSC_VER) && defined(HAVE_FREETYPE) #pragma comment (lib, "freetype.lib") #endif @@ -82,7 +84,7 @@ IMPLEMENT_STANDARD_RTTIEXT(Font_FontMgr,Standard_Transient) NULL }; - #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) + #if defined(HAVE_FREETYPE) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) // X11 configuration file in plain text format (obsolete - doesn't exists in modern distributives) static Standard_CString myFontServiceConf[] = {"/etc/X11/fs/config", "/usr/X11R6/lib/X11/fs/config", @@ -149,8 +151,9 @@ IMPLEMENT_STANDARD_RTTIEXT(Font_FontMgr,Standard_Transient) static bool checkFont (NCollection_Sequence& theFonts, const Handle(Font_FTLibrary)& theFTLib, const TCollection_AsciiString& theFontPath, - FT_Long theFaceId = -1) + signed long theFaceId = -1) // FT_Long { +#ifdef HAVE_FREETYPE const FT_Long aFaceId = theFaceId != -1 ? theFaceId : 0; FT_Face aFontFace; FT_Error aFaceError = FT_New_Face (theFTLib->Instance(), theFontPath.ToCString(), aFaceId, &aFontFace); @@ -283,6 +286,13 @@ static bool checkFont (NCollection_Sequence& theFonts, FT_Done_Face (aFontFace); return true; +#else + (void )theFonts; + (void )theFTLib; + (void )theFontPath; + (void )theFaceId; + return false; +#endif } // ======================================================================= @@ -712,7 +722,7 @@ void Font_FontMgr::InitFontDataBase() #else NCollection_Map aMapOfFontsDirs; -#if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) +#if defined(HAVE_FREETYPE) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) if (FcConfig* aFcCfg = FcInitLoadConfig()) { if (FcStrList* aFcFontDir = FcConfigGetFontDirs (aFcCfg)) @@ -815,7 +825,7 @@ void Font_FontMgr::InitFontDataBase() for (NCollection_Map::Iterator anIter (aMapOfFontsDirs); anIter.More(); anIter.Next()) { - #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) + #if defined(HAVE_FREETYPE) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) OSD_File aReadFile (anIter.Value() + "/fonts.dir"); if (!aReadFile.Exists()) { @@ -835,7 +845,7 @@ void Font_FontMgr::InitFontDataBase() RegisterFonts (aFonts, false); } - #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) + #if defined(HAVE_FREETYPE) && !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) continue; } @@ -1154,7 +1164,11 @@ Handle(Font_SystemFont) Font_FontMgr::Font_FontMap::Find (const TCollection_Asci // ======================================================================= Handle(NCollection_Buffer) Font_FontMgr::EmbedFallbackFont() { +#ifdef HAVE_FREETYPE return new NCollection_Buffer (Handle(NCollection_BaseAllocator)(), Font_DejavuSans_Latin_woff_size, const_cast(Font_DejavuSans_Latin_woff)); +#else + return Handle(NCollection_Buffer)(); +#endif } diff --git a/src/StdPrs/StdPrs_BRepFont.cxx b/src/StdPrs/StdPrs_BRepFont.cxx index 177601b9e9..2ab855c489 100644 --- a/src/StdPrs/StdPrs_BRepFont.cxx +++ b/src/StdPrs/StdPrs_BRepFont.cxx @@ -47,9 +47,11 @@ #include #include -#include -#include FT_FREETYPE_H -#include FT_OUTLINE_H +#ifdef HAVE_FREETYPE + #include + #include FT_FREETYPE_H + #include FT_OUTLINE_H +#endif IMPLEMENT_STANDARD_RTTIEXT(StdPrs_BRepFont, Standard_Transient) @@ -66,6 +68,7 @@ namespace return theSize / Standard_Real(THE_FONT_SIZE) * 72.0 / Standard_Real(THE_RESOLUTION_DPI); } +#ifdef HAVE_FREETYPE //! Auxiliary method to convert FT_Vector to gp_XY static gp_XY readFTVec (const FT_Vector& theVec, const Standard_Real theScaleUnits, @@ -113,7 +116,7 @@ namespace } return aRes; } - +#endif } // ======================================================================= @@ -308,6 +311,7 @@ bool StdPrs_BRepFont::to3d (const Handle(Geom2d_Curve)& theCurve2d, Standard_Boolean StdPrs_BRepFont::buildFaces (const NCollection_Sequence& theWires, TopoDS_Shape& theRes) { +#ifdef HAVE_FREETYPE // classify wires NCollection_DataMap, TopTools_ShapeMapHasher> aMapOutInts; TopTools_DataMapOfShapeInteger aMapNbOuts; @@ -419,6 +423,11 @@ Standard_Boolean StdPrs_BRepFont::buildFaces (const NCollection_SequencerenderGlyphOutline (theChar); if (!anOutline) { @@ -666,7 +675,9 @@ Standard_Boolean StdPrs_BRepFont::renderGlyph (const Standard_Utf32Char theChar, { theShape = aFaceCompDraft; } - +#else + (void )theChar; +#endif myCache.Bind (theChar, theShape); return !theShape.IsNull(); }