//! return the size of the stream in bytes virtual unsigned long size() { if (!fa) return 0; return fa->get_len(); };
void AudioStreamSpeex::set_file(const String& p_file) { if (this->file == p_file) return; this->file=p_file; if (p_file == "") { data.resize(0); return; }; Error err; FileAccess* file = FileAccess::open(p_file, FileAccess::READ,&err); if (err != OK) { data.resize(0); }; ERR_FAIL_COND(err != OK); this->file = p_file; data.resize(file->get_len()); int read = file->get_buffer(&data[0], data.size()); memdelete(file); }
Error ResourceImporterOGGVorbis::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) { bool loop = p_options["loop"]; FileAccess *f = FileAccess::open(p_source_file, FileAccess::READ); if (!f) { ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); } size_t len = f->get_len(); PoolVector<uint8_t> data; data.resize(len); PoolVector<uint8_t>::Write w = data.write(); f->get_buffer(w.ptr(), len); memdelete(f); Ref<AudioStreamOGGVorbis> ogg_stream; ogg_stream.instance(); ogg_stream->set_data(data); ogg_stream->set_loop(loop); return ResourceSaver::save(p_save_path + ".asogg", ogg_stream); }
Error ResourceImporterImage::import(const String &p_source_file, const String &p_save_path, const Map<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files) { FileAccess *f = FileAccess::open(p_source_file, FileAccess::READ); if (!f) { ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); } size_t len = f->get_len(); Vector<uint8_t> data; data.resize(len); f->get_buffer(data.ptrw(), len); memdelete(f); f = FileAccess::open(p_save_path + ".image", FileAccess::WRITE); //save the header GDIM const uint8_t header[4] = { 'G', 'D', 'I', 'M' }; f->store_buffer(header, 4); //SAVE the extension (so it can be recognized by the loader later f->store_pascal_string(p_source_file.get_extension().to_lower()); //SAVE the actual image f->store_buffer(data.ptr(), len); memdelete(f); return OK; }
RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String& p_original_path, Error *r_error) { if (r_error) *r_error=ERR_FILE_CANT_OPEN; FileAccess *f = FileAccess::open(p_path,FileAccess::READ); ERR_FAIL_COND_V(!f,RES()); DVector<uint8_t> data; data.resize(f->get_len()); ERR_FAIL_COND_V(data.size()==0,RES()); { DVector<uint8_t>::Write w = data.write(); f->get_buffer(w.ptr(),data.size()); } Ref<DynamicFontData> dfd; dfd.instance(); dfd->set_font_data(data); if (r_error) *r_error=OK; return dfd; }
Vector<uint8_t> FileAccess::get_file_as_array(const String &p_path) { FileAccess *f = FileAccess::open(p_path, READ); ERR_FAIL_COND_V(!f, Vector<uint8_t>()); Vector<uint8_t> data; data.resize(f->get_len()); f->get_buffer(data.ptrw(), data.size()); memdelete(f); return data; }
Vector<uint8_t> EditorExportPlatform::get_exported_file(String& p_fname) const { Ref<ResourceImportMetadata> rimd = ResourceLoader::load_import_metadata(p_fname); if (rimd.is_valid()) { if (rimd->get_editor()!="") { Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name(rimd->get_editor()); if (pl.is_valid()) { Vector<uint8_t> ce = pl->custom_export(p_fname,EditorImportExport::get_singleton()->get_export_platform(get_name())); if (ce.size()) return ce; } } } else if (EditorImportExport::get_singleton()->image_get_export_group(p_fname)) { Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture_2d"); if (pl.is_valid()) { Vector<uint8_t> ce = pl->custom_export(p_fname,EditorImportExport::get_singleton()->get_export_platform(get_name())); if (ce.size()) { p_fname=p_fname.basename()+".tex"; return ce; } } } else if (EditorImportExport::get_singleton()->get_export_image_action()!=EditorImportExport::IMAGE_ACTION_NONE){ String xt = p_fname.extension().to_lower(); print_line("TRY FOR: "+p_fname); if (EditorImportExport::get_singleton()->get_image_formats().has(xt)) { //should check for more I guess? Ref<EditorImportPlugin> pl = EditorImportExport::get_singleton()->get_import_plugin_by_name("texture_2d"); if (pl.is_valid()) { Vector<uint8_t> ce = pl->custom_export(p_fname,EditorImportExport::get_singleton()->get_export_platform(get_name())); if (ce.size()) { p_fname=p_fname.basename()+".tex"; return ce; } } } } FileAccess *f = FileAccess::open(p_fname,FileAccess::READ); ERR_FAIL_COND_V(!f,Vector<uint8_t>()); Vector<uint8_t> ret; ret.resize(f->get_len()); int rbs = f->get_buffer(ret.ptr(),ret.size()); memdelete(f); return ret; }
void EditorExportPlatformOSX::_make_icon(const Image& p_icon,Vector<uint8_t>& icon) { Ref<ImageTexture> it = memnew( ImageTexture ); int size=512; Vector<uint8_t> data; data.resize(8); data[0]='i'; data[1]='c'; data[2]='n'; data[3]='s'; const char *name[]={"ic09","ic08","ic07","icp6","icp5","icp4"}; int index=0; while(size>=16) { Image copy = p_icon; copy.convert(Image::FORMAT_RGBA); copy.resize(size,size); it->create_from_image(copy); String path = EditorSettings::get_singleton()->get_settings_path()+"/tmp/icon.png"; ResourceSaver::save(path,it); FileAccess *f = FileAccess::open(path,FileAccess::READ); ERR_FAIL_COND(!f); int ofs = data.size(); uint32_t len = f->get_len(); data.resize(data.size()+len+8); f->get_buffer(&data[ofs+8],len); memdelete(f); len+=8; len=BSWAP32(len); copymem(&data[ofs],name[index],4); encode_uint32(len,&data[ofs+4]); index++; size/=2; } uint32_t total_len = data.size(); total_len = BSWAP32(total_len); encode_uint32(total_len,&data[4]); icon=data; }
void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_t> &p_data) { Ref<ImageTexture> it = memnew(ImageTexture); int size = 512; Vector<uint8_t> data; data.resize(8); data[0] = 'i'; data[1] = 'c'; data[2] = 'n'; data[3] = 's'; const char *name[] = { "ic09", "ic08", "ic07", "icp6", "icp5", "icp4" }; int index = 0; while (size >= 16) { Ref<Image> copy = p_icon; // does this make sense? doesn't this just increase the reference count instead of making a copy? Do we even need a copy? copy->convert(Image::FORMAT_RGBA8); copy->resize(size, size); it->create_from_image(copy); String path = EditorSettings::get_singleton()->get_cache_dir().plus_file("icon.png"); ResourceSaver::save(path, it); FileAccess *f = FileAccess::open(path, FileAccess::READ); ERR_FAIL_COND(!f); int ofs = data.size(); uint32_t len = f->get_len(); data.resize(data.size() + len + 8); f->get_buffer(&data[ofs + 8], len); memdelete(f); len += 8; len = BSWAP32(len); copymem(&data[ofs], name[index], 4); encode_uint32(len, &data[ofs + 4]); index++; size /= 2; } uint32_t total_len = data.size(); total_len = BSWAP32(total_len); encode_uint32(total_len, &data[4]); p_data = data; }
MainLoop *test() { print_line("this is test io"); DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); da->change_dir("."); print_line("Opening current dir " + da->get_current_dir()); String entry; da->list_dir_begin(); while ((entry = da->get_next()) != "") { print_line("entry " + entry + " is dir: " + Variant(da->current_is_dir())); }; da->list_dir_end(); RES texture = ResourceLoader::load("test_data/rock.png"); ERR_FAIL_COND_V(texture.is_null(), NULL); ResourceSaver::save("test_data/rock.xml", texture); print_line("localize paths"); print_line(ProjectSettings::get_singleton()->localize_path("algo.xml")); print_line(ProjectSettings::get_singleton()->localize_path("c:\\windows\\algo.xml")); print_line(ProjectSettings::get_singleton()->localize_path(ProjectSettings::get_singleton()->get_resource_path() + "/something/something.xml")); print_line(ProjectSettings::get_singleton()->localize_path("somedir/algo.xml")); { FileAccess *z = FileAccess::open("test_data/archive.zip", FileAccess::READ); int len = z->get_len(); Vector<uint8_t> zip; zip.resize(len); z->get_buffer(&zip[0], len); z->close(); memdelete(z); FileAccessMemory::register_file("a_package", zip); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_RESOURCES); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_FILESYSTEM); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_USERDATA); print_line("archive test"); }; print_line("test done"); return memnew(TestMainLoop); }
int64_t GDAPI godot_videodecoder_file_seek(void *ptr, int64_t pos, int whence) { // file FileAccess *file = reinterpret_cast<FileAccess *>(ptr); if (file) { size_t len = file->get_len(); switch (whence) { case SEEK_SET: { // Just for explicitness size_t new_pos = static_cast<size_t>(pos); if (new_pos > len) { return -1; } file->seek(new_pos); pos = static_cast<int64_t>(file->get_position()); return pos; } break; case SEEK_CUR: { // Just in case it doesn't exist if (pos < 0 && (size_t)-pos > file->get_position()) { return -1; } pos = pos + static_cast<int>(file->get_position()); file->seek(pos); pos = static_cast<int64_t>(file->get_position()); return pos; } break; case SEEK_END: { // Just in case something goes wrong if ((size_t)-pos > len) { return -1; } file->seek_end(pos); pos = static_cast<int64_t>(file->get_position()); return pos; } break; default: { // Only 4 possible options, hence default = AVSEEK_SIZE // Asks to return the length of file return static_cast<int64_t>(len); } break; } } // In case nothing works out. return -1; }
static long godot_seek(voidpf opaque, voidpf stream, uLong offset, int origin) { FileAccess* f = (FileAccess*)opaque; int pos = offset; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR: pos = f->get_pos() + offset; break; case ZLIB_FILEFUNC_SEEK_END: pos = f->get_len() + offset; break; default: break; }; f->seek(pos); return 0; };
Error PCKPacker::add_file(const String& p_file, const String& p_src) { FileAccess* f = FileAccess::open(p_src, FileAccess::READ); if (!f) { return ERR_FILE_CANT_OPEN; }; File pf; pf.path = p_file; pf.src_path = p_src; pf.size = f->get_len(); pf.offset_offset = 0; files.push_back(pf); f->close(); memdelete(f); return OK; };
Vector<uint8_t> EditorExportPlatform::get_exported_file(String& p_fname) const { Ref<EditorExportPlatform> ep=EditorImportExport::get_singleton()->get_export_platform(get_name()); for(int i=0;i<EditorImportExport::get_singleton()->get_export_plugin_count();i++) { Vector<uint8_t> data = EditorImportExport::get_singleton()->get_export_plugin(i)->custom_export(p_fname,ep); if (data.size()) return data; } FileAccess *f = FileAccess::open(p_fname,FileAccess::READ); ERR_FAIL_COND_V(!f,Vector<uint8_t>()); Vector<uint8_t> ret; ret.resize(f->get_len()); int rbs = f->get_buffer(ret.ptr(),ret.size()); memdelete(f); return ret; }
Error read_all_file_utf8(const String &p_path, String &r_content) { PoolVector<uint8_t> sourcef; Error err; FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); ERR_FAIL_COND_V(err != OK, err); int len = f->get_len(); sourcef.resize(len + 1); PoolVector<uint8_t>::Write w = sourcef.write(); int r = f->get_buffer(w.ptr(), len); f->close(); memdelete(f); ERR_FAIL_COND_V(r != len, ERR_CANT_OPEN); w[len] = 0; String source; if (source.parse_utf8((const char *)w.ptr())) { ERR_FAIL_V(ERR_INVALID_DATA); } r_content = source; return OK; }
void StreamPeerMbedTLS::initialize_ssl() { _create = _create_func; load_certs_func = _load_certs; mbedtls_x509_crt_init(&cacert); #ifdef DEBUG_ENABLED mbedtls_debug_set_threshold(1); #endif String certs_path = GLOBAL_DEF("network/ssl/certificates", ""); ProjectSettings::get_singleton()->set_custom_property_info("network/ssl/certificates", PropertyInfo(Variant::STRING, "network/ssl/certificates", PROPERTY_HINT_FILE, "*.crt")); if (certs_path != "") { FileAccess *f = FileAccess::open(certs_path, FileAccess::READ); if (f) { PoolByteArray arr; int flen = f->get_len(); arr.resize(flen + 1); { PoolByteArray::Write w = arr.write(); f->get_buffer(w.ptr(), flen); w[flen] = 0; //end f string } memdelete(f); _load_certs(arr); print_line("Loaded certs from '" + certs_path); } } available = true; }
Error EditorExportPlatformWindows::export_project(const String& p_path, bool p_debug, int p_flags) { Error err = EditorExportPlatformPC::export_project(p_path, p_debug, p_flags); if(err != OK) { return err; } EditorProgress ep("editexe","Edit EXE File",102); ep.step("Create ico file..",0); DVector<uint8_t> icon_content; if (this->icon_ico!="" && this->icon_ico.ends_with(".ico")) { FileAccess *f = FileAccess::open(this->icon_ico,FileAccess::READ); if (f) { icon_content.resize(f->get_len()); DVector<uint8_t>::Write write = icon_content.write(); f->get_buffer(write.ptr(),icon_content.size()); f->close(); memdelete(f); } } else if (this->icon_png!="" && this->icon_png.ends_with(".png") && (icon16 || icon32 || icon48 || icon64 || icon128 || icon256)) { #ifdef PNG_ENABLED Vector<Image> pngs; Image png; Error err_png = png.load(this->icon_png); if (err_png==OK && !png.empty()) { if(icon256) { Image icon_256(png); if(!(png.get_height()==256 && png.get_width()==256)) icon_256.resize(256,256); pngs.push_back(icon_256); } if(icon128) { Image icon_128(png); if(!(png.get_height()==128 && png.get_width()==128)) icon_128.resize(128,128); pngs.push_back(icon_128); } if(icon64) { Image icon_64(png); if(!(png.get_height()==64 && png.get_width()==64)) icon_64.resize(64,64); pngs.push_back(icon_64); } if(icon48) { Image icon_48(png); if(!(png.get_height()==48 && png.get_width()==48)) icon_48.resize(48,48); pngs.push_back(icon_48); } if(icon32) { Image icon_32(png); if(!(png.get_height()==32 && png.get_width()==32)) icon_32.resize(32,32); pngs.push_back(icon_32); } if(icon16) { Image icon_16(png); if(!(png.get_height()==16 && png.get_width()==16)) icon_16.resize(16,16); pngs.push_back(icon_16); } // create icon according to https://www.daubnet.com/en/file-format-ico store_16(icon_content,0); //Reserved store_16(icon_content,1); //Type store_16(icon_content,pngs.size()); //Count int offset = 6+pngs.size()*16; //List of bitmaps for(int i=0;i<pngs.size();i++) { int w = pngs[i].get_width(); int h = pngs[i].get_height(); icon_content.push_back(w<256?w:0); //width icon_content.push_back(h<256?h:0); //height icon_content.push_back(0); //ColorCount = 0 icon_content.push_back(0); //Reserved store_16(icon_content,1); //Planes store_16(icon_content,32); //BitCount (bit per pixel) int size = 40 + (w * h * 4) + (w * h / 8); store_32(icon_content,size); //Size of (InfoHeader + ANDbitmap + XORbitmap) store_32(icon_content,offset); //FileOffset offset += size; } //Write bmp files. for(int i=0;i<pngs.size();i++) { int w = pngs[i].get_width(); int h = pngs[i].get_height(); store_32(icon_content,40); //Size of InfoHeader structure = 40 store_32(icon_content,w); //Width store_32(icon_content,h*2); //Height store_16(icon_content,1); //Planes store_16(icon_content,32); //BitCount store_32(icon_content,0); //Compression store_32(icon_content,w*h*4); //ImageSize = Size of Image in Bytes store_32(icon_content,0); //unused = 0 store_32(icon_content,0); //unused = 0 store_32(icon_content,0); //unused = 0 store_32(icon_content,0); //unused = 0 //XORBitmap for(int y=h-1;y>=0;y--) { for(int x=0;x<w;x++) { store_32(icon_content,pngs[i].get_pixel(x,y).to_32()); } } //ANDBitmap for(int m=0;m<(w * h / 8);m+=4) store_32(icon_content,0x00000000); // Add empty ANDBitmap , TODO create full ANDBitmap Structure if need. } } #endif } ep.step("Add rsrc..",50); String basename = Globals::get_singleton()->get("application/name"); product_name=product_name.replace("$genname",basename); String godot_version; if(set_godot_version) godot_version = String( VERSION_MKSTRING ); String ret = pe_bliss_add_resrc(p_path.utf8(), version_major, version_minor, company_name, file_description, legal_copyright, version_text, product_name, godot_version, icon_content); if (ret.empty()) { return OK; } else { EditorNode::add_io_error(ret); return ERR_FILE_CANT_WRITE; } }
MainLoop* test() { print_line("this is test io"); DirAccess* da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); da->change_dir("."); print_line("Opening current dir "+ da->get_current_dir()); String entry; da->list_dir_begin(); while ( (entry = da->get_next()) != "") { print_line("entry "+entry+" is dir: " + Variant(da->current_is_dir())); }; da->list_dir_end(); RES texture = ResourceLoader::load("test_data/rock.png"); ERR_FAIL_COND_V(texture.is_null(), NULL); ResourceSaver::save("test_data/rock.xml",texture); print_line("localize paths"); print_line(Globals::get_singleton()->localize_path("algo.xml")); print_line(Globals::get_singleton()->localize_path("c:\\windows\\algo.xml")); print_line(Globals::get_singleton()->localize_path(Globals::get_singleton()->get_resource_path()+"/something/something.xml")); print_line(Globals::get_singleton()->localize_path("somedir/algo.xml")); { FileAccess* z = FileAccess::open("test_data/archive.zip", FileAccess::READ); int len = z->get_len(); Vector<uint8_t> zip; zip.resize(len); z->get_buffer(&zip[0], len); z->close(); memdelete(z); FileAccessMemory::register_file("a_package", zip); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_RESOURCES); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_FILESYSTEM); FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_USERDATA); print_line("archive test"); #if 0 Archive arch; Archive::get_singleton()->add_package("a_package"); FileAccessArchive f; print_line("opening for read"); f._open("file.txt", FileAccess::READ); int pos = f.get_pos(); printf("file has %i bytes, initial pos %i\n", (int)f.get_len(), pos); do { printf("%c", f.get_8()); } while (!f.eof_reached()); print_line("opening for stored seek"); f.open("seek.bin", FileAccess::READ); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); f.seek(128); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); print_line("opening for deflated seek"); f.open("seek_deflated.bin", FileAccess::READ); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); f.seek(128); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); f.seek(256); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); f.seek(4); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); pos = f.get_pos(); printf("byte at pos %i is %i\n", pos, (int)f.get_8()); f.close(); DirAccessArchive d; String dir = "../blah1/blah2/blahask/../blah3/.//blah4/"; printf("changing dir to %s\n", dir.utf8().get_data()); d.change_dir(dir); printf("current dir is %s\n", d.get_current_dir().utf8().get_data()); FileAccessMemory::cleanup(); #endif }; print_line("test done"); return memnew( TestMainLoop ); }
Error DynamicFontAtSize::_load() { int error = FT_Init_FreeType(&library); ERR_EXPLAIN(TTR("Error initializing FreeType.")); ERR_FAIL_COND_V(error != 0, ERR_CANT_CREATE); // FT_OPEN_STREAM is extremely slow only on Android. if (OS::get_singleton()->get_name() == "Android" && font->font_mem == NULL && font->font_path != String()) { // cache font only once for each font->font_path if (_fontdata.has(font->font_path)) { font->set_font_ptr(_fontdata[font->font_path].ptr(), _fontdata[font->font_path].size()); } else { FileAccess *f = FileAccess::open(font->font_path, FileAccess::READ); ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); size_t len = f->get_len(); _fontdata[font->font_path] = Vector<uint8_t>(); Vector<uint8_t> &fontdata = _fontdata[font->font_path]; fontdata.resize(len); f->get_buffer(fontdata.ptr(), len); font->set_font_ptr(fontdata.ptr(), len); f->close(); } } if (font->font_mem == NULL && font->font_path != String()) { FileAccess *f = FileAccess::open(font->font_path, FileAccess::READ); ERR_FAIL_COND_V(!f, ERR_CANT_OPEN); memset(&stream, 0, sizeof(FT_StreamRec)); stream.base = NULL; stream.size = f->get_len(); stream.pos = 0; stream.descriptor.pointer = f; stream.read = _ft_stream_io; stream.close = _ft_stream_close; FT_Open_Args fargs; memset(&fargs, 0, sizeof(FT_Open_Args)); fargs.flags = FT_OPEN_STREAM; fargs.stream = &stream; error = FT_Open_Face(library, &fargs, 0, &face); } else if (font->font_mem) { memset(&stream, 0, sizeof(FT_StreamRec)); stream.base = (unsigned char *)font->font_mem; stream.size = font->font_mem_size; stream.pos = 0; FT_Open_Args fargs; memset(&fargs, 0, sizeof(FT_Open_Args)); fargs.memory_base = (unsigned char *)font->font_mem; fargs.memory_size = font->font_mem_size; fargs.flags = FT_OPEN_MEMORY; fargs.stream = &stream; error = FT_Open_Face(library, &fargs, 0, &face); } else { ERR_EXPLAIN("DynamicFont uninitialized"); ERR_FAIL_V(ERR_UNCONFIGURED); } //error = FT_New_Face( library, src_path.utf8().get_data(),0,&face ); if (error == FT_Err_Unknown_File_Format) { ERR_EXPLAIN(TTR("Unknown font format.")); FT_Done_FreeType(library); } else if (error) { ERR_EXPLAIN(TTR("Error loading font.")); FT_Done_FreeType(library); } ERR_FAIL_COND_V(error, ERR_FILE_CANT_OPEN); /*error = FT_Set_Char_Size(face,0,64*size,512,512); if ( error ) { FT_Done_FreeType( library ); ERR_EXPLAIN(TTR("Invalid font size.")); ERR_FAIL_COND_V( error, ERR_INVALID_PARAMETER ); }*/ error = FT_Set_Pixel_Sizes(face, 0, id.size); ascent = face->size->metrics.ascender >> 6; descent = -face->size->metrics.descender >> 6; linegap = 0; texture_flags = 0; if (id.mipmaps) texture_flags |= Texture::FLAG_MIPMAPS; if (id.filter) texture_flags |= Texture::FLAG_FILTER; //print_line("ASCENT: "+itos(ascent)+" descent "+itos(descent)+" hinted: "+itos(face->face_flags&FT_FACE_FLAG_HINTER)); valid = true; return OK; }
MainLoop *test(TestType p_type) { List<String> cmdlargs = OS::get_singleton()->get_cmdline_args(); if (cmdlargs.empty()) { //try editor! return NULL; } String test = cmdlargs.back()->get(); FileAccess *fa = FileAccess::open(test, FileAccess::READ); if (!fa) { ERR_EXPLAIN("Could not open file: " + test); ERR_FAIL_V(NULL); } Vector<uint8_t> buf; int flen = fa->get_len(); buf.resize(fa->get_len() + 1); fa->get_buffer(buf.ptrw(), flen); buf.write[flen] = 0; String code; code.parse_utf8((const char *)&buf[0]); Vector<String> lines; int last = 0; for (int i = 0; i <= code.length(); i++) { if (code[i] == '\n' || code[i] == 0) { lines.push_back(code.substr(last, i - last)); last = i + 1; } } if (p_type == TEST_TOKENIZER) { GDScriptTokenizerText tk; tk.set_code(code); int line = -1; while (tk.get_token() != GDScriptTokenizer::TK_EOF) { String text; if (tk.get_token() == GDScriptTokenizer::TK_IDENTIFIER) text = "'" + tk.get_token_identifier() + "' (identifier)"; else if (tk.get_token() == GDScriptTokenizer::TK_CONSTANT) { Variant c = tk.get_token_constant(); if (c.get_type() == Variant::STRING) text = "\"" + String(c) + "\""; else text = c; text = text + " (" + Variant::get_type_name(c.get_type()) + " constant)"; } else if (tk.get_token() == GDScriptTokenizer::TK_ERROR) text = "ERROR: " + tk.get_token_error(); else if (tk.get_token() == GDScriptTokenizer::TK_NEWLINE) text = "newline (" + itos(tk.get_token_line()) + ") + indent: " + itos(tk.get_token_line_indent()); else if (tk.get_token() == GDScriptTokenizer::TK_BUILT_IN_FUNC) text = "'" + String(GDScriptFunctions::get_func_name(tk.get_token_built_in_func())) + "' (built-in function)"; else text = tk.get_token_name(tk.get_token()); if (tk.get_token_line() != line) { int from = line + 1; line = tk.get_token_line(); for (int i = from; i <= line; i++) { int l = i - 1; if (l >= 0 && l < lines.size()) { print_line("\n" + itos(i) + ": " + lines[l] + "\n"); } } } print_line("\t(" + itos(tk.get_token_column()) + "): " + text); tk.advance(); } } if (p_type == TEST_PARSER) { GDScriptParser parser; Error err = parser.parse(code); if (err) { print_line("Parse Error:\n" + itos(parser.get_error_line()) + ":" + itos(parser.get_error_column()) + ":" + parser.get_error()); memdelete(fa); return NULL; } const GDScriptParser::Node *root = parser.get_parse_tree(); ERR_FAIL_COND_V(root->type != GDScriptParser::Node::TYPE_CLASS, NULL); const GDScriptParser::ClassNode *cnode = static_cast<const GDScriptParser::ClassNode *>(root); _parser_show_class(cnode, 0, lines); } if (p_type == TEST_COMPILER) { GDScriptParser parser; Error err = parser.parse(code); if (err) { print_line("Parse Error:\n" + itos(parser.get_error_line()) + ":" + itos(parser.get_error_column()) + ":" + parser.get_error()); memdelete(fa); return NULL; } GDScript *script = memnew(GDScript); GDScriptCompiler gdc; err = gdc.compile(&parser, script); if (err) { print_line("Compile Error:\n" + itos(gdc.get_error_line()) + ":" + itos(gdc.get_error_column()) + ":" + gdc.get_error()); memdelete(script); return NULL; } Ref<GDScript> gds = Ref<GDScript>(script); Ref<GDScript> current = gds; while (current.is_valid()) { print_line("** CLASS **"); _disassemble_class(current, lines); current = current->get_base(); } } else if (p_type == TEST_BYTECODE) { Vector<uint8_t> buf = GDScriptTokenizerBuffer::parse_code_string(code); String dst = test.get_basename() + ".gdc"; FileAccess *fw = FileAccess::open(dst, FileAccess::WRITE); fw->store_buffer(buf.ptr(), buf.size()); memdelete(fw); } memdelete(fa); return NULL; }