void test1() { gpath_init(); gpath_setDrivePath(0, "/resource/"); gpath_setDrivePath(1, "/documents/"); gpath_setDrivePath(2, "/temporary/"); gpath_addDrivePrefix(0, "|R|"); gpath_addDrivePrefix(1, "|D|"); gpath_addDrivePrefix(2, "|T|"); gpath_setDefaultDrive(0); printf("%d\n", gpath_getPathDrive("/hebe.png")); printf("%d\n", gpath_getPathDrive("hebe.png")); printf("%d\n", gpath_getPathDrive("|R|hebe.png")); printf("%d\n", gpath_getPathDrive("|D|hebe.png")); printf("%d\n", gpath_getPathDrive("|T|hebe.png")); printf("%s\n", gpath_transform("/hebe.png")); printf("%s\n", gpath_transform("hebe.png")); printf("%s\n", gpath_transform("|R|hebe.png")); printf("%s\n", gpath_transform("|D|hebe.png")); printf("%s\n", gpath_transform("|T|hebe.png")); gpath_cleanup(); }
void test2() { gpath_init(); // gpath_setDrivePath(0, "."); gpath_setDriveFlags(0, GPATH_RW | GPATH_REAL); gpath_setDefaultDrive(0); gpath_setAbsolutePathFlags(GPATH_RW | GPATH_REAL); gpath_addDrivePrefix(0, "|R|"); printf("%d\n", gpath_getPathDrive("/hebe.png")); printf("%d\n", gpath_getPathDrive("hebe.png")); printf("%d\n", gpath_getPathDrive("|R|hebe.png")); printf("%s\n", gpath_transform("/hebe.png")); printf("%s\n", gpath_transform("hebe.png")); printf("%s\n", gpath_transform("./hebe.png")); printf("%s\n", gpath_transform("|R|./hebe.png")); gpath_cleanup(); }
static int s_open(const char *pathname, int flags) { int drive = gpath_getPathDrive(pathname); if (drive != GPATH_ABSOLUTE) { if ((gpath_getDriveFlags(drive) & GPATH_RO) == GPATH_RO && (flags & O_ACCMODE) != O_RDONLY) { errno = EACCES; return -1; } } int fd = ::open(gpath_transform(pathname), flags, 0755); if (fd < 0) return fd; FileInfo fi = {0}; if (drive == 0) { const char *ext = strrchr(pathname, '.'); if (ext) { ext++; if (!strcasecmp(ext, "lua")) { fi.encrypt = 1; } else if (!strcasecmp(ext, "jpeg") || !strcasecmp(ext, "jpg") || !strcasecmp(ext, "png") || !strcasecmp(ext, "wav")) { fi.encrypt = 2; } } } s_fileInfos[fd] = fi; return fd; }
static int s_open(const char *pathname, int flags) { int drive = gpath_getPathDrive(pathname); if (drive != GPATH_ABSOLUTE) { if ((gpath_getDriveFlags(drive) & GPATH_RO) == GPATH_RO && (flags & O_ACCMODE) != O_RDONLY) { errno = EACCES; return -1; } } int fd = -1; FileInfo fi = {-1, (size_t)-1, (size_t)-1, 0}; if ( drive != 0 || s_zipFile.empty() ) fd=::open(gpath_transform(pathname), flags, 0755); else { pathname = gpath_normalizeArchivePath(pathname); glog_d("Looking for %s in archive %s",pathname,s_zipFile.c_str()); std::map<std::string, FileInfo>::iterator iter; iter = s_files.find(pathname); if (iter == s_files.end()) { glog_d("%s Not found in archive",pathname); errno = ENOENT; return -1; } fd = ::open(s_zipFile.c_str(), flags, 0755); glog_d("%s: fd is %d",pathname,fd); ::lseek(fd, iter->second.startOffset, SEEK_SET); fi = iter->second; } if (fd < 0) return fd; if (drive == 0) { const char *ext = strrchr(pathname, '.'); if (ext) { ext++; if (!strcasecmp(ext, "lua")) { fi.encrypt = 1; } else if (!strcasecmp(ext, "jpeg") || !strcasecmp(ext, "jpg") || !strcasecmp(ext, "png") || !strcasecmp(ext, "wav")) { fi.encrypt = 2; } } } s_fileInfos[fd] = fi; return fd; }
int AudioBinder::Sound_create(lua_State *L) { StackChecker checker(L, "AudioBinder::Sound_create", 1); Binder binder(L); const char *fileName = luaL_checkstring(L, 1); std::vector<char> sig; int flags = gpath_getDriveFlags(gpath_getPathDrive(fileName)); if (flags & GPATH_RO) { append(sig, fileName, strlen(fileName) + 1); } else { if (flags & GPATH_REAL) { append(sig, fileName, strlen(fileName) + 1); struct stat s; stat(gpath_transform(fileName), &s); append(sig, &s.st_mtime, sizeof(s.st_mtime)); } } GGSound *sound = NULL; luaL_rawgetptr(L, LUA_REGISTRYINDEX, &keySound); if (sig.empty()) { lua_pushnil(L); } else { lua_pushlstring(L, &sig[0], sig.size()); lua_rawget(L, -2); } if (!lua_isnil(L, -1)) { sound = static_cast<GGSound*>(lua_touserdata(L, -1)); sound->ref(); } else { gaudio_Error error; sound = new GGSound(L, fileName, &error, sig); switch (error) { case GAUDIO_NO_ERROR: break; case GAUDIO_CANNOT_OPEN_FILE: sound->unref(); luaL_error(L, "%s: No such file or directory.", fileName); break; case GAUDIO_UNRECOGNIZED_FORMAT: sound->unref(); luaL_error(L, "%s: Sound format is not recognized.", fileName); break; case GAUDIO_ERROR_WHILE_READING: sound->unref(); luaL_error(L, "%s: Error while reading.", fileName); break; case GAUDIO_UNSUPPORTED_FORMAT: sound->unref(); luaL_error(L, "%s: Sound format is not supported.", fileName); break; case GAUDIO_INTERNAL_ERROR: sound->unref(); luaL_error(L, "%s: Sound internal error.", fileName); break; } } lua_pop(L, 2); binder.pushInstance("Sound", sound); return 1; }
TextureData* TextureManager::createTextureFromFile(const char* filename, const TextureParameters& parameters) { int flags = gpath_getDriveFlags(gpath_getPathDrive(filename)); std::vector<char> sig; if (flags & GPATH_RO) { append(sig, filename, strlen(filename) + 1); append(sig, parameters); } else { if (flags & GPATH_REAL) { struct stat s; stat(gpath_transform(filename), &s); append(sig, filename, strlen(filename) + 1); append(sig, parameters); append(sig, &s.st_mtime, sizeof(s.st_mtime)); } } int wrap = 0; switch (parameters.wrap) { case eClamp: wrap = GTEXTURE_CLAMP; break; case eRepeat: wrap = GTEXTURE_REPEAT; break; } int filter = 0; switch (parameters.filter) { case eNearest: filter = GTEXTURE_NEAREST; break; case eLinear: filter = GTEXTURE_LINEAR; break; } int format = 0; int type = 0; switch (parameters.format) { case eRGBA8888: format = GTEXTURE_RGBA; type = GTEXTURE_UNSIGNED_BYTE; break; case eRGB888: format = GTEXTURE_RGB; type = GTEXTURE_UNSIGNED_BYTE; break; case eRGB565: format = GTEXTURE_RGB; type = GTEXTURE_UNSIGNED_SHORT_5_6_5; break; case eRGBA4444: format = GTEXTURE_RGBA; type = GTEXTURE_UNSIGNED_SHORT_4_4_4_4; break; case eRGBA5551: format = GTEXTURE_RGBA; type = GTEXTURE_UNSIGNED_SHORT_5_5_5_1; break; } if (!sig.empty()) { g_id gid = gtexture_reuse(format, type, wrap, filter, &sig[0], sig.size()); if (gid != 0) { TextureData* internal = (TextureData*)gtexture_getUserData(gid); TextureData* data = new TextureData(*internal); data->gid = gid; return data; } } Dib dib(application_, filename, true, true, parameters.maketransparent, parameters.transparentcolor); if (parameters.grayscale) dib.convertGrayscale(); #if PREMULTIPLIED_ALPHA dib.premultiplyAlpha(); #endif g_id gid = 0; switch (parameters.format) { case eRGBA8888: gid = gtexture_create(dib.width(), dib.height(), format, type, wrap, filter, dib.data(), &sig[0], sig.size()); break; case eRGB888: { std::vector<unsigned char> data = dib.to888(); gid = gtexture_create(dib.width(), dib.height(), format, type, wrap, filter, &data[0], &sig[0], sig.size()); break; } case eRGB565: { std::vector<unsigned short> data = dib.to565(); gid = gtexture_create(dib.width(), dib.height(), format, type, wrap, filter, &data[0], &sig[0], sig.size()); break; } case eRGBA4444: { std::vector<unsigned short> data = dib.to4444(); gid = gtexture_create(dib.width(), dib.height(), format, type, wrap, filter, &data[0], &sig[0], sig.size()); break; } case eRGBA5551: { std::vector<unsigned short> data = dib.to5551(); gid = gtexture_create(dib.width(), dib.height(), format, type, wrap, filter, &data[0], &sig[0], sig.size()); break; } } TextureData* data = new TextureData; data->gid = gid; data->parameters = parameters; data->width = dib.originalWidth(); data->height = dib.originalHeight(); data->exwidth = dib.width(); data->exheight = dib.height(); data->baseWidth = dib.baseOriginalWidth(); data->baseHeight = dib.baseOriginalHeight(); TextureData* internal = new TextureData(*data); gtexture_setUserData(gid, internal); return data; }
static int s_open(const char *pathname, int flags) { int drive = gpath_getPathDrive(pathname); if (s_playerModeEnabled == true || drive != 0) { int fd = ::open(gpath_transform(pathname), flags, 0755); if (fd < 0) return fd; FileInfo fi = {-1, (size_t)-1, (size_t)-1, 0}; s_fileInfos[fd] = fi; return fd; } std::string normpathname = pystring::os::path::normpath(gpath_transform(pathname)); pathname = normpathname.c_str(); std::map<std::string, FileInfo>::iterator iter; iter = s_files.find(pathname); if (iter == s_files.end()) { errno = ENOENT; return -1; } if ((flags & O_ACCMODE) != O_RDONLY) { errno = EACCES; return -1; } int fd = ::open(s_zipFiles[iter->second.zipFile].c_str(), flags, 0755); if (fd < 0) return fd; FileInfo fi = iter->second; if (drive == 0) { const char *ext = strrchr(pathname, '.'); if (ext) { ext++; if (!strcasecmp(ext, "lua")) { fi.encrypt = 1; } else if (!strcasecmp(ext, "jpeg") || !strcasecmp(ext, "jpg") || !strcasecmp(ext, "png") || !strcasecmp(ext, "wav")) { fi.encrypt = 2; } } } ::lseek(fd, iter->second.startOffset, SEEK_SET); s_fileInfos[fd] = fi; return fd; }