diff --git a/.gitignore b/.gitignore index a7c80f59..2a50a889 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,2 @@ -Makefile.in -/ac-aux/ -/aclocal.m4 -/autom4te.cache/ -/config.h.in -/config.h.in~ -/configure -/m4/ +/CMakeCache.txt +/cbuild/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..468282d6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,82 @@ +# cmake configuration + +cmake_minimum_required(VERSION 2.8.12) +cmake_policy(VERSION 2.8.12) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + "${CMAKE_SOURCE_DIR}/cmake/") + +include(CheckIncludeFile) + +# for /MT on MSVC +set(CMAKE_USER_MAKE_RULES_OVERRIDE + "${CMAKE_SOURCE_DIR}/cmake/c_flag_overrides.cmake") +set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX + "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake") + +# project + +project(solvespace) +set(solvespace_VERSION_MAJOR 2) +set(solvespace_VERSION_MINOR 1) + +# compiler + +if(WIN32) + add_definitions( + -D_CRT_SECURE_NO_DEPRECATE=1 + -D_CRT_SECURE_NO_WARNINGS=1 + -D_WIN32_WINNT=0x500 + -D_WIN32_IE=_WIN32_WINNT + -DISOLATION_AWARE_ENABLED=1 + -DWIN32=1 + -DWIN32_LEAN_AND_MEAN=1) +endif() + +# dependencies + +CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H) + +find_package(OpenGL REQUIRED) + +find_package(Perl) +find_package(PerlModules COMPONENTS GD) +if(NOT (PERL_FOUND AND PERLMODULES_FOUND)) + message(STATUS "Perl with GD not found; icons will not be regenerated if modified") +endif() + +if(WIN32) + find_package(PNG) + + if(NOT PNG_FOUND) + message(STATUS "Using prebuilt libpng") + + set(PNG_FOUND TRUE) + set(PNG_LIBRARIES + "${CMAKE_SOURCE_DIR}/extlib/libpng/libpng.lib" + "${CMAKE_SOURCE_DIR}/extlib/zlib/zlib.lib") + set(PNG_INCLUDE_DIRS + "${CMAKE_SOURCE_DIR}/extlib/libpng") + endif() + + message(STATUS "Using prebuilt SpaceWare") + set(SPACEWARE_FOUND TRUE) + set(SPACEWARE_INCLUDE_DIR + "${CMAKE_SOURCE_DIR}/extlib/si") + set(SPACEWARE_LIBRARIES + "${CMAKE_SOURCE_DIR}/extlib/si/siapp.lib") +else() + find_package(PNG REQUIRED) + find_package(SpaceWare) + + find_package(FLTK REQUIRED) + CHECK_INCLUDE_FILE("fontconfig/fontconfig.h" HAVE_FONTCONFIG) +endif() + +# components + +if(WIN32) + add_subdirectory(tools) +endif() + +add_subdirectory(src) +add_subdirectory(exposed) diff --git a/cmake/FindPerlModules.cmake b/cmake/FindPerlModules.cmake new file mode 100644 index 00000000..770a0b80 --- /dev/null +++ b/cmake/FindPerlModules.cmake @@ -0,0 +1,77 @@ +# - try to find perl modules, passed as COMPONENTS +# +# Non-cache variable you might use in your CMakeLists.txt: +# PERLMODULES_FOUND +# +# Requires these CMake modules: +# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) +# +# Original Author: +# 2012 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2012. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(NOT PERL_FOUND) + find_package(Perl QUIET) +endif() + +set(_deps_check) +if(PERL_FOUND) + foreach(module ${PerlModules_FIND_COMPONENTS}) + string(REPLACE "::" "/" modfilename "${module}.pm") + string(REPLACE "::" "_" modvarname "PERLMODULES_${module}_MODULE") + string(TOUPPER "${modvarname}" modvarname) + list(APPEND _deps_check ${modvarname}) + if(NOT ${modvarname}) + if(NOT PerlModules_FIND_QUIETLY) + message(STATUS "Checking for perl module ${module}") + endif() + execute_process(COMMAND + "${PERL_EXECUTABLE}" + "-e" + "use ${module}; print \$INC{\"${modfilename}\"}" + RESULT_VARIABLE result_code + OUTPUT_VARIABLE filename + ERROR_VARIABLE error_info + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(result_code EQUAL 0) + if(NOT PerlModules_FIND_QUIETLY) + message(STATUS + "Checking for perl module ${module} - found at ${filename}") + endif() + set(${modvarname} + "${filename}" + CACHE + FILEPATH + "Location found for module ${module}" + FORCE) + mark_as_advanced(${modvarname}) + else() + if(NOT PerlModules_FIND_QUIETLY) + message(STATUS "Checking for perl module ${module} - failed") + endif() + set(${modvarname} + "NOTFOUND" + CACHE + FILEPATH + "No location found for module ${module}" + FORCE) + file(APPEND + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the Perl module ${module} exists failed with the following error output:\n" + "${error_info}\n\n") + endif() + endif() + endforeach() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PerlModules + DEFAULT_MSG + PERL_FOUND + ${_deps_check}) diff --git a/cmake/FindSpaceWare.cmake b/cmake/FindSpaceWare.cmake new file mode 100644 index 00000000..135384a0 --- /dev/null +++ b/cmake/FindSpaceWare.cmake @@ -0,0 +1,28 @@ +# Find the libspnav library and header. +# +# Sets the usual variables expected for find_package scripts: +# +# SPACEWARE_INCLUDE_DIR - header location +# SPACEWARE_LIBRARIES - library to link against +# SPACEWARE_FOUND - true if pugixml was found. + +if(UNIX) + + find_path(SPACEWARE_INCLUDE_DIR + spnav.h) + + find_library(SPACEWARE_LIBRARY + NAMES spnav libspnav) + + # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found. + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG + SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) + + if(SPACEWARE_FOUND) + set(SPACEWARE_LIBRARIES ${SPACEWARE_LIBRARY}) + endif() + + mark_as_advanced(SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) + +endif() diff --git a/cmake/c_flag_overrides.cmake b/cmake/c_flag_overrides.cmake new file mode 100644 index 00000000..b21f00e3 --- /dev/null +++ b/cmake/c_flag_overrides.cmake @@ -0,0 +1,6 @@ +if(MSVC) + set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") +endif() \ No newline at end of file diff --git a/cmake/cxx_flag_overrides.cmake b/cmake/cxx_flag_overrides.cmake new file mode 100644 index 00000000..67e00433 --- /dev/null +++ b/cmake/cxx_flag_overrides.cmake @@ -0,0 +1,6 @@ +if(MSVC) + set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") +endif() diff --git a/exposed/CMakeLists.txt b/exposed/CMakeLists.txt new file mode 100644 index 00000000..bdc3fc39 --- /dev/null +++ b/exposed/CMakeLists.txt @@ -0,0 +1,8 @@ +include_directories( + ${CMAKE_SOURCE_DIR}/include) + +add_executable(CDemo + CDemo.c) + +target_link_libraries(CDemo + slvs) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..526105dd --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,238 @@ +# global + +include_directories( + ${OPENGL_INCLUDE_DIR} + ${PNG_INCLUDE_DIRS}) + +link_directories( + ${PNG_LIBRARY_DIRS}) + +add_definitions( + ${PNG_CFLAGS_OTHER}) + +include_directories( + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/built" + "${CMAKE_CURRENT_BINARY_DIR}") + +if(SPACEWARE_FOUND) + include_directories( + "${SPACEWARE_INCLUDE_DIR}") +endif() + +set(HAVE_FLTK ${FLTK_FOUND}) +set(HAVE_SPACEWARE ${SPACEWARE_FOUND}) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/config.h") + +# platform utilities + +if(WIN32) + set(util_SOURCES + win32/w32util.cpp) +else() + set(util_SOURCES + fltk/fltkutil.cpp) +endif() + +# libslvs + +set(libslvs_SOURCES + util.cpp + entity.cpp + expr.cpp + constraint.cpp + constrainteq.cpp + system.cpp) + +set(libslvs_HEADERS + solvespace.h) + + add_library(slvs SHARED + ${libslvs_SOURCES} + ${libslvs_HEADERS} + ${util_SOURCES} + lib.cpp) + +target_compile_definitions(slvs + PRIVATE -DLIBRARY) + +target_include_directories(slvs + PUBLIC "${CMAKE_SOURCE_DIR}/include") + +set_target_properties(slvs PROPERTIES + PUBLIC_HEADER "${CMAKE_SOURCE_DIR}/include/slvs.h" + VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} + SOVERSION 1) + +if(NOT WIN32) + install(TARGETS slvs + LIBRARY DESTINATION lib + PUBLIC_HEADER DESTINATION include) +endif() + +# generated files + +file(GLOB icons "${CMAKE_CURRENT_SOURCE_DIR}/icons/*.png") + +if(PERL_FOUND AND PERLMODULES_FOUND) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/built/icons.h" + "${CMAKE_CURRENT_SOURCE_DIR}/built/icons-proto.h" + COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/png2c.pl" + "${CMAKE_CURRENT_SOURCE_DIR}/built/icons.h" + "${CMAKE_CURRENT_SOURCE_DIR}/built/icons-proto.h" + "${CMAKE_CURRENT_SOURCE_DIR}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/png2c.pl" + DEPENDENCIES ${icons}) + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/built/bitmapextra.table.h" + COMMAND "${PERL_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/pngchar2c.pl" + "${CMAKE_CURRENT_SOURCE_DIR}/built/bitmapextra.table.h" + "${CMAKE_CURRENT_SOURCE_DIR}" + MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/pngchar2c.pl" + DEPENDENCIES ${icons}) +endif() + +if(WIN32) + add_custom_command( + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/built/bitmapfont.table.h" + COMMAND ttf2c "${CMAKE_CURRENT_SOURCE_DIR}/built/bitmapfont.table.h") +endif() + +set(generated_HEADERS + built/bitmapextra.table.h + built/bitmapfont.table.h + built/icons-proto.h + built/icons.h) + +set_source_files_properties(${generated_HEADERS} + PROPERTIES GENERATED TRUE) + +# platform dependencies + +if(WIN32) + set(platform_HEADERS + win32/freeze.h) + + set(platform_SOURCES + win32/freeze.cpp + win32/w32main.cpp + win32/resource.rc) +else() + include_directories( + "${FLTK_INCLUDE_DIR}") + + set(platform_SOURCES + fltk/fltkmain.cpp) + + set(platform_LIBRARIES + ${CMAKE_DL_LIBS} + "${FLTK_LIBRARIES}") +endif() + +# solvespace executable + +set(solvespace_HEADERS + config.h + dsc.h + expr.h + font.table.h + polygon.h + sketch.h + solvespace.h + ui.h + srf/surface.h) + +set(solvespace_SOURCES + bsp.cpp + clipboard.cpp + confscreen.cpp + constraint.cpp + constrainteq.cpp + describescreen.cpp + draw.cpp + drawconstraint.cpp + drawentity.cpp + entity.cpp + export.cpp + exportstep.cpp + exportvector.cpp + expr.cpp + file.cpp + generate.cpp + glhelper.cpp + graphicswin.cpp + group.cpp + groupmesh.cpp + mesh.cpp + modify.cpp + mouse.cpp + polygon.cpp + request.cpp + solvespace.cpp + style.cpp + system.cpp + textscreens.cpp + textwin.cpp + toolbar.cpp + ttf.cpp + undoredo.cpp + util.cpp + view.cpp + srf/boolean.cpp + srf/curve.cpp + srf/merge.cpp + srf/ratpoly.cpp + srf/raycast.cpp + srf/surface.cpp + srf/surfinter.cpp + srf/triangulate.cpp) + +add_executable(solvespace WIN32 + ${libslvs_HEADERS} + ${libslvs_SOURCES} + ${util_SOURCES} + ${platform_HEADERS} + ${platform_SOURCES} + ${generated_HEADERS} + ${solvespace_HEADERS} + ${solvespace_SOURCES}) + +target_link_libraries(solvespace + "${OPENGL_LIBRARIES}" + "${PNG_LIBRARIES}" + "${platform_LIBRARIES}") + +if(WIN32) + set_target_properties(solvespace PROPERTIES + LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO") +endif() + +if(SPACEWARE_FOUND) + target_link_libraries(solvespace + "${SPACEWARE_LIBRARIES}") +endif() + +install(TARGETS solvespace + RUNTIME DESTINATION bin) + +# valgrind + +add_custom_target(solvespace-valgrind + valgrind + --tool=memcheck + --verbose + --track-fds=yes + --log-file=vg.%p.out + --num-callers=50 + --error-limit=no + --read-var-info=yes + --leak-check=full + --leak-resolution=high + --show-reachable=yes + --track-origins=yes + --malloc-fill=0xac + --free-fill=0xde + $) diff --git a/src/built/bitmapextra.table.h b/src/built/bitmapextra.table.h index 338290da..3d95b2b5 100644 --- a/src/built/bitmapextra.table.h +++ b/src/built/bitmapextra.table.h @@ -1,3 +1,5 @@ +/**** This is a generated file - do not edit ****/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 00000000..516e638e --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,14 @@ +#ifndef __CONFIG_H +#define __CONFIG_H + +#define PACKAGE_VERSION "@solvespace_VERSION_MAJOR@.@solvespace_VERSION_MINOR@" + +#cmakedefine HAVE_STDINT_H +#cmakedefine HAVE_FONTCONFIG_FONTCONFIG_H + +#cmakedefine HAVE_FLTK +#define HAVE_FLTK_FULLSCREEN + +#cmakedefine HAVE_SPACEWARE + +#endif diff --git a/src/fltk/fltkmain.cpp b/src/fltk/fltkmain.cpp index 43d7b817..c7665740 100644 --- a/src/fltk/fltkmain.cpp +++ b/src/fltk/fltkmain.cpp @@ -6,20 +6,18 @@ // Copyright 2008-2013 Jonathan Westhues. // Copyright 2013 Daniel Richard G. //----------------------------------------------------------------------------- -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include #include #include #include -#ifdef HAVE_FONTCONFIG_FONTCONFIG_H +#ifdef HAVE_FONTCONFIG # include #endif -#ifdef HAVE_LIBSPNAV +#ifdef HAVE_SPACEWARE # include # ifndef SI_APP_FIT_BUTTON # define SI_APP_FIT_BUTTON 31 @@ -402,7 +400,7 @@ public: { switch(event) { -#ifdef HAVE_LIBSPNAV +#ifdef HAVE_SPACEWARE case FL_NO_EVENT: { spnav_event sev; if(!spnav_x11_event(fl_xevent, &sev)) break; @@ -426,7 +424,7 @@ public: } return 1; } -#endif // HAVE_LIBSPNAV +#endif // HAVE_SPACEWARE case FL_PUSH: // mouse button click... case FL_RELEASE: // ...and release @@ -1330,7 +1328,7 @@ int main(int argc, char **argv) GetAbsoluteFilename(file); } -#ifdef HAVE_LIBSPNAV +#ifdef HAVE_SPACEWARE bool spacenavd_active = spnav_x11_open(fl_display, fl_xid(GraphicsWnd)) == 0; #endif @@ -1355,7 +1353,7 @@ int main(int argc, char **argv) SS.DoLater(); } -#ifdef HAVE_LIBSPNAV +#ifdef HAVE_SPACEWARE if(spacenavd_active) { spnav_close(); } diff --git a/src/fltk/fltkutil.cpp b/src/fltk/fltkutil.cpp index 78c95d7f..700029be 100644 --- a/src/fltk/fltkutil.cpp +++ b/src/fltk/fltkutil.cpp @@ -7,9 +7,7 @@ // Copyright 2008-2013 Jonathan Westhues. // Copyright 2013 Daniel Richard G. //----------------------------------------------------------------------------- -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include #include diff --git a/src/pngchar2c.pl b/src/pngchar2c.pl index 8462c2b4..5f3d199f 100644 --- a/src/pngchar2c.pl +++ b/src/pngchar2c.pl @@ -5,11 +5,13 @@ use warnings; use GD; -my ($srcdir) = @ARGV; +my ($out, $srcdir) = @ARGV; defined($srcdir) or $srcdir = '.'; -d "$srcdir/icons" || die "$srcdir/icons/: directory not found"; -print "/**** This is a generated file - do not edit ****/\n\n"; +open(OUT, ">$out") or die "$out: $!"; + +print OUT "/**** This is a generated file - do not edit ****/\n\n"; for my $file (sort <$srcdir/icons/char-*.png>) { open(PNG, $file) or die "$file: $!\n"; @@ -25,13 +27,13 @@ for my $file (sort <$srcdir/icons/char-*.png>) { my $index = $img->getPixel($x, $y); my ($r, $g, $b) = $img->rgb($index); if($r + $g + $b < 11) { - print " 0, "; + print OUT " 0, "; } else { - print "255, "; + print OUT "255, "; } } - print "\n"; + print OUT "\n"; } - print "\n"; + print OUT "\n"; } diff --git a/src/solvespace.h b/src/solvespace.h index 8fad7c8a..29d22b7b 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -7,9 +7,7 @@ #ifndef __SOLVESPACE_H #define __SOLVESPACE_H -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include #include #include @@ -95,7 +93,7 @@ inline double ffabs(double v) { return (v > 0) ? v : (-v); } #define isforname(c) (isalnum(c) || (c) == '_' || (c) == '-' || (c) == '#') -#if defined(WIN32) && !defined(HAVE_C99_INTEGER_TYPES) +#if defined(WIN32) && !defined(HAVE_STDINT_H) // Define some useful C99 integer types. typedef UINT64 uint64_t; typedef INT64 int64_t; diff --git a/src/win32/w32main.cpp b/src/win32/w32main.cpp index d6b947e2..b58ad457 100644 --- a/src/win32/w32main.cpp +++ b/src/win32/w32main.cpp @@ -11,7 +11,7 @@ #include #include -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE # include # include # undef uint32_t // thanks but no thanks @@ -48,7 +48,7 @@ int ClientIsSmallerBy; HFONT FixedFont; -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE // The 6-DOF input device. SiHdl SpaceNavigator = SI_NO_HANDLE; #endif @@ -1114,7 +1114,7 @@ static void CreateMainWindows(void) ClientIsSmallerBy = (r.bottom - r.top) - (rc.bottom - rc.top); } -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE //----------------------------------------------------------------------------- // Test if a message comes from the SpaceNavigator device. If yes, dispatch // it appropriately and return true. Otherwise, do nothing and return false. @@ -1150,7 +1150,7 @@ static bool ProcessSpaceNavigatorMsg(MSG *msg) { } return true; } -#endif // HAVE_SPACEWARE_INPUT +#endif // HAVE_SPACEWARE //----------------------------------------------------------------------------- // Entry point into the program. @@ -1204,7 +1204,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, GetAbsoluteFilename(file); } -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE // Initialize the SpaceBall, if present. Test if the driver is running // first, to avoid a long timeout if it's not. HWND swdc = FindWindow("SpaceWare Driver Class", NULL); @@ -1226,7 +1226,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, MSG msg; DWORD ret; while((ret = GetMessage(&msg, NULL, 0, 0)) != 0) { -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE // Is it a message from the six degree of freedom input device? if(ProcessSpaceNavigatorMsg(&msg)) goto done; #endif @@ -1249,7 +1249,7 @@ done: SS.DoLater(); } -#ifdef HAVE_SPACEWARE_INPUT +#ifdef HAVE_SPACEWARE if(swdc != NULL) { if(SpaceNavigator != SI_NO_HANDLE) SiClose(SpaceNavigator); SiTerminate(); diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 00000000..c44f9027 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,2 @@ +add_executable(ttf2c + ttf2c.cpp) diff --git a/tools/ttf2c.cpp b/tools/ttf2c.cpp index c6e7c6da..9d6d9146 100644 --- a/tools/ttf2c.cpp +++ b/tools/ttf2c.cpp @@ -5,8 +5,13 @@ //----------------------------------------------------------------------------- // Entry point into the program. //----------------------------------------------------------------------------- -int main(void) +int main(int argc, char** argv) { + if(argc != 2) { + fprintf(stderr, "usage: ttf2c [output]"); + return 1; + } + InitCommonControls(); // A monospaced font @@ -20,7 +25,13 @@ int main(void) SelectObject(hdc, bitmap); SelectObject(hdc, font); - printf("static const uint8_t FontTexture[256*16*16] = {\n"); + FILE* out = fopen(argv[1], "w"); + if(!out) { + fprintf(stderr, "cannot open output file %s", argv[1]); + return 1; + } + + fprintf(out, "static const uint8_t FontTexture[256*16*16] = {\n"); int c; for(c = 0; c < 128; c++) { @@ -34,19 +45,21 @@ int main(void) SetTextColor(hdc, RGB(255, 255, 255)); char str[2] = { c, 0 }; TextOut(hdc, 0, 0, str, 1); - + int i, j; for(i = 0; i < 16; i++) { for(j = 0; j < 16; j++) { COLORREF c = GetPixel(hdc, i, j); - printf("%3d, ", c ? 255 : 0); + fprintf(out, "%3d, ", c ? 255 : 0); } - printf("\n"); + fprintf(out, "\n"); } - printf("\n"); + fprintf(out, "\n"); } - printf("#include \"bitmapextra.table.h\"\n"); - printf("};\n"); + fprintf(out, "#include \"bitmapextra.table.h\"\n"); + fprintf(out, "};\n"); + + fclose(out); return 0; }