diff --git a/blooblib.sln b/blooblib.sln index 7e754c1..2f9ac17 100644 --- a/blooblib.sln +++ b/blooblib.sln @@ -5,6 +5,11 @@ VisualStudioVersion = 17.8.34330.188 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blooblib", "blooblib\blooblib.vcxproj", "{CF7A4698-9135-4200-9E68-B8D4F53275D7}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcxproj", "{243F1CBC-1E8B-4A9D-836A-1B616B805558}" + ProjectSection(ProjectDependencies) = postProject + {CF7A4698-9135-4200-9E68-B8D4F53275D7} = {CF7A4698-9135-4200-9E68-B8D4F53275D7} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -21,6 +26,14 @@ Global {CF7A4698-9135-4200-9E68-B8D4F53275D7}.Release|x64.Build.0 = Release|x64 {CF7A4698-9135-4200-9E68-B8D4F53275D7}.Release|x86.ActiveCfg = Release|Win32 {CF7A4698-9135-4200-9E68-B8D4F53275D7}.Release|x86.Build.0 = Release|Win32 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Debug|x64.ActiveCfg = Debug|x64 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Debug|x64.Build.0 = Debug|x64 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Debug|x86.ActiveCfg = Debug|Win32 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Debug|x86.Build.0 = Debug|Win32 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Release|x64.ActiveCfg = Release|x64 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Release|x64.Build.0 = Release|x64 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Release|x86.ActiveCfg = Release|Win32 + {243F1CBC-1E8B-4A9D-836A-1B616B805558}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/blooblib/blooblib.vcxproj b/blooblib/blooblib.vcxproj index ff8880d..01eea5e 100644 --- a/blooblib/blooblib.vcxproj +++ b/blooblib/blooblib.vcxproj @@ -19,13 +19,16 @@ + + + - + @@ -34,6 +37,9 @@ + + + 17.0 Win32Proj @@ -56,13 +62,13 @@ Unicode - Application + StaticLibrary true v143 Unicode - Application + StaticLibrary false v143 true diff --git a/blooblib/blooblib.vcxproj.filters b/blooblib/blooblib.vcxproj.filters index c14ba71..6fea1df 100644 --- a/blooblib/blooblib.vcxproj.filters +++ b/blooblib/blooblib.vcxproj.filters @@ -15,9 +15,6 @@ - - Source Files - Source Files @@ -27,6 +24,15 @@ Source Files + + Source Files + + + Source Files + + + Source Files + @@ -53,5 +59,13 @@ Header Files + + Header Files + + + + + Source Files + \ No newline at end of file diff --git a/blooblib/fontconvert.bat b/blooblib/fontconvert.bat new file mode 100644 index 0000000..1a7260f --- /dev/null +++ b/blooblib/fontconvert.bat @@ -0,0 +1 @@ +magick convert +antialias -font @%1.ttf -pointsize 16 caption:" !""#$%%%%&,()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_'abcdefghijklmnopqrstuvwxyz{|}~" -flatten %1.png \ No newline at end of file diff --git a/blooblib/include/bloob.h b/blooblib/include/bloob.h index 00b6272..bf2be6a 100644 --- a/blooblib/include/bloob.h +++ b/blooblib/include/bloob.h @@ -1,8 +1,11 @@ #pragma once +#include "font.h" #include "game.h" #include "image.h" +#include "rect.h" #include "settings.h" +#include "tileset.h" #include "vec2.h" const double PI = 3.141592653589793238462643383279502884197169399375105820974944592307816406286; diff --git a/blooblib/include/font.h b/blooblib/include/font.h new file mode 100644 index 0000000..899a80e --- /dev/null +++ b/blooblib/include/font.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +struct image; + +struct font { + font(image const& image, bool proportional); + font(std::string const& path, bool proportional); + + image const& operator[](char ch) const; +private: + std::map _glyphs; +}; diff --git a/blooblib/include/image.h b/blooblib/include/image.h index 8003d2f..de7ac37 100644 --- a/blooblib/include/image.h +++ b/blooblib/include/image.h @@ -2,6 +2,7 @@ #include #include #include +#include "font.h" #include "rect.h" #include "vec2.h" @@ -11,6 +12,7 @@ struct image { image(vec2i size); image(vec2i size, color* data); image(std::string path); + image(image const& other); ~image(); //static image_from_pointer() @@ -18,13 +20,18 @@ struct image { recti const& bounds() const; color* raw_pointer() const; + color get(vec2i pos) const; void clear(color color); + void draw(image const& image, vec2i pos); void draw(image const& image, vec2i pos, recti src_rect); + void draw(image const& image, vec2i pos, color color); + void draw(image const& image, vec2i pos, color color, recti src_rect); void draw_upscaled(image const& image); - + void draw(std::string const& str, vec2i pos, font const& font, color color); + void draw(std::string const& str, vec2i pos, font const& font, color color1, color color2); private: bool _borrowed_pointer; //to know if to free or not color* _data; //not a vector so can wrap sdl surfaces diff --git a/blooblib/include/tileset.h b/blooblib/include/tileset.h index 50cf109..c0a73e4 100644 --- a/blooblib/include/tileset.h +++ b/blooblib/include/tileset.h @@ -6,7 +6,7 @@ #include "vec2.h" struct tileset { - tileset(image const&, vec2i tile_size); + tileset(image const& image, vec2i tile_size); tileset(std::string path, vec2i tile_size); image& operator[](int index); diff --git a/blooblib/src/draw/draw_image.cpp b/blooblib/src/draw/draw_image.cpp new file mode 100644 index 0000000..6baba02 --- /dev/null +++ b/blooblib/src/draw/draw_image.cpp @@ -0,0 +1,84 @@ +#include "image.h" + +void image::draw(image const& image, vec2i pos) { + draw(image, pos, image.bounds()); +} + +void image::draw(image const& image, vec2i pos, recti src_rect) { + src_rect = recti::intersection(src_rect, image.bounds()); + auto crop = recti::intersection(bounds(), recti(pos, image.bounds().size)); + crop = recti::intersection(crop, recti(crop.pos, src_rect.size)); + auto src_off = crop.pos - pos + src_rect.pos; + auto start = crop.pos; + auto end = crop.pos2(); + for(int y = start.y; y <= end.y; ++y) { + for(int x = start.x; x <= end.x; ++x) { + auto color = image._data[ + x - start.x + src_off.x + (y - start.y + src_off.y) * image._bounds.size.x + ]; + if(color & 0xff000000) + _data[x + y * _bounds.size.x] = color; + } + } +} + +void image::draw(image const& image, vec2i pos, color color) { + draw(image, pos, color, image.bounds()); +} + +void image::draw(image const& image, vec2i pos, color color, recti src_rect) { + color |= 0xff000000; + src_rect = recti::intersection(src_rect, image.bounds()); + auto crop = recti::intersection(bounds(), recti(pos, image.bounds().size)); + crop = recti::intersection(crop, recti(crop.pos, src_rect.size)); + auto src_off = crop.pos - pos + src_rect.pos; + auto start = crop.pos; + auto end = crop.pos2(); + for(int y = start.y; y <= end.y; ++y) { + for(int x = start.x; x <= end.x; ++x) { + auto color_src = image._data[ + x - start.x + src_off.x + (y - start.y + src_off.y) * image._bounds.size.x + ]; + if(color_src & 0xff000000) + _data[x + y * _bounds.size.x] = color; + } + } +} + + +void image::draw_upscaled(image const& image) { + auto ratio = _bounds.size / image._bounds.size; + auto scale = std::min(ratio.x, ratio.y); + switch(scale) { + case 3: +#pragma omp parallel for + for(int y = 0; y < image._bounds.size.y; ++y) { + for(int x = 0; x < image._bounds.size.x; ++x) { + auto color = image._data[x + y * image._bounds.size.x]; + auto color2 = (color & 0xfefefe) >> 1; + _data[x * 3 + 0 + (y * 3 + 0) * _bounds.size.x] = color; + _data[x * 3 + 1 + (y * 3 + 0) * _bounds.size.x] = color; + _data[x * 3 + 2 + (y * 3 + 0) * _bounds.size.x] = color2; + _data[x * 3 + 0 + (y * 3 + 1) * _bounds.size.x] = color; + _data[x * 3 + 1 + (y * 3 + 1) * _bounds.size.x] = color; + _data[x * 3 + 2 + (y * 3 + 1) * _bounds.size.x] = color2; + _data[x * 3 + 0 + (y * 3 + 2) * _bounds.size.x] = color2; + _data[x * 3 + 1 + (y * 3 + 2) * _bounds.size.x] = color2; + _data[x * 3 + 2 + (y * 3 + 2) * _bounds.size.x] = color2; + } + } + break; + default: +#pragma omp parallel for + for(int y = 0; y < image._bounds.size.y; ++y) { + for(int x = 0; x < image._bounds.size.x; ++x) { + auto color = image._data[x + y * image._bounds.size.x]; + for(int sy = 0; sy < scale; ++sy) { + for(int sx = 0; sx < scale; ++sx) { + _data[(x * scale + sx) + (y * scale + sy) * _bounds.size.x] = color; + } + } + } + } + } +} diff --git a/blooblib/src/draw/draw_text.cpp b/blooblib/src/draw/draw_text.cpp new file mode 100644 index 0000000..aacdf1c --- /dev/null +++ b/blooblib/src/draw/draw_text.cpp @@ -0,0 +1,31 @@ +#include "image.h" + +void image::draw(std::string const& str, vec2i pos, font const& font, color color) { + for(auto ch = str.begin(); ch != str.end(); ++ch) { + draw(font[*ch], pos, color); + pos.x += font[*ch].size().x; + } +} + +const std::vector shadow_offsets{ + vec2i(-1, 0), + vec2i( 1, 0), + vec2i( 0, -1), + vec2i( 0, 1), + + vec2i(-1, -1), + vec2i(-1, 1), + vec2i( 1, -1), + vec2i( 1, 1), + + vec2i( 0, 2), + vec2i(-1, 2), + vec2i( 1, 2) +}; + +void image::draw(std::string const& str, vec2i pos, font const& font, color color1, color color2) { + for(auto so = shadow_offsets.begin(); so != shadow_offsets.end(); ++so) + draw(str, pos + *so, font, color2); + draw(str, pos, font, color1); +} + diff --git a/blooblib/src/font.cpp b/blooblib/src/font.cpp new file mode 100644 index 0000000..7e6599f --- /dev/null +++ b/blooblib/src/font.cpp @@ -0,0 +1,38 @@ +#include "font.h" + +#include "image.h" + +font::font(image const& image, bool proportional) { + if(!proportional) + throw std::runtime_error("not yet implemented"); + + auto x = 0; + std::vector slices; + for(int i = 0; i < image.size().x; ++i) { + if(image.get(vec2i(i, 0)) & 0xff000000) + slices.push_back(i); + } + int count = slices.size(); + slices.push_back(image.size().x); + auto height = image.size().y; + + auto charset = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~"; + for(int i = 0; i < count; ++i) { + auto r = recti(vec2i(slices[i], 1), vec2i(slices[i + 1] - slices[i], height - 1)); + //auto img = ::image(r.size); + auto ch = charset[i]; + _glyphs.emplace(ch, r.size); + _glyphs.at(ch).clear(0); + _glyphs.at(ch).draw(image, vec2i::zero, r); + } +} + +font::font(std::string const& path, bool proportional) : + font(image(path), proportional) { } + +image const& font::operator[](char ch) const { + if(_glyphs.contains(ch)) + return _glyphs.at(ch); + else + return _glyphs.at(' '); +} diff --git a/blooblib/src/game.cpp b/blooblib/src/game.cpp index 5c9b685..c75a1c6 100644 --- a/blooblib/src/game.cpp +++ b/blooblib/src/game.cpp @@ -56,6 +56,10 @@ void game::run() { auto last_second = std::chrono::steady_clock::now(); auto frames_since_last_second = 0; + std::chrono::duration second(1000000000ll); + auto frame_duration = second / settings.target_fps; + auto last_frame = last_second; + auto running = true; while(running) { MSG msg; @@ -76,23 +80,37 @@ void game::run() { last_second += std::chrono::seconds(1); } - update(); - render(screen); - window_image.draw_upscaled(screen); + if(now - last_frame >= frame_duration) { + update(); + render(screen); + window_image.draw_upscaled(screen); - BITMAPINFOHEADER bi{ sizeof(bi) }; - bi.biWidth = window_image.size().x; - bi.biHeight = -window_image.size().y; - bi.biPlanes = 1; - bi.biBitCount = 32; - bi.biCompression = BI_RGB; - - auto dc = GetDC(window); - SetDIBitsToDevice(dc, 0, 0, window_image.size().x, window_image.size().y, 0, 0, 0, window_image.size().y, window_image.raw_pointer(), - (BITMAPINFO*)&bi, DIB_RGB_COLORS); - ReleaseDC(window, dc); - ++frames_since_last_second; + BITMAPINFOHEADER bi{ sizeof(bi) }; + bi.biWidth = window_image.size().x; + bi.biHeight = -window_image.size().y; + bi.biPlanes = 1; + bi.biBitCount = 32; + bi.biCompression = BI_RGB; + auto dc = GetDC(window); + SetDIBitsToDevice( + dc, + 0, + 0, + window_image.size().x, + window_image.size().y, + 0, + 0, + 0, + window_image.size().y, + window_image.raw_pointer(), + (BITMAPINFO*)&bi, + DIB_RGB_COLORS + ); + ReleaseDC(window, dc); + ++frames_since_last_second; + last_frame += frame_duration; + } } diff --git a/blooblib/src/image.cpp b/blooblib/src/image.cpp index 9ae0bc2..87ec9d9 100644 --- a/blooblib/src/image.cpp +++ b/blooblib/src/image.cpp @@ -1,9 +1,4 @@ #include "image.h" -#include -#include -//#define WIN32_LEAN_AND_MEAN -#define NOMINMAX -#include #define STB_IMAGE_IMPLEMENTATION #define STBI_ONLY_PNG #include "stb_image.h" @@ -12,27 +7,40 @@ image::image(vec2i size) : _borrowed_pointer(false), _data(new color[size.size()]), _bounds(vec2i::zero, size) -{ -} +{} image::image(vec2i size, color* data) : _borrowed_pointer(true), _data(data), - _bounds(vec2i::zero, size) { -} + _bounds(vec2i::zero, size) +{} image::image(std::string path) : _borrowed_pointer(false) { int w, h, n; - _data = reinterpret_cast(stbi_load(path.c_str(), &w, &h, &n, 0)); + auto data = reinterpret_cast(stbi_load(path.c_str(), &w, &h, &n, 0)); + _data = new color[w * h]; for(int i = 0; i < w*h; ++i) { - _data[i] = _data[i] & 0xff000000 | (_data[i] & 0x00ff0000) >> 16 | (_data[i] & 0x0000ff00) | (_data[i] & 0x000000ff) << 16; + _data[i] = data[i]; + _data[i] = (data[i] & 0xff000000u) | + ((data[i] & 0x00ff0000u) >> 16) | + (data[i] & 0x0000ff00u) | + ((data[i] & 0x000000ffu) << 16); } + stbi_image_free(data); _bounds = recti(vec2i::zero, vec2i(w, h)); } +image::image(image const& other) : + _borrowed_pointer(false), + _data(new color[other.size().size()]), + _bounds(other.bounds()) +{ + std::memcpy(_data, other._data, size().size() * 4); +} + image::~image() { - if(!_borrowed_pointer) - delete _data; + if(!_borrowed_pointer && _data) + delete[] _data; } vec2i const& image::size() const { @@ -47,62 +55,13 @@ color* image::raw_pointer() const { return _data; } +color image::get(vec2i pos) const { + return _data[pos.x + pos.y * _bounds.size.x]; +} + void image::clear(color color) { - std::fill(_data, _data + size().size() - 1, color); + std::fill(_data, _data + size().size(), color); } -void image::draw(image const& image, vec2i pos) { - auto crop = recti::intersection(bounds(), recti(pos, image.bounds().size)); - auto src_off = crop.pos - pos; - auto start = crop.pos; - auto end = crop.pos2(); - for(int y = start.y; y <= end.y; ++y) { - for(int x = start.x; x <= end.x; ++x) { - auto color = image._data[x - start.x + src_off.x + (y - start.y + src_off.y) * image._bounds.size.x]; - if(color & 0xff000000) - _data[x + y * _bounds.size.x] = color; - } - } -} - -void image::draw(image const& image, vec2i pos, recti src_rect) { -} - -void image::draw_upscaled(image const& image) { - auto ratio = _bounds.size / image._bounds.size; - auto scale = std::min(ratio.x, ratio.y); - switch(scale) { - case 3: -#pragma omp parallel for - for(int y = 0; y < image._bounds.size.y; ++y) { - for(int x = 0; x < image._bounds.size.x; ++x) { - auto color = image._data[x + y * image._bounds.size.x]; - auto color2 = (color & 0xfefefe) >> 1; - _data[x * 3 + 0 + (y * 3 + 0) * _bounds.size.x] = color; - _data[x * 3 + 1 + (y * 3 + 0) * _bounds.size.x] = color; - _data[x * 3 + 2 + (y * 3 + 0) * _bounds.size.x] = color2; - _data[x * 3 + 0 + (y * 3 + 1) * _bounds.size.x] = color; - _data[x * 3 + 1 + (y * 3 + 1) * _bounds.size.x] = color; - _data[x * 3 + 2 + (y * 3 + 1) * _bounds.size.x] = color2; - _data[x * 3 + 0 + (y * 3 + 2) * _bounds.size.x] = color2; - _data[x * 3 + 1 + (y * 3 + 2) * _bounds.size.x] = color2; - _data[x * 3 + 2 + (y * 3 + 2) * _bounds.size.x] = color2; - } - } - break; - default: -#pragma omp parallel for - for(int y = 0; y < image._bounds.size.y; ++y) { - for(int x = 0; x < image._bounds.size.x; ++x) { - auto color = image._data[x + y * image._bounds.size.x]; - for(int sy = 0; sy < scale; ++sy) { - for(int sx = 0; sx < scale; ++sx) { - _data[(x * scale + sx) + (y * scale + sy) * _bounds.size.x] = color; - } - } - } - } - } -} diff --git a/blooblib/src/main.cpp b/blooblib/src/main.cpp deleted file mode 100644 index daa1242..0000000 --- a/blooblib/src/main.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include "bloob.h" - -struct my_game : game { - my_game(); - void init(settings& settings); - void update(); - void render(image& target); - - image img; - double time; -}; - -my_game::my_game() : - img("test.png"), - time(0.0) -{} - -void my_game::init(settings& settings) { -} - -void my_game::update() { - time += 1.0 / 60.0; -} - -void my_game::render(image& target) { - target.clear(0xffdddd); - auto pos = vec2i(std::sin(time*TAU/100), std::cos(time*TAU/100)); - std::cout << pos << std::endl; - target.draw(img, vec2i(320, 180) + pos); -} - -int main(int argc, char* argv[]) { - my_game game; - game.run(); - return 0; -} diff --git a/blooblib/src/tileset.cpp b/blooblib/src/tileset.cpp index b8962b9..d7d34cb 100644 --- a/blooblib/src/tileset.cpp +++ b/blooblib/src/tileset.cpp @@ -1,6 +1,15 @@ #include "tileset.h" -tileset::tileset(image const&, vec2i tile_size) { +tileset::tileset(image const& image, vec2i tile_size) { + auto tile_count = image.size() / tile_size; + for(int y = 0; y < tile_count.y; ++y) { + for(int x = 0; x < tile_count.x; ++x) { + auto tile = ::image(tile_size); + tile.clear(0); + tile.draw(image, vec2i::zero, recti(tile_size * vec2i(x, y), tile_size)); + _tiles.push_back(tile); + } + } } tileset::tileset(std::string path, vec2i tile_size) : diff --git a/blooblib/test.bmp b/blooblib/test.bmp deleted file mode 100644 index af467b0..0000000 Binary files a/blooblib/test.bmp and /dev/null differ diff --git a/blooblib/test2.bmp b/blooblib/test2.bmp deleted file mode 100644 index 84329e0..0000000 Binary files a/blooblib/test2.bmp and /dev/null differ diff --git a/test/font-thin.png b/test/font-thin.png new file mode 100644 index 0000000..1b33c2b Binary files /dev/null and b/test/font-thin.png differ diff --git a/test/font.png b/test/font.png new file mode 100644 index 0000000..01b92d8 Binary files /dev/null and b/test/font.png differ diff --git a/test/habbo.png b/test/habbo.png new file mode 100644 index 0000000..ee3d8f3 Binary files /dev/null and b/test/habbo.png differ diff --git a/test/test.cpp b/test/test.cpp new file mode 100644 index 0000000..584374e --- /dev/null +++ b/test/test.cpp @@ -0,0 +1,44 @@ +#include +#include "bloob.h" + +struct my_game : game { + my_game(); + void init(settings& settings); + void update(); + void render(image& target); + + image img; + tileset tileset; + font font; + double time; +}; + +my_game::my_game() : + img("test.png"), + tileset("font.png", vec2i(8, 14)), + font("habbo.png", true), + time(0.0) { +} + +void my_game::init(settings& settings) { + settings.target_fps = 60; +} + +void my_game::update() { + time += 1.0 / 60.0; +} + +void my_game::render(image& target) { + target.clear(0xffdddd); + auto pos = vec2i(std::sin(time * TAU / 4) * 100, std::cos(time * TAU / 4) * 100); + //target.draw(img, vec2i(320, 180) + pos, recti(vec2i(8, 14), vec2i(8 * 4, 14 * 4))); + //target.draw(img, vec2i(320, 180) + pos); + //target.draw(tileset[0xda], vec2i(320, 180) + pos, 0xff00ff); + target.draw("hello world!", vec2i(320, 180) + pos, font, 0xffffff, 0); +} + +int main(int argc, char* argv[]) { + my_game game; + game.run(); + return 0; +} diff --git a/blooblib/test.png b/test/test.png similarity index 100% rename from blooblib/test.png rename to test/test.png diff --git a/test/test.vcxproj b/test/test.vcxproj new file mode 100644 index 0000000..1408c12 --- /dev/null +++ b/test/test.vcxproj @@ -0,0 +1,144 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {243f1cbc-1e8b-4a9d-836a-1b616b805558} + test + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)blooblib\include + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)blooblib\include + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)blooblib\include + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)blooblib\include + + + Console + true + true + true + + + + + + + + {cf7a4698-9135-4200-9e68-b8d4f53275d7} + + + + + + \ No newline at end of file diff --git a/test/test.vcxproj.filters b/test/test.vcxproj.filters new file mode 100644 index 0000000..eebbd43 --- /dev/null +++ b/test/test.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;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 + + + \ No newline at end of file diff --git a/test/test.vcxproj.user b/test/test.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/test/test.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file