#ifndef APPPLATFORM_GLFW_H__ #define APPPLATFORM_GLFW_H__ #include "AppPlatform.h" #include "platform/log.h" #include "platform/HttpClient.h" #include "platform/PngLoader.h" #include "client/renderer/gles.h" #include "world/level/storage/FolderMethods.h" #include #include #include #include #include #include #include "util/StringUtils.h" #ifdef _WIN32 #include #include #endif static void png_funcReadFile(png_structp pngPtr, png_bytep data, png_size_t length) { ((std::istream*)png_get_io_ptr(pngPtr))->read((char*)data, length); } class AppPlatform_glfw: public AppPlatform { public: AppPlatform_glfw() { } BinaryBlob readAssetFile(const std::string& filename) override { FILE* fp = fopen(("data/" + filename).c_str(), "r"); if (!fp) return BinaryBlob(); int size = getRemainingFileSize(fp); BinaryBlob blob; blob.size = size; blob.data = new unsigned char[size]; fread(blob.data, 1, size, fp); fclose(fp); return blob; } void saveScreenshot(const std::string& filename, int glWidth, int glHeight) override { //@todo } __inline unsigned int rgbToBgr(unsigned int p) { return (p & 0xff00ff00) | ((p >> 16) & 0xff) | ((p << 16) & 0xff0000); } TextureData loadTexture(const std::string& filename_, bool textureFolder) override { // Support fetching PNG textures via HTTP/HTTPS (for skins, etc) if (Util::startsWith(filename_, "http://") || Util::startsWith(filename_, "https://")) { std::vector body; if (HttpClient::download(filename_, body) && !body.empty()) { return loadTextureFromMemory(body.data(), body.size()); } return TextureData(); } TextureData out; std::string filename = textureFolder? "data/images/" + filename_ : filename_; std::ifstream source(filename.c_str(), std::ios::binary); if (source) { png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!pngPtr) return out; png_infop infoPtr = png_create_info_struct(pngPtr); if (!infoPtr) { png_destroy_read_struct(&pngPtr, NULL, NULL); return out; } // Hack to get around the broken libpng for windows png_set_read_fn(pngPtr,(void*)&source, png_funcReadFile); png_read_info(pngPtr, infoPtr); // Set up the texdata properties out.w = png_get_image_width(pngPtr, infoPtr); out.h = png_get_image_height(pngPtr, infoPtr); png_bytep* rowPtrs = new png_bytep[out.h]; out.data = new unsigned char[4 * out.w * out.h]; out.memoryHandledExternally = false; int rowStrideBytes = 4 * out.w; for (int i = 0; i < out.h; i++) { rowPtrs[i] = (png_bytep)&out.data[i*rowStrideBytes]; } png_read_image(pngPtr, rowPtrs); // Teardown and return png_destroy_read_struct(&pngPtr, &infoPtr,(png_infopp)0); delete[] (png_bytep)rowPtrs; source.close(); return out; } else { LOGI("Couldn't find file: %s\n", filename.c_str()); return out; } } TextureData loadTextureFromMemory(const unsigned char* data, size_t size) override { return loadPngFromMemory(data, size); } virtual std::string getDateString(int s) override { time_t tm = s; char mbstr[100]; std::strftime(mbstr, sizeof(mbstr), "%F %T", std::localtime(&tm)); return std::string(mbstr); } virtual int getScreenWidth() override { return 854; }; virtual int getScreenHeight() override { return 480; }; virtual float getPixelsPerMillimeter() override; virtual bool supportsTouchscreen() override { return true; } virtual void openURL(const std::string& url) override { #ifdef _WIN32 ShellExecuteA(NULL, "open", url.c_str(), NULL, NULL, SW_SHOWNORMAL); #elif __linux__ std::string command = "xdg-open " + url; system(command.c_str()); #endif } GLFWwindow* window; private: }; #endif /*APPPLATFORM_GLFW_H__*/