From ea701302ac6cc5baa3385d775edc2631e512e06f Mon Sep 17 00:00:00 2001 From: Matthias Blankertz Date: Mon, 6 Jul 2015 14:37:33 +0200 Subject: [PATCH 1/2] WIP: Make portable to Win32 (VC++ 2013) --- .gitignore | 3 + IffFile.cc | 16 +- LICENSES | 72 ++++ Resource.hh | 2 +- TreFile.cc | 4 + TreFile.hh | 19 +- compiler.hh | 2 +- exceptions.cc | 19 +- exceptions.hh | 16 + libs/wingetopt/getopt.c | 560 +++++++++++++++++++++++++++++++ libs/wingetopt/getopt.h | 95 ++++++ libs/wingetopt/stdafx.c | 8 + libs/wingetopt/stdafx.h | 17 + libs/wingetopt/targetver.h | 8 + libs/wingetopt/wingetopt.vcxproj | 91 +++++ treexplore.cc | 4 + treexplore.vcxproj | 108 ++++++ util.cc | 76 ++++- util.hh | 9 + wc3re.sln | 28 ++ 20 files changed, 1134 insertions(+), 23 deletions(-) create mode 100644 LICENSES create mode 100644 libs/wingetopt/getopt.c create mode 100644 libs/wingetopt/getopt.h create mode 100644 libs/wingetopt/stdafx.c create mode 100644 libs/wingetopt/stdafx.h create mode 100644 libs/wingetopt/targetver.h create mode 100644 libs/wingetopt/wingetopt.vcxproj create mode 100644 treexplore.vcxproj create mode 100644 wc3re.sln diff --git a/.gitignore b/.gitignore index 49c6238..845e977 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ data/ objs/ tmp/ +Debug/ +Release/ *~ iffexplore font2png pntr2png treexplore +*.vcxproj.user diff --git a/IffFile.cc b/IffFile.cc index 1f8618b..3025b5b 100644 --- a/IffFile.cc +++ b/IffFile.cc @@ -5,7 +5,7 @@ #include "common.hh" struct ChunkHeader { - char typeID[4]; + unsigned char typeID[4]; uint32_t length; }; @@ -73,7 +73,7 @@ IffFile::parseObject(IffFile& parent, uint8_t const* base, size_t length, static_cast(header.length), footprint)); else - return std::unique_ptr(new Object(parent, std::string(header.typeID, 4), + return std::unique_ptr(new Object(parent, std::string(reinterpret_cast(header.typeID), 4), base+8, static_cast(header.length), footprint)); } @@ -132,27 +132,27 @@ IffFile::Object::Object(IffFile& parent, std::string type, uint8_t const* base, IffFile::Object::operator std::string() const { // Check if BLOB is string - enum class State { STARTASCII, NULLS, ERROR }; + enum class State { STARTASCII, NULLS, NOT_STRING }; State state = State::STARTASCII; for (char const& c : *this) { switch(state) { case State::STARTASCII: - if (isprint(c)) + if (isprint(static_cast(c))) continue; if (c == '\0') state = State::NULLS; else - state = State::ERROR; + state = State::NOT_STRING; break; case State::NULLS: if (c != '\0') - state = State::ERROR; + state = State::NOT_STRING; break; - case State::ERROR: + case State::NOT_STRING: break; } - if (state == State::ERROR) + if (state == State::NOT_STRING) break; } diff --git a/LICENSES b/LICENSES new file mode 100644 index 0000000..15e00b9 --- /dev/null +++ b/LICENSES @@ -0,0 +1,72 @@ +Uses wingetopt on Windows platforms: +Copyright (c) 2002 Todd C. Miller + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Sponsored in part by the Defense Advanced Research Projects +Agency (DARPA) and Air Force Research Laboratory, Air Force +Materiel Command, USAF, under agreement number F39502-99-1-0512. + + +Copyright (c) 2000 The NetBSD Foundation, Inc. +All rights reserved. + +This code is derived from software contributed to The NetBSD Foundation +by Dieter Baron and Thomas Klausner. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +Uses components of boost: +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Resource.hh b/Resource.hh index a63b194..a62b84c 100644 --- a/Resource.hh +++ b/Resource.hh @@ -31,7 +31,7 @@ public: } protected: - std::atomic_uint ref_; + std::atomic ref_; }; template diff --git a/TreFile.cc b/TreFile.cc index d09ecdc..c7aed1d 100644 --- a/TreFile.cc +++ b/TreFile.cc @@ -3,6 +3,10 @@ #include #include +#ifdef WIN32 +#define snprintf _snprintf +#endif + #include "common.hh" #include "util.hh" #include "decompress.hh" diff --git a/TreFile.hh b/TreFile.hh index 2bce93c..403210e 100644 --- a/TreFile.hh +++ b/TreFile.hh @@ -6,7 +6,6 @@ #include #include #include -#include #include "Resource.hh" @@ -44,9 +43,9 @@ public: Object(Object && move) : data_(std::move(move.data_)), base_(move.base_), length_(move.length_), res_(std::move(move.res_)) { - move.data_ = std::experimental::nullopt; - move.base_ = nullptr; - move.length_ = 0; + move.data_ = std::vector(); + move.base_ = nullptr; + move.length_ = 0; } Object& operator=(Object const& copy) { @@ -62,7 +61,7 @@ public: base_ = move.base_; length_ = move.length_; res_ = std::move(move.res_); - move.data_ = std::experimental::nullopt; + move.data_ = std::vector(); move.base_ = nullptr; move.length_ = 0; return *this; @@ -72,8 +71,8 @@ public: } uint8_t const* data() const override { - if (data_) - return data_->data(); + if (!data_.empty()) + return data_.data(); else return base_; } @@ -83,7 +82,7 @@ public: } operator bool() const override { - return data_ || base_; + return data_.empty() || base_; } size_t footprint() const override { @@ -98,12 +97,12 @@ public: } Object(std::vector data) - : data_(std::move(data)), base_(nullptr), length_(data_->size()), res_() { + : data_(std::move(data)), base_(nullptr), length_(data_.size()), res_() { } private: // Object either owns data (when decompressed) (res_ is null in this case)... - std::experimental::optional > data_; + std::vector data_; // .. or points to area in underlying data (when not compressed) uint8_t const* base_; size_t length_; diff --git a/compiler.hh b/compiler.hh index a8a20d3..7fbb35f 100644 --- a/compiler.hh +++ b/compiler.hh @@ -4,7 +4,7 @@ #ifdef __GNUG__ #define RESTRICT __restrict__ #else -#ifdef __MSC_VER +#ifdef _MSC_VER #define RESTRICT __restrict #else #define RESTRICT diff --git a/exceptions.cc b/exceptions.cc index 29635d9..2bb3224 100644 --- a/exceptions.cc +++ b/exceptions.cc @@ -3,8 +3,6 @@ #include "exceptions.hh" -using namespace std::string_literals; - Exception::Exception(std::string msg) : msg_(std::move(msg)) { @@ -56,3 +54,20 @@ std::string POSIXException::toString() const { return "POSIXException: " + msg_ + ": " + std::strerror(err_); } + +#ifdef WIN32 +Win32Exception::Win32Exception(DWORD err, std::string msg) + : Exception(std::move(msg)), err_(err) +{ +} + +DWORD Win32Exception::getErr() const +{ + return err_; +} + +std::string Win32Exception::toString() const +{ + return "Win32Exception: " + msg_ + ": " + std::to_string(err_); +} +#endif diff --git a/exceptions.hh b/exceptions.hh index 311c54b..d97d793 100644 --- a/exceptions.hh +++ b/exceptions.hh @@ -40,4 +40,20 @@ private: int err_; }; +#ifdef WIN32 +#define NOMINMAX +#include + +class Win32Exception : public Exception { +public: + Win32Exception(DWORD err, std::string msg = ""); + + DWORD getErr() const; + + std::string toString() const override; +private: + DWORD err_; +}; +#endif + #endif diff --git a/libs/wingetopt/getopt.c b/libs/wingetopt/getopt.c new file mode 100644 index 0000000..51e0e5d --- /dev/null +++ b/libs/wingetopt/getopt.c @@ -0,0 +1,560 @@ +/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ + +/* + * Copyright (c) 2002 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Sponsored in part by the Defense Advanced Research Projects + * Agency (DARPA) and Air Force Research Laboratory, Air Force + * Materiel Command, USAF, under agreement number F39502-99-1-0512. + */ +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "stdafx.h" +#include "getopt.h" + +#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */ + +#ifdef REPLACE_GETOPT +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +#undef optreset /* see getopt.h */ +#define optreset __mingw_optreset +int optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ +#endif + +#define PRINT_ERROR ((opterr) && (*options != ':')) + +#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */ +#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */ +#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */ + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#ifndef __CYGWIN__ +#define __progname __argv[0] +#else +extern char __declspec(dllimport) *__progname; +#endif + +#ifdef __CYGWIN__ +static char EMSG[] = ""; +#else +#define EMSG "" +#endif + +static int getopt_internal(int, char * const *, const char *, + const struct option *, int *, int); +static int parse_long_options(char * const *, const char *, + const struct option *, int *, int); +static int gcd(int, int); +static void permute_args(int, int, int, char * const *); + +static char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptchar[] = "unknown option -- %c"; +static const char illoptstring[] = "unknown option -- %s"; + +static void +_vwarnx(const char *fmt,va_list ap) +{ + (void)fprintf(stderr,"%s: ",__progname); + if (fmt != NULL) + (void)vfprintf(stderr,fmt,ap); + (void)fprintf(stderr,"\n"); +} + +static void +warnx(const char *fmt,...) +{ + va_list ap; + va_start(ap,fmt); + _vwarnx(fmt,ap); + va_end(ap); +} + +/* + * Compute the greatest common divisor of a and b. + */ +static int +gcd(int a, int b) +{ + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return (b); +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void +permute_args(int panonopt_start, int panonopt_end, int opt_end, + char * const *nargv) +{ + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char *swap; + + /* + * compute lengths of blocks and number and size of cycles + */ + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; + + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end+i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) + pos -= nnonopts; + else + pos += nopts; + swap = nargv[pos]; + /* LINTED const cast */ + ((char **) nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * parse_long_options -- + * Parse long options in argc/argv argument vector. + * Returns -1 if short_too is set and the option does not match long_options. + */ +static int +parse_long_options(char * const *nargv, const char *options, + const struct option *long_options, int *idx, int short_too) +{ + char *current_argv, *has_equal; + size_t current_argv_len; + int i, ambiguous, match; + +#define IDENTICAL_INTERPRETATION(_x, _y) \ + (long_options[(_x)].has_arg == long_options[(_y)].has_arg && \ + long_options[(_x)].flag == long_options[(_y)].flag && \ + long_options[(_x)].val == long_options[(_y)].val) + + current_argv = place; + match = -1; + ambiguous = 0; + + optind++; + + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = has_equal - current_argv; + has_equal++; + } else + current_argv_len = strlen(current_argv); + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, + current_argv_len)) + continue; + + if (strlen(long_options[i].name) == current_argv_len) { + /* exact match */ + match = i; + ambiguous = 0; + break; + } + /* + * If this is a known short option, don't allow + * a partial match of a single character. + */ + if (short_too && current_argv_len == 1) + continue; + + if (match == -1) /* partial match */ + match = i; + else if (!IDENTICAL_INTERPRETATION(i, match)) + ambiguous = 1; + } + if (ambiguous) { + /* ambiguous abbreviation */ + if (PRINT_ERROR) + warnx(ambig, (int)current_argv_len, + current_argv); + optopt = 0; + return (BADCH); + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument + && has_equal) { + if (PRINT_ERROR) + warnx(noarg, (int)current_argv_len, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + return (BADARG); + } + if (long_options[match].has_arg == required_argument || + long_options[match].has_arg == optional_argument) { + if (has_equal) + optarg = has_equal; + else if (long_options[match].has_arg == + required_argument) { + /* + * optional argument doesn't use next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) + && (optarg == NULL)) { + /* + * Missing argument; leading ':' indicates no error + * should be generated. + */ + if (PRINT_ERROR) + warnx(recargstring, + current_argv); + /* + * XXX: GNU sets optopt to val regardless of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + --optind; + return (BADARG); + } + } else { /* unknown option */ + if (short_too) { + --optind; + return (-1); + } + if (PRINT_ERROR) + warnx(illoptstring, current_argv); + optopt = 0; + return (BADCH); + } + if (idx) + *idx = match; + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + return (0); + } else + return (long_options[match].val); +#undef IDENTICAL_INTERPRETATION +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + */ +static int +getopt_internal(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx, int flags) +{ + char *oli; /* option letter list index */ + int optchar, short_too; + static int posixly_correct = -1; + + if (options == NULL) + return (-1); + + /* + * XXX Some GNU programs (like cvs) set optind to 0 instead of + * XXX using optreset. Work around this braindamage. + */ + if (optind == 0) + optind = optreset = 1; + + /* + * Disable GNU extensions if POSIXLY_CORRECT is set or options + * string begins with a '+'. + * + * CV, 2009-12-14: Check POSIXLY_CORRECT anew if optind == 0 or + * optreset != 0 for GNU compatibility. + */ + if (posixly_correct == -1 || optreset != 0) { + size_t foundlen; + getenv_s(&foundlen, NULL, 0, "POSIXLY_CORRECT"); + posixly_correct = (foundlen != 0); + } + if (*options == '-') + flags |= FLAG_ALLARGS; + else if (posixly_correct || *options == '+') + flags &= ~FLAG_PERMUTE; + if (*options == '+' || *options == '-') + options++; + + optarg = NULL; + if (optreset) + nonopt_start = nonopt_end = -1; +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + if (*(place = nargv[optind]) != '-' || + (place[1] == '\0' && strchr(options, '-') == NULL)) { + place = EMSG; /* found non-option */ + if (flags & FLAG_ALLARGS) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return (INORDER); + } + if (!(flags & FLAG_PERMUTE)) { + /* + * If no permutation wanted, stop parsing + * at first non-option. + */ + return (-1); + } + /* do permutation */ + if (nonopt_start == -1) + nonopt_start = optind; + else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + nonopt_start = optind - + (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) + nonopt_end = optind; + + /* + * If we have "-" do nothing, if "--" we are done. + */ + if (place[1] != '\0' && *++place == '-' && place[1] == '\0') { + optind++; + place = EMSG; + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return (-1); + } + } + + /* + * Check long options if: + * 1) we were passed some + * 2) the arg is not just "-" + * 3) either the arg starts with -- we are getopt_long_only() + */ + if (long_options != NULL && place != nargv[optind] && + (*place == '-' || (flags & FLAG_LONGONLY))) { + short_too = 0; + if (*place == '-') + place++; /* --foo long option */ + else if (*place != ':' && strchr(options, *place) != NULL) + short_too = 1; /* could be short option too */ + + optchar = parse_long_options(nargv, options, long_options, + idx, short_too); + if (optchar != -1) { + place = EMSG; + return (optchar); + } + } + + if ((optchar = (int)*place++) == (int)':' || + (optchar == (int)'-' && *place != '\0') || + (oli = strchr(options, optchar)) == NULL) { + /* + * If the user specified "-" and '-' isn't listed in + * options, return -1 (non-option) as per POSIX. + * Otherwise, it is an unknown option character (or ':'). + */ + if (optchar == (int)'-' && *place == '\0') + return (-1); + if (!*place) + ++optind; + if (PRINT_ERROR) + warnx(illoptchar, optchar); + optopt = optchar; + return (BADCH); + } + if (long_options != NULL && optchar == 'W' && oli[1] == ';') { + /* -W long-option */ + if (*place) /* no space */ + /* NOTHING */; + else if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else /* white space */ + place = nargv[optind]; + optchar = parse_long_options(nargv, options, long_options, + idx, 0); + place = EMSG; + return (optchar); + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) + ++optind; + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) /* no white space */ + optarg = place; + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; + if (PRINT_ERROR) + warnx(recargchar, optchar); + optopt = optchar; + return (BADARG); + } else + optarg = nargv[optind]; + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return (optchar); +} + +#ifdef REPLACE_GETOPT +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the BSD getopt] + */ +int +getopt(int nargc, char * const *nargv, const char *options) +{ + + /* + * We don't pass FLAG_PERMUTE to getopt_internal() since + * the BSD getopt(3) (unlike GNU) has never done this. + * + * Furthermore, since many privileged programs call getopt() + * before dropping privileges it makes sense to keep things + * as simple (and bug-free) as possible. + */ + return (getopt_internal(nargc, nargv, options, NULL, NULL, 0)); +} +#endif /* REPLACE_GETOPT */ + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int +getopt_long(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE)); +} + +/* + * getopt_long_only -- + * Parse argc/argv argument vector. + */ +int +getopt_long_only(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx) +{ + + return (getopt_internal(nargc, nargv, options, long_options, idx, + FLAG_PERMUTE|FLAG_LONGONLY)); +} diff --git a/libs/wingetopt/getopt.h b/libs/wingetopt/getopt.h new file mode 100644 index 0000000..260915b --- /dev/null +++ b/libs/wingetopt/getopt.h @@ -0,0 +1,95 @@ +#ifndef __GETOPT_H__ +/** + * DISCLAIMER + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the w64 mingw-runtime package. + * + * The w64 mingw-runtime package and its code is distributed in the hope that it + * will be useful but WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESSED OR + * IMPLIED ARE HEREBY DISCLAIMED. This includes but is not limited to + * warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#define __GETOPT_H__ + +/* All the headers include this file. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern int optind; /* index of first non-option in argv */ +extern int optopt; /* single option character, as parsed */ +extern int opterr; /* flag to enable built-in diagnostics... */ + /* (user may set to zero, to suppress) */ + +extern char *optarg; /* pointer to argument of current option */ + +extern int getopt(int nargc, char * const *nargv, const char *options); + +#ifdef _BSD_SOURCE +/* + * BSD adds the non-standard `optreset' feature, for reinitialisation + * of `getopt' parsing. We support this feature, for applications which + * proclaim their BSD heritage, before including this header; however, + * to maintain portability, developers are advised to avoid it. + */ +# define optreset __mingw_optreset +extern int optreset; +#endif +#ifdef __cplusplus +} +#endif +/* + * POSIX requires the `getopt' API to be specified in `unistd.h'; + * thus, `unistd.h' includes this header. However, we do not want + * to expose the `getopt_long' or `getopt_long_only' APIs, when + * included in this manner. Thus, close the standard __GETOPT_H__ + * declarations block, and open an additional __GETOPT_LONG_H__ + * specific block, only when *not* __UNISTD_H_SOURCED__, in which + * to declare the extended API. + */ +#endif /* !defined(__GETOPT_H__) */ + +#if !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) +#define __GETOPT_LONG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct option /* specification for a long form option... */ +{ + const char *name; /* option name, without leading hyphens */ + int has_arg; /* does it take an argument? */ + int *flag; /* where to save its status, or NULL */ + int val; /* its associated status value */ +}; + +enum /* permitted values for its `has_arg' field... */ +{ + no_argument = 0, /* option never takes an argument */ + required_argument, /* option always requires an argument */ + optional_argument /* option may take an argument */ +}; + +extern int getopt_long(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx); +extern int getopt_long_only(int nargc, char * const *nargv, const char *options, + const struct option *long_options, int *idx); +/* + * Previous MinGW implementation had... + */ +#ifndef HAVE_DECL_GETOPT +/* + * ...for the long form API only; keep this for compatibility. + */ +# define HAVE_DECL_GETOPT 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__UNISTD_H_SOURCED__) && !defined(__GETOPT_LONG_H__) */ diff --git a/libs/wingetopt/stdafx.c b/libs/wingetopt/stdafx.c new file mode 100644 index 0000000..917d347 --- /dev/null +++ b/libs/wingetopt/stdafx.c @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// wingetopt.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/libs/wingetopt/stdafx.h b/libs/wingetopt/stdafx.h new file mode 100644 index 0000000..7c92460 --- /dev/null +++ b/libs/wingetopt/stdafx.h @@ -0,0 +1,17 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include +#include +#include +#include +#include +#include diff --git a/libs/wingetopt/targetver.h b/libs/wingetopt/targetver.h new file mode 100644 index 0000000..87c0086 --- /dev/null +++ b/libs/wingetopt/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/libs/wingetopt/wingetopt.vcxproj b/libs/wingetopt/wingetopt.vcxproj new file mode 100644 index 0000000..38f5e7f --- /dev/null +++ b/libs/wingetopt/wingetopt.vcxproj @@ -0,0 +1,91 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {50D0969D-054D-4726-A85B-3ED2FBCCC43E} + Win32Proj + wingetopt + + + + StaticLibrary + true + v120 + Unicode + + + StaticLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + + + + + + + + + Create + Create + + + + + + \ No newline at end of file diff --git a/treexplore.cc b/treexplore.cc index d816d67..b7f8763 100644 --- a/treexplore.cc +++ b/treexplore.cc @@ -5,7 +5,11 @@ #include #include +#ifndef WIN32 #include +#else +#include "getopt.h" +#endif #include "common.hh" #include "util.hh" diff --git a/treexplore.vcxproj b/treexplore.vcxproj new file mode 100644 index 0000000..f88ff0b --- /dev/null +++ b/treexplore.vcxproj @@ -0,0 +1,108 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC} + Win32Proj + treexplore + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + D:\devel\wc3re\libs\wingetopt;%(AdditionalIncludeDirectories) + + + Console + true + D:\devel\wc3re\Debug;%(AdditionalLibraryDirectories) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGSNDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + D:\devel\wc3re\libs\wingetopt; + + + Console + true + true + true + D:\devel\wc3re\Release;%(AdditionalLibraryDirectories) + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/util.cc b/util.cc index cd82deb..37e35e6 100644 --- a/util.cc +++ b/util.cc @@ -1,13 +1,19 @@ #include #include -#include #include #include + +#ifndef WIN32 +#include #include +#else +#define fileno _fileno +#endif #include "common.hh" #include "util.hh" +#ifndef WIN32 MmapFile::MmapFile(std::string fileName) : name_(std::move(fileName)), fd_(fopen(name_.c_str(), "rb")), size_(0), base_(nullptr) { @@ -59,6 +65,74 @@ MmapFile& MmapFile::operator=(MmapFile && move) return *this; } +#else +MmapFile::MmapFile(std::string fileName) + : name_(std::move(fileName)), file_hnd_(nullptr), fm_hnd_(nullptr), size_(0), base_(nullptr) +{ + file_hnd_ = CreateFileA(name_.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (file_hnd_ == INVALID_HANDLE_VALUE) + throw Win32Exception(GetLastError(), "CreateFileA() failed"); + + LARGE_INTEGER size; + if (!GetFileSizeEx(file_hnd_, &size)) + throw Win32Exception(GetLastError(), "GetFileSizeEx() failed"); + size_ = size.QuadPart; + + fm_hnd_ = CreateFileMapping(file_hnd_, NULL, PAGE_READONLY, 0, 0, NULL); + if (fm_hnd_ == INVALID_HANDLE_VALUE) { + CloseHandle(file_hnd_); + throw Win32Exception(GetLastError(), "CreateFileMapping() failed"); + } + + base_ = MapViewOfFile(fm_hnd_, FILE_MAP_READ, 0, 0, 0); + if (!base_) { + CloseHandle(fm_hnd_); + CloseHandle(file_hnd_); + throw Win32Exception(GetLastError(), "MapViewOfFile() failed"); + } +} + +MmapFile::MmapFile(MmapFile && move) + : name_(std::move(move.name_)), fm_hnd_(std::move(move.fm_hnd_)), + file_hnd_(std::move(move.file_hnd_)), size_(move.size_), + base_(move.base_) +{ + move.base_ = nullptr; + move.fm_hnd_ = nullptr; + move.file_hnd_ = nullptr; +} + +MmapFile::~MmapFile() +{ + if (base_) + UnmapViewOfFile(base_); + if (fm_hnd_) + CloseHandle(fm_hnd_); + if (file_hnd_) + CloseHandle(file_hnd_); +} + +MmapFile& MmapFile::operator=(MmapFile && move) +{ + if (base_) + UnmapViewOfFile(base_); + if (fm_hnd_) + CloseHandle(fm_hnd_); + if (file_hnd_) + CloseHandle(file_hnd_); + + fm_hnd_ = move.fm_hnd_; + file_hnd_ = move.file_hnd_; + base_ = move.base_; + move.base_ = nullptr; + move.fm_hnd_ = nullptr; + move.file_hnd_ = nullptr; + size_ = move.size_; + name_ = std::move(move.name_); + + return *this; +} +#endif std::string const& MmapFile::name() const { diff --git a/util.hh b/util.hh index 4ee8b3e..03751e1 100644 --- a/util.hh +++ b/util.hh @@ -4,6 +4,11 @@ #include #include +#ifdef WIN32 +#define NOMINMAX +#include +#endif + #include "common.hh" #include "Resource.hh" @@ -29,7 +34,11 @@ public: } private: std::string name_; +#ifndef WIN32 FILEUPtr fd_; +#else + HANDLE file_hnd_, fm_hnd_; +#endif size_t size_; void *base_; }; diff --git a/wc3re.sln b/wc3re.sln new file mode 100644 index 0000000..4b27bc1 --- /dev/null +++ b/wc3re.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "treexplore", "treexplore.vcxproj", "{5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wingetopt", "libs\wingetopt\wingetopt.vcxproj", "{50D0969D-054D-4726-A85B-3ED2FBCCC43E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}.Debug|Win32.Build.0 = Debug|Win32 + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}.Release|Win32.ActiveCfg = Release|Win32 + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}.Release|Win32.Build.0 = Release|Win32 + {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Debug|Win32.ActiveCfg = Debug|Win32 + {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Debug|Win32.Build.0 = Debug|Win32 + {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Release|Win32.ActiveCfg = Release|Win32 + {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal From 86ba46667da9096b234e588aef06edfa3b7cca8d Mon Sep 17 00:00:00 2001 From: Matthias Blankertz Date: Thu, 9 Jul 2015 12:33:26 +0200 Subject: [PATCH 2/2] Port to Win32; Move sources to src/ subdir; Use precompiled headers --- .gitignore | 1 + LICENSES | 22 ++- Makefile | 8 +- common.hh | 17 -- iffexplore.vcxproj | 121 ++++++++++++++ iffexplore.vcxproj.filters | 74 +++++++++ mvedecode.vcxproj | 144 +++++++++++++++++ mvedecode.vcxproj.filters | 147 +++++++++++++++++ objdecode.vcxproj | 146 +++++++++++++++++ objdecode.vcxproj.filters | 153 ++++++++++++++++++ shapdecode.vcxproj | 123 ++++++++++++++ shapdecode.vcxproj.filters | 80 +++++++++ IffFile.cc => src/IffFile.cc | 3 +- IffFile.hh => src/IffFile.hh | 6 - MveDecoder.cc => src/MveDecoder.cc | 7 +- MveDecoder.hh => src/MveDecoder.hh | 3 - ObjDecoder.cc => src/ObjDecoder.cc | 3 +- ObjDecoder.hh => src/ObjDecoder.hh | 5 - PaletteDecoder.cc => src/PaletteDecoder.cc | 3 +- PaletteDecoder.hh => src/PaletteDecoder.hh | 3 - Resource.hh => src/Resource.hh | 9 +- .../ResourceProvider.cc | 13 +- .../ResourceProvider.hh | 3 - ShapDecoder.cc => src/ShapDecoder.cc | 9 +- ShapDecoder.hh => src/ShapDecoder.hh | 2 - Singleton.hh => src/Singleton.hh | 3 - TreFile.cc => src/TreFile.cc | 12 +- TreFile.hh => src/TreFile.hh | 6 - src/common.cc | 1 + src/common.hh | 62 +++++++ compiler.hh => src/compiler.hh | 6 + decompress.cc => src/decompress.cc | 5 +- decompress.hh => src/decompress.hh | 3 - exceptions.cc => src/exceptions.cc | 5 +- exceptions.hh => src/exceptions.hh | 5 - font2png.cc => src/font2png.cc | 0 {game => src/game}/GSMvePlay.cc | 3 +- {game => src/game}/GSMvePlay.hh | 0 {game => src/game}/GSShowObject.cc | 2 +- {game => src/game}/GSShowObject.hh | 0 {game => src/game}/GameState.hh | 2 - iffexplore.cc => src/iffexplore.cc | 9 +- mvedecode.cc => src/mvedecode.cc | 22 ++- objdecode.cc => src/objdecode.cc | 10 +- src/platform.hh | 10 ++ {render => src/render}/AlResource.cc | 2 + {render => src/render}/AlResource.hh | 4 - {render => src/render}/AudioStream.cc | 5 +- {render => src/render}/AudioStream.hh | 2 - {render => src/render}/Drawable.hh | 0 {render => src/render}/GlResource.cc | 2 +- {render => src/render}/GlResource.hh | 2 - {render => src/render}/Object.cc | 8 +- {render => src/render}/Object.hh | 3 - {render => src/render}/Overlay.cc | 8 +- {render => src/render}/Overlay.hh | 5 - {render => src/render}/ProgramProvider.cc | 4 +- {render => src/render}/ProgramProvider.hh | 3 +- {render => src/render}/Renderer.cc | 19 ++- {render => src/render}/Renderer.hh | 4 +- {render => src/render}/VBOManager.cc | 4 +- {render => src/render}/VBOManager.hh | 11 +- {render => src/render}/renderutil.cc | 31 +++- {render => src/render}/renderutil.hh | 2 + {render => src/render}/sdlutil.hh | 8 - shapdecode.cc => src/shapdecode.cc | 6 +- treexplore.cc => src/treexplore.cc | 14 +- util.cc => src/util.cc | 20 +-- util.hh => src/util.hh | 17 +- treexplore.vcxproj | 69 ++++---- treexplore.vcxproj.filters | 74 +++++++++ wc3re.sln | 36 +++++ 72 files changed, 1343 insertions(+), 291 deletions(-) delete mode 100644 common.hh create mode 100644 iffexplore.vcxproj create mode 100644 iffexplore.vcxproj.filters create mode 100644 mvedecode.vcxproj create mode 100644 mvedecode.vcxproj.filters create mode 100644 objdecode.vcxproj create mode 100644 objdecode.vcxproj.filters create mode 100644 shapdecode.vcxproj create mode 100644 shapdecode.vcxproj.filters rename IffFile.cc => src/IffFile.cc (99%) rename IffFile.hh => src/IffFile.hh (98%) rename MveDecoder.cc => src/MveDecoder.cc (99%) rename MveDecoder.hh => src/MveDecoder.hh (97%) rename ObjDecoder.cc => src/ObjDecoder.cc (99%) rename ObjDecoder.hh => src/ObjDecoder.hh (96%) rename PaletteDecoder.cc => src/PaletteDecoder.cc (96%) rename PaletteDecoder.hh => src/PaletteDecoder.hh (91%) rename Resource.hh => src/Resource.hh (94%) rename ResourceProvider.cc => src/ResourceProvider.cc (92%) rename ResourceProvider.hh => src/ResourceProvider.hh (96%) rename ShapDecoder.cc => src/ShapDecoder.cc (93%) rename ShapDecoder.hh => src/ShapDecoder.hh (92%) rename Singleton.hh => src/Singleton.hh (90%) rename TreFile.cc => src/TreFile.cc (98%) rename TreFile.hh => src/TreFile.hh (97%) create mode 100644 src/common.cc create mode 100644 src/common.hh rename compiler.hh => src/compiler.hh (55%) rename decompress.cc => src/decompress.cc (98%) rename decompress.hh => src/decompress.hh (95%) rename exceptions.cc => src/exceptions.cc (94%) rename exceptions.hh => src/exceptions.hh (93%) rename font2png.cc => src/font2png.cc (100%) rename {game => src/game}/GSMvePlay.cc (99%) rename {game => src/game}/GSMvePlay.hh (100%) rename {game => src/game}/GSShowObject.cc (99%) rename {game => src/game}/GSShowObject.hh (100%) rename {game => src/game}/GameState.hh (96%) rename iffexplore.cc => src/iffexplore.cc (95%) rename mvedecode.cc => src/mvedecode.cc (83%) rename objdecode.cc => src/objdecode.cc (91%) create mode 100644 src/platform.hh rename {render => src/render}/AlResource.cc (96%) rename {render => src/render}/AlResource.hh (93%) rename {render => src/render}/AudioStream.cc (93%) rename {render => src/render}/AudioStream.hh (95%) rename {render => src/render}/Drawable.hh (100%) rename {render => src/render}/GlResource.cc (95%) rename {render => src/render}/GlResource.hh (98%) rename {render => src/render}/Object.cc (99%) rename {render => src/render}/Object.hh (93%) rename {render => src/render}/Overlay.cc (95%) rename {render => src/render}/Overlay.hh (91%) rename {render => src/render}/ProgramProvider.cc (98%) rename {render => src/render}/ProgramProvider.hh (97%) rename {render => src/render}/Renderer.cc (94%) rename {render => src/render}/Renderer.hh (95%) rename {render => src/render}/VBOManager.cc (98%) rename {render => src/render}/VBOManager.hh (91%) rename {render => src/render}/renderutil.cc (79%) rename {render => src/render}/renderutil.hh (91%) rename {render => src/render}/sdlutil.hh (96%) rename shapdecode.cc => src/shapdecode.cc (94%) rename treexplore.cc => src/treexplore.cc (93%) rename util.cc => src/util.cc (96%) rename util.hh => src/util.hh (91%) create mode 100644 treexplore.vcxproj.filters diff --git a/.gitignore b/.gitignore index 845e977..07d6fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ font2png pntr2png treexplore *.vcxproj.user +*.gch diff --git a/LICENSES b/LICENSES index 15e00b9..c22796e 100644 --- a/LICENSES +++ b/LICENSES @@ -69,4 +69,24 @@ FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file +DEALINGS IN THE SOFTWARE. + + +Simple DirectMedia Layer +Copyright (C) 1997-2014 Sam Lantinga + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. diff --git a/Makefile b/Makefile index 495964e..e684790 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CXX=g++ -CXXOPTS=-Og -ggdb -fvar-tracking-assignments -Wall -Wextra -Wno-unused-function -pedantic -std=c++14 -march=native -fstack-protector-strong --param=ssp-buffer-size=4 -flto -I. -pthread +CXXOPTS=-Og -ggdb -fvar-tracking-assignments -Wall -Winvalid-pch -Wextra -Wno-unused-function -pedantic -std=c++14 -march=native -fstack-protector-strong --param=ssp-buffer-size=4 -flto -Isrc -pthread LDOPTS=-Wl,--sort-common render_CXXSRCS ::= render/Renderer.cc render/GlResource.cc render/ProgramProvider.cc render/renderutil.cc render/Overlay.cc render/VBOManager.cc render/Object.cc render/AlResource.cc render/AudioStream.cc @@ -29,12 +29,12 @@ progs ::= iffexplore treexplore mvedecode objdecode shapdecode all: $(progs) -objs/%.o: %.cc +objs/%.o: src/%.cc src/common.hh.gch $(CXX) $(CXXOPTS) -c -MMD -MP -o $@ $< @cp objs/$*.d objs/$*.P; rm -f objs/$*.d -%.pb.cc %.pb.h: %.proto - protoc --cpp_out=. $< +src/common.hh.gch: src/common.hh src/compiler.hh src/platform.hh src/exceptions.hh + $(CXX) $(CXXOPTS) -c -o $@ $< $(progs): %: $(CXX) $(CXXOPTS) $(LDOPTS) -o $@ $^ $($(@)_LIBS) diff --git a/common.hh b/common.hh deleted file mode 100644 index 26a58ba..0000000 --- a/common.hh +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef WC3RE__COMMON_HH__ -#define WC3RE__COMMON_HH__ - -#include -#include - -struct FILEDeleter { - void operator()(FILE* file) const { - fclose(file); - } -}; - -using FILEUPtr = std::unique_ptr; - -#include "exceptions.hh" - -#endif diff --git a/iffexplore.vcxproj b/iffexplore.vcxproj new file mode 100644 index 0000000..8bda37a --- /dev/null +++ b/iffexplore.vcxproj @@ -0,0 +1,121 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + {23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8} + Win32Proj + iffexplore + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + $(Configuration)\$(ProjectName)\ + + + false + $(Configuration)\$(ProjectName)\ + + + + Use + Level3 + Disabled + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + 4101;4251 + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + common.hh + /Zm190 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + Debug + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + 4101;4251 + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + common.hh + /Zm190 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + Release + + + + + + \ No newline at end of file diff --git a/iffexplore.vcxproj.filters b/iffexplore.vcxproj.filters new file mode 100644 index 0000000..f2bcf3f --- /dev/null +++ b/iffexplore.vcxproj.filters @@ -0,0 +1,74 @@ + + + + + {9d0923ce-d2f5-4368-b493-b775e9240a39} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {64a1e02e-886d-42ab-8338-5f224ee4f7b9} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/mvedecode.vcxproj b/mvedecode.vcxproj new file mode 100644 index 0000000..7997b07 --- /dev/null +++ b/mvedecode.vcxproj @@ -0,0 +1,144 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {94524082-F925-415B-9ABC-D9C68CDCB01F} + Win32Proj + mvedecode + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + $(Configuration)\$(ProjectName)\ + + + false + $(Configuration)\$(ProjectName)\ + + + + Use + Level3 + Disabled + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include;src + 4101;4251 + /Zm190 + common.hh + + + Console + true + env\SDL2_ttf-2.0.12\lib\x86;env\SDL2-2.0.3\lib\x86;env\openal-soft-1.16.0-bin\libs\Win32;env\glbinding\lib;Debug + wingetopt.lib;SDL2.lib;SDL2_ttf.lib;OpenAL32.lib;glbindingd.lib;%(AdditionalDependencies) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include;src + 4101;4251 + /Zm190 + common.hh + + + Console + true + true + true + env\SDL2_ttf-2.0.12\lib\x86;env\SDL2-2.0.3\lib\x86;env\openal-soft-1.16.0-bin\libs\Win32;env\glbinding\lib;Release + wingetopt.lib;SDL2.lib;SDL2_ttf.lib;OpenAL32.lib;glbinding.lib;%(AdditionalDependencies) + + + + + + \ No newline at end of file diff --git a/mvedecode.vcxproj.filters b/mvedecode.vcxproj.filters new file mode 100644 index 0000000..815323c --- /dev/null +++ b/mvedecode.vcxproj.filters @@ -0,0 +1,147 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/objdecode.vcxproj b/objdecode.vcxproj new file mode 100644 index 0000000..0e87f2f --- /dev/null +++ b/objdecode.vcxproj @@ -0,0 +1,146 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {E3B62A51-0886-47B3-95CA-906AC56CC1A8} + Win32Proj + objdecode + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + $(Configuration)\$(ProjectName)\ + + + false + $(Configuration)\$(ProjectName)\ + + + + Use + Level3 + Disabled + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + common.hh + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include;src + 4101;4251 + /Zm190 + + + Console + true + Debug;env\SDL2_ttf-2.0.12\lib\x86;env\SDL2-2.0.3\lib\x86;env\openal-soft-1.16.0-bin\libs\Win32;env\glbinding\lib; + glbindingd.lib;wingetopt.lib;SDL2.lib;SDL2_ttf.lib;OpenAL32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + common.hh + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include;src + 4101;4251 + /Zm190 + + + Console + true + true + true + Release;env\SDL2_ttf-2.0.12\lib\x86;env\SDL2-2.0.3\lib\x86;env\openal-soft-1.16.0-bin\libs\Win32;env\glbinding\lib; + glbinding.lib;wingetopt.lib;SDL2.lib;SDL2_ttf.lib;OpenAL32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/objdecode.vcxproj.filters b/objdecode.vcxproj.filters new file mode 100644 index 0000000..22cf9fc --- /dev/null +++ b/objdecode.vcxproj.filters @@ -0,0 +1,153 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/shapdecode.vcxproj b/shapdecode.vcxproj new file mode 100644 index 0000000..c7169bf --- /dev/null +++ b/shapdecode.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {5C417180-437D-4B93-92F2-1E6E6438573A} + Win32Proj + shapdecode + + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + true + $(Configuration)\$(ProjectName)\ + + + false + $(Configuration)\$(ProjectName)\ + + + + Use + Level3 + Disabled + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + common.hh + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + 4101;4251 + /Zm190 + + + Console + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + Debug/ + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + true + common.hh + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + 4101;4251 + /Zm190 + + + Console + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) + Release/ + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/shapdecode.vcxproj.filters b/shapdecode.vcxproj.filters new file mode 100644 index 0000000..5be0ab4 --- /dev/null +++ b/shapdecode.vcxproj.filters @@ -0,0 +1,80 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/IffFile.cc b/src/IffFile.cc similarity index 99% rename from IffFile.cc rename to src/IffFile.cc index 3025b5b..f4426a5 100644 --- a/IffFile.cc +++ b/src/IffFile.cc @@ -1,8 +1,7 @@ -#include +#include "common.hh" #include "IffFile.hh" #include "util.hh" -#include "common.hh" struct ChunkHeader { unsigned char typeID[4]; diff --git a/IffFile.hh b/src/IffFile.hh similarity index 98% rename from IffFile.hh rename to src/IffFile.hh index bbd93ef..586a415 100644 --- a/IffFile.hh +++ b/src/IffFile.hh @@ -1,12 +1,6 @@ #ifndef WC3RE_IFFFILE_HH__ #define WC3RE_IFFFILE_HH__ -#include -#include -#include -#include -#include - #include "Resource.hh" class IffFile : public RefCounted { diff --git a/MveDecoder.cc b/src/MveDecoder.cc similarity index 99% rename from MveDecoder.cc rename to src/MveDecoder.cc index b019786..2c7c8a2 100644 --- a/MveDecoder.cc +++ b/src/MveDecoder.cc @@ -1,8 +1,5 @@ -#include -#include - #include "common.hh" -#include "compiler.hh" + #include "util.hh" #include "IffFile.hh" #include "decompress.hh" @@ -222,7 +219,7 @@ MveDecoder::Movie::Movie(std::vector::const_iterator shotIt, MveDecoder::Movie::~Movie() { #ifndef NDEBUG - printf("Maximum command buffer: %zu\n", maxCommand_); + printf("Maximum command buffer: " SIZE_T_FORMAT "\n", maxCommand_); #endif } diff --git a/MveDecoder.hh b/src/MveDecoder.hh similarity index 97% rename from MveDecoder.hh rename to src/MveDecoder.hh index 438490e..836c52b 100644 --- a/MveDecoder.hh +++ b/src/MveDecoder.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_MVEDECODER_HH__ #define WC3RE_MVEDECODER_HH__ -#include -#include - #include "IffFile.hh" class MveDecoder { diff --git a/ObjDecoder.cc b/src/ObjDecoder.cc similarity index 99% rename from ObjDecoder.cc rename to src/ObjDecoder.cc index 0b05908..9b383fb 100644 --- a/ObjDecoder.cc +++ b/src/ObjDecoder.cc @@ -1,7 +1,6 @@ -#include +#include "common.hh" #include "ObjDecoder.hh" -#include "exceptions.hh" #include "util.hh" #include "ResourceProvider.hh" diff --git a/ObjDecoder.hh b/src/ObjDecoder.hh similarity index 96% rename from ObjDecoder.hh rename to src/ObjDecoder.hh index de1463c..bbf8066 100644 --- a/ObjDecoder.hh +++ b/src/ObjDecoder.hh @@ -1,11 +1,6 @@ #ifndef WC3RE_OBJDECODER_HH__ #define WC3RE_OBJDECODER_HH__ -#include -#include -#include -#include - #include "IffFile.hh" class ObjDecoder { diff --git a/PaletteDecoder.cc b/src/PaletteDecoder.cc similarity index 96% rename from PaletteDecoder.cc rename to src/PaletteDecoder.cc index 6e5cf8f..9566809 100644 --- a/PaletteDecoder.cc +++ b/src/PaletteDecoder.cc @@ -1,7 +1,6 @@ -#include +#include "common.hh" #include "PaletteDecoder.hh" -#include "exceptions.hh" #include "ResourceProvider.hh" PaletteDecoder::PaletteDecoder(std::string const& path) diff --git a/PaletteDecoder.hh b/src/PaletteDecoder.hh similarity index 91% rename from PaletteDecoder.hh rename to src/PaletteDecoder.hh index 1310976..5019a26 100644 --- a/PaletteDecoder.hh +++ b/src/PaletteDecoder.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_PALETTEDECODER_HH__ #define WC3RE_PALETTEDECODER_HH__ -#include -#include - #include "IffFile.hh" class PaletteDecoder { diff --git a/Resource.hh b/src/Resource.hh similarity index 94% rename from Resource.hh rename to src/Resource.hh index a62b84c..f26b3b1 100644 --- a/Resource.hh +++ b/src/Resource.hh @@ -1,13 +1,6 @@ #ifndef WC3RE_RESOURCE_HH__ #define WC3RE_RESOURCE_HH__ -#include -#include -#include -#include -#include -#include - class RefCounted { public: RefCounted() : ref_(0) { @@ -81,7 +74,7 @@ public: } operator bool() const { - return res_; + return (res_ != nullptr); } Resource& operator*() { diff --git a/ResourceProvider.cc b/src/ResourceProvider.cc similarity index 92% rename from ResourceProvider.cc rename to src/ResourceProvider.cc index 671b0fe..0a13d14 100644 --- a/ResourceProvider.cc +++ b/src/ResourceProvider.cc @@ -1,10 +1,9 @@ -#include +#include "common.hh" #include "Resource.hh" -#include "exceptions.hh" #include "util.hh" #include "IffFile.hh" -//#include "TreFile.hh" +#include "TreFile.hh" #include "ResourceProvider.hh" template<> @@ -30,22 +29,22 @@ ResourceProvider::~ResourceProvider() void ResourceProvider::dumpCache_() const { for (auto& iff: iffs_) { - printf("IFF: %s: %u users, %zu size\n", iff.first.c_str(), iff.second->getRef(), + printf("IFF: %s: %u users, " SIZE_T_FORMAT " size\n", iff.first.c_str(), iff.second->getRef(), iff.second->footprint()); } for (auto& treObj: treObjs_) { - printf("TRE-Obj: %s: %u users, %zu size\n", treObj.first.c_str(), treObj.second->getRef(), + printf("TRE-Obj: %s: %u users, " SIZE_T_FORMAT " size\n", treObj.first.c_str(), treObj.second->getRef(), treObj.second->footprint()); } for (auto& tre: tres_) { - printf("TRE: %s: %u users, %zu size\n", tre.first.c_str(), tre.second->getRef(), + printf("TRE: %s: %u users, " SIZE_T_FORMAT " size\n", tre.first.c_str(), tre.second->getRef(), tre.second->footprint()); } for (auto& mmap: files_) { - printf("File: %s: %u users, %zu size\n", mmap.first.c_str(), mmap.second->getRef(), + printf("File: %s: %u users, " SIZE_T_FORMAT " size\n", mmap.first.c_str(), mmap.second->getRef(), mmap.second->footprint()); } } diff --git a/ResourceProvider.hh b/src/ResourceProvider.hh similarity index 96% rename from ResourceProvider.hh rename to src/ResourceProvider.hh index 787cf38..b5962c9 100644 --- a/ResourceProvider.hh +++ b/src/ResourceProvider.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_RESOURCEPROVIDER_HH__ #define WC3RE_RESOURCEPROVIDER_HH__ -#include -#include - #include "Singleton.hh" #include "TreFile.hh" #include "IffFile.hh" diff --git a/ShapDecoder.cc b/src/ShapDecoder.cc similarity index 93% rename from ShapDecoder.cc rename to src/ShapDecoder.cc index aa8b986..5556f6f 100644 --- a/ShapDecoder.cc +++ b/src/ShapDecoder.cc @@ -1,9 +1,4 @@ -#include -#include -#include -#include - -#include +#include "common.hh" #include "util.hh" #include "Resource.hh" @@ -81,5 +76,5 @@ ShapDecoder::ShapDecoder(Resource::Handle res) printf("\t%.4x: %u\n", ent.first, ent.second); } - printf("\t%zu bytes of data\n", res_->size()-(lastofs+24)); + printf("\t" SIZE_T_FORMAT " bytes of data\n", res_->size()-(lastofs+24)); } diff --git a/ShapDecoder.hh b/src/ShapDecoder.hh similarity index 92% rename from ShapDecoder.hh rename to src/ShapDecoder.hh index 0f8148b..46d4186 100644 --- a/ShapDecoder.hh +++ b/src/ShapDecoder.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_SHAPDECODER_HH__ #define WC3RE_SHAPDECODER_HH__ -#include - class Resource; class ShapDecoder { diff --git a/Singleton.hh b/src/Singleton.hh similarity index 90% rename from Singleton.hh rename to src/Singleton.hh index f76bb5b..f887f6d 100644 --- a/Singleton.hh +++ b/src/Singleton.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_SINGLETON_HH__ #define WC3RE_SINGLETON_HH__ -#include -#include - template class Singleton { public: diff --git a/TreFile.cc b/src/TreFile.cc similarity index 98% rename from TreFile.cc rename to src/TreFile.cc index c7aed1d..14516a6 100644 --- a/TreFile.cc +++ b/src/TreFile.cc @@ -1,13 +1,5 @@ -#include -#include -#include -#include - -#ifdef WIN32 -#define snprintf _snprintf -#endif - #include "common.hh" + #include "util.hh" #include "decompress.hh" #include "TreFile.hh" @@ -247,7 +239,7 @@ std::unique_ptr TreFile::getObject(std::string const& spec) con if (crc <= std::numeric_limits::max()) { try { - return openCRC(crc); + return openCRC(static_cast(crc)); } catch (Exception &ex) { } } diff --git a/TreFile.hh b/src/TreFile.hh similarity index 97% rename from TreFile.hh rename to src/TreFile.hh index 403210e..c43d840 100644 --- a/TreFile.hh +++ b/src/TreFile.hh @@ -1,12 +1,6 @@ #ifndef WC3RE_TREFILE_HH__ #define WC3RE_TREFILE_HH__ -#include -#include -#include -#include -#include - #include "Resource.hh" class TreFile : public RefCounted { diff --git a/src/common.cc b/src/common.cc new file mode 100644 index 0000000..65b079b --- /dev/null +++ b/src/common.cc @@ -0,0 +1 @@ +#include "common.hh" \ No newline at end of file diff --git a/src/common.hh b/src/common.hh new file mode 100644 index 0000000..a51f751 --- /dev/null +++ b/src/common.hh @@ -0,0 +1,62 @@ +#ifndef WC3RE__COMMON_HH__ +#define WC3RE__COMMON_HH__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define GLM_FORCE_RADIANS +#include +#include +#include +#include + +#include +#include + +#ifdef WIN32 +#define NOMINMAX +#include +#include "getopt.h" + +#include +#include +#undef main +#else +#include +#include + +#include +#include +#endif + +#include "compiler.hh" +#include "platform.hh" +#include "exceptions.hh" + +#endif diff --git a/compiler.hh b/src/compiler.hh similarity index 55% rename from compiler.hh rename to src/compiler.hh index 7fbb35f..b1a8266 100644 --- a/compiler.hh +++ b/src/compiler.hh @@ -3,11 +3,17 @@ #ifdef __GNUG__ #define RESTRICT __restrict__ +#define NO_EXCEPT noexcept +#define SIZE_T_FORMAT "%zu" #else #ifdef _MSC_VER #define RESTRICT __restrict +#define NO_EXCEPT _NOEXCEPT +#define SIZE_T_FORMAT "%Iu" #else #define RESTRICT +#define NO_EXCEPT +#define SIZE_T_FORMAT "%zu" #endif #endif diff --git a/decompress.cc b/src/decompress.cc similarity index 98% rename from decompress.cc rename to src/decompress.cc index e1a25cf..6d07bec 100644 --- a/decompress.cc +++ b/src/decompress.cc @@ -1,8 +1,5 @@ -#include -#include - #include "common.hh" -#include "compiler.hh" + #include "util.hh" #include "decompress.hh" diff --git a/decompress.hh b/src/decompress.hh similarity index 95% rename from decompress.hh rename to src/decompress.hh index 5385513..65abd1e 100644 --- a/decompress.hh +++ b/src/decompress.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_DECOMPRESS_HH__ #define WC3RE_DECOMPRESS_HH__ -#include -#include - /* Decompression routines for various proprietary compression formats found in WC3 */ diff --git a/exceptions.cc b/src/exceptions.cc similarity index 94% rename from exceptions.cc rename to src/exceptions.cc index 2bb3224..26fd063 100644 --- a/exceptions.cc +++ b/src/exceptions.cc @@ -1,7 +1,4 @@ -#include -#include - -#include "exceptions.hh" +#include "common.hh" Exception::Exception(std::string msg) : msg_(std::move(msg)) diff --git a/exceptions.hh b/src/exceptions.hh similarity index 93% rename from exceptions.hh rename to src/exceptions.hh index d97d793..f440d04 100644 --- a/exceptions.hh +++ b/src/exceptions.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_EXCEPTIONS_HH__ #define WC3RE_EXCEPTIONS_HH__ -#include - class Exception { public: Exception(std::string msg = ""); @@ -41,9 +39,6 @@ private: }; #ifdef WIN32 -#define NOMINMAX -#include - class Win32Exception : public Exception { public: Win32Exception(DWORD err, std::string msg = ""); diff --git a/font2png.cc b/src/font2png.cc similarity index 100% rename from font2png.cc rename to src/font2png.cc diff --git a/game/GSMvePlay.cc b/src/game/GSMvePlay.cc similarity index 99% rename from game/GSMvePlay.cc rename to src/game/GSMvePlay.cc index 424c0ad..01ee0f9 100644 --- a/game/GSMvePlay.cc +++ b/src/game/GSMvePlay.cc @@ -1,5 +1,6 @@ -#include "MveDecoder.hh" +#include "common.hh" +#include "MveDecoder.hh" #include "GSMvePlay.hh" #include "render/Overlay.hh" #include "render/Renderer.hh" diff --git a/game/GSMvePlay.hh b/src/game/GSMvePlay.hh similarity index 100% rename from game/GSMvePlay.hh rename to src/game/GSMvePlay.hh diff --git a/game/GSShowObject.cc b/src/game/GSShowObject.cc similarity index 99% rename from game/GSShowObject.cc rename to src/game/GSShowObject.cc index 93c8667..39846f3 100644 --- a/game/GSShowObject.cc +++ b/src/game/GSShowObject.cc @@ -1,4 +1,4 @@ -#include +#include "common.hh" #include "ObjDecoder.hh" diff --git a/game/GSShowObject.hh b/src/game/GSShowObject.hh similarity index 100% rename from game/GSShowObject.hh rename to src/game/GSShowObject.hh diff --git a/game/GameState.hh b/src/game/GameState.hh similarity index 96% rename from game/GameState.hh rename to src/game/GameState.hh index 6a9d94a..99c94d5 100644 --- a/game/GameState.hh +++ b/src/game/GameState.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_GAME_GAMESTATE_HH__ #define WC3RE_GAME_GAMESTATE_HH__ -#include - namespace render { class Renderer; } diff --git a/iffexplore.cc b/src/iffexplore.cc similarity index 95% rename from iffexplore.cc rename to src/iffexplore.cc index aa28e32..c0bc484 100644 --- a/iffexplore.cc +++ b/src/iffexplore.cc @@ -1,12 +1,5 @@ -#include -#include -#include -#include -#include - -#include - #include "common.hh" + #include "util.hh" #include "ResourceProvider.hh" #include "IffFile.hh" diff --git a/mvedecode.cc b/src/mvedecode.cc similarity index 83% rename from mvedecode.cc rename to src/mvedecode.cc index 6d7fc5b..6001740 100644 --- a/mvedecode.cc +++ b/src/mvedecode.cc @@ -1,13 +1,5 @@ -#include -#include -#include -#include -#include -#include - -#include - #include "common.hh" + #include "util.hh" #include "MveDecoder.hh" #include "render/Renderer.hh" @@ -16,19 +8,20 @@ using render::Renderer; void usage(char *argv0) { - fprintf(stderr, "Usage: %s [-h] (tre-file name/crc)/iff-file\n", argv0); + fprintf(stderr, "Usage: %s [-hf] [-p [id]] (tre-file name/crc)/iff-file\n", argv0); fprintf(stderr, "\tAttempt to decode the movie stored in iff-file, or in the\n\tiff-object \"name\"/\"crc\" contained in tre-file\n"); fprintf(stderr, "\t-p [id]\tPlay branch id, or all branches if no id given\n"); + fprintf(stderr, "\t-f\tPlay video in fullscreen\n"); fprintf(stderr, "\t-h\tPrint this help\n"); } int main(int argc, char *argv[]) { std::string inPath; int branch = -1; - bool play = false; + bool play = false, fullscreen = false; { int opt; - while ((opt = getopt(argc, argv, "hp::")) != -1) { + while ((opt = getopt(argc, argv, "hp::f")) != -1) { switch (opt) { case 'h': usage(argv[0]); @@ -43,6 +36,9 @@ int main(int argc, char *argv[]) { } } break; + case 'f': + fullscreen = true; + break; default: usage(argv[0]); return 1; @@ -61,7 +57,7 @@ int main(int argc, char *argv[]) { auto mve = std::make_unique(inPath); if (play) { - Renderer renderer; + Renderer renderer(fullscreen); if (branch >= 0) { auto movie = mve->open(branch); diff --git a/objdecode.cc b/src/objdecode.cc similarity index 91% rename from objdecode.cc rename to src/objdecode.cc index fbf5522..b13f012 100644 --- a/objdecode.cc +++ b/src/objdecode.cc @@ -1,13 +1,5 @@ -#include -#include -#include -#include -#include -#include - -#include - #include "common.hh" + #include "util.hh" #include "TreFile.hh" #include "IffFile.hh" diff --git a/src/platform.hh b/src/platform.hh new file mode 100644 index 0000000..faf9311 --- /dev/null +++ b/src/platform.hh @@ -0,0 +1,10 @@ +#ifndef WC3RE_PLATFORM_HH_ +#define WC3RE_PLATFORM_HH_ + +#ifdef WIN32 +#define snprintf _snprintf +#else + +#endif + +#endif diff --git a/render/AlResource.cc b/src/render/AlResource.cc similarity index 96% rename from render/AlResource.cc rename to src/render/AlResource.cc index 000ca8b..57c8524 100644 --- a/render/AlResource.cc +++ b/src/render/AlResource.cc @@ -1,3 +1,5 @@ +#include "common.hh" + #include "AlResource.hh" namespace render { diff --git a/render/AlResource.hh b/src/render/AlResource.hh similarity index 93% rename from render/AlResource.hh rename to src/render/AlResource.hh index eca4fdb..55b0a67 100644 --- a/render/AlResource.hh +++ b/src/render/AlResource.hh @@ -1,10 +1,6 @@ #ifndef WC3RE_RENDER_ALRESOURCE_HH__ #define WC3RE_RENDER_ALRESOURCE_HH__ -#include -#include -#include - #include "GlResource.hh" namespace render { diff --git a/render/AudioStream.cc b/src/render/AudioStream.cc similarity index 93% rename from render/AudioStream.cc rename to src/render/AudioStream.cc index 7cb86e8..f116ad5 100644 --- a/render/AudioStream.cc +++ b/src/render/AudioStream.cc @@ -1,5 +1,6 @@ +#include "common.hh" + #include "AudioStream.hh" -#include "exceptions.hh" namespace render { AudioStream::AudioStream() @@ -12,7 +13,7 @@ namespace render { AudioStream::~AudioStream() { #ifndef NDEBUG - printf("%zu buffers at destruction\n", alBufs_.size()); + printf(SIZE_T_FORMAT " buffers at destruction\n", alBufs_.size()); #endif } diff --git a/render/AudioStream.hh b/src/render/AudioStream.hh similarity index 95% rename from render/AudioStream.hh rename to src/render/AudioStream.hh index 49ef78b..016fa54 100644 --- a/render/AudioStream.hh +++ b/src/render/AudioStream.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_RENDER_AUDIOSTREAM_HH__ #define WC3RE_RENDER_AUDIOSTREAM_HH__ -#include - #include "AlResource.hh" namespace render { diff --git a/render/Drawable.hh b/src/render/Drawable.hh similarity index 100% rename from render/Drawable.hh rename to src/render/Drawable.hh diff --git a/render/GlResource.cc b/src/render/GlResource.cc similarity index 95% rename from render/GlResource.cc rename to src/render/GlResource.cc index eea4749..91ca1c2 100644 --- a/render/GlResource.cc +++ b/src/render/GlResource.cc @@ -1,4 +1,4 @@ -#include +#include "common.hh" #include "GlResource.hh" diff --git a/render/GlResource.hh b/src/render/GlResource.hh similarity index 98% rename from render/GlResource.hh rename to src/render/GlResource.hh index 330749a..219b702 100644 --- a/render/GlResource.hh +++ b/src/render/GlResource.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_RENDER_GLRESOURCE_HH__ #define WC3RE_RENDER_GLRESOURCE_HH__ -#include - namespace render { struct TextureDeleter { void operator() (gl::GLuint tex) const; diff --git a/render/Object.cc b/src/render/Object.cc similarity index 99% rename from render/Object.cc rename to src/render/Object.cc index ecfedd3..5da9e96 100644 --- a/render/Object.cc +++ b/src/render/Object.cc @@ -1,10 +1,4 @@ -#include - -#include - -#include -#include -#include +#include "common.hh" #include "Object.hh" #include "ProgramProvider.hh" diff --git a/render/Object.hh b/src/render/Object.hh similarity index 93% rename from render/Object.hh rename to src/render/Object.hh index e682192..c8d0eba 100644 --- a/render/Object.hh +++ b/src/render/Object.hh @@ -1,9 +1,6 @@ #ifndef WC3RE_RENDER_OBJECT_HH__ #define WC3RE_RENDER_OBJECT_HH__ -#define GLM_FORCE_RADIANS -#include - #include "Drawable.hh" #include "GlResource.hh" #include "VBOManager.hh" diff --git a/render/Overlay.cc b/src/render/Overlay.cc similarity index 95% rename from render/Overlay.cc rename to src/render/Overlay.cc index 7efff18..350310e 100644 --- a/render/Overlay.cc +++ b/src/render/Overlay.cc @@ -1,8 +1,4 @@ -#include -#include - -#include -#include +#include "common.hh" #include "Overlay.hh" #include "renderutil.hh" @@ -73,7 +69,7 @@ namespace render { // void Overlay::clear() // { - // if (SDL_GL_ExtensionSupported("GL_ARB_clear_texture")) + // if (extensionSupported("GL_ARB_clear_texture")) // glClearTexImage(texture_, 0, GL_BGRA, GL_UNSIGNED_BYTE, nullptr); // else { // std::vector zeros(intWidth_*intHeight_*4, 0u); diff --git a/render/Overlay.hh b/src/render/Overlay.hh similarity index 91% rename from render/Overlay.hh rename to src/render/Overlay.hh index 260836b..4fadbb0 100644 --- a/render/Overlay.hh +++ b/src/render/Overlay.hh @@ -1,11 +1,6 @@ #ifndef WC3RE_RENDER_OVERLAY_HH__ #define WC3RE_RENDER_OVERLAY_HH__ -#include - -#define GLM_FORCE_RADIANS -#include - #include "Drawable.hh" #include "GlResource.hh" #include "VBOManager.hh" diff --git a/render/ProgramProvider.cc b/src/render/ProgramProvider.cc similarity index 98% rename from render/ProgramProvider.cc rename to src/render/ProgramProvider.cc index 6fdbb03..b1d4bd1 100644 --- a/render/ProgramProvider.cc +++ b/src/render/ProgramProvider.cc @@ -1,8 +1,8 @@ -#include +#include "common.hh" + #include #include "ProgramProvider.hh" -#include "exceptions.hh" #include "util.hh" using namespace gl; diff --git a/render/ProgramProvider.hh b/src/render/ProgramProvider.hh similarity index 97% rename from render/ProgramProvider.hh rename to src/render/ProgramProvider.hh index 39e3950..9ff6517 100644 --- a/render/ProgramProvider.hh +++ b/src/render/ProgramProvider.hh @@ -1,10 +1,9 @@ #ifndef WC3RE_RENDER_PROGRAMPROVIDER_HH__ #define WC3RE_RENDER_PROGRAMPROVIDER_HH__ -#include - #include "Singleton.hh" #include "GlResource.hh" + namespace render { using ProgramProviderKeyType = std::tuple; } diff --git a/render/Renderer.cc b/src/render/Renderer.cc similarity index 94% rename from render/Renderer.cc rename to src/render/Renderer.cc index 42341c5..1b906f7 100644 --- a/render/Renderer.cc +++ b/src/render/Renderer.cc @@ -1,12 +1,8 @@ -#include -#include -#include -#include +#include "common.hh" #include "Renderer.hh" #include "GlResource.hh" #include "game/GameState.hh" -#include "exceptions.hh" #include "Overlay.hh" using namespace gl; @@ -16,6 +12,9 @@ namespace render { public: GLException(GLenum err) : Exception(), err_(err) { } + + GLException(GLenum err, glbinding::FunctionCall const& fc) : Exception(fc.toString()), err_(err) { + } GLenum getErr() const {return err_;} @@ -40,7 +39,7 @@ namespace render { } std::string toString() const override { - return "GLException: " + errToString() + "(" + std::to_string(static_cast(err_)) + ")"; + return "GLException: " + errToString() + "(" + std::to_string(static_cast(err_)) + "):" + msg_; } private: @@ -53,12 +52,12 @@ namespace render { GLenum error = glGetError(); glbinding::setCallbackMask(glbinding::CallbackMask::After); if (error != GL_NO_ERROR) - throw GLException(error); + throw GLException(error, fc); } - Renderer::Renderer() + Renderer::Renderer(bool fullscreen) : sdlInit_(), ttfInit_(), window_(), context_() { // Initialize OpenGL @@ -73,8 +72,8 @@ namespace render { window_.reset(SDL_CreateWindow("WC3 RE", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - 0, 0, - SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_OPENGL)); + 640, 400, + (fullscreen?SDL_WINDOW_FULLSCREEN_DESKTOP:0) | SDL_WINDOW_OPENGL)); if (!window_) throw SDLException{}; diff --git a/render/Renderer.hh b/src/render/Renderer.hh similarity index 95% rename from render/Renderer.hh rename to src/render/Renderer.hh index cbef52f..d5fee52 100644 --- a/render/Renderer.hh +++ b/src/render/Renderer.hh @@ -1,8 +1,6 @@ #ifndef WC3RE_RENDER_RENDERER_HH__ #define WC3RE_RENDER_RENDERER_HH__ -#include - #include "sdlutil.hh" #include "AlResource.hh" @@ -15,7 +13,7 @@ namespace render { class Renderer { public: - Renderer(); + Renderer(bool fullscreen = true); ~Renderer(); void run(); diff --git a/render/VBOManager.cc b/src/render/VBOManager.cc similarity index 98% rename from render/VBOManager.cc rename to src/render/VBOManager.cc index 6234820..3e3a113 100644 --- a/render/VBOManager.cc +++ b/src/render/VBOManager.cc @@ -1,6 +1,4 @@ -#include -#include -#include +#include "common.hh" #include "VBOManager.hh" diff --git a/render/VBOManager.hh b/src/render/VBOManager.hh similarity index 91% rename from render/VBOManager.hh rename to src/render/VBOManager.hh index a87d55e..2122543 100644 --- a/render/VBOManager.hh +++ b/src/render/VBOManager.hh @@ -1,15 +1,6 @@ #ifndef WC3RE_RENDER_VBOMANAGER_HH__ #define WC3RE_RENDER_VBOMANAGER_HH__ -#include -#include -#include -#include -#include - -#include -#include - #include "Singleton.hh" namespace render { @@ -67,7 +58,7 @@ namespace render { return _vbo->getID(); } - explicit operator bool() const noexcept { + explicit operator bool() const NO_EXCEPT { return (_vbo != nullptr); } diff --git a/render/renderutil.cc b/src/render/renderutil.cc similarity index 79% rename from render/renderutil.cc rename to src/render/renderutil.cc index 8bd43a0..323685f 100644 --- a/render/renderutil.cc +++ b/src/render/renderutil.cc @@ -1,8 +1,6 @@ -#include -#include +#include "common.hh" #include "renderutil.hh" -#include "exceptions.hh" using namespace gl; @@ -26,7 +24,8 @@ namespace render { if ((maxTexSize < 0) || (maxArrTexLayers < 0)) throw Exception{"GL returned negative values for max tex. dimensions"}; - return std::make_tuple(maxTexSize, maxArrTexLayers); + return std::make_tuple(static_cast(maxTexSize), + static_cast(maxArrTexLayers)); } void useProgram(GLuint program) @@ -38,6 +37,20 @@ namespace render { curProgram = program; } } + + bool extensionSupported(std::string const& extname) + { + static std::unordered_map extensions; + + auto it = extensions.find(extname); + if (it != extensions.end()) + return it->second; + + bool support = SDL_GL_ExtensionSupported(extname.c_str()); + extensions.emplace(extname, support); + + return support; + } TextureResource create2DTexture(unsigned width, unsigned height, bool alpha, unsigned levels) { @@ -46,15 +59,17 @@ namespace render { glBindTexture(GL_TEXTURE_2D, tex); unsigned logWidth = ilog2(width), logHeight = ilog2(height); + if (levels == 0) levels = std::max(logWidth,logHeight)+1u; - if(SDL_GL_ExtensionSupported("GL_ARB_texture_storage")) + + if(extensionSupported("GL_ARB_texture_storage")) glTexStorage2D(GL_TEXTURE_2D, levels, alpha?GL_RGBA8:GL_RGB8, width, height); else { std::printf("Warning: extension GL_ARB_texture_storage not supported!\n"); for (unsigned i = 0u; i < levels; ++i) { glTexImage2D(GL_TEXTURE_2D, i, static_cast(alpha?GL_RGBA8:GL_RGB8), width, height, 0, - alpha?GL_RGBA8:GL_RGB8, GL_UNSIGNED_BYTE, NULL); + alpha?GL_RGBA:GL_RGB, GL_UNSIGNED_BYTE, NULL); width = std::max(1u, (width / 2u)); height = std::max(1u, (height / 2u)); } @@ -72,9 +87,11 @@ namespace render { glBindTexture(GL_TEXTURE_2D_ARRAY, tex); unsigned logWidth = ilog2(width), logHeight = ilog2(height); + if (levels == 0) levels = std::max(logWidth,logHeight)+1u; - if(SDL_GL_ExtensionSupported("GL_ARB_texture_storage")) + + if(extensionSupported("GL_ARB_texture_storage")) glTexStorage3D(GL_TEXTURE_2D_ARRAY, levels, alpha?GL_RGBA8:GL_RGB8, width, height, count); else { std::printf("Warning: extension GL_ARB_texture_storage not supported!\n"); diff --git a/render/renderutil.hh b/src/render/renderutil.hh similarity index 91% rename from render/renderutil.hh rename to src/render/renderutil.hh index f6b0358..9da17e3 100644 --- a/render/renderutil.hh +++ b/src/render/renderutil.hh @@ -11,6 +11,8 @@ namespace render { // call glUseProgram if program != current program void useProgram(gl::GLuint program); + + bool extensionSupported(std::string const& extname); TextureResource create2DTexture(unsigned width, unsigned height, bool alpha, unsigned levels = 0); TextureResource create2DArrayTexture(unsigned width, unsigned height, unsigned count, diff --git a/render/sdlutil.hh b/src/render/sdlutil.hh similarity index 96% rename from render/sdlutil.hh rename to src/render/sdlutil.hh index 3a27528..317beb4 100644 --- a/render/sdlutil.hh +++ b/src/render/sdlutil.hh @@ -1,14 +1,6 @@ #ifndef WC3RE_RENDER_SDLUTIL_HH__ #define WC3RE_RENDER_SDLUTIL_HH__ -#include -#include - -#include -#include - -#include "exceptions.hh" - namespace render { class SDLException : public Exception { diff --git a/shapdecode.cc b/src/shapdecode.cc similarity index 94% rename from shapdecode.cc rename to src/shapdecode.cc index 7a28040..bfaf19b 100644 --- a/shapdecode.cc +++ b/src/shapdecode.cc @@ -1,9 +1,5 @@ -#include -#include - -#include - #include "common.hh" + #include "util.hh" #include "ShapDecoder.hh" #include "IffFile.hh" diff --git a/treexplore.cc b/src/treexplore.cc similarity index 93% rename from treexplore.cc rename to src/treexplore.cc index b7f8763..287cca4 100644 --- a/treexplore.cc +++ b/src/treexplore.cc @@ -1,17 +1,5 @@ -#include -#include -#include -#include -#include -#include - -#ifndef WIN32 -#include -#else -#include "getopt.h" -#endif - #include "common.hh" + #include "util.hh" #include "TreFile.hh" #include "IffFile.hh" diff --git a/util.cc b/src/util.cc similarity index 96% rename from util.cc rename to src/util.cc index 37e35e6..aa1ec78 100644 --- a/util.cc +++ b/src/util.cc @@ -1,16 +1,5 @@ -#include -#include -#include -#include - -#ifndef WIN32 -#include -#include -#else -#define fileno _fileno -#endif - #include "common.hh" + #include "util.hh" #ifndef WIN32 @@ -76,7 +65,10 @@ MmapFile::MmapFile(std::string fileName) LARGE_INTEGER size; if (!GetFileSizeEx(file_hnd_, &size)) throw Win32Exception(GetLastError(), "GetFileSizeEx() failed"); - size_ = size.QuadPart; + + if (size.QuadPart > std::numeric_limits::max()) + throw Exception("File size exceeds size_t"); + size_ = static_cast(size.QuadPart); fm_hnd_ = CreateFileMapping(file_hnd_, NULL, PAGE_READONLY, 0, 0, NULL); if (fm_hnd_ == INVALID_HANDLE_VALUE) { @@ -157,7 +149,7 @@ uint8_t const* MmapFile::data() const MmapFile::operator bool() const { - return base_; + return (base_ != nullptr); } diff --git a/util.hh b/src/util.hh similarity index 91% rename from util.hh rename to src/util.hh index 03751e1..5bfc81b 100644 --- a/util.hh +++ b/src/util.hh @@ -1,17 +1,16 @@ #ifndef WC3RE_UTIL_HH__ #define WC3RE_UTIL_HH__ -#include -#include - -#ifdef WIN32 -#define NOMINMAX -#include -#endif - -#include "common.hh" #include "Resource.hh" +struct FILEDeleter { + void operator()(FILE* file) const { + fclose(file); + } +}; + +using FILEUPtr = std::unique_ptr; + class MmapFile : public Resource { public: MmapFile(std::string fileName); diff --git a/treexplore.vcxproj b/treexplore.vcxproj index f88ff0b..a96901a 100644 --- a/treexplore.vcxproj +++ b/treexplore.vcxproj @@ -10,6 +10,34 @@ Win32 + + + Create + common.hh + Create + common.hh + + + + + + + + + + + + + + + + + + + + + + {5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC} Win32Proj @@ -41,67 +69,54 @@ true + $(Configuration)\$(ProjectName)\ false + $(Configuration)\$(ProjectName)\ - - + Use Level3 Disabled WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true - D:\devel\wc3re\libs\wingetopt;%(AdditionalIncludeDirectories) + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + common.hh + 4101;4251 + /Zm190 Console true - D:\devel\wc3re\Debug;%(AdditionalLibraryDirectories) + Debug;%(AdditionalLibraryDirectories) kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) Level3 - - + Use MaxSpeed true true WIN32;_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGSNDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true - D:\devel\wc3re\libs\wingetopt; + env\SDL2_ttf-2.0.12\include;env\SDL2-2.0.3\include;libs\wingetopt;env\glm;env\glbinding\include;env\openal-soft-1.16.0-bin\include + 4101;4251 + common.hh + /Zm190 Console true true true - D:\devel\wc3re\Release;%(AdditionalLibraryDirectories) + Release;%(AdditionalLibraryDirectories) kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wingetopt.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - diff --git a/treexplore.vcxproj.filters b/treexplore.vcxproj.filters new file mode 100644 index 0000000..ea02fbd --- /dev/null +++ b/treexplore.vcxproj.filters @@ -0,0 +1,74 @@ + + + + + {aab1f74c-b199-4808-94b3-355ea8c10661} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {a477e5a5-8ced-430d-a7b4-f3ed476e4e8b} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/wc3re.sln b/wc3re.sln index 4b27bc1..d95867d 100644 --- a/wc3re.sln +++ b/wc3re.sln @@ -4,9 +4,29 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "treexplore", "treexplore.vcxproj", "{5AB0D2CB-6E7B-400C-86AE-2D61AA70B3EC}" + ProjectSection(ProjectDependencies) = postProject + {50D0969D-054D-4726-A85B-3ED2FBCCC43E} = {50D0969D-054D-4726-A85B-3ED2FBCCC43E} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wingetopt", "libs\wingetopt\wingetopt.vcxproj", "{50D0969D-054D-4726-A85B-3ED2FBCCC43E}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iffexplore", "iffexplore.vcxproj", "{23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8}" + ProjectSection(ProjectDependencies) = postProject + {50D0969D-054D-4726-A85B-3ED2FBCCC43E} = {50D0969D-054D-4726-A85B-3ED2FBCCC43E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shapdecode", "shapdecode.vcxproj", "{5C417180-437D-4B93-92F2-1E6E6438573A}" + ProjectSection(ProjectDependencies) = postProject + {50D0969D-054D-4726-A85B-3ED2FBCCC43E} = {50D0969D-054D-4726-A85B-3ED2FBCCC43E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mvedecode", "mvedecode.vcxproj", "{94524082-F925-415B-9ABC-D9C68CDCB01F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "objdecode", "objdecode.vcxproj", "{E3B62A51-0886-47B3-95CA-906AC56CC1A8}" + ProjectSection(ProjectDependencies) = postProject + {50D0969D-054D-4726-A85B-3ED2FBCCC43E} = {50D0969D-054D-4726-A85B-3ED2FBCCC43E} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -21,6 +41,22 @@ Global {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Debug|Win32.Build.0 = Debug|Win32 {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Release|Win32.ActiveCfg = Release|Win32 {50D0969D-054D-4726-A85B-3ED2FBCCC43E}.Release|Win32.Build.0 = Release|Win32 + {23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8}.Debug|Win32.Build.0 = Debug|Win32 + {23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8}.Release|Win32.ActiveCfg = Release|Win32 + {23DC33B8-9A83-49C4-A2F4-0EC407CCD7E8}.Release|Win32.Build.0 = Release|Win32 + {5C417180-437D-4B93-92F2-1E6E6438573A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5C417180-437D-4B93-92F2-1E6E6438573A}.Debug|Win32.Build.0 = Debug|Win32 + {5C417180-437D-4B93-92F2-1E6E6438573A}.Release|Win32.ActiveCfg = Release|Win32 + {5C417180-437D-4B93-92F2-1E6E6438573A}.Release|Win32.Build.0 = Release|Win32 + {94524082-F925-415B-9ABC-D9C68CDCB01F}.Debug|Win32.ActiveCfg = Debug|Win32 + {94524082-F925-415B-9ABC-D9C68CDCB01F}.Debug|Win32.Build.0 = Debug|Win32 + {94524082-F925-415B-9ABC-D9C68CDCB01F}.Release|Win32.ActiveCfg = Release|Win32 + {94524082-F925-415B-9ABC-D9C68CDCB01F}.Release|Win32.Build.0 = Release|Win32 + {E3B62A51-0886-47B3-95CA-906AC56CC1A8}.Debug|Win32.ActiveCfg = Debug|Win32 + {E3B62A51-0886-47B3-95CA-906AC56CC1A8}.Debug|Win32.Build.0 = Debug|Win32 + {E3B62A51-0886-47B3-95CA-906AC56CC1A8}.Release|Win32.ActiveCfg = Release|Win32 + {E3B62A51-0886-47B3-95CA-906AC56CC1A8}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE