diff options
678 files changed, 52871 insertions, 19647 deletions
diff --git a/.gitignore b/.gitignore index 84aaefd736..7552e8fd17 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,5 @@ # Godot auto generated files -core/global_defaults.cpp -core/method_bind_ext.inc -core/method_bind.inc -core/script_encryption_key.cpp -core/version_generated.h -drivers/gles2/shaders/*.h -drivers/gles3/shaders/*.h -drivers/unix/os_unix_global_settings_path.cpp -editor/authors.h -editor/builtin_fonts.h -editor/certs_compressed.h -editor/doc_data_compressed.h -editor/editor_icons.cpp -editor/register_exporters.cpp -editor/translations.h -log.txt -main/app_icon.h -main/splash.h -make.bat -modules/register_module_types.cpp -platform/android/logo.h -platform/bb10/logo.h -platform/iphone/logo.h -platform/javascript/logo.h -platform/osx/logo.h -platform/server/logo.h -platform/windows/logo.h -platform/x11/logo.h +*.gen.* # Documentation generated by doxygen or from classes.xml doc/_build/ diff --git a/SConstruct b/SConstruct index 11cd95464d..e745d7bb15 100644 --- a/SConstruct +++ b/SConstruct @@ -377,7 +377,7 @@ if selected_platform in platform_list: methods.no_verbose(sys, env) if (True): # FIXME: detect GLES3 - env.Append( BUILDERS = { 'GLES3_GLSL' : env.Builder(action = methods.build_gles3_headers, suffix = 'glsl.h',src_suffix = '.glsl') } ) + env.Append( BUILDERS = { 'GLES3_GLSL' : env.Builder(action = methods.build_gles3_headers, suffix = 'glsl.gen.h',src_suffix = '.glsl') } ) Export('env') diff --git a/core/SCsub b/core/SCsub index da2403f1d3..02abaa2bb6 100644 --- a/core/SCsub +++ b/core/SCsub @@ -18,7 +18,7 @@ gd_cpp = '#include "global_config.h"\n' gd_cpp += gd_inc gd_cpp += "void GlobalConfig::register_global_defaults() {\n" + gd_call + "\n}\n" -f = open("global_defaults.cpp", "wb") +f = open("global_defaults.gen.cpp", "wb") f.write(gd_cpp) f.close() @@ -47,7 +47,7 @@ if ("SCRIPT_AES256_ENCRYPTION_KEY" in os.environ): txt = "0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0" print("Invalid AES256 encryption key, not 64 bits hex: " + e) -f = open("script_encryption_key.cpp", "wb") +f = open("script_encryption_key.gen.cpp", "wb") f.write("#include \"global_config.h\"\nuint8_t script_encryption_key[32]={" + txt + "};\n") f.close() @@ -109,7 +109,7 @@ env.add_source_files(env.core_sources, "*.cpp") # Make binders import make_binders -env.Command(['method_bind.inc', 'method_bind_ext.inc'], 'make_binders.py', make_binders.run) +env.Command(['method_bind.gen.inc', 'method_bind_ext.gen.inc'], 'make_binders.py', make_binders.run) # Chain load SCsubs diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index d81ccf0265..095f058ed9 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -31,6 +31,7 @@ #include "core/global_config.h" #include "geometry.h" +#include "io/file_access_compressed.h" #include "io/file_access_encrypted.h" #include "io/marshalls.h" #include "os/keyboard.h" @@ -1395,6 +1396,24 @@ Error _File::open_encrypted_pass(const String &p_path, int p_mode_flags, const S return OK; } +Error _File::open_compressed(const String &p_path, int p_mode_flags, int p_compress_mode) { + + FileAccessCompressed *fac = memnew(FileAccessCompressed); + Error err = OK; + + fac->configure("GCPF", (Compression::Mode)p_compress_mode); + + err = fac->_open(p_path, p_mode_flags); + + if (err) { + memdelete(fac); + return err; + } + + f = fac; + return OK; +} + Error _File::open(const String &p_path, int p_mode_flags) { close(); @@ -1700,6 +1719,7 @@ void _File::_bind_methods() { ClassDB::bind_method(D_METHOD("open_encrypted", "path", "mode_flags", "key"), &_File::open_encrypted); ClassDB::bind_method(D_METHOD("open_encrypted_with_pass", "path", "mode_flags", "pass"), &_File::open_encrypted_pass); + ClassDB::bind_method(D_METHOD("open_compressed", "path", "mode_flags", "compression_mode"), &_File::open_compressed, DEFVAL(0)); ClassDB::bind_method(D_METHOD("open", "path", "flags"), &_File::open); ClassDB::bind_method(D_METHOD("close"), &_File::close); @@ -1749,6 +1769,10 @@ void _File::_bind_methods() { BIND_CONSTANT(WRITE); BIND_CONSTANT(READ_WRITE); BIND_CONSTANT(WRITE_READ); + + BIND_CONSTANT(COMPRESSION_FASTLZ); + BIND_CONSTANT(COMPRESSION_DEFLATE); + BIND_CONSTANT(COMPRESSION_ZSTD); } _File::_File() { diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index a2fb6c966c..87d84c0732 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -31,6 +31,7 @@ #define CORE_BIND_H #include "image.h" +#include "io/compression.h" #include "io/resource_loader.h" #include "io/resource_saver.h" #include "os/dir_access.h" @@ -366,8 +367,15 @@ public: WRITE_READ = 7, }; + enum CompressionMode { + COMPRESSION_FASTLZ = Compression::MODE_FASTLZ, + COMPRESSION_DEFLATE = Compression::MODE_DEFLATE, + COMPRESSION_ZSTD = Compression::MODE_ZSTD + }; + Error open_encrypted(const String &p_path, int p_mode_flags, const Vector<uint8_t> &p_key); Error open_encrypted_pass(const String &p_path, int p_mode_flags, const String &p_pass); + Error open_compressed(const String &p_path, int p_mode_flags, int p_compress_mode = 0); Error open(const String &p_path, int p_mode_flags); ///< open a file void close(); ///< close a file diff --git a/core/class_db.cpp b/core/class_db.cpp index 1fe02c8cd9..6b8c290a99 100644 --- a/core/class_db.cpp +++ b/core/class_db.cpp @@ -497,7 +497,7 @@ void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherit } } -void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance) { +void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance, bool p_exclude_from_properties) { OBJTYPE_RLOCK; @@ -528,6 +528,9 @@ void ClassDB::get_method_list(StringName p_class, List<MethodInfo> *p_methods, b minfo.name = E->get(); minfo.id = method->get_method_id(); + if (p_exclude_from_properties && type->methods_in_properties.has(minfo.name)) + continue; + for (int i = 0; i < method->get_argument_count(); i++) { //Variant::Type t=method->get_argument_type(i); @@ -802,7 +805,14 @@ void ClassDB::add_property(StringName p_class, const PropertyInfo &p_pinfo, cons OBJTYPE_WLOCK type->property_list.push_back(p_pinfo); - +#ifdef DEBUG_METHODS_ENABLED + if (mb_get) { + type->methods_in_properties.insert(p_getter); + } + if (mb_set) { + type->methods_in_properties.insert(p_setter); + } +#endif PropertySetGet psg; psg.setter = p_setter; psg.getter = p_getter; diff --git a/core/class_db.h b/core/class_db.h index 547068da5f..4f00a16e91 100644 --- a/core/class_db.h +++ b/core/class_db.h @@ -139,6 +139,7 @@ public: #ifdef DEBUG_METHODS_ENABLED List<StringName> constant_order; List<StringName> method_order; + Set<StringName> methods_in_properties; List<MethodInfo> virtual_methods; StringName category; #endif @@ -486,7 +487,7 @@ public: static bool has_method(StringName p_class, StringName p_method, bool p_no_inheritance = false); static void set_method_flags(StringName p_class, StringName p_method, int p_flags); - static void get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false); + static void get_method_list(StringName p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false, bool p_exclude_from_properties = false); static MethodBind *get_method(StringName p_class, StringName p_name); static void add_virtual_method(const StringName &p_class, const MethodInfo &p_method, bool p_virtual = true); diff --git a/core/core_string_names.cpp b/core/core_string_names.cpp index e35ac2b72c..0ed44b0cb7 100644 --- a/core/core_string_names.cpp +++ b/core/core_string_names.cpp @@ -44,4 +44,7 @@ CoreStringNames::CoreStringNames() { _iter_next = StaticCString::create("_iter_next"); _iter_get = StaticCString::create("_iter_get"); get_rid = StaticCString::create("get_rid"); +#ifdef TOOLS_ENABLED + _sections_unfolded = StaticCString::create("_sections_unfolded"); +#endif } diff --git a/core/core_string_names.h b/core/core_string_names.h index 6672772432..4b4f87a8f0 100644 --- a/core/core_string_names.h +++ b/core/core_string_names.h @@ -61,6 +61,9 @@ public: StringName _iter_next; StringName _iter_get; StringName get_rid; +#ifdef TOOLS_ENABLED + StringName _sections_unfolded; +#endif }; #endif // SCENE_STRING_NAMES_H diff --git a/core/image.cpp b/core/image.cpp index ad52447935..023a058667 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -1646,6 +1646,189 @@ void Image::blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Po } } +void Image::blit_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, const Rect2 &p_src_rect, const Point2 &p_dest) { + + ERR_FAIL_COND(p_src.is_null()); + ERR_FAIL_COND(p_mask.is_null()); + int dsize = data.size(); + int srcdsize = p_src->data.size(); + int maskdsize = p_mask->data.size(); + ERR_FAIL_COND(dsize == 0); + ERR_FAIL_COND(srcdsize == 0); + ERR_FAIL_COND(maskdsize == 0); + ERR_FAIL_COND(p_src->width != p_mask->width); + ERR_FAIL_COND(p_src->height != p_mask->height); + ERR_FAIL_COND(format != p_src->format); + + Rect2i clipped_src_rect = Rect2i(0, 0, p_src->width, p_src->height).clip(p_src_rect); + if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0) + return; + + Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size)); + + PoolVector<uint8_t>::Write wp = data.write(); + uint8_t *dst_data_ptr = wp.ptr(); + + PoolVector<uint8_t>::Read rp = p_src->data.read(); + const uint8_t *src_data_ptr = rp.ptr(); + + int pixel_size = get_format_pixel_size(format); + + Ref<Image> msk = p_mask; + msk->lock(); + + for (int i = 0; i < dest_rect.size.y; i++) { + + for (int j = 0; j < dest_rect.size.x; j++) { + + int src_x = clipped_src_rect.position.x + j; + int src_y = clipped_src_rect.position.y + i; + + if (msk->get_pixel(src_x, src_y).a != 0) { + + int dst_x = dest_rect.position.x + j; + int dst_y = dest_rect.position.y + i; + + const uint8_t *src = &src_data_ptr[(src_y * p_src->width + src_x) * pixel_size]; + uint8_t *dst = &dst_data_ptr[(dst_y * width + dst_x) * pixel_size]; + + for (int k = 0; k < pixel_size; k++) { + dst[k] = src[k]; + } + } + } + } + + msk->unlock(); +} + +void Image::blend_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest) { + + ERR_FAIL_COND(p_src.is_null()); + int dsize = data.size(); + int srcdsize = p_src->data.size(); + ERR_FAIL_COND(dsize == 0); + ERR_FAIL_COND(srcdsize == 0); + ERR_FAIL_COND(format != p_src->format); + + Rect2i clipped_src_rect = Rect2i(0, 0, p_src->width, p_src->height).clip(p_src_rect); + if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0) + return; + + Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size)); + + lock(); + Ref<Image> img = p_src; + img->lock(); + + for (int i = 0; i < dest_rect.size.y; i++) { + + for (int j = 0; j < dest_rect.size.x; j++) { + + int src_x = clipped_src_rect.position.x + j; + int src_y = clipped_src_rect.position.y + i; + + int dst_x = dest_rect.position.x + j; + int dst_y = dest_rect.position.y + i; + + Color sc = img->get_pixel(src_x, src_y); + Color dc = get_pixel(dst_x, dst_y); + dc.r = (double)(sc.a * sc.r + dc.a * (1.0 - sc.a) * dc.r); + dc.g = (double)(sc.a * sc.g + dc.a * (1.0 - sc.a) * dc.g); + dc.b = (double)(sc.a * sc.b + dc.a * (1.0 - sc.a) * dc.b); + dc.a = (double)(sc.a + dc.a * (1.0 - sc.a)); + put_pixel(dst_x, dst_y, dc); + } + } + + img->unlock(); + unlock(); +} + +void Image::blend_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, const Rect2 &p_src_rect, const Point2 &p_dest) { + + ERR_FAIL_COND(p_src.is_null()); + ERR_FAIL_COND(p_mask.is_null()); + int dsize = data.size(); + int srcdsize = p_src->data.size(); + int maskdsize = p_mask->data.size(); + ERR_FAIL_COND(dsize == 0); + ERR_FAIL_COND(srcdsize == 0); + ERR_FAIL_COND(maskdsize == 0); + ERR_FAIL_COND(p_src->width != p_mask->width); + ERR_FAIL_COND(p_src->height != p_mask->height); + ERR_FAIL_COND(format != p_src->format); + + Rect2i clipped_src_rect = Rect2i(0, 0, p_src->width, p_src->height).clip(p_src_rect); + if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0) + return; + + Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size)); + + lock(); + Ref<Image> img = p_src; + Ref<Image> msk = p_mask; + img->lock(); + msk->lock(); + + for (int i = 0; i < dest_rect.size.y; i++) { + + for (int j = 0; j < dest_rect.size.x; j++) { + + int src_x = clipped_src_rect.position.x + j; + int src_y = clipped_src_rect.position.y + i; + + // If the mask's pixel is transparent then we skip it + //Color c = msk->get_pixel(src_x, src_y); + //if (c.a == 0) continue; + if (msk->get_pixel(src_x, src_y).a != 0) { + + int dst_x = dest_rect.position.x + j; + int dst_y = dest_rect.position.y + i; + + Color sc = img->get_pixel(src_x, src_y); + Color dc = get_pixel(dst_x, dst_y); + dc.r = (double)(sc.a * sc.r + dc.a * (1.0 - sc.a) * dc.r); + dc.g = (double)(sc.a * sc.g + dc.a * (1.0 - sc.a) * dc.g); + dc.b = (double)(sc.a * sc.b + dc.a * (1.0 - sc.a) * dc.b); + dc.a = (double)(sc.a + dc.a * (1.0 - sc.a)); + put_pixel(dst_x, dst_y, dc); + } + } + } + + msk->unlock(); + img->unlock(); + unlock(); +} + +void Image::fill(const Color &c) { + + lock(); + + PoolVector<uint8_t>::Write wp = data.write(); + uint8_t *dst_data_ptr = wp.ptr(); + + int pixel_size = get_format_pixel_size(format); + + // put first pixel with the format-aware API + put_pixel(0, 0, c); + + for (int y = 0; y < height; y++) { + + for (int x = 0; x < width; x++) { + + uint8_t *dst = &dst_data_ptr[(y * width + x) * pixel_size]; + + for (int k = 0; k < pixel_size; k++) { + dst[k] = dst_data_ptr[k]; + } + } + } + + unlock(); +} + Ref<Image> (*Image::_png_mem_loader_func)(const uint8_t *, int) = NULL; Ref<Image> (*Image::_jpg_mem_loader_func)(const uint8_t *, int) = NULL; @@ -2040,7 +2223,7 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("get_mipmap_offset", "mipmap"), &Image::get_mipmap_offset); - ClassDB::bind_method(D_METHOD("resize_to_po2", "square"), &Image::resize_to_po2, DEFVAL("false")); + ClassDB::bind_method(D_METHOD("resize_to_po2", "square"), &Image::resize_to_po2, DEFVAL(false)); ClassDB::bind_method(D_METHOD("resize", "width", "height", "interpolation"), &Image::resize, DEFVAL(INTERPOLATE_BILINEAR)); ClassDB::bind_method(D_METHOD("shrink_x2"), &Image::shrink_x2); ClassDB::bind_method(D_METHOD("expand_x2_hq2x"), &Image::expand_x2_hq2x); @@ -2072,6 +2255,10 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("normalmap_to_xy"), &Image::normalmap_to_xy); ClassDB::bind_method(D_METHOD("blit_rect", "src:Image", "src_rect", "dst"), &Image::blit_rect); + ClassDB::bind_method(D_METHOD("blit_rect_mask", "src:Image", "mask:Image", "src_rect", "dst"), &Image::blit_rect_mask); + ClassDB::bind_method(D_METHOD("blend_rect", "src:Image", "src_rect", "dst"), &Image::blend_rect); + ClassDB::bind_method(D_METHOD("blend_rect_mask", "src:Image", "mask:Image", "src_rect", "dst"), &Image::blend_rect_mask); + ClassDB::bind_method(D_METHOD("fill", "color"), &Image::fill); ClassDB::bind_method(D_METHOD("get_used_rect"), &Image::get_used_rect); ClassDB::bind_method(D_METHOD("get_rect:Image", "rect"), &Image::get_rect); diff --git a/core/image.h b/core/image.h index 838b37352d..e523f703fa 100644 --- a/core/image.h +++ b/core/image.h @@ -283,6 +283,10 @@ public: void normalmap_to_xy(); void blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest); + void blit_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, const Rect2 &p_src_rect, const Point2 &p_dest); + void blend_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Point2 &p_dest); + void blend_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, const Rect2 &p_src_rect, const Point2 &p_dest); + void fill(const Color &c); Rect2 get_used_rect() const; Ref<Image> get_rect(const Rect2 &p_area) const; diff --git a/core/math/matrix3.h b/core/math/matrix3.h index c3eeb1f705..8897c692f7 100644 --- a/core/math/matrix3.h +++ b/core/math/matrix3.h @@ -145,6 +145,12 @@ public: elements[2][1] = zy; elements[2][2] = zz; } + _FORCE_INLINE_ void set(const Vector3 &p_x, const Vector3 &p_y, const Vector3 &p_z) { + + set_axis(0, p_x); + set_axis(1, p_y); + set_axis(2, p_z); + } _FORCE_INLINE_ Vector3 get_column(int i) const { return Vector3(elements[0][i], elements[1][i], elements[2][i]); diff --git a/core/math/transform.cpp b/core/math/transform.cpp index e53e6cf519..7a50214596 100644 --- a/core/math/transform.cpp +++ b/core/math/transform.cpp @@ -82,7 +82,10 @@ Transform Transform::looking_at(const Vector3 &p_target, const Vector3 &p_up) co } void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const Vector3 &p_up) { - +#ifdef MATH_CHECKS + ERR_FAIL_COND(p_eye == p_target); + ERR_FAIL_COND(p_up.length() == 0); +#endif // Reference: MESA source code Vector3 v_x, v_y, v_z; @@ -96,6 +99,9 @@ void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const v_y = p_up; v_x = v_y.cross(v_z); +#ifdef MATH_CHECKS + ERR_FAIL_COND(v_x.length() == 0); +#endif /* Recompute Y = Z cross X */ v_y = v_z.cross(v_x); @@ -103,9 +109,8 @@ void Transform::set_look_at(const Vector3 &p_eye, const Vector3 &p_target, const v_x.normalize(); v_y.normalize(); - basis.set_axis(0, v_x); - basis.set_axis(1, v_y); - basis.set_axis(2, v_z); + basis.set(v_x, v_y, v_z); + origin = p_eye; } diff --git a/core/math/transform.h b/core/math/transform.h index c39ea7826f..48467f2ed7 100644 --- a/core/math/transform.h +++ b/core/math/transform.h @@ -97,15 +97,7 @@ public: void set(real_t xx, real_t xy, real_t xz, real_t yx, real_t yy, real_t yz, real_t zx, real_t zy, real_t zz, real_t tx, real_t ty, real_t tz) { - basis.elements[0][0] = xx; - basis.elements[0][1] = xy; - basis.elements[0][2] = xz; - basis.elements[1][0] = yx; - basis.elements[1][1] = yy; - basis.elements[1][2] = yz; - basis.elements[2][0] = zx; - basis.elements[2][1] = zy; - basis.elements[2][2] = zz; + basis.set(xx, xy, xz, yx, yy, yz, zx, zy, zz); origin.x = tx; origin.y = ty; origin.z = tz; diff --git a/core/method_bind.h b/core/method_bind.h index 8d72c8573a..dbc9cca082 100644 --- a/core/method_bind.h +++ b/core/method_bind.h @@ -343,6 +343,6 @@ MethodBind *create_vararg_method_bind(Variant (T::*p_method)(const Variant **, i // if you declare an nonexistent class.. class __UnexistingClass; -#include "method_bind.inc" +#include "method_bind.gen.inc" #endif diff --git a/core/object.cpp b/core/object.cpp index f20e93f9d7..d83b2d0c6e 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -419,6 +419,16 @@ void Object::set(const StringName &p_name, const Variant &p_value, bool *r_valid if (r_valid) *r_valid = true; return; +#ifdef TOOLS_ENABLED + } else if (p_name == CoreStringNames::get_singleton()->_sections_unfolded) { + Array arr = p_value; + for (int i = 0; i < arr.size(); i++) { + editor_section_folding.insert(arr[i]); + } + if (r_valid) + *r_valid = true; + return; +#endif } else { //something inside the object... :| bool success = _setv(p_name, p_value); @@ -464,6 +474,16 @@ Variant Object::get(const StringName &p_name, bool *r_valid) const { if (r_valid) *r_valid = true; return ret; +#ifdef TOOLS_ENABLED + } else if (p_name == CoreStringNames::get_singleton()->_sections_unfolded) { + Array array; + for (Set<String>::Element *E = editor_section_folding.front(); E; E = E->next()) { + array.push_back(E->get()); + } + if (r_valid) + *r_valid = true; + return array; +#endif } else { //something inside the object... :| bool success = _getv(p_name, ret); @@ -516,6 +536,11 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons if (!is_class("Script")) // can still be set, but this is for userfriendlyness p_list->push_back(PropertyInfo(Variant::OBJECT, "script", PROPERTY_HINT_RESOURCE_TYPE, "Script", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NONZERO)); +#ifdef TOOLS_ENABLED + if (editor_section_folding.size()) { + p_list->push_back(PropertyInfo(Variant::ARRAY, CoreStringNames::get_singleton()->_sections_unfolded, PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR)); + } +#endif if (!metadata.empty()) p_list->push_back(PropertyInfo(Variant::DICTIONARY, "__meta__", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_STORE_IF_NONZERO)); if (script_instance && !p_reversed) { @@ -1571,6 +1596,23 @@ void Object::_clear_internal_resource_paths(const Variant &p_var) { } } +#ifdef TOOLS_ENABLED +void Object::editor_set_section_unfold(const String &p_section, bool p_unfolded) { + + set_edited(true); + if (p_unfolded) + editor_section_folding.insert(p_section); + else + editor_section_folding.erase(p_section); +} + +bool Object::editor_is_section_unfolded(const String &p_section) { + + return editor_section_folding.has(p_section); +} + +#endif + void Object::clear_internal_resource_paths() { List<PropertyInfo> pinfo; diff --git a/core/object.h b/core/object.h index 83b03b9239..fabd10fa1f 100644 --- a/core/object.h +++ b/core/object.h @@ -430,6 +430,7 @@ private: #ifdef TOOLS_ENABLED bool _edited; uint32_t _edited_version; + Set<String> editor_section_folding; #endif ScriptInstance *script_instance; RefPtr script; @@ -666,6 +667,11 @@ public: _FORCE_INLINE_ void set_message_translation(bool p_enable) { _can_translate = p_enable; } _FORCE_INLINE_ bool can_translate_messages() const { return _can_translate; } +#ifdef TOOLS_ENABLED + void editor_set_section_unfold(const String &p_section, bool p_unfolded); + bool editor_is_section_unfolded(const String &p_section); +#endif + void clear_internal_resource_paths(); Object(); diff --git a/core/os/input_event.cpp b/core/os/input_event.cpp index dbdf9628e3..1c575aa970 100644 --- a/core/os/input_event.cpp +++ b/core/os/input_event.cpp @@ -89,6 +89,11 @@ bool InputEvent::action_match(const Ref<InputEvent> &p_event) const { return false; } +bool InputEvent::shortcut_match(const Ref<InputEvent> &p_event) const { + + return false; +} + bool InputEvent::is_action_type() const { return false; @@ -130,10 +135,13 @@ void InputEvent::_bind_methods() { ClassDB::bind_method(D_METHOD("as_text"), &InputEvent::as_text); ClassDB::bind_method(D_METHOD("action_match", "event:InputEvent"), &InputEvent::action_match); + ClassDB::bind_method(D_METHOD("shortcut_match", "event:InputEvent"), &InputEvent::shortcut_match); ClassDB::bind_method(D_METHOD("is_action_type"), &InputEvent::is_action_type); ClassDB::bind_method(D_METHOD("xformed_by:InputEvent", "xform", "local_ofs"), &InputEvent::xformed_by, DEFVAL(Vector2())); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "device"), "set_device", "get_device"); } InputEvent::InputEvent() { @@ -276,6 +284,27 @@ uint32_t InputEventKey::get_scancode_with_modifiers() const { return sc; } +String InputEventKey::as_text() const { + + String kc = keycode_get_string(scancode); + if (kc == String()) + return kc; + + if (get_metakey()) { + kc = "Meta+" + kc; + } + if (get_alt()) { + kc = "Alt+" + kc; + } + if (get_shift()) { + kc = "Shift+" + kc; + } + if (get_control()) { + kc = "Ctrl+" + kc; + } + return kc; +} + bool InputEventKey::action_match(const Ref<InputEvent> &p_event) const { Ref<InputEventKey> key = p_event; @@ -288,6 +317,18 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event) const { return get_scancode() == key->get_scancode() && (!key->is_pressed() || (code & event_code) == code); } +bool InputEventKey::shortcut_match(const Ref<InputEvent> &p_event) const { + + Ref<InputEventKey> key = p_event; + if (key.is_null()) + return false; + + uint32_t code = get_scancode_with_modifiers(); + uint32_t event_code = key->get_scancode_with_modifiers(); + + return code == event_code; +} + void InputEventKey::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &InputEventKey::set_pressed); diff --git a/core/os/input_event.h b/core/os/input_event.h index 6a694df345..b120d4b840 100644 --- a/core/os/input_event.h +++ b/core/os/input_event.h @@ -165,6 +165,7 @@ public: virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const; virtual bool action_match(const Ref<InputEvent> &p_event) const; + virtual bool shortcut_match(const Ref<InputEvent> &p_event) const; virtual bool is_action_type() const; InputEvent(); @@ -243,9 +244,12 @@ public: uint32_t get_scancode_with_modifiers() const; virtual bool action_match(const Ref<InputEvent> &p_event) const; + virtual bool shortcut_match(const Ref<InputEvent> &p_event) const; virtual bool is_action_type() const { return true; } + virtual String as_text() const; + InputEventKey(); }; diff --git a/core/reference.h b/core/reference.h index afc097817a..4e2d6c36c0 100644 --- a/core/reference.h +++ b/core/reference.h @@ -344,7 +344,7 @@ struct PtrToArg<const Ref<T> &> { _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { - return Ref<T>(reinterpret_cast<const T *>(p_ptr)); + return Ref<T>((T *)p_ptr); } }; diff --git a/core/ustring.cpp b/core/ustring.cpp index 6a93d7789e..ab4528e495 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -65,7 +65,7 @@ bool CharString::operator<(const CharString &p_right) const { } const char *this_str = get_data(); - const char *that_str = get_data(); + const char *that_str = p_right.get_data(); while (true) { if (*that_str == 0 && *this_str == 0) @@ -96,6 +96,12 @@ const char *CharString::get_data() const { void String::copy_from(const char *p_cstr) { + if (!p_cstr) { + + resize(0); + return; + } + int len = 0; const char *ptr = p_cstr; while (*(ptr++) != 0) @@ -119,6 +125,12 @@ void String::copy_from(const char *p_cstr) { void String::copy_from(const CharType *p_cstr, int p_clip_to) { + if (!p_cstr) { + + resize(0); + return; + } + int len = 0; const CharType *ptr = p_cstr; while (*(ptr++) != 0) diff --git a/core/variant_call.cpp b/core/variant_call.cpp index 9ead727a80..6936a362e1 100644 --- a/core/variant_call.cpp +++ b/core/variant_call.cpp @@ -30,6 +30,7 @@ #include "variant.h" #include "core_string_names.h" +#include "io/compression.h" #include "object.h" #include "os/os.h" #include "script_language.h" @@ -509,6 +510,44 @@ struct _VariantCall { r_ret = s; } + static void _call_PoolByteArray_compress(Variant &r_ret, Variant &p_self, const Variant **p_args) { + + PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem); + PoolByteArray compressed; + Compression::Mode mode = (Compression::Mode)(int)(*p_args[0]); + + compressed.resize(Compression::get_max_compressed_buffer_size(ba->size())); + int result = Compression::compress(compressed.write().ptr(), ba->read().ptr(), ba->size(), mode); + + result = result >= 0 ? result : 0; + compressed.resize(result); + + r_ret = compressed; + } + + static void _call_PoolByteArray_decompress(Variant &r_ret, Variant &p_self, const Variant **p_args) { + + PoolByteArray *ba = reinterpret_cast<PoolByteArray *>(p_self._data._mem); + PoolByteArray decompressed; + Compression::Mode mode = (Compression::Mode)(int)(*p_args[1]); + + int buffer_size = (int)(*p_args[0]); + + if (buffer_size < 0) { + r_ret = decompressed; + ERR_EXPLAIN("Decompression buffer size is less than zero"); + ERR_FAIL(); + } + + decompressed.resize(buffer_size); + int result = Compression::decompress(decompressed.write().ptr(), buffer_size, ba->read().ptr(), ba->size(), mode); + + result = result >= 0 ? result : 0; + decompressed.resize(result); + + r_ret = decompressed; + } + VCALL_LOCALMEM0R(PoolByteArray, size); VCALL_LOCALMEM2(PoolByteArray, set); VCALL_LOCALMEM1R(PoolByteArray, get); @@ -1552,6 +1591,8 @@ void register_variant_methods() { ADDFUNC0(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_ascii, varray()); ADDFUNC0(POOL_BYTE_ARRAY, STRING, PoolByteArray, get_string_from_utf8, varray()); + ADDFUNC1(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, compress, INT, "compression_mode", varray(0)); + ADDFUNC2(POOL_BYTE_ARRAY, POOL_BYTE_ARRAY, PoolByteArray, decompress, INT, "buffer_size", INT, "compression_mode", varray(0)); ADDFUNC0(POOL_INT_ARRAY, INT, PoolIntArray, size, varray()); ADDFUNC2(POOL_INT_ARRAY, NIL, PoolIntArray, set, INT, "idx", INT, "integer", varray()); diff --git a/core/variant_op.cpp b/core/variant_op.cpp index 7b2d0f6886..a463a5a23f 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -2236,30 +2236,30 @@ bool Variant::iter_init(Variant &r_iter, bool &valid) const { return _data._int > 0; } break; case REAL: { - r_iter = 0.0; + r_iter = 0; return _data._real > 0.0; } break; case VECTOR2: { - real_t from = reinterpret_cast<const Vector2 *>(_data._mem)->x; - real_t to = reinterpret_cast<const Vector2 *>(_data._mem)->y; + int64_t from = reinterpret_cast<const Vector2 *>(_data._mem)->x; + int64_t to = reinterpret_cast<const Vector2 *>(_data._mem)->y; r_iter = from; return from < to; } break; case VECTOR3: { - real_t from = reinterpret_cast<const Vector3 *>(_data._mem)->x; - real_t to = reinterpret_cast<const Vector3 *>(_data._mem)->y; - real_t step = reinterpret_cast<const Vector3 *>(_data._mem)->z; + int64_t from = reinterpret_cast<const Vector3 *>(_data._mem)->x; + int64_t to = reinterpret_cast<const Vector3 *>(_data._mem)->y; + int64_t step = reinterpret_cast<const Vector3 *>(_data._mem)->z; r_iter = from; if (from == to) { return false; } else if (from < to) { - return step > 0.0; + return step > 0; } else { - return step < 0.0; + return step < 0; } //return true; } break; @@ -2387,7 +2387,6 @@ bool Variant::iter_next(Variant &r_iter, bool &valid) const { valid = true; switch (type) { case INT: { - int64_t idx = r_iter; idx++; if (idx >= _data._int) @@ -2396,33 +2395,36 @@ bool Variant::iter_next(Variant &r_iter, bool &valid) const { return true; } break; case REAL: { - - double idx = r_iter; - idx += 1.0; + int64_t idx = r_iter; + idx++; if (idx >= _data._real) return false; r_iter = idx; return true; } break; case VECTOR2: { - real_t idx = r_iter; - idx += 1.0; - if (idx >= reinterpret_cast<const Vector2 *>(_data._mem)->y) + int64_t to = reinterpret_cast<const Vector3 *>(_data._mem)->y; + + int64_t idx = r_iter; + idx++; + + if (idx >= to) return false; + r_iter = idx; return true; } break; case VECTOR3: { - real_t to = reinterpret_cast<const Vector3 *>(_data._mem)->y; - real_t step = reinterpret_cast<const Vector3 *>(_data._mem)->z; + int64_t to = reinterpret_cast<const Vector3 *>(_data._mem)->y; + int64_t step = reinterpret_cast<const Vector3 *>(_data._mem)->z; - real_t idx = r_iter; + int64_t idx = r_iter; idx += step; - if (step < 0.0 && idx <= to) + if (step < 0 && idx <= to) return false; - if (step > 0.0 && idx >= to) + if (step > 0 && idx >= to) return false; r_iter = idx; diff --git a/core/version.h b/core/version.h index 80e50e51b9..43f6f1bbf9 100644 --- a/core/version.h +++ b/core/version.h @@ -27,7 +27,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "version_generated.h" +#include "version_generated.gen.h" #ifdef VERSION_PATCH #define VERSION_MKSTRING "" _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR) "." _MKSTR(VERSION_PATCH) "." _MKSTR(VERSION_STATUS) "." _MKSTR(VERSION_REVISION) diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 2331d49c1f..c2c8d3e8dd 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -15299,6 +15299,19 @@ Open the file for writing or reading, depending on the flags. </description> </method> + <method name="open_compressed"> + <return type="int"> + </return> + <argument index="0" name="path" type="String"> + </argument> + <argument index="1" name="mode_flags" type="int"> + </argument> + <argument index="2" name="compression_mode" type="int" default="0"> + </argument> + <description> + Open a compressed file for reading or writing. The compression_mode can be set as one of the COMPRESSION_* constants. + </description> + </method> <method name="open_encrypted"> <return type="int"> </return> @@ -15445,6 +15458,15 @@ <constant name="WRITE_READ" value="7"> Open the file for reading and writing. Create it if the file not exists and truncate if it exists. </constant> + <constant name="COMPRESSION_FASTLZ" value="0"> + Use the FastLZ compression method. + </constant> + <constant name="COMPRESSION_DEFLATE" value="1"> + Use the Deflate compression method. + </constant> + <constant name="COMPRESSION_ZSTD" value="2"> + Use the Zstd compression method. + </constant> </constants> </class> <class name="FileDialog" inherits="ConfirmationDialog" category="Core"> @@ -18949,6 +18971,30 @@ Native image datatype. Contains image data, which can be converted to a texture, and several functions to interact with it. </description> <methods> + <method name="blend_rect"> + <argument index="0" name="src" type="Image"> + </argument> + <argument index="1" name="src_rect" type="Rect2"> + </argument> + <argument index="2" name="dst" type="Vector2"> + </argument> + <description> + Alpha-blends a "src_rect" [Rect2] from "src" [Image] to this [Image] on coordinates "dest". + </description> + </method> + <method name="blend_rect_mask"> + <argument index="0" name="src" type="Image"> + </argument> + <argument index="1" name="mask" type="Image"> + </argument> + <argument index="2" name="src_rect" type="Rect2"> + </argument> + <argument index="3" name="dst" type="Vector2"> + </argument> + <description> + Alpha-blends a "src_rect" [Rect2] from "src" [Image] to this [Image] using a "mask" [Image] on coordinates "dest". Alpha channels are required for both "src" and "mask", dest pixels and src pixels will blend if the corresponding mask pixel's alpha value is not 0. "src" [Image] and "mask" [Image] *must* have the same size (width and height) but they can have different formats + </description> + </method> <method name="blit_rect"> <argument index="0" name="src" type="Image"> </argument> @@ -19039,6 +19085,13 @@ <description> </description> </method> + <method name="fill"> + <argument index="0" name="color" type="Color"> + </argument> + <description> + Fills an [Image] with a specified [Color] + </description> + </method> <method name="fix_alpha_edges"> <description> </description> @@ -33733,6 +33786,26 @@ Append an [PoolByteArray] at the end of this array. </description> </method> + <method name="compress"> + <return type="PoolByteArray"> + </return> + <argument index="0" name="compression_mode" type="int" default="0"> + </argument> + <description> + Returns a new [PoolByteArray] with the data compressed. The compression mode can be set using one of the COMPRESS_* constants of [File]. + </description> + </method> + <method name="decompress"> + <return type="PoolByteArray"> + </return> + <argument index="0" name="buffer_size" type="int"> + </argument> + <argument index="1" name="compression_mode" type="int" default="0"> + </argument> + <description> + Returns a new [PoolByteArray] with the data decompressed. The buffer_size should be set as the size of the uncompressed data. The compression mode can be set using one of the COMPRESS_* constants of [File]. + </description> + </method> <method name="get_string_from_ascii"> <return type="String"> </return> @@ -34651,6 +34724,13 @@ Returns a boolean that indicates whether or not the PopupMenu will hide on item selection. </description> </method> + <method name="is_hide_on_checkable_item_selection"> + <return type="bool"> + </return> + <description> + Returns a boolean that indicates whether or not the PopupMenu will hide on checkable item selection. + </description> + </method> <method name="is_item_checkable" qualifiers="const"> <return type="bool"> </return> @@ -34701,6 +34781,13 @@ Sets whether or not the PopupMenu will hide on item selection. </description> </method> + <method name="set_hide_on_checkable_item_selection"> + <argument index="0" name="enable" type="bool"> + </argument> + <description> + Sets whether or not the PopupMenu will hide on checkable item selection. + </description> + </method> <method name="set_item_ID"> <argument index="0" name="idx" type="int"> </argument> diff --git a/drivers/gles3/SCsub b/drivers/gles3/SCsub index a17335b41b..2471dd3739 100644 --- a/drivers/gles3/SCsub +++ b/drivers/gles3/SCsub @@ -1,3 +1,5 @@ +#!/usr/bin/env python + Import('env') env.add_source_files(env.drivers_sources,"*.cpp") diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index a8895f7bfc..c71bf22965 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -28,6 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "rasterizer_canvas_gles3.h" +#include "servers/visual/visual_server_raster.h" #include "global_config.h" #include "os/os.h" @@ -164,6 +165,7 @@ void RasterizerCanvasGLES3::canvas_begin() { state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF5, false); state.canvas_shader.set_conditional(CanvasShaderGLES3::SHADOW_FILTER_PCF13, false); state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_DISTANCE_FIELD, false); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, false); state.canvas_shader.set_custom_shader(0); state.canvas_shader.bind(); @@ -178,6 +180,7 @@ void RasterizerCanvasGLES3::canvas_begin() { glBindBufferBase(GL_UNIFORM_BUFFER, 0, state.canvas_item_ubo); glBindVertexArray(data.canvas_quad_array); state.using_texture_rect = true; + state.using_ninepatch = false; } void RasterizerCanvasGLES3::canvas_end() { @@ -186,6 +189,7 @@ void RasterizerCanvasGLES3::canvas_end() { glBindBufferBase(GL_UNIFORM_BUFFER, 0, 0); state.using_texture_rect = false; + state.using_ninepatch = false; } RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map) { @@ -258,9 +262,9 @@ RasterizerStorageGLES3::Texture *RasterizerCanvasGLES3::_bind_canvas_texture(con return tex_return; } -void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) { +void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable, bool p_ninepatch) { - if (state.using_texture_rect == p_enable) + if (state.using_texture_rect == p_enable && state.using_ninepatch == p_ninepatch) return; if (p_enable) { @@ -272,6 +276,7 @@ void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_NINEPATCH, p_ninepatch && p_enable); state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_TEXTURE_RECT, p_enable); state.canvas_shader.bind(); state.canvas_shader.set_uniform(CanvasShaderGLES3::FINAL_MODULATE, state.canvas_item_modulate); @@ -279,6 +284,7 @@ void RasterizerCanvasGLES3::_set_texture_rect_mode(bool p_enable) { state.canvas_shader.set_uniform(CanvasShaderGLES3::EXTRA_MATRIX, state.extra_matrix); state.using_texture_rect = p_enable; + state.using_ninepatch = p_ninepatch; } void RasterizerCanvasGLES3::_draw_polygon(const int *p_indices, int p_index_count, int p_vertex_count, const Vector2 *p_vertices, const Vector2 *p_uvs, const Color *p_colors, bool p_singlecolor) { @@ -493,79 +499,41 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur Item::CommandNinePatch *np = static_cast<Item::CommandNinePatch *>(c); - _set_texture_rect_mode(true); + _set_texture_rect_mode(true, true); glVertexAttrib4f(VS::ARRAY_COLOR, np->color.r, np->color.g, np->color.b, np->color.a); RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(np->texture, np->normal_map); - if (!texture) { - - glVertexAttrib4f(1, np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y); - glVertexAttrib4f(2, 0, 0, 1, 1); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - continue; - } - - Size2 texpixel_size(1.0 / texture->width, 1.0 / texture->height); - - state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size); - state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false); - -#define DSTRECT(m_x, m_y, m_w, m_h) state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(m_x, m_y, m_w, m_h)) -#define SRCRECT(m_x, m_y, m_w, m_h) state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color((m_x)*texpixel_size.x, (m_y)*texpixel_size.y, (m_w)*texpixel_size.x, (m_h)*texpixel_size.y)) + Size2 texpixel_size; - //top left - DSTRECT(np->rect.position.x, np->rect.position.y, np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]); - SRCRECT(np->source.position.x, np->source.position.y, np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - //top right - DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y, np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]); - SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y, np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + if (!texture) { - //bottom right - DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]); - SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + texpixel_size = Size2(1, 1); - //bottom left - DSTRECT(np->rect.position.x, np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_LEFT], np->margin[MARGIN_BOTTOM]); - SRCRECT(np->source.position.x, np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->margin[MARGIN_LEFT], np->margin[MARGIN_BOTTOM]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1)); - //top - DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y, np->rect.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]); - SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y, np->source.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + } else { - //bottom - DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y + np->rect.size.height - np->margin[MARGIN_BOTTOM], np->rect.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->margin[MARGIN_TOP]); - SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y + np->source.size.height - np->margin[MARGIN_BOTTOM], np->source.size.width - np->margin[MARGIN_LEFT] - np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + if (np->source != Rect2()) { + texpixel_size = Size2(1.0 / np->source.size.width, 1.0 / np->source.size.height); + state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(np->source.position.x / texture->width, np->source.position.y / texture->height, np->source.size.x / texture->width, np->source.size.y / texture->height)); + } else { + texpixel_size = Size2(1.0 / texture->width, 1.0 / texture->height); + state.canvas_shader.set_uniform(CanvasShaderGLES3::SRC_RECT, Color(0, 0, 1, 1)); + } + } - //left - DSTRECT(np->rect.position.x, np->rect.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_LEFT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); - SRCRECT(np->source.position.x, np->source.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_LEFT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size); + state.canvas_shader.set_uniform(CanvasShaderGLES3::CLIP_RECT_UV, false); + state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_H, int(np->axis_x)); + state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_REPEAT_V, int(np->axis_y)); + state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_DRAW_CENTER, np->draw_center); + state.canvas_shader.set_uniform(CanvasShaderGLES3::NP_MARGINS, Color(np->margin[MARGIN_LEFT], np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->margin[MARGIN_BOTTOM])); + state.canvas_shader.set_uniform(CanvasShaderGLES3::DST_RECT, Color(np->rect.position.x, np->rect.position.y, np->rect.size.x, np->rect.size.y)); - //right - DSTRECT(np->rect.position.x + np->rect.size.width - np->margin[MARGIN_RIGHT], np->rect.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); - SRCRECT(np->source.position.x + np->source.size.width - np->margin[MARGIN_RIGHT], np->source.position.y + np->margin[MARGIN_TOP], np->margin[MARGIN_RIGHT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - if (np->draw_center) { - - //center - DSTRECT(np->rect.position.x + np->margin[MARGIN_LEFT], np->rect.position.y + np->margin[MARGIN_TOP], np->rect.size.x - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->rect.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); - SRCRECT(np->source.position.x + np->margin[MARGIN_LEFT], np->source.position.y + np->margin[MARGIN_TOP], np->source.size.x - np->margin[MARGIN_LEFT] - np->margin[MARGIN_RIGHT], np->source.size.height - np->margin[MARGIN_TOP] - np->margin[MARGIN_BOTTOM]); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - } - -#undef SRCRECT -#undef DSTRECT - storage->frame.canvas_draw_commands++; } break; @@ -608,6 +576,133 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1); } break; + case Item::Command::TYPE_PARTICLES: { + + Item::CommandParticles *particles_cmd = static_cast<Item::CommandParticles *>(c); + + RasterizerStorageGLES3::Particles *particles = storage->particles_owner.getornull(particles_cmd->particles); + if (!particles) + break; + + glVertexAttrib4f(VS::ARRAY_COLOR, 1, 1, 1, 1); //not used, so keep white + + VisualServerRaster::redraw_request(); + + storage->particles_request_process(particles_cmd->particles); + //enable instancing + + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, true); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, true); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, true); + //reset shader and force rebind + state.using_texture_rect = true; + _set_texture_rect_mode(false); + + RasterizerStorageGLES3::Texture *texture = _bind_canvas_texture(particles_cmd->texture, particles_cmd->normal_map); + + if (texture) { + Size2 texpixel_size(1.0 / (texture->width / particles_cmd->h_frames), 1.0 / (texture->height / particles_cmd->v_frames)); + state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size); + } else { + state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, Vector2(1.0, 1.0)); + } + + if (!particles->use_local_coords) { + + Transform2D inv_xf; + inv_xf.set_axis(0, Vector2(particles->emission_transform.basis.get_axis(0).x, particles->emission_transform.basis.get_axis(0).y)); + inv_xf.set_axis(1, Vector2(particles->emission_transform.basis.get_axis(1).x, particles->emission_transform.basis.get_axis(1).y)); + inv_xf.set_origin(Vector2(particles->emission_transform.get_origin().x, particles->emission_transform.get_origin().y)); + inv_xf.affine_invert(); + + state.canvas_shader.set_uniform(CanvasShaderGLES3::MODELVIEW_MATRIX, state.final_transform * inv_xf); + } + + state.canvas_shader.set_uniform(CanvasShaderGLES3::H_FRAMES, particles_cmd->h_frames); + state.canvas_shader.set_uniform(CanvasShaderGLES3::V_FRAMES, particles_cmd->v_frames); + + glBindVertexArray(data.particle_quad_array); //use particle quad array + glBindBuffer(GL_ARRAY_BUFFER, particles->particle_buffers[0]); //bind particle buffer + + int stride = sizeof(float) * 4 * 6; + + int amount = particles->amount; + + if (particles->draw_order != VS::PARTICLES_DRAW_ORDER_LIFETIME) { + + glEnableVertexAttribArray(8); //xform x + glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3); + glVertexAttribDivisor(8, 1); + glEnableVertexAttribArray(9); //xform y + glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4); + glVertexAttribDivisor(9, 1); + glEnableVertexAttribArray(10); //xform z + glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5); + glVertexAttribDivisor(10, 1); + glEnableVertexAttribArray(11); //color + glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); + glVertexAttribDivisor(11, 1); + glEnableVertexAttribArray(12); //custom + glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2); + glVertexAttribDivisor(12, 1); + + glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount); + } else { + //split + + int stride = sizeof(float) * 4 * 6; + int split = int(Math::ceil(particles->phase * particles->amount)); + + if (amount - split > 0) { + glEnableVertexAttribArray(8); //xform x + glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 3); + glVertexAttribDivisor(8, 1); + glEnableVertexAttribArray(9); //xform y + glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 4); + glVertexAttribDivisor(9, 1); + glEnableVertexAttribArray(10); //xform z + glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 5); + glVertexAttribDivisor(10, 1); + glEnableVertexAttribArray(11); //color + glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + 0); + glVertexAttribDivisor(11, 1); + glEnableVertexAttribArray(12); //custom + glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + stride * split + sizeof(float) * 4 * 2); + glVertexAttribDivisor(12, 1); + + glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, amount - split); + } + + if (split > 0) { + glEnableVertexAttribArray(8); //xform x + glVertexAttribPointer(8, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 3); + glVertexAttribDivisor(8, 1); + glEnableVertexAttribArray(9); //xform y + glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 4); + glVertexAttribDivisor(9, 1); + glEnableVertexAttribArray(10); //xform z + glVertexAttribPointer(10, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 5); + glVertexAttribDivisor(10, 1); + glEnableVertexAttribArray(11); //color + glVertexAttribPointer(11, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + 0); + glVertexAttribDivisor(11, 1); + glEnableVertexAttribArray(12); //custom + glVertexAttribPointer(12, 4, GL_FLOAT, GL_FALSE, stride, ((uint8_t *)NULL) + sizeof(float) * 4 * 2); + glVertexAttribDivisor(12, 1); + + glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, split); + } + } + + glBindVertexArray(0); + + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCE_CUSTOM, false); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_INSTANCING, false); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PARTICLES, false); + state.using_texture_rect = true; + _set_texture_rect_mode(false); + + } break; case Item::Command::TYPE_CIRCLE: { _set_texture_rect_mode(false); @@ -1351,7 +1446,39 @@ void RasterizerCanvasGLES3::initialize() { glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind } + { + //particle quad buffers + + glGenBuffers(1, &data.particle_quad_vertices); + glBindBuffer(GL_ARRAY_BUFFER, data.particle_quad_vertices); + { + //quad of size 1, with pivot on the center for particles, then regular UVS. Color is general plus fetched from particle + const float qv[16] = { + -0.5, -0.5, + 0.0, 0.0, + -0.5, 0.5, + 0.0, 1.0, + 0.5, 0.5, + 1.0, 1.0, + 0.5, -0.5, + 1.0, 0.0 + }; + + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 16, qv, GL_STATIC_DRAW); + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind + glGenVertexArrays(1, &data.particle_quad_array); + glBindVertexArray(data.particle_quad_array); + glBindBuffer(GL_ARRAY_BUFFER, data.particle_quad_vertices); + glEnableVertexAttribArray(VS::ARRAY_VERTEX); + glVertexAttribPointer(VS::ARRAY_VERTEX, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 0); + glEnableVertexAttribArray(VS::ARRAY_TEX_UV); + glVertexAttribPointer(VS::ARRAY_TEX_UV, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, (float *)0 + 2); + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); //unbind + } { uint32_t poly_size = GLOBAL_DEF("rendering/buffers/canvas_polygon_buffer_size_kb", 128); @@ -1428,6 +1555,9 @@ void RasterizerCanvasGLES3::finalize() { glDeleteBuffers(1, &data.canvas_quad_vertices); glDeleteVertexArrays(1, &data.canvas_quad_array); + glDeleteBuffers(1, &data.canvas_quad_vertices); + glDeleteVertexArrays(1, &data.canvas_quad_array); + glDeleteVertexArrays(1, &data.polygon_buffer_pointer_array); } diff --git a/drivers/gles3/rasterizer_canvas_gles3.h b/drivers/gles3/rasterizer_canvas_gles3.h index 4996f0a6b2..5859820364 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.h +++ b/drivers/gles3/rasterizer_canvas_gles3.h @@ -32,7 +32,7 @@ #include "rasterizer_storage_gles3.h" #include "servers/visual/rasterizer.h" -#include "shaders/canvas_shadow.glsl.h" +#include "shaders/canvas_shadow.glsl.gen.h" class RasterizerCanvasGLES3 : public RasterizerCanvas { public: @@ -51,6 +51,10 @@ public: GLuint polygon_buffer_quad_arrays[4]; GLuint polygon_buffer_pointer_array; GLuint polygon_index_buffer; + + GLuint particle_quad_vertices; + GLuint particle_quad_array; + uint32_t polygon_buffer_size; } data; @@ -63,6 +67,7 @@ public: CanvasShadowShaderGLES3 canvas_shadow_shader; bool using_texture_rect; + bool using_ninepatch; RID current_tex; RID current_normal; @@ -107,7 +112,7 @@ public: virtual void canvas_begin(); virtual void canvas_end(); - _FORCE_INLINE_ void _set_texture_rect_mode(bool p_enable); + _FORCE_INLINE_ void _set_texture_rect_mode(bool p_enable, bool p_ninepatch = false); _FORCE_INLINE_ RasterizerStorageGLES3::Texture *_bind_canvas_texture(const RID &p_texture, const RID &p_normal_map); _FORCE_INLINE_ void _draw_gui_primitive(int p_points, const Vector2 *p_vertices, const Color *p_colors, const Vector2 *p_uvs); diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 913aa62452..96c3da99f0 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -977,6 +977,27 @@ void RasterizerSceneGLES3::environment_set_fog_height(RID p_env, bool p_enable, env->fog_height_curve = p_height_curve; } +bool RasterizerSceneGLES3::is_environment(RID p_env) { + + return environment_owner.owns(p_env); +} + +VS::EnvironmentBG RasterizerSceneGLES3::environment_get_background(RID p_env) { + + const Environment *env = environment_owner.getornull(p_env); + ERR_FAIL_COND_V(!env, VS::ENV_BG_MAX); + + return env->bg_mode; +} + +int RasterizerSceneGLES3::environment_get_canvas_max_layer(RID p_env) { + + const Environment *env = environment_owner.getornull(p_env); + ERR_FAIL_COND_V(!env, -1); + + return env->canvas_max_layer; +} + RID RasterizerSceneGLES3::light_instance_create(RID p_light) { LightInstance *light_instance = memnew(LightInstance); @@ -3561,7 +3582,7 @@ void RasterizerSceneGLES3::_post_process(Environment *env, const CameraMatrix &p glUniform2iv(state.exposure_shader.get_uniform(ExposureShaderGLES3::SOURCE_RENDER_SIZE), 1, ss); glUniform2iv(state.exposure_shader.get_uniform(ExposureShaderGLES3::TARGET_SIZE), 1, ds); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->buffers.diffuse); + glBindTexture(GL_TEXTURE_2D, composite_from); glBindFramebuffer(GL_FRAMEBUFFER, exposure_shrink[0].fbo); glViewport(0, 0, exposure_shrink_size, exposure_shrink_size); @@ -3957,6 +3978,7 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const use_mrt = use_mrt && !storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_TRANSPARENT]; use_mrt = use_mrt && !storage->frame.current_rt->flags[RasterizerStorage::RENDER_TARGET_NO_3D_EFFECTS]; use_mrt = use_mrt && state.debug_draw != VS::VIEWPORT_DEBUG_DRAW_OVERDRAW; + use_mrt = use_mrt && env && (env->bg_mode != VS::ENV_BG_KEEP && env->bg_mode != VS::ENV_BG_CANVAS); glViewport(0, 0, storage->frame.current_rt->width, storage->frame.current_rt->height); @@ -4020,6 +4042,10 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const storage->frame.clear_request = false; } + } else if (env->bg_mode == VS::ENV_BG_CANVAS) { + + clear_color = env->bg_color.to_linear(); + storage->frame.clear_request = false; } else if (env->bg_mode == VS::ENV_BG_COLOR) { clear_color = env->bg_color.to_linear(); @@ -4037,7 +4063,39 @@ void RasterizerSceneGLES3::render_scene(const Transform &p_cam_transform, const storage->frame.clear_request = false; } - glClearBufferfv(GL_COLOR, 0, clear_color.components); // specular + if (!env || env->bg_mode != VS::ENV_BG_KEEP) { + glClearBufferfv(GL_COLOR, 0, clear_color.components); // specular + } + + if (env && env->bg_mode == VS::ENV_BG_CANVAS) { + //copy canvas to 3d buffer and convert it to linear + + glDisable(GL_BLEND); + glDepthMask(GL_FALSE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color); + + storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, true); + + storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, true); + + storage->shaders.copy.bind(); + + _copy_screen(); + + //turn off everything used + storage->shaders.copy.set_conditional(CopyShaderGLES3::SRGB_TO_LINEAR, false); + storage->shaders.copy.set_conditional(CopyShaderGLES3::DISABLE_ALPHA, false); + + //restore + glEnable(GL_BLEND); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + } state.texscreen_copied = false; diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 3e15da52ab..5f0db446a9 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -33,17 +33,17 @@ /* Must come before shaders or the Windows build fails... */ #include "rasterizer_storage_gles3.h" -#include "drivers/gles3/shaders/cube_to_dp.glsl.h" -#include "drivers/gles3/shaders/effect_blur.glsl.h" -#include "drivers/gles3/shaders/exposure.glsl.h" -#include "drivers/gles3/shaders/resolve.glsl.h" -#include "drivers/gles3/shaders/scene.glsl.h" -#include "drivers/gles3/shaders/screen_space_reflection.glsl.h" -#include "drivers/gles3/shaders/ssao.glsl.h" -#include "drivers/gles3/shaders/ssao_blur.glsl.h" -#include "drivers/gles3/shaders/ssao_minify.glsl.h" -#include "drivers/gles3/shaders/subsurf_scattering.glsl.h" -#include "drivers/gles3/shaders/tonemap.glsl.h" +#include "drivers/gles3/shaders/cube_to_dp.glsl.gen.h" +#include "drivers/gles3/shaders/effect_blur.glsl.gen.h" +#include "drivers/gles3/shaders/exposure.glsl.gen.h" +#include "drivers/gles3/shaders/resolve.glsl.gen.h" +#include "drivers/gles3/shaders/scene.glsl.gen.h" +#include "drivers/gles3/shaders/screen_space_reflection.glsl.gen.h" +#include "drivers/gles3/shaders/ssao.glsl.gen.h" +#include "drivers/gles3/shaders/ssao_blur.glsl.gen.h" +#include "drivers/gles3/shaders/ssao_minify.glsl.gen.h" +#include "drivers/gles3/shaders/subsurf_scattering.glsl.gen.h" +#include "drivers/gles3/shaders/tonemap.glsl.gen.h" class RasterizerSceneGLES3 : public RasterizerScene { public: @@ -536,6 +536,11 @@ public: virtual void environment_set_fog_depth(RID p_env, bool p_enable, float p_depth_begin, float p_depth_curve, bool p_transmit, float p_transmit_curve); virtual void environment_set_fog_height(RID p_env, bool p_enable, float p_min_height, float p_max_height, float p_height_curve); + virtual bool is_environment(RID p_env); + + virtual VS::EnvironmentBG environment_get_background(RID p_env); + virtual int environment_get_canvas_max_layer(RID p_env); + /* LIGHT INSTANCE */ struct LightDataUBO { diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 85331342e9..24a57b772b 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -2326,6 +2326,9 @@ void RasterizerStorageGLES3::_update_material(Material *material) { if (E->get().order < 0) continue; // texture, does not go here + //if (material->shader->mode == VS::SHADER_PARTICLES) { + // print_line("uniform " + String(E->key()) + " order " + itos(E->get().order) + " offset " + itos(material->shader->ubo_offsets[E->get().order])); + //} //regular uniform uint8_t *data = &local_ubo[material->shader->ubo_offsets[E->get().order]]; @@ -5065,6 +5068,14 @@ void RasterizerStorageGLES3::particles_set_lifetime(RID p_particles, float p_lif ERR_FAIL_COND(!particles); particles->lifetime = p_lifetime; } + +void RasterizerStorageGLES3::particles_set_one_shot(RID p_particles, bool p_one_shot) { + + Particles *particles = particles_owner.getornull(p_particles); + ERR_FAIL_COND(!particles); + particles->one_shot = p_one_shot; +} + void RasterizerStorageGLES3::particles_set_pre_process_time(RID p_particles, float p_time) { Particles *particles = particles_owner.getornull(p_particles); @@ -5196,6 +5207,14 @@ void RasterizerStorageGLES3::particles_set_draw_pass_mesh(RID p_particles, int p particles->draw_passes[p_pass] = p_mesh; } +void RasterizerStorageGLES3::particles_restart(RID p_particles) { + + Particles *particles = particles_owner.getornull(p_particles); + ERR_FAIL_COND(!particles); + + particles->restart_request = true; +} + void RasterizerStorageGLES3::particles_request_process(RID p_particles) { Particles *particles = particles_owner.getornull(p_particles); @@ -5285,7 +5304,12 @@ void RasterizerStorageGLES3::_particles_process(Particles *particles, float p_de if (particles->clear) { particles->cycle_number = 0; + particles->random_seed = Math::rand(); } else if (new_phase < particles->phase) { + if (particles->one_shot) { + particles->emitting = false; + shaders.particles.set_uniform(ParticlesShaderGLES3::EMITTING, false); + } particles->cycle_number++; } @@ -5295,6 +5319,8 @@ void RasterizerStorageGLES3::_particles_process(Particles *particles, float p_de shaders.particles.set_uniform(ParticlesShaderGLES3::DELTA, p_delta * particles->speed_scale); shaders.particles.set_uniform(ParticlesShaderGLES3::CLEAR, particles->clear); + glUniform1ui(shaders.particles.get_uniform_location(ParticlesShaderGLES3::RANDOM_SEED), particles->random_seed); + if (particles->use_local_coords) shaders.particles.set_uniform(ParticlesShaderGLES3::EMISSION_TRANSFORM, Transform()); else @@ -5350,6 +5376,44 @@ void RasterizerStorageGLES3::update_particles() { Particles *particles = particle_update_list.first()->self(); + if (particles->restart_request) { + particles->emitting = true; //restart from zero + particles->prev_ticks = 0; + particles->phase = 0; + particles->prev_phase = 0; + particles->clear = true; + particles->particle_valid_histories[0] = false; + particles->particle_valid_histories[1] = false; + particles->restart_request = false; + } + + if (particles->inactive && !particles->emitting) { + + particle_update_list.remove(particle_update_list.first()); + continue; + } + + if (particles->emitting) { + if (particles->inactive) { + //restart system from scratch + particles->prev_ticks = 0; + particles->phase = 0; + particles->prev_phase = 0; + particles->clear = true; + particles->particle_valid_histories[0] = false; + particles->particle_valid_histories[1] = false; + } + particles->inactive = false; + particles->inactive_time = 0; + } else { + particles->inactive_time += particles->speed_scale * frame.delta; + if (particles->inactive_time > particles->lifetime * 1.2) { + particles->inactive = true; + particle_update_list.remove(particle_update_list.first()); + continue; + } + } + Material *material = material_owner.getornull(particles->process_material); if (!material || !material->shader || material->shader->mode != VS::SHADER_PARTICLES) { diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index ca0194bd5e..2ef47fe2cb 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -35,11 +35,11 @@ #include "servers/visual/shader_language.h" #include "shader_compiler_gles3.h" #include "shader_gles3.h" -#include "shaders/blend_shape.glsl.h" -#include "shaders/canvas.glsl.h" -#include "shaders/copy.glsl.h" -#include "shaders/cubemap_filter.glsl.h" -#include "shaders/particles.glsl.h" +#include "shaders/blend_shape.glsl.gen.h" +#include "shaders/canvas.glsl.gen.h" +#include "shaders/copy.glsl.gen.h" +#include "shaders/cubemap_filter.glsl.gen.h" +#include "shaders/particles.glsl.gen.h" class RasterizerCanvasGLES3; class RasterizerSceneGLES3; @@ -1033,12 +1033,16 @@ public: struct Particles : public GeometryOwner { + bool inactive; + float inactive_time; bool emitting; + bool one_shot; int amount; float lifetime; float pre_process_time; float explosiveness; float randomness; + bool restart_request; Rect3 custom_aabb; bool use_local_coords; RID process_material; @@ -1060,6 +1064,7 @@ public: float phase; float prev_phase; uint64_t prev_ticks; + uint32_t random_seed; uint32_t cycle_number; @@ -1077,6 +1082,7 @@ public: : particle_element(this) { cycle_number = 0; emitting = false; + one_shot = false; amount = 0; lifetime = 1.0; pre_process_time = 0.0; @@ -1088,6 +1094,9 @@ public: frame_remainder = 0; histories_enabled = false; speed_scale = 1.0; + random_seed = 0; + + restart_request = false; custom_aabb = Rect3(Vector3(-4, -4, -4), Vector3(8, 8, 8)); @@ -1098,6 +1107,8 @@ public: prev_ticks = 0; clear = true; + inactive = true; + inactive_time = false; glGenBuffers(2, particle_buffers); glGenVertexArrays(2, particle_vaos); @@ -1125,6 +1136,7 @@ public: virtual void particles_set_emitting(RID p_particles, bool p_emitting); virtual void particles_set_amount(RID p_particles, int p_amount); virtual void particles_set_lifetime(RID p_particles, float p_lifetime); + virtual void particles_set_one_shot(RID p_particles, bool p_one_shot); virtual void particles_set_pre_process_time(RID p_particles, float p_time); virtual void particles_set_explosiveness_ratio(RID p_particles, float p_ratio); virtual void particles_set_randomness_ratio(RID p_particles, float p_ratio); @@ -1134,6 +1146,7 @@ public: virtual void particles_set_process_material(RID p_particles, RID p_material); virtual void particles_set_fixed_fps(RID p_particles, int p_fps); virtual void particles_set_fractional_delta(RID p_particles, bool p_enable); + virtual void particles_restart(RID p_particles); virtual void particles_set_draw_order(RID p_particles, VS::ParticlesDrawOrder p_order); diff --git a/drivers/gles3/shader_compiler_gles3.cpp b/drivers/gles3/shader_compiler_gles3.cpp index 3376f99112..41421a3e2f 100644 --- a/drivers/gles3/shader_compiler_gles3.cpp +++ b/drivers/gles3/shader_compiler_gles3.cpp @@ -795,6 +795,7 @@ ShaderCompilerGLES3::ShaderCompilerGLES3() { actions[VS::SHADER_PARTICLES].renames["INDEX"] = "index"; actions[VS::SHADER_PARTICLES].renames["GRAVITY"] = "current_gravity"; actions[VS::SHADER_PARTICLES].renames["EMISSION_TRANSFORM"] = "emission_transform"; + actions[VS::SHADER_PARTICLES].renames["RANDOM_SEED"] = "random_seed"; actions[VS::SHADER_SPATIAL].render_mode_defines["disable_force"] = "#define DISABLE_FORCE\n"; actions[VS::SHADER_SPATIAL].render_mode_defines["disable_velocity"] = "#define DISABLE_VELOCITY\n"; diff --git a/drivers/gles3/shader_gles3.cpp b/drivers/gles3/shader_gles3.cpp index 8c6d15c3b7..e08ef0ad12 100644 --- a/drivers/gles3/shader_gles3.cpp +++ b/drivers/gles3/shader_gles3.cpp @@ -361,6 +361,8 @@ ShaderGLES3::Version *ShaderGLES3::get_current_version() { ERR_FAIL_V(NULL); } + //_display_error_with_code("pepo", strings); + /* FRAGMENT SHADER */ strings.resize(strings_base_size); diff --git a/drivers/gles3/shaders/SCsub b/drivers/gles3/shaders/SCsub index f9baeae97d..0c69c8cf74 100644 --- a/drivers/gles3/shaders/SCsub +++ b/drivers/gles3/shaders/SCsub @@ -1,22 +1,22 @@ +#!/usr/bin/env python + Import('env') if env['BUILDERS'].has_key('GLES3_GLSL'): - env.GLES3_GLSL('copy.glsl'); - env.GLES3_GLSL('resolve.glsl'); - env.GLES3_GLSL('canvas.glsl'); - env.GLES3_GLSL('canvas_shadow.glsl'); - env.GLES3_GLSL('scene.glsl'); - env.GLES3_GLSL('cubemap_filter.glsl'); - env.GLES3_GLSL('cube_to_dp.glsl'); - env.GLES3_GLSL('blend_shape.glsl'); - env.GLES3_GLSL('screen_space_reflection.glsl'); - env.GLES3_GLSL('effect_blur.glsl'); - env.GLES3_GLSL('subsurf_scattering.glsl'); - env.GLES3_GLSL('ssao.glsl'); - env.GLES3_GLSL('ssao_minify.glsl'); - env.GLES3_GLSL('ssao_blur.glsl'); - env.GLES3_GLSL('exposure.glsl'); - env.GLES3_GLSL('tonemap.glsl'); - env.GLES3_GLSL('particles.glsl'); - - + env.GLES3_GLSL('copy.glsl'); + env.GLES3_GLSL('resolve.glsl'); + env.GLES3_GLSL('canvas.glsl'); + env.GLES3_GLSL('canvas_shadow.glsl'); + env.GLES3_GLSL('scene.glsl'); + env.GLES3_GLSL('cubemap_filter.glsl'); + env.GLES3_GLSL('cube_to_dp.glsl'); + env.GLES3_GLSL('blend_shape.glsl'); + env.GLES3_GLSL('screen_space_reflection.glsl'); + env.GLES3_GLSL('effect_blur.glsl'); + env.GLES3_GLSL('subsurf_scattering.glsl'); + env.GLES3_GLSL('ssao.glsl'); + env.GLES3_GLSL('ssao_minify.glsl'); + env.GLES3_GLSL('ssao_blur.glsl'); + env.GLES3_GLSL('exposure.glsl'); + env.GLES3_GLSL('tonemap.glsl'); + env.GLES3_GLSL('particles.glsl'); diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index 7be6ee857a..e97ce62daa 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -11,11 +11,26 @@ uniform vec4 src_rect; #else +#ifdef USE_INSTANCING + +layout(location=8) in highp vec4 instance_xform0; +layout(location=9) in highp vec4 instance_xform1; +layout(location=10) in highp vec4 instance_xform2; +layout(location=11) in lowp vec4 instance_color; + +#ifdef USE_INSTANCE_CUSTOM +layout(location=12) in highp vec4 instance_custom_data; +#endif + +#endif + layout(location=4) in highp vec2 uv_attrib; //skeletn #endif +uniform highp vec2 color_texpixel_size; + layout(std140) uniform CanvasItemData { //ubo:0 @@ -30,6 +45,12 @@ uniform highp mat4 extra_matrix; out mediump vec2 uv_interp; out mediump vec4 color_interp; +#ifdef USE_NINEPATCH + +out highp vec2 pixel_size_interp; +#endif + + #ifdef USE_LIGHTING layout(std140) uniform LightData { //ubo:1 @@ -64,7 +85,10 @@ const bool at_light_pass = true; const bool at_light_pass = false; #endif - +#ifdef USE_PARTICLES +uniform int h_frames; +uniform int v_frames; +#endif VERTEX_SHADER_GLOBALS @@ -82,6 +106,12 @@ void main() { vec4 vertex_color = color_attrib; +#ifdef USE_INSTANCING + mat4 extra_matrix2 = extra_matrix * transpose(mat4(instance_xform0,instance_xform1,instance_xform2,vec4(0.0,0.0,0.0,1.0))); + vertex_color*=instance_color; +#else + mat4 extra_matrix2 = extra_matrix; +#endif #ifdef USE_TEXTURE_RECT @@ -95,6 +125,22 @@ void main() { #endif +#ifdef USE_PARTICLES + //scale by texture size + outvec.xy/=color_texpixel_size; + + //compute h and v frames and adjust UV interp for animation + int total_frames = h_frames * v_frames; + int frame = min(int(float(total_frames) *instance_custom_data.z),total_frames-1); + float frame_w = 1.0/float(h_frames); + float frame_h = 1.0/float(v_frames); + uv_interp.x = uv_interp.x * frame_w + frame_w * float(frame % h_frames); + uv_interp.y = uv_interp.y * frame_h + frame_h * float(frame / v_frames); + +#endif + +#define extra_matrix extra_matrix2 + { vec2 src_vtx=outvec.xy; @@ -102,11 +148,19 @@ VERTEX_SHADER_CODE } + +#ifdef USE_NINEPATCH + + pixel_size_interp=abs(dst_rect.zw) * vertex; +#endif + #if !defined(SKIP_TRANSFORM_USED) outvec = extra_matrix * outvec; outvec = modelview_matrix * outvec; #endif +#undef extra_matrix + color_interp = vertex_color; #ifdef USE_PIXEL_SNAP @@ -235,6 +289,58 @@ uniform vec4 dst_rect; uniform vec4 src_rect; uniform bool clip_rect_uv; +#ifdef USE_NINEPATCH + +in highp vec2 pixel_size_interp; + +uniform int np_repeat_v; +uniform int np_repeat_h; +uniform bool np_draw_center; +//left top right bottom in pixel coordinates +uniform vec4 np_margins; + + + +float map_ninepatch_axis(float pixel, float draw_size,float tex_pixel_size,float margin_begin,float margin_end,int np_repeat,inout int draw_center) { + + + float tex_size = 1.0/tex_pixel_size; + + if (pixel < margin_begin) { + return pixel * tex_pixel_size; + } else if (pixel >= draw_size-margin_end) { + return (tex_size-(draw_size-pixel)) * tex_pixel_size; + } else { + if (!np_draw_center){ + draw_center--; + } + + if (np_repeat==0) { //stretch + //convert to ratio + float ratio = (pixel - margin_begin) / (draw_size - margin_begin - margin_end); + //scale to source texture + return (margin_begin + ratio * (tex_size - margin_begin - margin_end)) * tex_pixel_size; + } else if (np_repeat==1) { //tile + //convert to ratio + float ofs = mod((pixel - margin_begin), tex_size - margin_begin - margin_end); + //scale to source texture + return (margin_begin + ofs) * tex_pixel_size; + } else if (np_repeat==2) { //tile fit + //convert to ratio + float src_area = draw_size - margin_begin - margin_end; + float dst_area = tex_size - margin_begin - margin_end; + float scale = max(1.0,floor(src_area / max(dst_area,0.0000001) + 0.5)); + + //convert to ratio + float ratio = (pixel - margin_begin) / src_area; + ratio = mod(ratio * scale,1.0); + return (margin_begin + ratio * dst_area) * tex_pixel_size; + } + } + +} + +#endif #endif uniform bool use_default_normal; @@ -245,6 +351,22 @@ void main() { vec2 uv = uv_interp; #ifdef USE_TEXTURE_RECT + +#ifdef USE_NINEPATCH + + int draw_center=2; + uv = vec2( + map_ninepatch_axis(pixel_size_interp.x,abs(dst_rect.z),color_texpixel_size.x,np_margins.x,np_margins.z,np_repeat_h,draw_center), + map_ninepatch_axis(pixel_size_interp.y,abs(dst_rect.w),color_texpixel_size.y,np_margins.y,np_margins.w,np_repeat_v,draw_center) + ); + + if (draw_center==0) { + color.a=0; + } + + uv = uv*src_rect.zw+src_rect.xy; //apply region if needed +#endif + if (clip_rect_uv) { vec2 half_texpixel = color_texpixel_size * 0.5; @@ -267,6 +389,8 @@ void main() { #endif + + vec3 normal; #if defined(NORMAL_USED) diff --git a/drivers/gles3/shaders/copy.glsl b/drivers/gles3/shaders/copy.glsl index 4c8648903e..b0fb525e20 100644 --- a/drivers/gles3/shaders/copy.glsl +++ b/drivers/gles3/shaders/copy.glsl @@ -129,6 +129,11 @@ void main() { color.rgb = mix( (vec3(1.0)+a)*pow(color.rgb,vec3(1.0/2.4))-a , 12.92*color.rgb , lessThan(color.rgb,vec3(0.0031308))); #endif +#ifdef SRGB_TO_LINEAR + + color.rgb = mix(pow((color.rgb + vec3(0.055)) * (1.0 / (1 + 0.055)),vec3(2.4)),color.rgb * (1.0 / 12.92),lessThan(color.rgb,vec3(0.04045))); +#endif + #ifdef DEBUG_GRADIENT color.rg=uv_interp; color.b=0.0; diff --git a/drivers/gles3/shaders/particles.glsl b/drivers/gles3/shaders/particles.glsl index 7e7b083f73..ec2577538c 100644 --- a/drivers/gles3/shaders/particles.glsl +++ b/drivers/gles3/shaders/particles.glsl @@ -37,6 +37,7 @@ uniform bool clear; uniform uint cycle; uniform float lifetime; uniform mat4 emission_transform; +uniform uint random_seed; out highp vec4 out_color; //tfb: @@ -104,7 +105,9 @@ void main() { bool shader_active = velocity_active.a > 0.5; if (system_phase > prev_system_phase) { - if (prev_system_phase < restart_phase && system_phase >= restart_phase) { + // restart_phase >= prev_system_phase is used so particles emit in the first frame they are processed + + if (restart_phase >= prev_system_phase && restart_phase < system_phase ) { restart=true; #ifdef USE_FRACTIONAL_DELTA local_delta = (system_phase - restart_phase) * lifetime; @@ -112,12 +115,12 @@ void main() { } } else { - if (prev_system_phase < restart_phase) { + if (restart_phase >= prev_system_phase) { restart=true; #ifdef USE_FRACTIONAL_DELTA local_delta = (1.0 - restart_phase + system_phase) * lifetime; #endif - } else if (system_phase >= restart_phase) { + } else if (restart_phase < system_phase ) { restart=true; #ifdef USE_FRACTIONAL_DELTA local_delta = (system_phase - restart_phase) * lifetime; diff --git a/drivers/unix/SCsub b/drivers/unix/SCsub index 3766e782e4..96efc91b7a 100644 --- a/drivers/unix/SCsub +++ b/drivers/unix/SCsub @@ -8,7 +8,7 @@ g_set_p += 'String OS_Unix::get_global_settings_path() const {\n' g_set_p += '\treturn "' + env["unix_global_settings_path"] + '";\n' g_set_p += '}\n' g_set_p += '#endif' -f = open("os_unix_global_settings_path.cpp", "wb") +f = open("os_unix_global_settings_path.gen.cpp", "wb") f.write(g_set_p) f.close() diff --git a/editor/SCsub b/editor/SCsub index c46e443534..ffdeed1523 100644 --- a/editor/SCsub +++ b/editor/SCsub @@ -176,7 +176,7 @@ if (env["tools"] == "yes"): reg_exporters += '\tregister_' + e + '_exporter();\n' reg_exporters_inc += '#include "platform/' + e + '/export/export.h"\n' reg_exporters += '}\n' - f = open("register_exporters.cpp", "wb") + f = open("register_exporters.gen.cpp", "wb") f.write(reg_exporters_inc) f.write(reg_exporters) f.close() @@ -189,12 +189,12 @@ if (env["tools"] == "yes"): docfile = os.path.join(curmodle, "classes.xml") if os.path.isdir(curmodle) and os.path.isfile(docfile): docs.append(docfile) - env.Depends("#editor/doc_data_compressed.h", docs) - env.Command("#editor/doc_data_compressed.h", docs, make_doc_header) + env.Depends("#editor/doc_data_compressed.gen.h", docs) + env.Command("#editor/doc_data_compressed.gen.h", docs, make_doc_header) # Certificates - env.Depends("#editor/certs_compressed.h", "#thirdparty/certs/ca-certificates.crt") - env.Command("#editor/certs_compressed.h", "#thirdparty/certs/ca-certificates.crt", make_certs_header) + env.Depends("#editor/certs_compressed.gen.h", "#thirdparty/certs/ca-certificates.crt") + env.Command("#editor/certs_compressed.gen.h", "#thirdparty/certs/ca-certificates.crt", make_certs_header) import glob path = env.Dir('.').abspath @@ -202,19 +202,19 @@ if (env["tools"] == "yes"): # Translations tlist = glob.glob(path + "/translations/*.po") print("translations: ", tlist) - env.Depends('#editor/translations.h', tlist) - env.Command('#editor/translations.h', tlist, make_translations_header) + env.Depends('#editor/translations.gen.h', tlist) + env.Command('#editor/translations.gen.h', tlist, make_translations_header) # Fonts flist = glob.glob(path + "/../thirdparty/fonts/*.ttf") flist.append(glob.glob(path + "/../thirdparty/fonts/*.otf")) print("fonts: ", flist) - env.Depends('#editor/builtin_fonts.h', flist) - env.Command('#editor/builtin_fonts.h', flist, make_fonts_header) + env.Depends('#editor/builtin_fonts.gen.h', flist) + env.Command('#editor/builtin_fonts.gen.h', flist, make_fonts_header) # Authors - env.Depends('#editor/authors.h', "../AUTHORS.md") - env.Command('#editor/authors.h', "../AUTHORS.md", make_authors_header) + env.Depends('#editor/authors.gen.h', "../AUTHORS.md") + env.Command('#editor/authors.gen.h', "../AUTHORS.md", make_authors_header) env.add_source_files(env.editor_sources, "*.cpp") diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index 0873b90f22..4a85b4e2ef 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "editor_fonts.h" -#include "builtin_fonts.h" +#include "builtin_fonts.gen.h" #include "doc_code_font.h" #include "doc_font.h" #include "doc_title_font.h" diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 11cb61370d..5089468e1d 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "editor_help.h" -#include "doc_data_compressed.h" +#include "doc_data_compressed.gen.h" #include "editor/plugins/script_editor_plugin.h" #include "editor_node.h" #include "editor_settings.h" diff --git a/editor/editor_initialize_ssl.cpp b/editor/editor_initialize_ssl.cpp index 23a033f6fb..290ade277e 100644 --- a/editor/editor_initialize_ssl.cpp +++ b/editor/editor_initialize_ssl.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "editor_initialize_ssl.h" -#include "certs_compressed.h" +#include "certs_compressed.gen.h" #include "io/compression.h" #include "io/stream_peer_ssl.h" diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 3a0825be9b..ddf7bc24cb 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -30,7 +30,7 @@ #include "editor_node.h" #include "animation_editor.h" -#include "authors.h" +#include "authors.gen.h" #include "bind/core_bind.h" #include "class_db.h" #include "core/io/resource_loader.h" @@ -77,7 +77,6 @@ #include "plugins/curve_editor_plugin.h" #include "plugins/gi_probe_editor_plugin.h" #include "plugins/gradient_editor_plugin.h" -#include "plugins/gradient_texture_editor_plugin.h" #include "plugins/item_list_editor_plugin.h" #include "plugins/light_occluder_2d_editor_plugin.h" #include "plugins/line_2d_editor_plugin.h" @@ -962,6 +961,23 @@ void EditorNode::_save_scene(String p_file, int idx) { } } +void EditorNode::_save_all_scenes() { + + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + Node *scene = editor_data.get_edited_scene_root(i); + if (scene && scene->get_filename() != "") { + // save in background if in the script editor + if (i != editor_data.get_edited_scene() || _get_current_main_editor() == EDITOR_SCRIPT) { + _save_scene(scene->get_filename(), i); + } else { + _save_scene_with_preview(scene->get_filename()); + } + } // else: ignore new scenes + } + + _save_default_environment(); +} + void EditorNode::_import_action(const String &p_action) { #if 0 import_confirmation->hide(); @@ -1118,14 +1134,26 @@ void EditorNode::_dialog_action(String p_file) { get_undo_redo()->clear_history(); } break; + case FILE_CLOSE: + case FILE_CLOSE_ALL_AND_QUIT: + case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER: + case SCENE_TAB_CLOSE: case FILE_SAVE_SCENE: case FILE_SAVE_AS_SCENE: { + int scene_idx = (current_option == FILE_SAVE_SCENE || current_option == FILE_SAVE_AS_SCENE) ? -1 : tab_closing; + if (file->get_mode() == EditorFileDialog::MODE_SAVE_FILE) { //_save_scene(p_file); _save_default_environment(); - _save_scene_with_preview(p_file); + if (scene_idx != editor_data.get_edited_scene() || _get_current_main_editor() == EDITOR_SCRIPT) + _save_scene(p_file, scene_idx); + else + _save_scene_with_preview(p_file); + + if (scene_idx != -1) + _discard_changes(); } } break; @@ -1624,6 +1652,7 @@ void EditorNode::_resource_selected(const RES &p_res, const String &p_property) return; RES r = p_res; + EditorNode::get_singleton()->get_import_dock()->set_edit_path(r->get_path()); push_item(r.operator->(), p_property); } @@ -1887,42 +1916,45 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { open_request(previous_scenes.back()->get()); } break; + case FILE_CLOSE_ALL_AND_QUIT: + case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER: case FILE_CLOSE: { - if (!p_confirmed && unsaved_cache) { - confirmation->get_ok()->set_text(TTR("Yes")); - //confirmation->get_cancel()->show(); - confirmation->set_text(TTR("Close scene? (Unsaved changes will be lost)")); - confirmation->popup_centered_minsize(); + if (!p_confirmed && (unsaved_cache || p_option == FILE_CLOSE_ALL_AND_QUIT || p_option == FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER)) { + tab_closing = p_option == FILE_CLOSE ? editor_data.get_edited_scene() : _next_unsaved_scene(); + String scene_filename = editor_data.get_edited_scene_root(tab_closing)->get_filename(); + save_confirmation->get_ok()->set_text(TTR("Save & Close")); + save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene_filename != "" ? scene_filename : "unsaved scene")); + save_confirmation->popup_centered_minsize(); break; } - - _remove_edited_scene(); - - } break; - case SCENE_TAB_CLOSE: { - _remove_scene(tab_closing); - _update_scene_tabs(); - current_option = -1; - } break; + } // fallthrough + case SCENE_TAB_CLOSE: case FILE_SAVE_SCENE: { - Node *scene = editor_data.get_edited_scene_root(); + int scene_idx = (p_option == FILE_SAVE_SCENE) ? -1 : tab_closing; + + Node *scene = editor_data.get_edited_scene_root(scene_idx); if (scene && scene->get_filename() != "") { // save in background if in the script editor - if (_get_current_main_editor() == EDITOR_SCRIPT) { - _save_scene(scene->get_filename()); + if (scene_idx != editor_data.get_edited_scene() || _get_current_main_editor() == EDITOR_SCRIPT) { + _save_scene(scene->get_filename(), scene_idx); } else { _save_scene_with_preview(scene->get_filename()); } - return; - }; + + if (scene_idx != -1) + _discard_changes(); + + break; + } // fallthrough to save_as }; case FILE_SAVE_AS_SCENE: { + int scene_idx = (p_option == FILE_SAVE_SCENE || p_option == FILE_SAVE_AS_SCENE) ? -1 : tab_closing; - Node *scene = editor_data.get_edited_scene_root(); + Node *scene = editor_data.get_edited_scene_root(scene_idx); if (!scene) { @@ -1958,7 +1990,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { String existing; if (extensions.size()) { - String root_name(get_edited_scene()->get_name()); + String root_name(scene->get_name()); existing = root_name + "." + extensions.front()->get().to_lower(); } file->set_current_path(existing); @@ -1969,19 +2001,8 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case FILE_SAVE_ALL_SCENES: { - for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { - Node *scene = editor_data.get_edited_scene_root(i); - if (scene && scene->get_filename() != "") { - // save in background if in the script editor - if (i != editor_data.get_edited_scene() || _get_current_main_editor() == EDITOR_SCRIPT) { - _save_scene(scene->get_filename(), i); - } else { - _save_scene_with_preview(scene->get_filename()); - } - } // else: ignore new scenes - } - _save_default_environment(); + _save_all_scenes(); } break; case FILE_SAVE_BEFORE_RUN: { if (!p_confirmed) { @@ -2100,22 +2121,6 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; - case FILE_QUIT: { - - if (!p_confirmed) { - - confirmation->get_ok()->set_text(TTR("Quit")); - //confirmation->get_cancel()->show(); - confirmation->set_text(TTR("Exit the editor?")); - confirmation->popup_centered(Size2(180, 70) * EDSCALE); - break; - } - - _menu_option_confirm(RUN_STOP, true); - exiting = true; - get_tree()->quit(); - - } break; case FILE_EXTERNAL_OPEN_SCENE: { if (unsaved_cache && !p_confirmed) { @@ -2444,28 +2449,53 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { project_settings->popup_project_settings(); } break; + case FILE_QUIT: case RUN_PROJECT_MANAGER: { if (!p_confirmed) { - confirmation->get_ok()->set_text(TTR("Yes")); - confirmation->set_text(TTR("Open Project Manager? \n(Unsaved changes will be lost)")); - confirmation->popup_centered_minsize(); - break; - } + if (_next_unsaved_scene() == -1) { - _menu_option_confirm(RUN_STOP, true); - exiting = true; - get_tree()->quit(); - String exec = OS::get_singleton()->get_executable_path(); + bool confirm = EDITOR_DEF("interface/quit_confirmation", true); + if (confirm) { - List<String> args; - args.push_back("-path"); - args.push_back(exec.get_base_dir()); - args.push_back("-pm"); + confirmation->get_ok()->set_text(p_option == FILE_QUIT ? TTR("Quit") : TTR("Yes")); + confirmation->set_text(p_option == FILE_QUIT ? TTR("Exit the editor?") : TTR("Open Project Manager?")); + confirmation->popup_centered_minsize(); + } else { + _discard_changes(); + } + } else { - OS::ProcessID pid = 0; - Error err = OS::get_singleton()->execute(exec, args, false, &pid); - ERR_FAIL_COND(err); + bool save_each = EDITOR_DEF("interface/save_each_scene_on_quit", true); + if (save_each) { + + _menu_option_confirm(p_option == FILE_QUIT ? FILE_CLOSE_ALL_AND_QUIT : FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER, false); + } else { + + String unsaved_scenes; + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + int current = editor_data.get_edited_scene(); + bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0; + if (unsaved) { + + String scene_filename = editor_data.get_edited_scene_root(i)->get_filename(); + unsaved_scenes += "\n " + scene_filename; + } + } + + save_confirmation->get_ok()->set_text(TTR("Save & Quit")); + save_confirmation->set_text((p_option == FILE_QUIT ? TTR("Save changes to the following scene(s) before quitting?") : TTR("Save changes the following scene(s) before opening Project Manager?")) + unsaved_scenes); + save_confirmation->popup_centered_minsize(); + } + } + + break; + } + + if (_next_unsaved_scene() != -1) { + _save_all_scenes(); + } + _discard_changes(); } break; case RUN_FILE_SERVER: { @@ -2691,6 +2721,70 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } } +int EditorNode::_next_unsaved_scene() { + + for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { + + int current = editor_data.get_edited_scene(); + bool unsaved = (i == current) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(i) != 0; + if (unsaved) { + return i; + } + } + return -1; +} + +void EditorNode::_discard_changes(const String &p_str) { + + switch (current_option) { + + case FILE_CLOSE_ALL_AND_QUIT: + case FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER: + case FILE_CLOSE: + case SCENE_TAB_CLOSE: { + + _remove_scene(tab_closing); + _update_scene_tabs(); + + if (current_option == FILE_CLOSE_ALL_AND_QUIT || current_option == FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER) { + int next_scene = _next_unsaved_scene(); + if (next_scene == -1) { + current_option = current_option == FILE_CLOSE_ALL_AND_QUIT ? FILE_QUIT : RUN_PROJECT_MANAGER; + _discard_changes(); + } else { + tab_closing = next_scene; + _menu_option_confirm(current_option, false); + } + } else { + current_option = -1; + save_confirmation->hide(); + } + } break; + case FILE_QUIT: { + + _menu_option_confirm(RUN_STOP, true); + exiting = true; + get_tree()->quit(); + } break; + case RUN_PROJECT_MANAGER: { + + _menu_option_confirm(RUN_STOP, true); + exiting = true; + get_tree()->quit(); + String exec = OS::get_singleton()->get_executable_path(); + + List<String> args; + args.push_back("-path"); + args.push_back(exec.get_base_dir()); + args.push_back("-pm"); + + OS::ProcessID pid = 0; + Error err = OS::get_singleton()->execute(exec, args, false, &pid); + ERR_FAIL_COND(err); + } break; + } +} + void EditorNode::_update_debug_options() { bool check_deploy_remote = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", false); @@ -4262,19 +4356,17 @@ void EditorNode::_scene_tab_script_edited(int p_tab) { void EditorNode::_scene_tab_closed(int p_tab) { current_option = SCENE_TAB_CLOSE; tab_closing = p_tab; + Node *scene = editor_data.get_edited_scene_root(p_tab); bool unsaved = (p_tab == editor_data.get_edited_scene()) ? saved_version != editor_data.get_undo_redo().get_version() : editor_data.get_scene_version(p_tab) != 0; if (unsaved) { - confirmation->get_ok()->set_text(TTR("Yes")); - - //confirmation->get_cancel()->show(); - confirmation->set_text(TTR("Close scene? (Unsaved changes will be lost)")); - confirmation->popup_centered_minsize(); + save_confirmation->get_ok()->set_text(TTR("Save & Close")); + save_confirmation->set_text(vformat(TTR("Save changes to '%s' before closing?"), scene->get_filename() != "" ? scene->get_filename() : "unsaved scene")); + save_confirmation->popup_centered_minsize(); } else { - _remove_scene(p_tab); - _update_scene_tabs(); + _discard_changes(); } } @@ -4892,6 +4984,7 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_scene_tab_script_edited", &EditorNode::_scene_tab_script_edited); ClassDB::bind_method("_set_main_scene_state", &EditorNode::_set_main_scene_state); ClassDB::bind_method("_update_scene_tabs", &EditorNode::_update_scene_tabs); + ClassDB::bind_method("_discard_changes", &EditorNode::_discard_changes); ClassDB::bind_method("_prepare_history", &EditorNode::_prepare_history); ClassDB::bind_method("_select_history", &EditorNode::_select_history); @@ -5311,36 +5404,6 @@ EditorNode::EditorNode() { top_region->add_child(left_menu_hb); menu_hb->add_child(top_region); - PopupMenu *p; - - project_menu = memnew(MenuButton); - project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools.")); - project_menu->set_text(TTR("Project")); - project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); - left_menu_hb->add_child(project_menu); - - p = project_menu->get_popup(); - p->connect("id_pressed", this, "_menu_option"); - p->add_item(TTR("Run Script"), FILE_RUN_SCRIPT, KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_R); - p->add_item(TTR("Export"), FILE_EXPORT_PROJECT); - - PopupMenu *tool_menu = memnew(PopupMenu); - tool_menu->set_name("Tools"); - tool_menu->connect("id_pressed", this, "_menu_option"); - p->add_child(tool_menu); - p->add_submenu_item(TTR("Tools"), "Tools"); - tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES); - p->add_separator(); - p->add_item(TTR("Project Settings"), RUN_SETTINGS); - p->add_separator(); - -#ifdef OSX_ENABLED - p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q); -#else - p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Q); -#endif - p->add_item(TTR("Quit"), FILE_QUIT, KEY_MASK_CMD + KEY_Q); - file_menu = memnew(MenuButton); file_menu->set_text(TTR("Scene")); //file_menu->set_icon(gui_base->get_icon("Save","EditorIcons")); @@ -5360,6 +5423,7 @@ EditorNode::EditorNode() { ED_SHORTCUT("editor/next_tab", TTR("Next tab"), KEY_MASK_CMD + KEY_TAB); ED_SHORTCUT("editor/prev_tab", TTR("Previous tab"), KEY_MASK_CMD + KEY_MASK_SHIFT + KEY_TAB); ED_SHORTCUT("editor/filter_files", TTR("Filter Files.."), KEY_MASK_ALT + KEY_MASK_CMD + KEY_P); + PopupMenu *p; file_menu->set_tooltip(TTR("Operations with scene files.")); p = file_menu->get_popup(); @@ -5379,7 +5443,6 @@ EditorNode::EditorNode() { p->add_shortcut(ED_SHORTCUT("editor/quick_open_scene", TTR("Quick Open Scene.."), KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCENE); p->add_shortcut(ED_SHORTCUT("editor/quick_open_script", TTR("Quick Open Script.."), KEY_MASK_ALT + KEY_MASK_CMD + KEY_O), FILE_QUICK_OPEN_SCRIPT); p->add_separator(); - PopupMenu *pm_export = memnew(PopupMenu); pm_export->set_name("Export"); p->add_child(pm_export); @@ -5405,6 +5468,35 @@ EditorNode::EditorNode() { sp->set_custom_minimum_size(Size2(30, 0) * EDSCALE); menu_hb->add_child(sp); } + p->add_separator(); + p->add_item(TTR("Quit"), FILE_QUIT, KEY_MASK_CMD + KEY_Q); + + project_menu = memnew(MenuButton); + project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools.")); + project_menu->set_text(TTR("Project")); + project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles")); + left_menu_hb->add_child(project_menu); + + p = project_menu->get_popup(); + p->add_item(TTR("Project Settings"), RUN_SETTINGS); + p->add_separator(); + p->connect("id_pressed", this, "_menu_option"); + p->add_item(TTR("Run Script"), FILE_RUN_SCRIPT, KEY_MASK_SHIFT + KEY_MASK_CMD + KEY_R); + p->add_item(TTR("Export"), FILE_EXPORT_PROJECT); + + PopupMenu *tool_menu = memnew(PopupMenu); + tool_menu->set_name("Tools"); + tool_menu->connect("id_pressed", this, "_menu_option"); + p->add_child(tool_menu); + p->add_submenu_item(TTR("Tools"), "Tools"); + tool_menu->add_item(TTR("Orphan Resource Explorer"), TOOLS_ORPHAN_RESOURCES); + p->add_separator(); + +#ifdef OSX_ENABLED + p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_ALT + KEY_Q); +#else + p->add_item(TTR("Quit to Project List"), RUN_PROJECT_MANAGER, KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Q); +#endif PanelContainer *editor_region = memnew(PanelContainer); main_editor_button_vb = memnew(HBoxContainer); @@ -5786,6 +5878,7 @@ EditorNode::EditorNode() { property_editor = memnew(PropertyEditor); property_editor->set_autoclear(true); property_editor->set_show_categories(true); + property_editor->set_use_folding(true); property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); property_editor->set_use_doc_hints(true); property_editor->set_enable_capitalize_paths(bool(EDITOR_DEF("interface/capitalize_properties", true))); @@ -5891,6 +5984,12 @@ EditorNode::EditorNode() { gui_base->add_child(confirmation); confirmation->connect("confirmed", this, "_menu_confirm_current"); + save_confirmation = memnew(ConfirmationDialog); + save_confirmation->add_button(TTR("Don't Save"), OS::get_singleton()->get_swap_ok_cancel(), "discard"); + gui_base->add_child(save_confirmation); + save_confirmation->connect("confirmed", this, "_menu_confirm_current"); + save_confirmation->connect("custom_action", this, "_discard_changes"); + accept = memnew(AcceptDialog); gui_base->add_child(accept); accept->connect("confirmed", this, "_menu_confirm_current"); @@ -6113,9 +6212,8 @@ EditorNode::EditorNode() { add_editor_plugin(memnew(LightOccluder2DEditorPlugin(this))); add_editor_plugin(memnew(NavigationPolygonEditorPlugin(this))); add_editor_plugin(memnew(GradientEditorPlugin(this))); - add_editor_plugin(memnew(GradientTextureEditorPlugin(this))); add_editor_plugin(memnew(CollisionShape2DEditorPlugin(this))); - add_editor_plugin(memnew(CurveTextureEditorPlugin(this))); + add_editor_plugin(memnew(CurveEditorPlugin(this))); add_editor_plugin(memnew(TextureEditorPlugin(this))); add_editor_plugin(memnew(AudioBusesEditorPlugin(audio_bus_editor))); //add_editor_plugin( memnew( MaterialEditorPlugin(this) ) ); @@ -6142,6 +6240,7 @@ EditorNode::EditorNode() { editor_plugin_screen = NULL; editor_plugins_over = memnew(EditorPluginList); + editor_plugins_force_input_forwarding = memnew(EditorPluginList); //force_top_viewport(true); _edit_current(); @@ -6290,6 +6389,7 @@ EditorNode::~EditorNode() { memdelete(EditorHelp::get_doc_data()); memdelete(editor_selection); memdelete(editor_plugins_over); + memdelete(editor_plugins_force_input_forwarding); memdelete(file_server); EditorSettings::destroy(); } @@ -6325,10 +6425,14 @@ bool EditorPluginList::forward_gui_input(const Transform2D &p_canvas_xform, cons return discard; } -bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event) { +bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled) { bool discard = false; for (int i = 0; i < plugins_list.size(); i++) { + if ((!serve_when_force_input_enabled) && plugins_list[i]->is_input_event_forwarding_always_enabled()) { + continue; + } + if (plugins_list[i]->forward_spatial_gui_input(p_camera, p_event)) { discard = true; } @@ -6344,6 +6448,10 @@ void EditorPluginList::forward_draw_over_canvas(const Transform2D &p_canvas_xfor } } +void EditorPluginList::add_plugin(EditorPlugin *p_plugin) { + plugins_list.push_back(p_plugin); +} + bool EditorPluginList::empty() { return plugins_list.empty(); } diff --git a/editor/editor_node.h b/editor/editor_node.h index 0f4561572a..5e83cec4a3 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -140,6 +140,8 @@ private: FILE_RUN_SCRIPT, FILE_OPEN_PREV, FILE_CLOSE, + FILE_CLOSE_ALL_AND_QUIT, + FILE_CLOSE_ALL_AND_RUN_PROJECT_MANAGER, FILE_QUIT, FILE_EXTERNAL_OPEN_SCENE, EDIT_UNDO, @@ -296,6 +298,7 @@ private: //CallDialog *call_dialog; ConfirmationDialog *confirmation; + ConfirmationDialog *save_confirmation; ConfirmationDialog *import_confirmation; ConfirmationDialog *open_recent_confirmation; ConfirmationDialog *pick_main_scene; @@ -398,6 +401,7 @@ private: Vector<EditorPlugin *> editor_plugins; EditorPlugin *editor_plugin_screen; EditorPluginList *editor_plugins_over; + EditorPluginList *editor_plugins_force_input_forwarding; EditorHistory editor_history; EditorData editor_data; @@ -464,6 +468,9 @@ private: void _vp_resized(); void _save_scene(String p_file, int idx = -1); + void _save_all_scenes(); + int _next_unsaved_scene(); + void _discard_changes(const String &p_str = String()); void _instance_request(const Vector<String> &p_files); @@ -647,6 +654,7 @@ public: EditorPlugin *get_editor_plugin_screen() { return editor_plugin_screen; } EditorPluginList *get_editor_plugins_over() { return editor_plugins_over; } + EditorPluginList *get_editor_plugins_force_input_forwarding() { return editor_plugins_force_input_forwarding; } PropertyEditor *get_property_editor() { return property_editor; } VBoxContainer *get_property_editor_vb() { return prop_editor_vb; } @@ -823,8 +831,9 @@ public: void make_visible(bool p_visible); void edit(Object *p_object); bool forward_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event); - bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event); + bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled); void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas); + void add_plugin(EditorPlugin *p_plugin); void clear(); bool empty(); diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index 6fcea98e32..75ab1e8a44 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -147,6 +147,12 @@ void EditorPlugin::remove_tool_menu_item(const String &p_name) { //EditorNode::get_singleton()->remove_tool_menu_item(p_name); } +void EditorPlugin::set_input_event_forwarding_always_enabled() { + input_event_forwarding_always_enabled = true; + EditorPluginList *always_input_forwarding_list = EditorNode::get_singleton()->get_editor_plugins_force_input_forwarding(); + always_input_forwarding_list->add_plugin(this); +} + Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial *p_spatial) { //?? if (get_script_instance() && get_script_instance()->has_method("create_spatial_gizmo")) { @@ -372,6 +378,7 @@ void EditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("edit_resource"), &EditorPlugin::edit_resource); ClassDB::bind_method(D_METHOD("add_import_plugin"), &EditorPlugin::add_import_plugin); ClassDB::bind_method(D_METHOD("remove_import_plugin"), &EditorPlugin::remove_import_plugin); + ClassDB::bind_method(D_METHOD("set_input_event_forwarding_always_enabled"), &EditorPlugin::set_input_event_forwarding_always_enabled); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_canvas_gui_input", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo("forward_draw_over_canvas", PropertyInfo(Variant::TRANSFORM2D, "canvas_xform"), PropertyInfo(Variant::OBJECT, "canvas:Control"))); ClassDB::add_virtual_method(get_class_static(), MethodInfo(Variant::BOOL, "forward_spatial_gui_input", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Camera"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); @@ -414,6 +421,7 @@ void EditorPlugin::_bind_methods() { EditorPlugin::EditorPlugin() { undo_redo = NULL; + input_event_forwarding_always_enabled = false; } EditorPlugin::~EditorPlugin() { diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index c607846ec9..57a22a8b2f 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -61,6 +61,8 @@ class EditorPlugin : public Node { UndoRedo *_get_undo_redo() { return undo_redo; } + bool input_event_forwarding_always_enabled; + protected: static void _bind_methods(); UndoRedo &get_undo_redo() { return *undo_redo; } @@ -106,6 +108,9 @@ public: void add_tool_submenu_item(const String &p_name, Object *p_submenu); void remove_tool_menu_item(const String &p_name); + void set_input_event_forwarding_always_enabled(); + bool is_input_event_forwarding_always_enabled() { return input_event_forwarding_always_enabled; } + virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial); virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event); virtual void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 485f8236de..f018603bfc 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -44,7 +44,7 @@ #include "scene/main/node.h" #include "scene/main/scene_main_loop.h" #include "scene/main/viewport.h" -#include "translations.h" +#include "translations.gen.h" #include "version.h" Ref<EditorSettings> EditorSettings::singleton = NULL; @@ -517,6 +517,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { set("interface/separate_distraction_mode", false); + set("interface/save_each_scene_on_quit", true); // Regression + set("interface/quit_confirmation", true); + set("interface/theme/preset", 0); hints["interface/theme/preset"] = PropertyInfo(Variant::INT, "interface/theme/preset", PROPERTY_HINT_ENUM, "Default,Grey,Godot 2,Arc,Custom", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED); set("interface/theme/base_color", Color::html("#273241")); diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index e6df58bc60..7e453a01c6 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -235,10 +235,12 @@ Ref<Theme> create_editor_theme() { style_popup_menu->set_dark_color(light_color_1); theme->set_stylebox("panel", "PopupMenu", style_popup_menu); - // Tree & script background - Ref<StyleBoxFlat> style_bg = make_flat_stylebox(dark_color_1, 0, 0, 0, 0); - theme->set_stylebox("bg", "Tree", style_bg); - theme->set_stylebox("ScriptPanel", "EditorStyles", style_bg); + // Tree & ItemList background + Ref<StyleBoxFlat> style_tree_bg = make_flat_stylebox(dark_color_1, 2, 4, 2, 4); + theme->set_stylebox("bg", "Tree", style_tree_bg); + // Script background + Ref<StyleBoxFlat> style_script_bg = make_flat_stylebox(dark_color_1, 0, 0, 0, 0); + theme->set_stylebox("ScriptPanel", "EditorStyles", style_script_bg); // Tree theme->set_icon("checked", "Tree", theme->get_icon("Checked", "EditorIcons")); @@ -255,10 +257,10 @@ Ref<Theme> create_editor_theme() { Ref<StyleBox> style_tree_btn = make_flat_stylebox(light_color_1, 2, 4, 2, 4); theme->set_stylebox("button_pressed", "Tree", style_tree_btn); - Ref<StyleBoxFlat> style_tree_focus = make_flat_stylebox(HIGHLIGHT_COLOR_DARK, 4, 4, 4, 4); + Ref<StyleBoxFlat> style_tree_focus = make_flat_stylebox(HIGHLIGHT_COLOR_DARK, 2, 2, 2, 2); theme->set_stylebox("selected_focus", "Tree", style_tree_focus); - Ref<StyleBoxFlat> style_tree_selected = make_flat_stylebox(light_color_1, 4, 4, 4, 4); + Ref<StyleBoxFlat> style_tree_selected = make_flat_stylebox(light_color_1, 2, 2, 2, 2); theme->set_stylebox("selected", "Tree", style_tree_selected); Ref<StyleBoxFlat> style_tree_cursor = make_flat_stylebox(HIGHLIGHT_COLOR_DARK, 4, 4, 4, 4); @@ -281,17 +283,18 @@ Ref<Theme> create_editor_theme() { theme->set_color("drop_position_color", "Tree", highlight_color); // ItemList - Ref<StyleBoxFlat> style_itemlist_cursor = make_flat_stylebox(highlight_color, 4, 4, 4, 4); + Ref<StyleBoxFlat> style_itemlist_bg = make_flat_stylebox(dark_color_1, 4, 4, 4, 4); + Ref<StyleBoxFlat> style_itemlist_cursor = make_flat_stylebox(highlight_color, 0, 0, 0, 0); style_itemlist_cursor->set_draw_center(false); style_itemlist_cursor->set_border_size(1 * EDSCALE); - style_itemlist_cursor->set_light_color(light_color_1); - style_itemlist_cursor->set_dark_color(light_color_1); + style_itemlist_cursor->set_light_color(HIGHLIGHT_COLOR_DARK); + style_itemlist_cursor->set_dark_color(HIGHLIGHT_COLOR_DARK); theme->set_stylebox("cursor", "ItemList", style_itemlist_cursor); theme->set_stylebox("cursor_unfocused", "ItemList", style_itemlist_cursor); theme->set_stylebox("selected_focus", "ItemList", style_tree_focus); theme->set_stylebox("selected", "ItemList", style_tree_selected); theme->set_stylebox("bg_focus", "ItemList", focus_sbt); - theme->set_stylebox("bg", "ItemList", style_bg); + theme->set_stylebox("bg", "ItemList", style_itemlist_bg); theme->set_constant("vseparation", "ItemList", 5 * EDSCALE); Ref<StyleBoxFlat> style_tab_fg = make_flat_stylebox(base_color, 15, 5, 15, 5); diff --git a/editor/icons/SCsub b/editor/icons/SCsub index 20a381cc78..182624a80d 100644 --- a/editor/icons/SCsub +++ b/editor/icons/SCsub @@ -90,7 +90,7 @@ make_editor_icons_builder = Builder(action=make_editor_icons_action, suffix='.cpp', src_suffix='.png') env['BUILDERS']['MakeEditorIconsBuilder'] = make_editor_icons_builder -env.Alias('editor_icons', [env.MakeEditorIconsBuilder('#editor/editor_icons.cpp', Glob("*.png"))]) +env.Alias('editor_icons', [env.MakeEditorIconsBuilder('#editor/editor_icons.gen.cpp', Glob("*.png"))]) -env.editor_sources.append("#editor/editor_icons.cpp") +env.editor_sources.append("#editor/editor_icons.gen.cpp") Export('env') diff --git a/editor/icons/icon_audio_player.png b/editor/icons/icon_audio_player.png Binary files differdeleted file mode 100644 index c3e6d6cafa..0000000000 --- a/editor/icons/icon_audio_player.png +++ /dev/null diff --git a/editor/import/editor_import_plugin.cpp b/editor/import/editor_import_plugin.cpp index 6dee5da538..4ebbcb1610 100644 --- a/editor/import/editor_import_plugin.cpp +++ b/editor/import/editor_import_plugin.cpp @@ -56,7 +56,7 @@ String EditorImportPlugin::get_preset_name(int p_idx) const { return get_script_instance()->call("get_preset_name", p_idx); } -int EditorImportPlugin::get_preset_count() { +int EditorImportPlugin::get_preset_count() const { ERR_FAIL_COND_V(!(get_script_instance() && get_script_instance()->has_method("get_preset_count")), 0); return get_script_instance()->call("get_preset_count"); } diff --git a/editor/import/editor_import_plugin.h b/editor/import/editor_import_plugin.h index 3c16b79713..b60813db61 100644 --- a/editor/import/editor_import_plugin.h +++ b/editor/import/editor_import_plugin.h @@ -43,7 +43,7 @@ public: virtual String get_visible_name() const; virtual void get_recognized_extensions(List<String> *p_extensions) const; virtual String get_preset_name(int p_idx) const; - virtual int get_preset_count(); + virtual int get_preset_count() const; virtual String get_save_extension() const; virtual String get_resource_type() const; virtual void get_import_options(List<ImportOption> *r_options, int p_preset) const; diff --git a/editor/import/resource_importer_texture.cpp b/editor/import/resource_importer_texture.cpp index 41b2353ed3..3834e52fab 100644 --- a/editor/import/resource_importer_texture.cpp +++ b/editor/import/resource_importer_texture.cpp @@ -202,7 +202,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options, r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "flags/anisotropic"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "flags/srgb", PROPERTY_HINT_ENUM, "Disable,Enable,Detect"), 2)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/fix_alpha_border"), p_preset != PRESET_3D ? true : false)); - r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), true)); + r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/premult_alpha"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL, "process/HDR_as_SRGB"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "stream"), false)); r_options->push_back(ImportOption(PropertyInfo(Variant::INT, "size_limit", PROPERTY_HINT_RANGE, "0,4096,1"), 0)); diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 803e59469c..7c6b233bd4 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -2687,11 +2687,11 @@ void CanvasItemEditor::_popup_callback(int p_op) { Node2D *n2d = canvas_item->cast_to<Node2D>(); if (key_pos) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "transform/pos", n2d->get_position(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "position", n2d->get_position(), existing); if (key_rot) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "transform/rot", Math::rad2deg(n2d->get_rotation()), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "rotation_deg", Math::rad2deg(n2d->get_rotation()), existing); if (key_scale) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "transform/scale", n2d->get_scale(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(n2d, "scale", n2d->get_scale(), existing); if (n2d->has_meta("_edit_bone_") && n2d->get_parent_item()) { //look for an IK chain @@ -2718,11 +2718,11 @@ void CanvasItemEditor::_popup_callback(int p_op) { for (List<Node2D *>::Element *F = ik_chain.front(); F; F = F->next()) { if (key_pos) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "transform/pos", F->get()->get_position(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "position", F->get()->get_position(), existing); if (key_rot) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "transform/rot", Math::rad2deg(F->get()->get_rotation()), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "rotation_deg", Math::rad2deg(F->get()->get_rotation()), existing); if (key_scale) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "transform/scale", F->get()->get_scale(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(F->get(), "scale", F->get()->get_scale(), existing); } } } @@ -2732,9 +2732,11 @@ void CanvasItemEditor::_popup_callback(int p_op) { Control *ctrl = canvas_item->cast_to<Control>(); if (key_pos) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl, "rect/pos", ctrl->get_position(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl, "rect_position", ctrl->get_position(), existing); + if (key_rot) + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl, "rect_rotation", ctrl->get_rotation_deg(), existing); if (key_scale) - AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl, "rect/size", ctrl->get_size(), existing); + AnimationPlayerEditor::singleton->get_key_editor()->insert_node_value_key(ctrl, "rect_size", ctrl->get_size(), existing); } } @@ -2819,10 +2821,10 @@ void CanvasItemEditor::_popup_callback(int p_op) { if (!n2d) continue; undo_redo->add_do_method(n2d, "set_position", E->get().pos); - undo_redo->add_do_method(n2d, "set_rot", E->get().rot); + undo_redo->add_do_method(n2d, "set_rotation", E->get().rot); undo_redo->add_do_method(n2d, "set_scale", E->get().scale); undo_redo->add_undo_method(n2d, "set_position", n2d->get_position()); - undo_redo->add_undo_method(n2d, "set_rot", n2d->get_rotation()); + undo_redo->add_undo_method(n2d, "set_rotation", n2d->get_rotation()); undo_redo->add_undo_method(n2d, "set_scale", n2d->get_scale()); } undo_redo->commit_action(); @@ -3270,6 +3272,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { PopupMenu *p; p = edit_menu->get_popup(); + p->set_hide_on_checkable_item_selection(false); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_snap", TTR("Use Snap")), SNAP_USE); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/show_grid", TTR("Show Grid")), SNAP_SHOW_GRID); p->add_check_shortcut(ED_SHORTCUT("canvas_item_editor/use_rotation_snap", TTR("Use Rotation Snap")), SNAP_USE_ROTATION); @@ -3291,6 +3294,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { skeleton_menu->add_separator(); skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_set_ik_chain", TTR("Make IK Chain")), SKELETON_SET_IK_CHAIN); skeleton_menu->add_shortcut(ED_SHORTCUT("canvas_item_editor/skeleton_clear_ik_chain", TTR("Clear IK Chain")), SKELETON_CLEAR_IK_CHAIN); + skeleton_menu->set_hide_on_checkable_item_selection(false); skeleton_menu->connect("id_pressed", this, "_popup_callback"); /* diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index d869d703f1..50a625ddc1 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -27,528 +27,695 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ + #include "curve_editor_plugin.h" #include "canvas_item_editor_plugin.h" +#include "core_string_names.h" +#include "os/input.h" #include "os/keyboard.h" -#include "spatial_editor_plugin.h" -void CurveTextureEdit::_gui_input(const Ref<InputEvent> &p_event) { +CurveEditor::CurveEditor() { + _selected_point = -1; + _hover_point = -1; + _selected_tangent = TANGENT_NONE; + _hover_radius = 6; + _tangents_length = 40; + _dragging = false; + _has_undo_data = false; + _world_rect = Rect2(0, 0, 1, 1); - Ref<InputEventKey> k = p_event; - if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && grabbed != -1) { + set_focus_mode(FOCUS_ALL); + set_clip_contents(true); + + _context_menu = memnew(PopupMenu); + _context_menu->connect("id_pressed", this, "_on_context_menu_item_selected"); + add_child(_context_menu); + + _presets_menu = memnew(PopupMenu); + _presets_menu->set_name("_presets_menu"); + _presets_menu->add_item("Flat0", PRESET_FLAT0); + _presets_menu->add_item("Flat1", PRESET_FLAT1); + _presets_menu->add_item("Linear", PRESET_LINEAR); + _presets_menu->add_item("Ease in", PRESET_EASE_IN); + _presets_menu->add_item("Ease out", PRESET_EASE_OUT); + _presets_menu->add_item("Smoothstep", PRESET_SMOOTHSTEP); + _presets_menu->connect("id_pressed", this, "_on_preset_item_selected"); + _context_menu->add_child(_presets_menu); +} - points.remove(grabbed); - grabbed = -1; - update(); - emit_signal("curve_changed"); - accept_event(); +void CurveEditor::set_curve(Ref<Curve> curve) { + + if (curve == _curve_ref) + return; + + if (_curve_ref.is_valid()) { + _curve_ref->disconnect("changed", this, "_curve_changed"); + } + _curve_ref = curve; + if (_curve_ref.is_valid()) { + _curve_ref->connect("changed", this, "_curve_changed"); } - Ref<InputEventMouseButton> mb = p_event; + _selected_point = -1; + _hover_point = -1; + _selected_tangent = TANGENT_NONE; - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) { + update(); - update(); - Ref<Font> font = get_font("font", "Label"); + // Note: if you edit a curve, then set another, and try to undo, + // it will normally apply on the previous curve, but you won't see it +} + +Size2 CurveEditor::get_minimum_size() const { + return Vector2(64, 64); +} + +void CurveEditor::_notification(int p_what) { + if (p_what == NOTIFICATION_DRAW) + _draw(); +} + +void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) { + + Ref<InputEventMouseButton> mb_ref = p_event; + if (mb_ref.is_valid()) { + + const InputEventMouseButton &mb = **mb_ref; - int font_h = font->get_height(); + if (mb.is_pressed() && !_dragging) { - Vector2 size = get_size(); - size.y -= font_h; + Vector2 mpos = mb.get_position(); - Point2 p = Vector2(mb->get_position().x, mb->get_position().y) / size; - p.y = CLAMP(1.0 - p.y, 0, 1) * (max - min) + min; - grabbed = -1; - grabbing = true; + _selected_tangent = get_tangent_at(mpos); + if (_selected_tangent == TANGENT_NONE) + set_selected_point(get_point_at(mpos)); - for (int i = 0; i < points.size(); i++) { + switch (mb.get_button_index()) { + case BUTTON_RIGHT: + _context_click_pos = mpos; + open_context_menu(get_global_transform().xform(mpos)); + break; - Vector2 ps = p * get_size(); - Vector2 pt = Vector2(points[i].offset, points[i].height) * get_size(); - if (ps.distance_to(pt) < 4) { - grabbed = i; + case BUTTON_MIDDLE: + remove_point(_hover_point); + break; + + case BUTTON_LEFT: + _dragging = true; + break; } } - //grab or select - if (grabbed != -1) { - return; - } - //insert - - Point np; - np.offset = p.x; - np.height = p.y; - - points.push_back(np); - points.sort(); - for (int i = 0; i < points.size(); i++) { - if (points[i].offset == p.x && points[i].height == p.y) { - grabbed = i; - break; + if (!mb.is_pressed() && _dragging && mb.get_button_index() == BUTTON_LEFT) { + _dragging = false; + if (_has_undo_data) { + push_undo(_undo_data); + _has_undo_data = false; } } - - emit_signal("curve_changed"); } - if (mb.is_valid() && mb->get_button_index() == 1 && !mb->is_pressed()) { + Ref<InputEventMouseMotion> mm_ref = p_event; + if (mm_ref.is_valid()) { - if (grabbing) { - grabbing = false; - emit_signal("curve_changed"); - } - update(); - } + const InputEventMouseMotion &mm = **mm_ref; - Ref<InputEventMouseMotion> mm = p_event; + Vector2 mpos = mm.get_position(); - if (mm.is_valid() && grabbing && grabbed != -1) { + if (_dragging && _curve_ref.is_valid()) { + if (_selected_point != -1) { - Ref<Font> font = get_font("font", "Label"); - int font_h = font->get_height(); - Vector2 size = get_size(); - size.y -= font_h; + if (!_has_undo_data) { + // Save curve state before dragging points + _undo_data = _curve_ref->get_data(); + _has_undo_data = true; + } - Point2 p = mm->get_position() / size; - p.y = CLAMP(1.0 - p.y, 0, 1) * (max - min) + min; - p.x = CLAMP(p.x, 0.0, 1.0); + if (_selected_tangent == TANGENT_NONE) { + // Drag point - bool valid = true; + Vector2 point_pos = get_world_pos(mpos); - for (int i = 0; i < points.size(); i++) { + int i = _curve_ref->set_point_offset(_selected_point, point_pos.x); + // The index may change if the point is dragged across another one + set_hover_point_index(i); + set_selected_point(i); - if (points[i].offset == p.x && points[i].height == p.y && i != grabbed) { - valid = false; - } - } + // TODO Get rid of this clamp if zoom is implemented in this editor. + // This is to prevent the user from loosing a point out of view. + if (point_pos.y < 0.0) + point_pos.y = 0.0; + else if (point_pos.y > 1.0) + point_pos.y = 1.0; + + _curve_ref->set_point_value(_selected_point, point_pos.y); - if (!valid) - return; + //auto_calculate_tangents(i); - points[grabbed].offset = p.x; - points[grabbed].height = p.y; + } else { + // Drag tangent - points.sort(); - for (int i = 0; i < points.size(); i++) { - if (points[i].offset == p.x && points[i].height == p.y) { - grabbed = i; - break; + Vector2 point_pos = _curve_ref->get_point_pos(_selected_point); + Vector2 control_pos = get_world_pos(mpos); + + Vector2 dir = (control_pos - point_pos).normalized(); + + real_t tangent; + if (Math::abs(dir.x) > CMP_EPSILON) + tangent = dir.y / dir.x; + else + tangent = 9999 * (dir.y >= 0 ? 1 : -1); + + bool link = !Input::get_singleton()->is_key_pressed(KEY_SHIFT); + + if (_selected_tangent == TANGENT_LEFT) { + _curve_ref->set_point_left_tangent(_selected_point, tangent); + if (link && _selected_point != _curve_ref->get_point_count() - 1) + _curve_ref->set_point_right_tangent(_selected_point, tangent); + } else { + _curve_ref->set_point_right_tangent(_selected_point, tangent); + if (link && _selected_point != 0) + _curve_ref->set_point_left_tangent(_selected_point, tangent); + } + } } + + } else { + set_hover_point_index(get_point_at(mpos)); } + } - emit_signal("curve_changed"); + Ref<InputEventKey> key_ref = p_event; + if (key_ref.is_valid()) { + const InputEventKey &key = **key_ref; - update(); + if (key.is_pressed() && _selected_point != -1) { + if (key.get_scancode() == KEY_DELETE) + remove_point(_selected_point); + } } } -void CurveTextureEdit::_plot_curve(const Vector2 &p_a, const Vector2 &p_b, const Vector2 &p_c, const Vector2 &p_d) { +void CurveEditor::on_preset_item_selected(int preset_id) { + ERR_FAIL_COND(preset_id < 0 || preset_id >= PRESET_COUNT); + ERR_FAIL_COND(_curve_ref.is_null()); - Ref<Font> font = get_font("font", "Label"); - - int font_h = font->get_height(); + Curve &curve = **_curve_ref; + Array previous_data = curve.get_data(); - float geometry[4][4]; - float tmp1[4][4]; - float tmp2[4][4]; - float deltas[4][4]; - double x, dx, dx2, dx3; - double y, dy, dy2, dy3; - double d, d2, d3; - int lastx, lasty; - int newx, newy; - int ntimes; - int i, j; + curve.clear_points(); - int xmax = get_size().x; - int ymax = get_size().y - font_h; + switch (preset_id) { + case PRESET_FLAT0: + curve.add_point(Vector2(0, 0)); + curve.add_point(Vector2(1, 0)); + break; - int vsplits = 4; + case PRESET_FLAT1: + curve.add_point(Vector2(0, 1)); + curve.add_point(Vector2(1, 1)); + break; - int zero_ofs = (1.0 - (0.0 - min) / (max - min)) * ymax; + case PRESET_LINEAR: + curve.add_point(Vector2(0, 0), 0, 1); + curve.add_point(Vector2(1, 1), 1, 0); + break; - draw_line(Vector2(0, zero_ofs), Vector2(xmax, zero_ofs), Color(0.8, 0.8, 0.8, 0.15), 2.0); + case PRESET_EASE_IN: + curve.add_point(Vector2(0, 0)); + curve.add_point(Vector2(1, 1), 1.4, 0); + break; - for (int i = 0; i <= vsplits; i++) { - float fofs = float(i) / vsplits; - int yofs = fofs * ymax; - draw_line(Vector2(xmax, yofs), Vector2(xmax - 4, yofs), Color(0.8, 0.8, 0.8, 0.8), 2.0); + case PRESET_EASE_OUT: + curve.add_point(Vector2(0, 0), 0, 1.4); + curve.add_point(Vector2(1, 1)); + break; - String text = rtos((1.0 - fofs) * (max - min) + min); - int ppos = text.find("."); - if (ppos != -1) { - if (text.length() > ppos + 2) - text = text.substr(0, ppos + 2); - } + case PRESET_SMOOTHSTEP: + curve.add_point(Vector2(0, 0)); + curve.add_point(Vector2(1, 1)); + break; - int size = font->get_string_size(text).x; - int xofs = xmax - size - 4; - yofs -= font_h / 2; + default: + break; + } - if (yofs < 2) { - yofs = 2; - } else if (yofs + font_h > ymax - 2) { - yofs = ymax - font_h - 2; - } + push_undo(previous_data); +} - draw_string(font, Vector2(xofs, yofs + font->get_ascent()), text, Color(0.8, 0.8, 0.8, 1)); +void CurveEditor::_curve_changed() { + update(); + // Point count can change in case of undo + if (_selected_point >= _curve_ref->get_point_count()) { + set_selected_point(-1); } +} - /* construct the geometry matrix from the segment */ - for (i = 0; i < 4; i++) { - geometry[i][2] = 0; - geometry[i][3] = 0; - } +void CurveEditor::on_context_menu_item_selected(int action_id) { + switch (action_id) { + case CONTEXT_ADD_POINT: + add_point(_context_click_pos); + break; - geometry[0][0] = (p_a[0] * xmax); - geometry[1][0] = (p_b[0] * xmax); - geometry[2][0] = (p_c[0] * xmax); - geometry[3][0] = (p_d[0] * xmax); - - geometry[0][1] = ((p_a[1] - min) / (max - min) * ymax); - geometry[1][1] = ((p_b[1] - min) / (max - min) * ymax); - geometry[2][1] = ((p_c[1] - min) / (max - min) * ymax); - geometry[3][1] = ((p_d[1] - min) / (max - min) * ymax); - - /* subdivide the curve ntimes (1000) times */ - ntimes = 4 * xmax; - /* ntimes can be adjusted to give a finer or coarser curve */ - d = 1.0 / ntimes; - d2 = d * d; - d3 = d * d * d; - - /* construct a temporary matrix for determining the forward differencing deltas */ - tmp2[0][0] = 0; - tmp2[0][1] = 0; - tmp2[0][2] = 0; - tmp2[0][3] = 1; - tmp2[1][0] = d3; - tmp2[1][1] = d2; - tmp2[1][2] = d; - tmp2[1][3] = 0; - tmp2[2][0] = 6 * d3; - tmp2[2][1] = 2 * d2; - tmp2[2][2] = 0; - tmp2[2][3] = 0; - tmp2[3][0] = 6 * d3; - tmp2[3][1] = 0; - tmp2[3][2] = 0; - tmp2[3][3] = 0; - - /* compose the basis and geometry matrices */ - - static const float CR_basis[4][4] = { - { -0.5, 1.5, -1.5, 0.5 }, - { 1.0, -2.5, 2.0, -0.5 }, - { -0.5, 0.0, 0.5, 0.0 }, - { 0.0, 1.0, 0.0, 0.0 }, - }; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - tmp1[i][j] = (CR_basis[i][0] * geometry[0][j] + - CR_basis[i][1] * geometry[1][j] + - CR_basis[i][2] * geometry[2][j] + - CR_basis[i][3] * geometry[3][j]); - } + case CONTEXT_REMOVE_POINT: + remove_point(_selected_point); + break; } - /* compose the above results to get the deltas matrix */ - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - deltas[i][j] = (tmp2[i][0] * tmp1[0][j] + - tmp2[i][1] * tmp1[1][j] + - tmp2[i][2] * tmp1[2][j] + - tmp2[i][3] * tmp1[3][j]); +} + +void CurveEditor::open_context_menu(Vector2 pos) { + _context_menu->set_position(pos); + + _context_menu->clear(); + + if (_curve_ref.is_valid()) { + _context_menu->add_item(TTR("Add point"), CONTEXT_ADD_POINT); + if (_selected_point >= 0) { + _context_menu->add_item(TTR("Remove point"), CONTEXT_REMOVE_POINT); } + _context_menu->add_separator(); } - /* extract the x deltas */ - x = deltas[0][0]; - dx = deltas[1][0]; - dx2 = deltas[2][0]; - dx3 = deltas[3][0]; + _context_menu->add_submenu_item(TTR("Load preset"), _presets_menu->get_name()); - /* extract the y deltas */ - y = deltas[0][1]; - dy = deltas[1][1]; - dy2 = deltas[2][1]; - dy3 = deltas[3][1]; + _context_menu->popup(); +} - lastx = CLAMP(x, 0, xmax); - lasty = CLAMP(y, 0, ymax); +int CurveEditor::get_point_at(Vector2 pos) const { + if (_curve_ref.is_null()) + return -1; + const Curve &curve = **_curve_ref; - /* if (fix255) - { - cd->curve[cd->outline][lastx] = lasty; - } - else - { - cd->curve_ptr[cd->outline][lastx] = lasty; - if(gb_debug) printf("bender_plot_curve xmax:%d ymax:%d\n", (int)xmax, (int)ymax); + const float r = _hover_radius * _hover_radius; + + for (int i = 0; i < curve.get_point_count(); ++i) { + Vector2 p = get_view_pos(curve.get_point_pos(i)); + if (p.distance_squared_to(pos) <= r) { + return i; } -*/ - /* loop over the curve */ - for (i = 0; i < ntimes; i++) { - /* increment the x values */ - x += dx; - dx += dx2; - dx2 += dx3; - - /* increment the y values */ - y += dy; - dy += dy2; - dy2 += dy3; - - newx = CLAMP((Math::round(x)), 0, xmax); - newy = CLAMP((Math::round(y)), 0, ymax); - - /* if this point is different than the last one...then draw it */ - if ((lastx != newx) || (lasty != newy)) { -#if 0 - if(fix255) - { - /* use fixed array size (for the curve graph) */ - cd->curve[cd->outline][newx] = newy; - } - else - { - /* use dynamic allocated curve_ptr (for the real curve) */ - cd->curve_ptr[cd->outline][newx] = newy; + } - if(gb_debug) printf("outline: %d cX: %d cY: %d\n", (int)cd->outline, (int)newx, (int)newy); - } -#endif - draw_line(Vector2(lastx, ymax - lasty), Vector2(newx, ymax - newy), Color(0.8, 0.8, 0.8, 0.8), 2.0); + return -1; +} + +int CurveEditor::get_tangent_at(Vector2 pos) const { + if (_curve_ref.is_null() || _selected_point < 0) + return TANGENT_NONE; + + if (_selected_point != 0) { + Vector2 control_pos = get_tangent_view_pos(_selected_point, TANGENT_LEFT); + if (control_pos.distance_to(pos) < _hover_radius) { + return TANGENT_LEFT; } + } - lastx = newx; - lasty = newy; + if (_selected_point != _curve_ref->get_point_count() - 1) { + Vector2 control_pos = get_tangent_view_pos(_selected_point, TANGENT_RIGHT); + if (control_pos.distance_to(pos) < _hover_radius) { + return TANGENT_RIGHT; + } } - int splits = 8; + return TANGENT_NONE; +} - draw_line(Vector2(0, ymax - 1), Vector2(xmax, ymax - 1), Color(0.8, 0.8, 0.8, 0.3), 2.0); +void CurveEditor::add_point(Vector2 pos) { + ERR_FAIL_COND(_curve_ref.is_null()); - for (int i = 0; i <= splits; i++) { - float fofs = float(i) / splits; - draw_line(Vector2(fofs * xmax, ymax), Vector2(fofs * xmax, ymax - 2), Color(0.8, 0.8, 0.8, 0.8), 2.0); + Array prev_data = _curve_ref->get_data(); - String text = rtos(fofs); - int size = font->get_string_size(text).x; - int ofs = fofs * xmax - size * 0.5; - if (ofs < 2) { - ofs = 2; - } else if (ofs + size > xmax - 2) { - ofs = xmax - size - 2; - } + Vector2 point_pos = get_world_pos(pos); + if (point_pos.y < 0.0) + point_pos.y = 0.0; + else if (point_pos.y > 1.0) + point_pos.y = 1.0; - draw_string(font, Vector2(ofs, ymax + font->get_ascent()), text, Color(0.8, 0.8, 0.8, 1)); - } + _curve_ref->add_point(point_pos); + + push_undo(prev_data); } -void CurveTextureEdit::_notification(int p_what) { +void CurveEditor::remove_point(int index) { + ERR_FAIL_COND(_curve_ref.is_null()); - if (p_what == NOTIFICATION_DRAW) { + Array prev_data = _curve_ref->get_data(); - Ref<Font> font = get_font("font", "Label"); + _curve_ref->remove_point(index); - int font_h = font->get_height(); + if (index == _selected_point) + set_selected_point(-1); - draw_style_box(get_stylebox("bg", "Tree"), Rect2(Point2(), get_size())); + push_undo(prev_data); +} - int w = get_size().x; - int h = get_size().y; +void CurveEditor::set_selected_point(int index) { + if (index != _selected_point) { + _selected_point = index; + update(); + } +} - Vector2 prev = Vector2(0, 0); - Vector2 prev2 = Vector2(0, 0); +void CurveEditor::set_hover_point_index(int index) { + if (index != _hover_point) { + _hover_point = index; + update(); + } +} - for (int i = -1; i < points.size(); i++) { +void CurveEditor::push_undo(Array previous_curve_data) { + UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - Vector2 next; - Vector2 next2; - if (i + 1 >= points.size()) { - next = Vector2(1, 0); - } else { - next = Vector2(points[i + 1].offset, points[i + 1].height); - } + ur->create_action(TTR("Modify Curve")); + ur->add_do_method(*_curve_ref, "_set_data", _curve_ref->get_data()); + ur->add_undo_method(*_curve_ref, "_set_data", previous_curve_data); - if (i + 2 >= points.size()) { - next2 = Vector2(1, 0); - } else { - next2 = Vector2(points[i + 2].offset, points[i + 2].height); - } + // This boolean is to prevent commit_action from executing the do method, + // because at this point it's already done, there is no point in doing it twice + _curve_ref->_disable_set_data = true; + ur->commit_action(); + _curve_ref->_disable_set_data = false; +} - /*if (i==-1 && prev.offset==next.offset) { - prev=next; - continue; - }*/ +void CurveEditor::update_view_transform() { + Vector2 control_size = get_size(); + const real_t margin = 24; - _plot_curve(prev2, prev, next, next2); + _world_rect = Rect2(Curve::MIN_X, 0, Curve::MAX_X, 1); + Vector2 wm = Vector2(margin, margin) / control_size; + _world_rect.position -= wm; + _world_rect.size += 2.0 * wm; - prev2 = prev; - prev = next; - } + _world_to_view = Transform2D(); + _world_to_view.translate(-_world_rect.position - Vector2(0, _world_rect.size.y)); + _world_to_view.scale(Vector2(control_size.x, -control_size.y) / _world_rect.size); +} - Vector2 size = get_size(); - size.y -= font_h; - for (int i = 0; i < points.size(); i++) { +Vector2 CurveEditor::get_tangent_view_pos(int i, TangentIndex tangent) const { - Color col = i == grabbed ? Color(1, 0.0, 0.0, 0.9) : Color(1, 1, 1, 0.8); + Vector2 dir; + if (tangent == TANGENT_LEFT) + dir = -Vector2(1, _curve_ref->get_point_left_tangent(i)); + else + dir = Vector2(1, _curve_ref->get_point_right_tangent(i)); - float h = (points[i].height - min) / (max - min); - draw_rect(Rect2(Vector2(points[i].offset, 1.0 - h) * size - Vector2(2, 2), Vector2(5, 5)), col); - } + Vector2 point_pos = get_view_pos(_curve_ref->get_point_pos(i)); + Vector2 control_pos = get_view_pos(_curve_ref->get_point_pos(i) + dir); - /* if (grabbed!=-1) { + return point_pos + _tangents_length * (control_pos - point_pos).normalized(); +} - draw_rect(Rect2(total_w+3,0,h,h),points[grabbed].color); - } -*/ - if (has_focus()) { +Vector2 CurveEditor::get_view_pos(Vector2 world_pos) const { + return _world_to_view.xform(world_pos); +} + +Vector2 CurveEditor::get_world_pos(Vector2 view_pos) const { + return _world_to_view.affine_inverse().xform(view_pos); +} - draw_line(Vector2(-1, -1), Vector2(w + 1, -1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(w + 1, -1), Vector2(w + 1, h + 1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(w + 1, h + 1), Vector2(-1, h + 1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(-1, -1), Vector2(-1, h + 1), Color(1, 1, 1, 0.6)); +// Uses non-baked points, but takes advantage of ordered iteration to be faster +template <typename T> +static void plot_curve_accurate(const Curve &curve, float step, T plot_func) { + + if (curve.get_point_count() <= 1) { + // Not enough points to make a curve, so it's just a straight line + float y = curve.interpolate(0); + plot_func(Vector2(0, y), Vector2(1.f, y), true); + + } else { + Vector2 first_point = curve.get_point_pos(0); + Vector2 last_point = curve.get_point_pos(curve.get_point_count() - 1); + + // Edge lines + plot_func(Vector2(0, first_point.y), first_point, false); + plot_func(Vector2(Curve::MAX_X, last_point.y), last_point, false); + + // Draw section by section, so that we get maximum precision near points. + // It's an accurate representation, but slower than using the baked one. + for (int i = 1; i < curve.get_point_count(); ++i) { + Vector2 a = curve.get_point_pos(i - 1); + Vector2 b = curve.get_point_pos(i); + + Vector2 pos = a; + Vector2 prev_pos = a; + + float len = b.x - a.x; + //float step = 4.f / view_size.x; + + for (float x = step; x < len; x += step) { + pos.x = a.x + x; + pos.y = curve.interpolate_local_nocheck(i - 1, x); + plot_func(prev_pos, pos, true); + prev_pos = pos; + } + + plot_func(prev_pos, b, true); } } } -Size2 CurveTextureEdit::get_minimum_size() const { +struct CanvasItemPlotCurve { - return Vector2(64, 64); -} + CanvasItem &ci; + Color color1; + Color color2; -void CurveTextureEdit::set_range(float p_min, float p_max) { - max = p_max; - min = p_min; - update(); -} + CanvasItemPlotCurve(CanvasItem &p_ci, Color p_color1, Color p_color2) + : ci(p_ci), color1(p_color1), color2(p_color2) {} -void CurveTextureEdit::set_points(const Vector<Vector2> &p_points) { + void operator()(Vector2 pos0, Vector2 pos1, bool in_definition) { + ci.draw_line(pos0, pos1, in_definition ? color1 : color2); + } +}; + +void CurveEditor::_draw() { + if (_curve_ref.is_null()) + return; + Curve &curve = **_curve_ref; + + update_view_transform(); + + // Background + + Vector2 view_size = get_rect().size; + draw_style_box(get_stylebox("bg", "Tree"), Rect2(Point2(), view_size)); + + // Grid + + draw_set_transform_matrix(_world_to_view); + + Vector2 min_edge = get_world_pos(Vector2(0, view_size.y)); + Vector2 max_edge = get_world_pos(Vector2(view_size.x, 0)); + + const Color grid_color0(0, 0, 0, 0.5); + const Color grid_color1(0, 0, 0, 0.15); + draw_line(Vector2(min_edge.x, 0), Vector2(max_edge.x, 0), grid_color0); + draw_line(Vector2(0, min_edge.y), Vector2(0, max_edge.y), grid_color0); + draw_line(Vector2(1, max_edge.y), Vector2(1, min_edge.y), grid_color0); + draw_line(Vector2(max_edge.x, 1), Vector2(min_edge.x, 1), grid_color0); - points.clear(); - for (int i = 0; i < p_points.size(); i++) { - Point p; - p.offset = p_points[i].x; - p.height = p_points[i].y; - points.push_back(p); + const Vector2 grid_step(0.25, 0.5); + + for (real_t x = 0; x < 1.0; x += grid_step.x) { + draw_line(Vector2(x, min_edge.y), Vector2(x, max_edge.y), grid_color1); + } + for (real_t y = 0; y < 1.0; y += grid_step.y) { + draw_line(Vector2(min_edge.x, y), Vector2(max_edge.x, y), grid_color1); } - points.sort(); - update(); -} + // Markings -Vector<Vector2> CurveTextureEdit::get_points() const { - Vector<Vector2> ret; - for (int i = 0; i < points.size(); i++) - ret.push_back(Vector2(points[i].offset, points[i].height)); - return ret; -} + draw_set_transform_matrix(Transform2D()); -void CurveTextureEdit::_bind_methods() { + Ref<Font> font = get_font("font", "Label"); + const Color text_color(1, 1, 1, 0.3); - ClassDB::bind_method(D_METHOD("_gui_input"), &CurveTextureEdit::_gui_input); + draw_string(font, get_view_pos(Vector2(0, 0)), "0.0", text_color); - ADD_SIGNAL(MethodInfo("curve_changed")); -} + draw_string(font, get_view_pos(Vector2(0.25, 0)), "0.25", text_color); + draw_string(font, get_view_pos(Vector2(0.5, 0)), "0.5", text_color); + draw_string(font, get_view_pos(Vector2(0.75, 0)), "0.75", text_color); + draw_string(font, get_view_pos(Vector2(1, 0)), "1.0", text_color); -CurveTextureEdit::CurveTextureEdit() { + draw_string(font, get_view_pos(Vector2(0, 0.5)), "0.5", text_color); + draw_string(font, get_view_pos(Vector2(0, 1)), "1.0", text_color); - grabbed = -1; - grabbing = false; - max = 1; - min = 0; - set_focus_mode(FOCUS_ALL); -} + // Draw tangents for current point -void CurveTextureEditorPlugin::_curve_settings_changed() { + if (_selected_point >= 0) { - if (!curve_texture_ref.is_valid()) - return; - curve_editor->set_points(Variant(curve_texture_ref->get_points())); - curve_editor->set_range(curve_texture_ref->get_min(), curve_texture_ref->get_max()); -} + const Color tangent_color(0.5, 0.5, 1, 1); + + int i = _selected_point; + Vector2 pos = curve.get_point_pos(i); + + if (i != 0) { + Vector2 control_pos = get_tangent_view_pos(i, TANGENT_LEFT); + draw_line(get_view_pos(pos), control_pos, tangent_color); + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), tangent_color); + } -CurveTextureEditorPlugin::CurveTextureEditorPlugin(EditorNode *p_node) { + if (i != curve.get_point_count() - 1) { + Vector2 control_pos = get_tangent_view_pos(i, TANGENT_RIGHT); + draw_line(get_view_pos(pos), control_pos, tangent_color); + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(2), tangent_color); + } + } - editor = p_node; - curve_editor = memnew(CurveTextureEdit); + // Draw lines - curve_button = editor->add_bottom_panel_item("CurveTexture", curve_editor); + draw_set_transform_matrix(_world_to_view); - curve_button->hide(); - curve_editor->set_custom_minimum_size(Size2(100, 128 * EDSCALE)); - curve_editor->hide(); - curve_editor->connect("curve_changed", this, "curve_changed"); -} + const Color line_color(1, 1, 1, 0.85); + const Color edge_line_color(1, 1, 1, 0.4); + + CanvasItemPlotCurve plot_func(*this, line_color, edge_line_color); + plot_curve_accurate(curve, 4.f / view_size.x, plot_func); + + /*// TEST draw baked curve + { + Vector2 pos = Vector2(0, curve.interpolate_baked(0)); + Vector2 prev_pos = pos; -void CurveTextureEditorPlugin::edit(Object *p_object) { + float len = 1.0; + float step = 4.f / view_size.x; - if (curve_texture_ref.is_valid()) { - curve_texture_ref->disconnect("changed", this, "_curve_settings_changed"); + for(float x = step; x < len; x += step) { + pos.x = x; + pos.y = curve.interpolate_baked(x); + draw_line(get_point_view_pos(prev_pos), get_point_view_pos(pos), Color(0,1,0)); + prev_pos = pos; + } + + draw_line(get_point_view_pos(prev_pos), get_point_view_pos(Vector2(1, curve.interpolate_baked(1))), Color(0,1,0)); + }//*/ + + // Draw points + + draw_set_transform_matrix(Transform2D()); + + const Color point_color(1, 1, 1); + const Color selected_point_color(1, 0.5, 0.5); + + for (int i = 0; i < curve.get_point_count(); ++i) { + Vector2 pos = curve.get_point_pos(i); + draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(3), i == _selected_point ? selected_point_color : point_color); + // TODO Circles are prettier. Needs a fix! Or a texture + //draw_circle(pos, 2, point_color); } - CurveTexture *curve_texture = p_object->cast_to<CurveTexture>(); - if (!curve_texture) - return; - curve_texture_ref = Ref<CurveTexture>(curve_texture); - curve_editor->set_points(Variant(curve_texture_ref->get_points())); - curve_editor->set_range(curve_texture_ref->get_min(), curve_texture_ref->get_max()); - if (!curve_texture_ref->is_connected("changed", this, "_curve_settings_changed")) { - curve_texture_ref->connect("changed", this, "_curve_settings_changed"); + + // Hover + + if (_hover_point != -1) { + const Color hover_color = line_color; + Vector2 pos = curve.get_point_pos(_hover_point); + stroke_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(_hover_radius), hover_color); } } -bool CurveTextureEditorPlugin::handles(Object *p_object) const { +// TODO That should be part of the drawing API... +void CurveEditor::stroke_rect(Rect2 rect, Color color) { + + // a---b + // | | + // c---d + Vector2 a(rect.position); + Vector2 b(rect.position.x + rect.size.x, rect.position.y); + Vector2 c(rect.position.x, rect.position.y + rect.size.y); + Vector2 d(rect.position + rect.size); + + draw_line(a, b, color); + draw_line(b, d, color); + draw_line(d, c, color); + draw_line(c, a, color); +} - return p_object->is_class("CurveTexture"); +void CurveEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_gui_input"), &CurveEditor::on_gui_input); + ClassDB::bind_method(D_METHOD("_on_preset_item_selected"), &CurveEditor::on_preset_item_selected); + ClassDB::bind_method(D_METHOD("_curve_changed"), &CurveEditor::_curve_changed); + ClassDB::bind_method(D_METHOD("_on_context_menu_item_selected"), &CurveEditor::on_context_menu_item_selected); } -void CurveTextureEditorPlugin::make_visible(bool p_visible) { +//--------------- - if (p_visible) { - curve_button->show(); - editor->make_bottom_panel_item_visible(curve_editor); +CurveEditorPlugin::CurveEditorPlugin(EditorNode *p_node) { + _editor_node = p_node; - } else { + _view = memnew(CurveEditor); + _view->set_custom_minimum_size(Size2(100, 128 * EDSCALE)); + _view->hide(); - curve_button->hide(); - if (curve_editor->is_visible_in_tree()) - editor->hide_bottom_panel(); - } + _toggle_button = _editor_node->add_bottom_panel_item(get_name(), _view); + _toggle_button->hide(); } -void CurveTextureEditorPlugin::_curve_changed() { +CurveEditorPlugin::~CurveEditorPlugin() { +} - if (curve_texture_ref.is_valid()) { +void CurveEditorPlugin::edit(Object *p_object) { - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); + Ref<Curve> curve_ref; - Vector<Vector2> points = curve_editor->get_points(); - PoolVector<Vector2> ppoints = Variant(points); + if (_current_ref.is_valid()) { + CurveTexture *ct = _current_ref->cast_to<CurveTexture>(); + if (ct) + ct->disconnect(CoreStringNames::get_singleton()->changed, this, "_curve_texture_changed"); + } + + if (p_object) { + Resource *res = p_object->cast_to<Resource>(); + ERR_FAIL_COND(res == NULL); + ERR_FAIL_COND(!handles(p_object)); + + _current_ref = Ref<Resource>(p_object->cast_to<Resource>()); + + if (_current_ref.is_valid()) { + Curve *curve = _current_ref->cast_to<Curve>(); + if (curve) + curve_ref = Ref<Curve>(curve); + else { + CurveTexture *ct = _current_ref->cast_to<CurveTexture>(); + if (ct) { + ct->connect(CoreStringNames::get_singleton()->changed, this, "_curve_texture_changed"); + curve_ref = ct->get_curve(); + } + } + } - ur->create_action(TTR("Modify Curve"), UndoRedo::MERGE_ENDS); - ur->add_do_method(this, "undo_redo_curve_texture", ppoints); - ur->add_undo_method(this, "undo_redo_curve_texture", curve_texture_ref->get_points()); - ur->commit_action(); + } else { + _current_ref = Ref<Resource>(); } + + _view->set_curve(curve_ref); } -void CurveTextureEditorPlugin::_undo_redo_curve_texture(const PoolVector<Vector2> &points) { +bool CurveEditorPlugin::handles(Object *p_object) const { + // Both handled so that we can keep the curve editor open + return p_object->cast_to<Curve>() || p_object->cast_to<CurveTexture>(); +} - curve_texture_ref->set_points(points); - curve_editor->set_points(Variant(curve_texture_ref->get_points())); - curve_editor->update(); +void CurveEditorPlugin::make_visible(bool p_visible) { + if (p_visible) { + _toggle_button->show(); + _editor_node->make_bottom_panel_item_visible(_view); + } else { + _toggle_button->hide(); + if (_view->is_visible_in_tree()) + _editor_node->hide_bottom_panel(); + } } -CurveTextureEditorPlugin::~CurveTextureEditorPlugin() { +void CurveEditorPlugin::_curve_texture_changed() { + // If the curve is shown indirectly as a CurveTexture is edited, + // we need to monitor when the curve property gets assigned + CurveTexture *ct = _current_ref->cast_to<CurveTexture>(); + if (ct) { + _view->set_curve(ct->get_curve()); + } } -void CurveTextureEditorPlugin::_bind_methods() { - ClassDB::bind_method(D_METHOD("curve_changed"), &CurveTextureEditorPlugin::_curve_changed); - ClassDB::bind_method(D_METHOD("_curve_settings_changed"), &CurveTextureEditorPlugin::_curve_settings_changed); - ClassDB::bind_method(D_METHOD("undo_redo_curve_texture", "points"), &CurveTextureEditorPlugin::_undo_redo_curve_texture); +void CurveEditorPlugin::_bind_methods() { + + ClassDB::bind_method(D_METHOD("_curve_texture_changed"), &CurveEditorPlugin::_curve_texture_changed); } diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h index 4e75ba407c..0ed4ee3517 100644 --- a/editor/plugins/curve_editor_plugin.h +++ b/editor/plugins/curve_editor_plugin.h @@ -27,69 +27,119 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ + #ifndef CURVE_EDITOR_PLUGIN_H #define CURVE_EDITOR_PLUGIN_H #include "editor/editor_node.h" #include "editor/editor_plugin.h" +#include "scene/resources/curve.h" -class CurveTextureEdit : public Control { +// Edits a y(x) curve +class CurveEditor : public Control { + GDCLASS(CurveEditor, Control) +public: + CurveEditor(); - GDCLASS(CurveTextureEdit, Control); + Size2 get_minimum_size() const; - struct Point { + void set_curve(Ref<Curve> curve); - float offset; - float height; - bool operator<(const Point &p_ponit) const { - return offset < p_ponit.offset; - } + enum PresetID { + PRESET_FLAT0 = 0, + PRESET_FLAT1, + PRESET_LINEAR, + PRESET_EASE_IN, + PRESET_EASE_OUT, + PRESET_SMOOTHSTEP, + PRESET_COUNT }; - bool grabbing; - int grabbed; - Vector<Point> points; - float max, min; + enum ContextAction { + CONTEXT_ADD_POINT = 0, + CONTEXT_REMOVE_POINT + }; - void _plot_curve(const Vector2 &p_a, const Vector2 &p_b, const Vector2 &p_c, const Vector2 &p_d); + enum TangentIndex { + TANGENT_NONE = -1, + TANGENT_LEFT = 0, + TANGENT_RIGHT = 1 + }; protected: - void _gui_input(const Ref<InputEvent> &p_event); void _notification(int p_what); + static void _bind_methods(); -public: - void set_range(float p_min, float p_max); - void set_points(const Vector<Vector2> &p_points); - Vector<Vector2> get_points() const; - virtual Size2 get_minimum_size() const; - CurveTextureEdit(); +private: + void on_gui_input(const Ref<InputEvent> &p_event); + void on_preset_item_selected(int preset_id); + void _curve_changed(); + void on_context_menu_item_selected(int action_id); + + void open_context_menu(Vector2 pos); + int get_point_at(Vector2 pos) const; + int get_tangent_at(Vector2 pos) const; + void add_point(Vector2 pos); + void remove_point(int index); + void set_selected_point(int index); + void set_hover_point_index(int index); + void push_undo(Array previous_curve_data); + void update_view_transform(); + + Vector2 get_tangent_view_pos(int i, TangentIndex tangent) const; + Vector2 get_view_pos(Vector2 world_pos) const; + Vector2 get_world_pos(Vector2 view_pos) const; + + void _draw(); + + void stroke_rect(Rect2 rect, Color color); + +private: + Rect2 _world_rect; + Transform2D _world_to_view; + + Ref<Curve> _curve_ref; + PopupMenu *_context_menu; + PopupMenu *_presets_menu; + + Array _undo_data; + bool _has_undo_data; + bool _undo_no_commit; + + Vector2 _context_click_pos; + int _selected_point; + int _hover_point; + int _selected_tangent; + bool _dragging; + + // Constant + float _hover_radius; + float _tangents_length; }; -class CurveTextureEditorPlugin : public EditorPlugin { - - GDCLASS(CurveTextureEditorPlugin, EditorPlugin); +class CurveEditorPlugin : public EditorPlugin { + GDCLASS(CurveEditorPlugin, EditorPlugin) +public: + CurveEditorPlugin(EditorNode *p_node); + ~CurveEditorPlugin(); - CurveTextureEdit *curve_editor; - Ref<CurveTexture> curve_texture_ref; - EditorNode *editor; - ToolButton *curve_button; + String get_name() const { return "Curve"; } + bool has_main_screen() const { return false; } + void edit(Object *p_object); + bool handles(Object *p_object) const; + void make_visible(bool p_visible); -protected: +private: static void _bind_methods(); - void _curve_changed(); - void _undo_redo_curve_texture(const PoolVector<Vector2> &points); - void _curve_settings_changed(); -public: - virtual String get_name() const { return "CurveTexture"; } - bool has_main_screen() const { return false; } - virtual void edit(Object *p_node); - virtual bool handles(Object *p_node) const; - virtual void make_visible(bool p_visible); + void _curve_texture_changed(); - CurveTextureEditorPlugin(EditorNode *p_node); - ~CurveTextureEditorPlugin(); +private: + CurveEditor *_view; + Ref<Resource> _current_ref; + EditorNode *_editor_node; + ToolButton *_toggle_button; }; #endif // CURVE_EDITOR_PLUGIN_H diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 7f8b98e1d3..11d804422a 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -427,13 +427,14 @@ Ref<Texture> EditorScriptPreviewPlugin::generate(const RES &p_from) { Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"); Color symbol_color = EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"); + img->lock(); + for (int i = 0; i < thumbnail_size; i++) { for (int j = 0; j < thumbnail_size; j++) { img->put_pixel(i, j, bg_color); } } - img->lock(); bool prev_is_text = false; bool in_keyword = false; for (int i = 0; i < code.length(); i++) { diff --git a/editor/plugins/gradient_editor_plugin.cpp b/editor/plugins/gradient_editor_plugin.cpp index 9884db934b..4aaa155cfd 100644 --- a/editor/plugins/gradient_editor_plugin.cpp +++ b/editor/plugins/gradient_editor_plugin.cpp @@ -91,8 +91,7 @@ void GradientEditorPlugin::_ramp_changed() { } } -void GradientEditorPlugin::_undo_redo_gradient(const Vector<float> &offsets, - const Vector<Color> &colors) { +void GradientEditorPlugin::_undo_redo_gradient(const Vector<float> &offsets, const Vector<Color> &colors) { gradient_ref->set_offsets(offsets); gradient_ref->set_colors(colors); diff --git a/editor/plugins/gradient_editor_plugin.h b/editor/plugins/gradient_editor_plugin.h index 843e98a917..c319a13a01 100644 --- a/editor/plugins/gradient_editor_plugin.h +++ b/editor/plugins/gradient_editor_plugin.h @@ -38,7 +38,6 @@ class GradientEditorPlugin : public EditorPlugin { GDCLASS(GradientEditorPlugin, EditorPlugin); - bool _2d; Ref<Gradient> gradient_ref; GradientEdit *ramp_editor; EditorNode *editor; diff --git a/editor/plugins/gradient_texture_editor_plugin.cpp b/editor/plugins/gradient_texture_editor_plugin.cpp deleted file mode 100644 index bc985dcdf7..0000000000 --- a/editor/plugins/gradient_texture_editor_plugin.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/*************************************************************************/ -/* gradient_texture_editor_plugin.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* 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 AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#include "gradient_texture_editor_plugin.h" - -#include "canvas_item_editor_plugin.h" -#include "os/keyboard.h" -#include "scene/resources/default_theme/theme_data.h" -#include "spatial_editor_plugin.h" - -#define POINT_WIDTH 8 - -GradientTextureEdit::GradientTextureEdit() { - grabbed = -1; - grabbing = false; - set_focus_mode(FOCUS_ALL); - - popup = memnew(PopupPanel); - picker = memnew(ColorPicker); - popup->add_child(picker); - - add_child(popup); - - checker = Ref<ImageTexture>(memnew(ImageTexture)); - Ref<Image> checker_bg = memnew(Image(checker_bg_png)); - checker->create_from_image(checker_bg, ImageTexture::FLAG_REPEAT); -} - -int GradientTextureEdit::_get_point_from_pos(int x) { - int result = -1; - int total_w = get_size().width - get_size().height - 3; - for (int i = 0; i < points.size(); i++) { - //Check if we clicked at point - if (ABS(x - points[i].offset * total_w + 1) < (POINT_WIDTH / 2 + 1)) { - result = i; - } - } - return result; -} - -void GradientTextureEdit::_show_color_picker() { - if (grabbed == -1) - return; - Size2 ms = Size2(350, picker->get_combined_minimum_size().height + 10); - picker->set_pick_color(points[grabbed].color); - popup->set_position(get_global_position() - Vector2(ms.width - get_size().width, ms.height)); - popup->set_size(ms); - popup->popup(); -} - -GradientTextureEdit::~GradientTextureEdit() { -} - -void GradientTextureEdit::_gui_input(const Ref<InputEvent> &p_event) { - - Ref<InputEventKey> k = p_event; - - if (k.is_valid() && k->is_pressed() && k->get_scancode() == KEY_DELETE && grabbed != -1) { - - points.remove(grabbed); - grabbed = -1; - grabbing = false; - update(); - emit_signal("ramp_changed"); - accept_event(); - } - - Ref<InputEventMouseButton> mb = p_event; - //Show color picker on double click. - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_doubleclick() && mb->is_pressed()) { - grabbed = _get_point_from_pos(mb->get_position().x); - _show_color_picker(); - accept_event(); - } - - //Delete point on right click - if (mb.is_valid() && mb->get_button_index() == 2 && mb->is_pressed()) { - grabbed = _get_point_from_pos(mb->get_position().x); - if (grabbed != -1) { - points.remove(grabbed); - grabbed = -1; - grabbing = false; - update(); - emit_signal("ramp_changed"); - accept_event(); - } - } - - //Hold alt key to duplicate selected color - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed() && mb->get_alt()) { - - int x = mb->get_position().x; - grabbed = _get_point_from_pos(x); - - if (grabbed != -1) { - int total_w = get_size().width - get_size().height - 3; - GradientTexture::Point newPoint = points[grabbed]; - newPoint.offset = CLAMP(x / float(total_w), 0, 1); - - points.push_back(newPoint); - points.sort(); - for (int i = 0; i < points.size(); ++i) { - if (points[i].offset == newPoint.offset) { - grabbed = i; - break; - } - } - - emit_signal("ramp_changed"); - update(); - } - } - - if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) { - - update(); - int x = mb->get_position().x; - int total_w = get_size().width - get_size().height - 3; - - //Check if color selector was clicked. - if (x > total_w + 3) { - _show_color_picker(); - return; - } - - grabbing = true; - - grabbed = _get_point_from_pos(x); - //grab or select - if (grabbed != -1) { - return; - } - - //insert - GradientTexture::Point newPoint; - newPoint.offset = CLAMP(x / float(total_w), 0, 1); - - GradientTexture::Point prev; - GradientTexture::Point next; - - int pos = -1; - for (int i = 0; i < points.size(); i++) { - if (points[i].offset < newPoint.offset) - pos = i; - } - - if (pos == -1) { - - prev.color = Color(0, 0, 0); - prev.offset = 0; - if (points.size()) { - next = points[0]; - } else { - next.color = Color(1, 1, 1); - next.offset = 1.0; - } - } else { - - if (pos == points.size() - 1) { - next.color = Color(1, 1, 1); - next.offset = 1.0; - } else { - next = points[pos + 1]; - } - prev = points[pos]; - } - - newPoint.color = prev.color.linear_interpolate(next.color, (newPoint.offset - prev.offset) / (next.offset - prev.offset)); - - points.push_back(newPoint); - points.sort(); - for (int i = 0; i < points.size(); i++) { - if (points[i].offset == newPoint.offset) { - grabbed = i; - break; - } - } - - emit_signal("ramp_changed"); - } - - if (mb.is_valid() && mb->get_button_index() == 1 && !mb->is_pressed()) { - - if (grabbing) { - grabbing = false; - emit_signal("ramp_changed"); - } - update(); - } - - Ref<InputEventMouseMotion> mm = p_event; - - if (mm.is_valid() && grabbing) { - - int total_w = get_size().width - get_size().height - 3; - - int x = mm->get_position().x; - float newofs = CLAMP(x / float(total_w), 0, 1); - - //Snap to nearest point if holding shift - if (mm->get_shift()) { - float snap_treshhold = 0.03; - float smallest_ofs = snap_treshhold; - bool founded = false; - int nearest_point; - for (int i = 0; i < points.size(); ++i) { - if (i != grabbed) { - float temp_ofs = ABS(points[i].offset - newofs); - if (temp_ofs < smallest_ofs) { - smallest_ofs = temp_ofs; - nearest_point = i; - if (founded) - break; - founded = true; - } - } - } - if (founded) { - if (points[nearest_point].offset < newofs) - newofs = points[nearest_point].offset + 0.00001; - else - newofs = points[nearest_point].offset - 0.00001; - newofs = CLAMP(newofs, 0, 1); - } - } - - bool valid = true; - for (int i = 0; i < points.size(); i++) { - - if (points[i].offset == newofs && i != grabbed) { - valid = false; - } - } - - if (!valid) - return; - - points[grabbed].offset = newofs; - - points.sort(); - for (int i = 0; i < points.size(); i++) { - if (points[i].offset == newofs) { - grabbed = i; - break; - } - } - - emit_signal("ramp_changed"); - - update(); - } -} - -void GradientTextureEdit::_notification(int p_what) { - - if (p_what == NOTIFICATION_ENTER_TREE) { - if (!picker->is_connected("color_changed", this, "_color_changed")) { - picker->connect("color_changed", this, "_color_changed"); - } - } - if (p_what == NOTIFICATION_DRAW) { - - int w = get_size().x; - int h = get_size().y; - - if (w == 0 || h == 0) - return; //Safety check. We have division by 'h'. And in any case there is nothing to draw with such size - - int total_w = get_size().width - get_size().height - 3; - - //Draw checker pattern for ramp - _draw_checker(0, 0, total_w, h); - - //Draw color ramp - GradientTexture::Point prev; - prev.offset = 0; - if (points.size() == 0) - prev.color = Color(0, 0, 0); //Draw black rectangle if we have no points - else - prev.color = points[0].color; //Extend color of first point to the beginning. - - for (int i = -1; i < points.size(); i++) { - - GradientTexture::Point next; - //If there is no next point - if (i + 1 == points.size()) { - if (points.size() == 0) - next.color = Color(0, 0, 0); //Draw black rectangle if we have no points - else - next.color = points[i].color; //Extend color of last point to the end. - next.offset = 1; - } else { - next = points[i + 1]; - } - - if (prev.offset == next.offset) { - prev = next; - continue; - } - - Vector<Vector2> points; - Vector<Color> colors; - points.push_back(Vector2(prev.offset * total_w, h)); - points.push_back(Vector2(prev.offset * total_w, 0)); - points.push_back(Vector2(next.offset * total_w, 0)); - points.push_back(Vector2(next.offset * total_w, h)); - colors.push_back(prev.color); - colors.push_back(prev.color); - colors.push_back(next.color); - colors.push_back(next.color); - draw_primitive(points, colors, Vector<Point2>()); - prev = next; - } - - //Draw point markers - for (int i = 0; i < points.size(); i++) { - - Color col = i == grabbed ? Color(1, 0.0, 0.0, 0.9) : points[i].color.contrasted(); - col.a = 0.9; - - draw_line(Vector2(points[i].offset * total_w, 0), Vector2(points[i].offset * total_w, h / 2), col); - draw_rect(Rect2(points[i].offset * total_w - POINT_WIDTH / 2, h / 2, POINT_WIDTH, h / 2), Color(0.6, 0.6, 0.6, i == grabbed ? 0.9 : 0.4)); - draw_line(Vector2(points[i].offset * total_w - POINT_WIDTH / 2, h / 2), Vector2(points[i].offset * total_w - POINT_WIDTH / 2, h - 1), col); - draw_line(Vector2(points[i].offset * total_w + POINT_WIDTH / 2, h / 2), Vector2(points[i].offset * total_w + POINT_WIDTH / 2, h - 1), col); - draw_line(Vector2(points[i].offset * total_w - POINT_WIDTH / 2, h / 2), Vector2(points[i].offset * total_w + POINT_WIDTH / 2, h / 2), col); - draw_line(Vector2(points[i].offset * total_w - POINT_WIDTH / 2, h - 1), Vector2(points[i].offset * total_w + POINT_WIDTH / 2, h - 1), col); - } - - //Draw "button" for color selector - _draw_checker(total_w + 3, 0, h, h); - if (grabbed != -1) { - //Draw with selection color - draw_rect(Rect2(total_w + 3, 0, h, h), points[grabbed].color); - } else { - //if no color selected draw grey color with 'X' on top. - draw_rect(Rect2(total_w + 3, 0, h, h), Color(0.5, 0.5, 0.5, 1)); - draw_line(Vector2(total_w + 3, 0), Vector2(total_w + 3 + h, h), Color(1, 1, 1, 0.6)); - draw_line(Vector2(total_w + 3, h), Vector2(total_w + 3 + h, 0), Color(1, 1, 1, 0.6)); - } - - //Draw borders around color ramp if in focus - if (has_focus()) { - - draw_line(Vector2(-1, -1), Vector2(total_w + 1, -1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(total_w + 1, -1), Vector2(total_w + 1, h + 1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(total_w + 1, h + 1), Vector2(-1, h + 1), Color(1, 1, 1, 0.6)); - draw_line(Vector2(-1, -1), Vector2(-1, h + 1), Color(1, 1, 1, 0.6)); - } - } -} - -void GradientTextureEdit::_draw_checker(int x, int y, int w, int h) { - //Draw it with polygon to insert UVs for scale - Vector<Vector2> backPoints; - backPoints.push_back(Vector2(x, y)); - backPoints.push_back(Vector2(x, y + h)); - backPoints.push_back(Vector2(x + w, y + h)); - backPoints.push_back(Vector2(x + w, y)); - Vector<Color> colorPoints; - colorPoints.push_back(Color(1, 1, 1, 1)); - colorPoints.push_back(Color(1, 1, 1, 1)); - colorPoints.push_back(Color(1, 1, 1, 1)); - colorPoints.push_back(Color(1, 1, 1, 1)); - Vector<Vector2> uvPoints; - //Draw checker pattern pixel-perfect and scale it by 2. - uvPoints.push_back(Vector2(x, y)); - uvPoints.push_back(Vector2(x, y + h * .5f / checker->get_height())); - uvPoints.push_back(Vector2(x + w * .5f / checker->get_width(), y + h * .5f / checker->get_height())); - uvPoints.push_back(Vector2(x + w * .5f / checker->get_width(), y)); - draw_polygon(backPoints, colorPoints, uvPoints, checker); -} - -Size2 GradientTextureEdit::get_minimum_size() const { - - return Vector2(0, 16); -} - -void GradientTextureEdit::_color_changed(const Color &p_color) { - - if (grabbed == -1) - return; - points[grabbed].color = p_color; - update(); - emit_signal("ramp_changed"); -} - -void GradientTextureEdit::set_ramp(const Vector<float> &p_offsets, const Vector<Color> &p_colors) { - - ERR_FAIL_COND(p_offsets.size() != p_colors.size()); - points.clear(); - for (int i = 0; i < p_offsets.size(); i++) { - GradientTexture::Point p; - p.offset = p_offsets[i]; - p.color = p_colors[i]; - points.push_back(p); - } - - points.sort(); - update(); -} - -Vector<float> GradientTextureEdit::get_offsets() const { - Vector<float> ret; - for (int i = 0; i < points.size(); i++) - ret.push_back(points[i].offset); - return ret; -} - -Vector<Color> GradientTextureEdit::get_colors() const { - Vector<Color> ret; - for (int i = 0; i < points.size(); i++) - ret.push_back(points[i].color); - return ret; -} - -void GradientTextureEdit::set_points(Vector<GradientTexture::Point> &p_points) { - if (points.size() != p_points.size()) - grabbed = -1; - points.clear(); - points = p_points; -} - -Vector<GradientTexture::Point> &GradientTextureEdit::get_points() { - return points; -} - -void GradientTextureEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &GradientTextureEdit::_gui_input); - ClassDB::bind_method(D_METHOD("_color_changed"), &GradientTextureEdit::_color_changed); - ADD_SIGNAL(MethodInfo("ramp_changed")); -} - -GradientTextureEditorPlugin::GradientTextureEditorPlugin(EditorNode *p_node) { - - editor = p_node; - ramp_editor = memnew(GradientTextureEdit); - - gradient_button = editor->add_bottom_panel_item("GradientTexture", ramp_editor); - - gradient_button->hide(); - ramp_editor->set_custom_minimum_size(Size2(100, 100 * EDSCALE)); - ramp_editor->hide(); - ramp_editor->connect("ramp_changed", this, "ramp_changed"); -} - -void GradientTextureEditorPlugin::edit(Object *p_object) { - - GradientTexture *gradient_texture = p_object->cast_to<GradientTexture>(); - if (!gradient_texture) - return; - gradient_texture_ref = Ref<GradientTexture>(gradient_texture); - ramp_editor->set_points(gradient_texture_ref->get_points()); -} - -bool GradientTextureEditorPlugin::handles(Object *p_object) const { - - return p_object->is_class("GradientTexture"); -} - -void GradientTextureEditorPlugin::make_visible(bool p_visible) { - - if (p_visible) { - gradient_button->show(); - editor->make_bottom_panel_item_visible(ramp_editor); - - } else { - - gradient_button->hide(); - if (ramp_editor->is_visible_in_tree()) - editor->hide_bottom_panel(); - } -} - -void GradientTextureEditorPlugin::_ramp_changed() { - - if (gradient_texture_ref.is_valid()) { - - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - - //Not sure if I should convert this data to PoolVector - Vector<float> new_offsets = ramp_editor->get_offsets(); - Vector<Color> new_colors = ramp_editor->get_colors(); - Vector<float> old_offsets = gradient_texture_ref->get_offsets(); - Vector<Color> old_colors = gradient_texture_ref->get_colors(); - - if (old_offsets.size() != new_offsets.size()) - ur->create_action(TTR("Add/Remove Color Ramp Point")); - else - ur->create_action(TTR("Modify Color Ramp"), UndoRedo::MERGE_ENDS); - ur->add_do_method(this, "undo_redo_gradient_texture", new_offsets, new_colors); - ur->add_undo_method(this, "undo_redo_gradient_texture", old_offsets, old_colors); - ur->commit_action(); - - //gradient_texture_ref->set_points(ramp_editor->get_points()); - } -} - -void GradientTextureEditorPlugin::_undo_redo_gradient_texture(const Vector<float> &offsets, - const Vector<Color> &colors) { - - gradient_texture_ref->set_offsets(offsets); - gradient_texture_ref->set_colors(colors); - ramp_editor->set_points(gradient_texture_ref->get_points()); - ramp_editor->update(); -} - -GradientTextureEditorPlugin::~GradientTextureEditorPlugin() { -} - -void GradientTextureEditorPlugin::_bind_methods() { - ClassDB::bind_method(D_METHOD("ramp_changed"), &GradientTextureEditorPlugin::_ramp_changed); - ClassDB::bind_method(D_METHOD("undo_redo_gradient_texture", "offsets", "colors"), &GradientTextureEditorPlugin::_undo_redo_gradient_texture); -} diff --git a/editor/plugins/gradient_texture_editor_plugin.h b/editor/plugins/gradient_texture_editor_plugin.h deleted file mode 100644 index 842d586541..0000000000 --- a/editor/plugins/gradient_texture_editor_plugin.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************/ -/* gradient_texture_editor_plugin.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* http://www.godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* 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 AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ -#ifndef GRADIENT_TEXTURE_EDITOR_PLUGIN_H -#define GRADIENT_TEXTURE_EDITOR_PLUGIN_H - -#include "editor/editor_node.h" -#include "editor/editor_plugin.h" -#include "scene/resources/texture.h" - -class GradientTextureEdit : public Control { - - GDCLASS(GradientTextureEdit, Control); - - PopupPanel *popup; - ColorPicker *picker; - - Ref<ImageTexture> checker; - - bool grabbing; - int grabbed; - Vector<GradientTexture::Point> points; - - void _draw_checker(int x, int y, int w, int h); - void _color_changed(const Color &p_color); - int _get_point_from_pos(int x); - void _show_color_picker(); - -protected: - void _gui_input(const Ref<InputEvent> &p_event); - void _notification(int p_what); - static void _bind_methods(); - -public: - void set_ramp(const Vector<float> &p_offsets, const Vector<Color> &p_colors); - Vector<float> get_offsets() const; - Vector<Color> get_colors() const; - void set_points(Vector<GradientTexture::Point> &p_points); - Vector<GradientTexture::Point> &get_points(); - virtual Size2 get_minimum_size() const; - - GradientTextureEdit(); - virtual ~GradientTextureEdit(); -}; - -class GradientTextureEditorPlugin : public EditorPlugin { - - GDCLASS(GradientTextureEditorPlugin, EditorPlugin); - - bool _2d; - Ref<GradientTexture> gradient_texture_ref; - GradientTextureEdit *ramp_editor; - EditorNode *editor; - ToolButton *gradient_button; - -protected: - static void _bind_methods(); - void _ramp_changed(); - void _undo_redo_gradient_texture(const Vector<float> &offsets, const Vector<Color> &colors); - -public: - virtual String get_name() const { return "GradientTexture"; } - bool has_main_screen() const { return false; } - virtual void edit(Object *p_node); - virtual bool handles(Object *p_node) const; - virtual void make_visible(bool p_visible); - - GradientTextureEditorPlugin(EditorNode *p_node); - ~GradientTextureEditorPlugin(); -}; - -#endif // GRADIENT_TEXTURE_EDITOR_PLUGIN_H diff --git a/editor/plugins/particles_2d_editor_plugin.cpp b/editor/plugins/particles_2d_editor_plugin.cpp index c6c85d8be2..a759e5892f 100644 --- a/editor/plugins/particles_2d_editor_plugin.cpp +++ b/editor/plugins/particles_2d_editor_plugin.cpp @@ -31,8 +31,8 @@ #include "canvas_item_editor_plugin.h" #include "io/image_loader.h" +#include "scene/3d/particles.h" #include "scene/gui/separator.h" - void Particles2DEditorPlugin::edit(Object *p_object) { if (p_object) { @@ -62,78 +62,264 @@ void Particles2DEditorPlugin::_file_selected(const String &p_file) { print_line("file: " + p_file); - int epc = epoints->get_value(); + source_emission_file = p_file; + emission_mask->popup_centered_minsize(); +} + +void Particles2DEditorPlugin::_menu_callback(int p_idx) { + + switch (p_idx) { + case MENU_GENERATE_VISIBILITY_RECT: { + generate_aabb->popup_centered_minsize(); + } break; + case MENU_LOAD_EMISSION_MASK: { + + file->popup_centered_ratio(); + + } break; + case MENU_CLEAR_EMISSION_MASK: { + + emission_mask->popup_centered_minsize(); + + /*undo_redo->create_action(TTR("Clear Emission Mask")); + undo_redo->add_do_method(particles, "set_emission_points", PoolVector<Vector2>()); + undo_redo->add_undo_method(particles, "set_emission_points", particles->get_emission_points()); + undo_redo->commit_action();*/ + } break; + } +} + +void Particles2DEditorPlugin::_generate_visibility_rect() { + + float time = generate_seconds->get_value(); + + float running = 0.0; + + EditorProgress ep("gen_aabb", TTR("Generating AABB"), int(time)); + + Rect2 rect; + while (running < time) { + + uint64_t ticks = OS::get_singleton()->get_ticks_usec(); + ep.step("Generating..", int(running), true); + OS::get_singleton()->delay_usec(1000); + + Rect2 capture = particles->capture_rect(); + if (rect == Rect2()) + rect = capture; + else + rect = rect.merge(capture); + + running += (OS::get_singleton()->get_ticks_usec() - ticks) / 1000000.0; + } + + particles->set_visibility_rect(rect); +} + +void Particles2DEditorPlugin::_generate_emission_mask() { + + Ref<ParticlesMaterial> pm = particles->get_process_material(); + if (!pm.is_valid()) { + EditorNode::get_singleton()->show_warning(TTR("Can only set point into a ParticlesMaterial process material")); + return; + } Ref<Image> img; img.instance(); - Error err = ImageLoader::load_image(p_file, img); - ERR_EXPLAIN(TTR("Error loading image:") + " " + p_file); + Error err = ImageLoader::load_image(source_emission_file, img); + ERR_EXPLAIN(TTR("Error loading image:") + " " + source_emission_file); ERR_FAIL_COND(err != OK); - img->convert(Image::FORMAT_LA8); - ERR_FAIL_COND(img->get_format() != Image::FORMAT_LA8); + if (img->is_compressed()) { + img->decompress(); + } + img->convert(Image::FORMAT_RGBA8); + ERR_FAIL_COND(img->get_format() != Image::FORMAT_RGBA8); Size2i s = Size2(img->get_width(), img->get_height()); ERR_FAIL_COND(s.width == 0 || s.height == 0); - PoolVector<uint8_t> data = img->get_data(); - PoolVector<uint8_t>::Read r = data.read(); + Vector<Point2> valid_positions; + Vector<Point2> valid_normals; + Vector<uint8_t> valid_colors; - Vector<Point2i> valid_positions; valid_positions.resize(s.width * s.height); + + EmissionMode emode = (EmissionMode)emission_mask_mode->get_selected(); + + if (emode == EMISSION_MODE_BORDER_DIRECTED) { + valid_normals.resize(s.width * s.height); + } + + bool capture_colors = emission_colors->is_pressed(); + + if (capture_colors) { + valid_colors.resize(s.width * s.height * 4); + } + int vpc = 0; - for (int i = 0; i < s.width * s.height; i++) { + { + PoolVector<uint8_t> data = img->get_data(); + PoolVector<uint8_t>::Read r = data.read(); + + for (int i = 0; i < s.width; i++) { + for (int j = 0; j < s.height; j++) { + + uint8_t a = r[(j * s.width + i) * 4 + 3]; + + if (a > 128) { + + if (emode == EMISSION_MODE_SOLID) { + + if (capture_colors) { + valid_colors[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0]; + valid_colors[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1]; + valid_colors[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2]; + valid_colors[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3]; + } + valid_positions[vpc++] = Point2(i, j); + + } else { - uint8_t a = r[i * 2 + 1]; - if (a > 128) { - valid_positions[vpc++] = Point2i(i % s.width, i / s.width); + bool on_border = false; + for (int x = i - 1; x <= i + 1; x++) { + for (int y = j - 1; y <= j + 1; y++) { + + if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) { + on_border = true; + break; + } + } + + if (on_border) + break; + } + + if (on_border) { + valid_positions[vpc] = Point2(i, j); + + if (emode == EMISSION_MODE_BORDER_DIRECTED) { + Vector2 normal; + for (int x = i - 2; x <= i + 2; x++) { + for (int y = j - 2; y <= j + 2; y++) { + + if (x == i && y == j) + continue; + + if (x < 0 || y < 0 || x >= s.width || y >= s.height || r[(y * s.width + x) * 4 + 3] <= 128) { + normal += Vector2(x - i, y - j).normalized(); + } + } + } + + normal.normalize(); + valid_normals[vpc] = normal; + } + + if (capture_colors) { + valid_colors[vpc * 4 + 0] = r[(j * s.width + i) * 4 + 0]; + valid_colors[vpc * 4 + 1] = r[(j * s.width + i) * 4 + 1]; + valid_colors[vpc * 4 + 2] = r[(j * s.width + i) * 4 + 2]; + valid_colors[vpc * 4 + 3] = r[(j * s.width + i) * 4 + 3]; + } + + vpc++; + } + } + } + } } } valid_positions.resize(vpc); + if (valid_normals.size()) { + valid_normals.resize(vpc); + } ERR_EXPLAIN(TTR("No pixels with transparency > 128 in image..")); ERR_FAIL_COND(valid_positions.size() == 0); - PoolVector<Point2> epoints; - epoints.resize(epc); - PoolVector<Point2>::Write w = epoints.write(); + PoolVector<uint8_t> texdata; + + int w = 2048; + int h = (vpc / 2048) + 1; - Size2 extents = Size2(img->get_width() * 0.5, img->get_height() * 0.5); + texdata.resize(w * h * 2 * sizeof(float)); - for (int i = 0; i < epc; i++) { + { + PoolVector<uint8_t>::Write tw = texdata.write(); + float *twf = (float *)tw.ptr(); + for (int i = 0; i < vpc; i++) { - Point2 p = valid_positions[Math::rand() % vpc]; - p -= s / 2; - w[i] = p / extents; + twf[i * 2 + 0] = valid_positions[i].x; + twf[i * 2 + 1] = valid_positions[i].y; + } } - w = PoolVector<Point2>::Write(); + img.instance(); + img->create(w, h, false, Image::FORMAT_RGF, texdata); - undo_redo->create_action(TTR("Set Emission Mask")); - undo_redo->add_do_method(particles, "set_emission_points", epoints); - undo_redo->add_do_method(particles, "set_emission_half_extents", extents); - undo_redo->add_undo_method(particles, "set_emission_points", particles->get_emission_points()); - undo_redo->add_undo_method(particles, "set_emission_half_extents", particles->get_emission_half_extents()); - undo_redo->commit_action(); -} + Ref<ImageTexture> imgt; + imgt.instance(); + imgt->create_from_image(img, 0); -void Particles2DEditorPlugin::_menu_callback(int p_idx) { + pm->set_emission_point_texture(imgt); + pm->set_emission_point_count(vpc); - switch (p_idx) { - case MENU_LOAD_EMISSION_MASK: { + if (capture_colors) { - file->popup_centered_ratio(); + PoolVector<uint8_t> colordata; + colordata.resize(w * h * 4); //use RG texture - } break; - case MENU_CLEAR_EMISSION_MASK: { + { + PoolVector<uint8_t>::Write tw = colordata.write(); + for (int i = 0; i < vpc * 4; i++) { - undo_redo->create_action(TTR("Clear Emission Mask")); - undo_redo->add_do_method(particles, "set_emission_points", PoolVector<Vector2>()); - undo_redo->add_undo_method(particles, "set_emission_points", particles->get_emission_points()); - undo_redo->commit_action(); - } break; + tw[i] = valid_colors[i]; + } + } + + img.instance(); + img->create(w, h, false, Image::FORMAT_RGBA8, colordata); + + imgt.instance(); + imgt->create_from_image(img, 0); + pm->set_emission_color_texture(imgt); } + + if (valid_normals.size()) { + pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_DIRECTED_POINTS); + + PoolVector<uint8_t> normdata; + normdata.resize(w * h * 2 * sizeof(float)); //use RG texture + + { + PoolVector<uint8_t>::Write tw = normdata.write(); + float *twf = (float *)tw.ptr(); + for (int i = 0; i < vpc; i++) { + twf[i * 2 + 0] = valid_normals[i].x; + twf[i * 2 + 1] = valid_normals[i].y; + } + } + + img.instance(); + img->create(w, h, false, Image::FORMAT_RGF, normdata); + + imgt.instance(); + imgt->create_from_image(img, 0); + pm->set_emission_normal_texture(imgt); + + } else { + pm->set_emission_shape(ParticlesMaterial::EMISSION_SHAPE_POINTS); + } + + /*undo_redo->create_action(TTR("Set Emission Mask")); + undo_redo->add_do_method(particles, "set_emission_points", epoints); + undo_redo->add_do_method(particles, "set_emission_half_extents", extents); + undo_redo->add_undo_method(particles, "set_emission_points", particles->get_emission_points()); + undo_redo->add_undo_method(particles, "set_emission_half_extents", particles->get_emission_half_extents()); + undo_redo->commit_action(); + */ } void Particles2DEditorPlugin::_notification(int p_what) { @@ -150,6 +336,8 @@ void Particles2DEditorPlugin::_bind_methods() { ClassDB::bind_method(D_METHOD("_menu_callback"), &Particles2DEditorPlugin::_menu_callback); ClassDB::bind_method(D_METHOD("_file_selected"), &Particles2DEditorPlugin::_file_selected); + ClassDB::bind_method(D_METHOD("_generate_visibility_rect"), &Particles2DEditorPlugin::_generate_visibility_rect); + ClassDB::bind_method(D_METHOD("_generate_emission_mask"), &Particles2DEditorPlugin::_generate_emission_mask); } Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) { @@ -165,8 +353,10 @@ Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) { toolbar->add_child(memnew(VSeparator)); menu = memnew(MenuButton); + menu->get_popup()->add_item(TTR("Generate Visibility Rect"), MENU_GENERATE_VISIBILITY_RECT); + menu->get_popup()->add_separator(); menu->get_popup()->add_item(TTR("Load Emission Mask"), MENU_LOAD_EMISSION_MASK); - menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK); + // menu->get_popup()->add_item(TTR("Clear Emission Mask"), MENU_CLEAR_EMISSION_MASK); menu->set_text("Particles"); toolbar->add_child(menu); @@ -185,6 +375,37 @@ Particles2DEditorPlugin::Particles2DEditorPlugin(EditorNode *p_node) { epoints->set_step(1); epoints->set_value(512); file->get_vbox()->add_margin_child(TTR("Generated Point Count:"), epoints); + + generate_aabb = memnew(ConfirmationDialog); + generate_aabb->set_title(TTR("Generate Visibility Rect")); + VBoxContainer *genvb = memnew(VBoxContainer); + generate_aabb->add_child(genvb); + generate_seconds = memnew(SpinBox); + genvb->add_margin_child(TTR("Generation Time (sec):"), generate_seconds); + generate_seconds->set_min(0.1); + generate_seconds->set_max(25); + generate_seconds->set_value(2); + + toolbar->add_child(generate_aabb); + + generate_aabb->connect("confirmed", this, "_generate_visibility_rect"); + + emission_mask = memnew(ConfirmationDialog); + emission_mask->set_title(TTR("Generate Visibility Rect")); + VBoxContainer *emvb = memnew(VBoxContainer); + emission_mask->add_child(emvb); + emission_mask_mode = memnew(OptionButton); + emvb->add_margin_child(TTR("Emission Mask"), emission_mask_mode); + emission_mask_mode->add_item("Solid Pixels", EMISSION_MODE_SOLID); + emission_mask_mode->add_item("Border Pixels", EMISSION_MODE_BORDER); + emission_mask_mode->add_item("Directed Border Pixels", EMISSION_MODE_BORDER_DIRECTED); + emission_colors = memnew(CheckBox); + emission_colors->set_text(TTR("Capture from Pixel")); + emvb->add_margin_child(TTR("Emission Colors"), emission_colors); + + toolbar->add_child(emission_mask); + + emission_mask->connect("confirmed", this, "_generate_emission_mask"); } Particles2DEditorPlugin::~Particles2DEditorPlugin() { diff --git a/editor/plugins/particles_2d_editor_plugin.h b/editor/plugins/particles_2d_editor_plugin.h index e532157c35..cea60fbeaf 100644 --- a/editor/plugins/particles_2d_editor_plugin.h +++ b/editor/plugins/particles_2d_editor_plugin.h @@ -44,10 +44,17 @@ class Particles2DEditorPlugin : public EditorPlugin { enum { + MENU_GENERATE_VISIBILITY_RECT, MENU_LOAD_EMISSION_MASK, MENU_CLEAR_EMISSION_MASK }; + enum EmissionMode { + EMISSION_MODE_SOLID, + EMISSION_MODE_BORDER, + EMISSION_MODE_BORDER_DIRECTED + }; + Particles2D *particles; EditorFileDialog *file; @@ -58,9 +65,20 @@ class Particles2DEditorPlugin : public EditorPlugin { SpinBox *epoints; + ConfirmationDialog *generate_aabb; + SpinBox *generate_seconds; + + ConfirmationDialog *emission_mask; + OptionButton *emission_mask_mode; + CheckBox *emission_colors; + + String source_emission_file; + UndoRedo *undo_redo; void _file_selected(const String &p_file); void _menu_callback(int p_idx); + void _generate_visibility_rect(); + void _generate_emission_mask(); protected: void _notification(int p_what); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 7c8ee97f22..bad88979ac 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -188,7 +188,7 @@ void ShaderTextEditor::_validate_script() { if (err != OK) { String error_text = "error(" + itos(sl.get_error_line()) + "): " + sl.get_error_text(); set_error(error_text); - get_text_edit()->set_line_as_marked(sl.get_error_line(), true); + get_text_edit()->set_line_as_marked(sl.get_error_line() - 1, true); } else { for (int i = 0; i < get_text_edit()->get_line_count(); i++) diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 5da242ffaa..c55bef1b03 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -696,12 +696,19 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { return; //do NONE { - + EditorNode *en = editor; + EditorPluginList *force_input_forwarding_list = en->get_editor_plugins_force_input_forwarding(); + if (!force_input_forwarding_list->empty()) { + bool discard = force_input_forwarding_list->forward_spatial_gui_input(camera, p_event, true); + if (discard) + return; + } + } + { EditorNode *en = editor; EditorPluginList *over_plugin_list = en->get_editor_plugins_over(); - if (!over_plugin_list->empty()) { - bool discard = over_plugin_list->forward_spatial_gui_input(camera, p_event); + bool discard = over_plugin_list->forward_spatial_gui_input(camera, p_event, false); if (discard) return; } @@ -768,6 +775,11 @@ void SpatialEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } freelook_active = b->is_pressed(); + if (freelook_active && !surface->has_focus()) { + // Focus usually doesn't trigger on right-click, but in case of freelook it should, + // otherwise using keyboard navigation would misbehave + surface->grab_focus(); + } } break; case BUTTON_MIDDLE: { diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 676e50d61c..c4fe15e61c 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -61,9 +61,21 @@ void TextureEditor::_notification(int p_what) { tex_height = texture->get_height() * tex_width / texture->get_width(); } + // Prevent the texture from being unpreviewable after the rescale, so that we can still see something + if (tex_height <= 0) + tex_height = 1; + if (tex_width <= 0) + tex_width = 1; + int ofs_x = (size.width - tex_width) / 2; int ofs_y = (size.height - tex_height) / 2; + if (texture->cast_to<CurveTexture>()) { + // In the case of CurveTextures we know they are 1 in height, so fill the preview to see the gradient + ofs_y = 0; + tex_height = size.height; + } + draw_texture_rect(texture, Rect2(ofs_x, ofs_y, tex_width, tex_height)); Ref<Font> font = get_font("font", "Label"); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index 976a7b6271..8a7dcea393 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -218,7 +218,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) { mtx.xform(rect.position + Vector2(0, rect.size.y / 2)) + Vector2(-4, 0) }; - Ref<InputEventMouseButton> mb; + Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { if (mb->get_button_index() == BUTTON_LEFT) { @@ -792,6 +792,7 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) { hb_tools->add_child(snap_mode_button); snap_mode_button->set_text(TTR("<None>")); PopupMenu *p = snap_mode_button->get_popup(); + p->set_hide_on_checkable_item_selection(false); p->add_item(TTR("<None>"), 0); p->add_item(TTR("Pixel Snap"), 1); p->add_item(TTR("Grid Snap"), 2); diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index 0b088f7171..70b6257bb2 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -53,6 +53,7 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) { Sprite *mi = child->cast_to<Sprite>(); Ref<Texture> texture = mi->get_texture(); + Ref<Texture> normal_map = mi->get_normal_map(); Ref<ShaderMaterial> material = mi->get_material(); if (texture.is_null()) @@ -67,6 +68,7 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) { } p_library->tile_set_texture(id, texture); + p_library->tile_set_normal_map(id, normal_map); p_library->tile_set_material(id, material); p_library->tile_set_modulate(id, mi->get_modulate()); @@ -105,23 +107,21 @@ void TileSetEditor::_import_node(Node *p_node, Ref<TileSet> p_library) { if (!child2->cast_to<StaticBody2D>()) continue; StaticBody2D *sb = child2->cast_to<StaticBody2D>(); - int shape_count = sb->get_shape_count(); - if (shape_count == 0) - continue; - for (int shape_index = 0; shape_index < shape_count; ++shape_index) { - Ref<Shape2D> collision = sb->get_shape(shape_index); - if (collision.is_valid()) { - collisions.push_back(collision); - } - } - } - if (collisions.size()) { + List<uint32_t> shapes; + sb->get_shape_owners(&shapes); - p_library->tile_set_shapes(id, collisions); - p_library->tile_set_shape_offset(id, -phys_offset); - } else { - p_library->tile_set_shape_offset(id, Vector2()); + for (List<uint32_t>::Element *E = shapes.front(); E; E = E->next()) { + + Vector2 shape_offset = sb->shape_owner_get_transform(E->get()).get_origin(); + bool one_way = sb->is_shape_owner_one_way_collision_enabled(E->get()); + + for (int k = 0; k < sb->shape_owner_get_shape_count(E->get()); k++) { + + Ref<Shape> shape = sb->shape_owner_get_shape(E->get(), k); + p_library->tile_add_shape(id, shape, shape_offset, one_way); + } + } } p_library->tile_set_texture_offset(id, mi->get_offset()); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index d58454a223..355f8ba22e 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -235,7 +235,7 @@ void ProjectExportDialog::_edit_preset(int p_index) { export_button->set_disabled(true); } else { - export_error->show(); + export_error->hide(); export_templates_error->hide(); export_button->set_disabled(false); } diff --git a/editor/project_settings.cpp b/editor/project_settings.cpp index 8ef7bd427f..4000b3e05c 100644 --- a/editor/project_settings.cpp +++ b/editor/project_settings.cpp @@ -119,6 +119,7 @@ void ProjectSettings::_action_selected() { return; add_at = "input/" + ti->get_text(0); + edit_idx = -1; } void ProjectSettings::_action_edited() { @@ -180,6 +181,7 @@ void ProjectSettings::_device_input_add() { Ref<InputEvent> ie; String name = add_at; + int idx = edit_idx; Variant old_val = GlobalConfig::get_singleton()->get(name); Array arr = old_val; // ie.device = device_id->get_value(); @@ -251,7 +253,11 @@ void ProjectSettings::_device_input_add() { default: {} } - arr.push_back(ie); + if (idx < 0 || idx >= arr.size()) { + arr.push_back(ie); + } else { + arr[idx] = ie; + } undo_redo->create_action(TTR("Add Input Action Event")); undo_redo->add_do_method(GlobalConfig::get_singleton(), "set", name, arr); @@ -279,6 +285,7 @@ void ProjectSettings::_press_a_key_confirm() { ie->set_metakey(last_wait_for_key->get_metakey()); String name = add_at; + int idx = edit_idx; Variant old_val = GlobalConfig::get_singleton()->get(name); Array arr = old_val; @@ -293,7 +300,11 @@ void ProjectSettings::_press_a_key_confirm() { } } - arr.push_back(ie); + if (idx < 0 || idx >= arr.size()) { + arr.push_back(ie); + } else { + arr[idx] = ie; + } undo_redo->create_action(TTR("Add Input Action Event")); undo_redo->add_do_method(GlobalConfig::get_singleton(), "set", name, arr); @@ -362,7 +373,7 @@ void ProjectSettings::_wait_for_key(const Ref<InputEvent> &p_event) { } } -void ProjectSettings::_add_item(int p_item) { +void ProjectSettings::_add_item(int p_item, Ref<InputEvent> p_exiting_event) { add_type = InputType(p_item); @@ -377,7 +388,6 @@ void ProjectSettings::_add_item(int p_item) { } break; case INPUT_MOUSE_BUTTON: { - device_id->set_value(0); device_index_label->set_text(TTR("Mouse Button Index:")); device_index->clear(); device_index->add_item(TTR("Left Button")); @@ -390,10 +400,19 @@ void ProjectSettings::_add_item(int p_item) { device_index->add_item(TTR("Button 8")); device_index->add_item(TTR("Button 9")); device_input->popup_centered_minsize(Size2(350, 95)); + + Ref<InputEventMouseButton> mb = p_exiting_event; + if (mb.is_valid()) { + device_index->select(mb->get_button_index() - 1); + device_id->set_value(mb->get_device()); + device_input->get_ok()->set_text(TTR("Change")); + } else { + device_id->set_value(0); + device_input->get_ok()->set_text(TTR("Add")); + } } break; case INPUT_JOY_MOTION: { - device_id->set_value(0); device_index_label->set_text(TTR("Joypad Axis Index:")); device_index->clear(); for (int i = 0; i < JOY_AXIS_MAX * 2; i++) { @@ -403,10 +422,18 @@ void ProjectSettings::_add_item(int p_item) { } device_input->popup_centered_minsize(Size2(350, 95)); + Ref<InputEventJoypadMotion> jm = p_exiting_event; + if (jm.is_valid()) { + device_index->select(jm->get_axis() * 2 + (jm->get_axis_value() > 0 ? 1 : 0)); + device_id->set_value(jm->get_device()); + device_input->get_ok()->set_text(TTR("Change")); + } else { + device_id->set_value(0); + device_input->get_ok()->set_text(TTR("Add")); + } } break; case INPUT_JOY_BUTTON: { - device_id->set_value(0); device_index_label->set_text(TTR("Joypad Button Index:")); device_index->clear(); @@ -416,11 +443,66 @@ void ProjectSettings::_add_item(int p_item) { } device_input->popup_centered_minsize(Size2(350, 95)); + Ref<InputEventJoypadButton> jb = p_exiting_event; + if (jb.is_valid()) { + device_index->select(jb->get_button_index()); + device_id->set_value(jb->get_device()); + device_input->get_ok()->set_text(TTR("Change")); + } else { + device_id->set_value(0); + device_input->get_ok()->set_text(TTR("Add")); + } + } break; default: {} } } +void ProjectSettings::_edit_item(Ref<InputEvent> p_exiting_event) { + + InputType ie_type; + + if ((Ref<InputEventKey>(p_exiting_event)).is_valid()) { + ie_type = INPUT_KEY; + + } else if ((Ref<InputEventJoypadButton>(p_exiting_event)).is_valid()) { + ie_type = INPUT_JOY_BUTTON; + + } else if ((Ref<InputEventMouseButton>(p_exiting_event)).is_valid()) { + ie_type = INPUT_MOUSE_BUTTON; + + } else if ((Ref<InputEventJoypadMotion>(p_exiting_event)).is_valid()) { + ie_type = INPUT_JOY_MOTION; + + } else { + return; + } + + _add_item(ie_type, p_exiting_event); +} +void ProjectSettings::_action_activated() { + + TreeItem *ti = input_editor->get_selected(); + + if (!ti || ti->get_parent() == input_editor->get_root()) + return; + + String name = "input/" + ti->get_parent()->get_text(0); + int idx = ti->get_metadata(0); + Array va = GlobalConfig::get_singleton()->get(name); + + ERR_FAIL_INDEX(idx, va.size()); + + Ref<InputEvent> ie = va[idx]; + + if (ie.is_null()) + return; + + add_at = name; + edit_idx = idx; + _edit_item(ie); +} + void ProjectSettings::_action_button_pressed(Object *p_obj, int p_column, int p_id) { TreeItem *ti = p_obj->cast_to<TreeItem>(); @@ -436,6 +518,7 @@ void ProjectSettings::_action_button_pressed(Object *p_obj, int p_column, int p_ popup_add->set_position(ofs); popup_add->popup(); add_at = "input/" + ti->get_text(0); + edit_idx = -1; } else if (p_id == 2) { //remove @@ -484,6 +567,32 @@ void ProjectSettings::_action_button_pressed(Object *p_obj, int p_column, int p_ undo_redo->add_undo_method(this, "_settings_changed"); undo_redo->commit_action(); } + } else if (p_id == 3) { + //edit + + if (ti->get_parent() == input_editor->get_root()) { + + ti->set_as_cursor(0); + input_editor->edit_selected(); + + } else { + //edit action + String name = "input/" + ti->get_parent()->get_text(0); + int idx = ti->get_metadata(0); + Array va = GlobalConfig::get_singleton()->get(name); + + ERR_FAIL_INDEX(idx, va.size()); + + Ref<InputEvent> ie = va[idx]; + + if (ie.is_null()) + return; + + ti->set_as_cursor(0); + add_at = name; + edit_idx = idx; + _edit_item(ie); + } } } @@ -589,6 +698,7 @@ void ProjectSettings::_update_actions() { action->set_text(0, str); action->set_icon(0, get_icon("JoyAxis", "EditorIcons")); } + action->add_button(0, get_icon("Edit", "EditorIcons"), 3, false, TTR("Edit")); action->add_button(0, get_icon("Remove", "EditorIcons"), 2, false, TTR("Remove")); action->set_metadata(0, i); action->set_meta("__input", ie); @@ -1174,10 +1284,11 @@ void ProjectSettings::_bind_methods() { ClassDB::bind_method(D_METHOD("_action_adds"), &ProjectSettings::_action_adds); ClassDB::bind_method(D_METHOD("_action_selected"), &ProjectSettings::_action_selected); ClassDB::bind_method(D_METHOD("_action_edited"), &ProjectSettings::_action_edited); + ClassDB::bind_method(D_METHOD("_action_activated"), &ProjectSettings::_action_activated); ClassDB::bind_method(D_METHOD("_action_button_pressed"), &ProjectSettings::_action_button_pressed); ClassDB::bind_method(D_METHOD("_update_actions"), &ProjectSettings::_update_actions); ClassDB::bind_method(D_METHOD("_wait_for_key"), &ProjectSettings::_wait_for_key); - ClassDB::bind_method(D_METHOD("_add_item"), &ProjectSettings::_add_item); + ClassDB::bind_method(D_METHOD("_add_item"), &ProjectSettings::_add_item, DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("_device_input_add"), &ProjectSettings::_device_input_add); ClassDB::bind_method(D_METHOD("_press_a_key_confirm"), &ProjectSettings::_press_a_key_confirm); ClassDB::bind_method(D_METHOD("_settings_prop_edited"), &ProjectSettings::_settings_prop_edited); @@ -1383,6 +1494,7 @@ ProjectSettings::ProjectSettings(EditorData *p_data) { vbc->add_child(input_editor); input_editor->set_v_size_flags(SIZE_EXPAND_FILL); input_editor->connect("item_edited", this, "_action_edited"); + input_editor->connect("item_activated", this, "_action_activated"); input_editor->connect("cell_selected", this, "_action_selected"); input_editor->connect("button_pressed", this, "_action_button_pressed"); popup_add = memnew(PopupMenu); diff --git a/editor/project_settings.h b/editor/project_settings.h index 47fb45cf8e..03140a854b 100644 --- a/editor/project_settings.h +++ b/editor/project_settings.h @@ -55,6 +55,7 @@ class ProjectSettings : public AcceptDialog { Timer *timer; InputType add_type; String add_at; + int edit_idx; EditorData *data; UndoRedo *undo_redo; @@ -105,7 +106,8 @@ class ProjectSettings : public AcceptDialog { void _item_del(); void _update_actions(); void _save(); - void _add_item(int p_item); + void _add_item(int p_item, Ref<InputEvent> p_exiting_event = NULL); + void _edit_item(Ref<InputEvent> p_exiting_event); void _action_adds(String); void _action_add(); @@ -114,6 +116,7 @@ class ProjectSettings : public AcceptDialog { void _item_checked(const String &p_item, bool p_check); void _action_selected(); void _action_edited(); + void _action_activated(); void _action_button_pressed(Object *p_obj, int p_column, int p_id); void _wait_for_key(const Ref<InputEvent> &p_event); void _press_a_key_confirm(); diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 3d3fecc8f9..ad9b3607e9 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -65,6 +65,9 @@ void CustomPropertyEditor::_notification(int p_what) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2( 10,10,60, get_size().height-20 ), v ); }*/ } + if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST) { + hide(); + } } void CustomPropertyEditor::_menu_option(int p_which) { @@ -821,7 +824,7 @@ bool CustomPropertyEditor::edit(Object *p_owner, const String &p_name, Variant:: color_picker->show(); color_picker->set_edit_alpha(hint != PROPERTY_HINT_COLOR_NO_ALPHA); color_picker->set_pick_color(v); - set_size(Size2(300 * EDSCALE, color_picker->get_combined_minimum_size().height + 10 * EDSCALE)); + set_size(Size2(307 * EDSCALE, 460 * EDSCALE)); color_picker->set_focus_on_line_edit(); /* int ofs=80; @@ -2693,20 +2696,20 @@ void PropertyEditor::_notification(int p_what) { } } -TreeItem *PropertyEditor::get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root) { +TreeItem *PropertyEditor::get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root, TreeItem *category) { TreeItem *item = NULL; if (p_path == "") { - item = root; + item = category ? category : root; } else if (item_paths.has(p_path)) { item = item_paths.get(p_path); } else { //printf("path %s parent path %s - item name %s\n",p_path.ascii().get_data(),p_path.left( p_path.find_last("/") ).ascii().get_data(),p_path.right( p_path.find_last("/") ).ascii().get_data() ); - TreeItem *parent = get_parent_node(p_path.left(p_path.find_last("/")), item_paths, root); + TreeItem *parent = get_parent_node(p_path.left(p_path.find_last("/")), item_paths, root, NULL); item = tree->create_item(parent); String name = (p_path.find("/") != -1) ? p_path.right(p_path.find_last("/") + 1) : p_path; @@ -2717,10 +2720,22 @@ TreeItem *PropertyEditor::get_parent_node(String p_path, HashMap<String, TreeIte } item->set_editable(0, false); + if (!subsection_selectable) { + item->set_expand_right(0, true); + } item->set_selectable(0, subsection_selectable); item->set_editable(1, false); item->set_selectable(1, subsection_selectable); + if (use_folding) { + if (!obj->editor_is_section_unfolded(p_path)) { + updating_folding = true; + item->set_collapsed(true); + updating_folding = false; + } + item->set_metadata(0, p_path); + } + if (item->get_parent() == root) { item->set_custom_bg_color(0, get_color("prop_subsection", "Editor")); @@ -2932,17 +2947,21 @@ void PropertyEditor::update_tree() { TreeItem *sep = tree->create_item(root); current_category = sep; String type = p.name; - /*if (has_icon(type,"EditorIcons")) - sep->set_icon(0,get_icon(type,"EditorIcons") ); + //* + if (has_icon(type, "EditorIcons")) + sep->set_icon(0, get_icon(type, "EditorIcons")); else - sep->set_icon(0,get_icon("Object","EditorIcons") ); - print_line("CATEGORY: "+type); - */ + sep->set_icon(0, get_icon("Object", "EditorIcons")); + + //*/ sep->set_text(0, type); + sep->set_expand_right(0, true); sep->set_selectable(0, false); sep->set_selectable(1, false); sep->set_custom_bg_color(0, get_color("prop_category", "Editor")); sep->set_custom_bg_color(1, get_color("prop_category", "Editor")); + sep->set_text_align(0, TreeItem::ALIGN_CENTER); + sep->set_disable_folding(true); if (use_doc_hints) { StringName type = p.name; @@ -2973,6 +2992,8 @@ void PropertyEditor::update_tree() { if (group_base != "") { if (basename.begins_with(group_base)) { basename = basename.replace_first(group_base, ""); + } else if (group_base.begins_with(basename)) { + //keep it, this is used pretty often } else { group = ""; //no longer using group base, clear } @@ -3002,7 +3023,7 @@ void PropertyEditor::update_tree() { } //printf("property %s\n",basename.ascii().get_data()); - TreeItem *parent = get_parent_node(path, item_path, current_category ? current_category : root); + TreeItem *parent = get_parent_node(path, item_path, root, current_category); /* if (parent->get_parent()==root) parent=root; @@ -3681,6 +3702,16 @@ void PropertyEditor::_draw_transparency(Object *t, const Rect2 &p_rect) { tree->draw_rect(area, color); } +void PropertyEditor::_item_folded(Object *item_obj) { + + if (updating_folding) + return; + + TreeItem *item = item_obj->cast_to<TreeItem>(); + + obj->editor_set_section_unfold(item->get_metadata(0), !item->is_collapsed()); +} + void PropertyEditor::_item_selected() { TreeItem *item = tree->get_selected(); @@ -4184,6 +4215,7 @@ void PropertyEditor::_bind_methods() { ClassDB::bind_method("_item_edited", &PropertyEditor::_item_edited); ClassDB::bind_method("_item_selected", &PropertyEditor::_item_selected); + ClassDB::bind_method("_item_folded", &PropertyEditor::_item_folded); ClassDB::bind_method("_custom_editor_request", &PropertyEditor::_custom_editor_request); ClassDB::bind_method("_custom_editor_edited", &PropertyEditor::_custom_editor_edited); ClassDB::bind_method("_custom_editor_edited_field", &PropertyEditor::_custom_editor_edited_field, DEFVAL("")); @@ -4289,11 +4321,18 @@ void PropertyEditor::set_subsection_selectable(bool p_selectable) { update_tree(); } +void PropertyEditor::set_use_folding(bool p_enable) { + + use_folding = p_enable; + tree->set_hide_folding(false); +} + PropertyEditor::PropertyEditor() { _prop_edited = "property_edited"; hide_script = false; + use_folding = false; undo_redo = NULL; obj = NULL; @@ -4326,6 +4365,7 @@ PropertyEditor::PropertyEditor() { tree->connect("item_edited", this, "_item_edited", varray(), CONNECT_DEFERRED); tree->connect("cell_selected", this, "_item_selected"); + tree->connect("item_collapsed", this, "_item_folded"); tree->set_drag_forwarding(this); @@ -4355,6 +4395,7 @@ PropertyEditor::PropertyEditor() { show_categories = false; refresh_countdown = 0; use_doc_hints = false; + updating_folding = true; use_filter = false; subsection_selectable = false; show_type_icons = EDITOR_DEF("interface/show_type_icons", false); diff --git a/editor/property_editor.h b/editor/property_editor.h index c02c301acf..47bd807c3f 100644 --- a/editor/property_editor.h +++ b/editor/property_editor.h @@ -190,6 +190,9 @@ class PropertyEditor : public Control { bool use_filter; bool subsection_selectable; bool hide_script; + bool use_folding; + + bool updating_folding; HashMap<String, String> pending; String selected_property; @@ -206,7 +209,7 @@ class PropertyEditor : public Control { void _item_selected(); void _item_edited(); - TreeItem *get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root); + TreeItem *get_parent_node(String p_path, HashMap<String, TreeItem *> &item_paths, TreeItem *root, TreeItem *category); void set_item_text(TreeItem *p_item, int p_type, const String &p_name, int p_hint = PROPERTY_HINT_NONE, const String &p_hint_text = ""); @@ -244,6 +247,7 @@ class PropertyEditor : public Control { void _resource_preview_done(const String &p_path, const Ref<Texture> &p_preview, Variant p_ud); void _draw_transparency(Object *t, const Rect2 &p_rect); + void _item_folded(Object *item_obj); UndoRedo *undo_redo; @@ -285,6 +289,7 @@ public: void set_subsection_selectable(bool p_selectable); + void set_use_folding(bool p_enable); PropertyEditor(); ~PropertyEditor(); }; diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index dbd0758256..0f3f5500a8 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -245,7 +245,7 @@ void ScriptCreateDialog::_lang_changed(int l) { template_menu->clear(); template_menu->add_item(TTR("Default")); for (int i = 0; i < template_list.size(); i++) { - template_menu->add_item(template_list[i]); + template_menu->add_item(template_list[i].capitalize()); } } diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 867302b657..d617f55dfd 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -1,6 +1,5 @@ # Arabic translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # athomield <athomield@hotmail.com>, 2017. @@ -535,7 +534,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -581,7 +581,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "مجتمع" @@ -724,6 +724,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -829,6 +830,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -929,8 +931,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -940,6 +941,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1008,8 +1010,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1200,7 +1201,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1217,7 +1219,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1388,8 +1389,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1443,6 +1444,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1499,7 +1504,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1537,6 +1542,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1589,7 +1598,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1617,35 +1626,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1653,47 +1650,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1764,8 +1729,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1785,11 +1750,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1873,6 +1894,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1900,6 +1929,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2143,6 +2196,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2171,10 +2228,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2340,7 +2393,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2815,7 +2868,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3476,7 +3529,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3525,17 +3578,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3567,9 +3609,31 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "عملية ØªØØ±ÙŠÙƒ" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3839,6 +3903,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3851,7 +3928,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3862,20 +3939,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3930,12 +4020,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3993,6 +4087,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "عملية ØªØØ±ÙŠÙƒ" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4146,6 +4249,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4233,10 +4340,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4270,15 +4373,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4333,6 +4428,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4412,6 +4523,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4434,6 +4553,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4651,35 +4774,95 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4739,71 +4922,67 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +msgid "Tool Select" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "1 Viewport" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports (Alt)" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports" +msgid "1 Viewport" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports (Alt)" +msgid "2 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "4 Viewports" +msgid "2 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" +msgid "3 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" +msgid "3 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" +msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4827,14 +5006,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5247,11 +5418,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5263,7 +5434,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5479,6 +5650,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5544,7 +5719,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5660,10 +5835,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5848,6 +6019,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5923,10 +6098,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "عمل اشتراك" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5971,76 +6193,84 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "عمل اشتراك" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6711,8 +6941,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6780,12 +7012,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6801,6 +7027,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6843,6 +7077,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/bg.po b/editor/translations/bg.po index f884b33773..7ca3987827 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -1,6 +1,5 @@ # Bulgarian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Bojidar Marinov <bojidar.marinov.bg@gmail.com>, 2016. @@ -535,7 +534,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -581,7 +581,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -724,6 +724,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -829,6 +830,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -929,8 +931,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -940,6 +941,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1009,8 +1011,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Път:" @@ -1202,7 +1203,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "Извършва Ñе повторно внаÑÑне" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1219,7 +1221,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1389,8 +1390,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1444,6 +1445,11 @@ msgid "Save Scene As.." msgstr "Запазване на Ñцената като.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Възел" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1500,7 +1506,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1538,6 +1544,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Сцена" @@ -1590,7 +1600,7 @@ msgstr "ЗатварÑне на Ñцената" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1618,84 +1628,41 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "ÐаÑтройки на проекта" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Изход до ÑпиÑъка Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." -msgstr "" +#, fuzzy +msgid "Project" +msgstr "ИзнаÑÑне на проекта" #: editor/editor_node.cpp -msgid "Tools" -msgstr "" +msgid "Project Settings" +msgstr "ÐаÑтройки на проекта" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "ИзнаÑÑне на проекта на много платформи." +msgid "Run Script" +msgstr "" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "ИзнаÑÑне" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Възпроизвеждане на проекта." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ПреуÑтановÑване на Ñцената" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "ПреуÑтановÑване на Ñцената" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Спиране на Ñцената." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Възпроизвеждане на редактирана Ñцена." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Възпроизвеждане на Ñцената" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Възпроизвеждане на Ñцена по избор" - -#: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Възпроизвеждане на Ñцена по избор" +msgid "Quit to Project List" +msgstr "Изход до ÑпиÑъка Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¸" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "ÐаÑтройки за отÑтранÑване на грешки" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "ОтÑтранÑване на грешки" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1765,9 +1732,9 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "ÐаÑтройки" +#: editor/editor_node.cpp +msgid "Editor" +msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1786,14 +1753,70 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "ОтноÑно" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "Възпроизвеждане на проекта." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" msgstr "" #: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "ПреуÑтановÑване на Ñцената" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "ПреуÑтановÑване на Ñцената" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Спиране на Ñцената." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Възпроизвеждане на редактирана Ñцена." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Възпроизвеждане на Ñцената" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Възпроизвеждане на Ñцена по избор" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Възпроизвеждане на Ñцена по избор" + +#: editor/editor_node.cpp msgid "Spins when the editor window repaints!" msgstr "" @@ -1874,6 +1897,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "ВнаÑÑне на шаблони от архив във формат ZIP" @@ -1901,6 +1932,31 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "ИзнаÑÑне на библиотеката" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "ИнÑталирани приÑтавки:" @@ -2149,6 +2205,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2177,10 +2237,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Повторно внаÑÑне.." @@ -2349,7 +2405,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2824,7 +2880,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3486,7 +3542,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Добре" @@ -3535,17 +3591,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3577,9 +3622,30 @@ msgid "Update from Scene" msgstr "ОбновÑване от Ñцена" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3849,6 +3915,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3861,7 +3940,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3872,20 +3951,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3940,12 +4032,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4003,6 +4099,14 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4156,6 +4260,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4244,10 +4352,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "ОтÑтранÑване на грешки" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4281,15 +4385,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4344,6 +4440,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4423,6 +4535,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4445,6 +4565,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4662,35 +4786,96 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Колелцето надолу." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4750,63 +4935,55 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Select" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "1 Viewport" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports (Alt)" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports (Alt)" +msgid "1 Viewport" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "4 Viewports" +msgid "2 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" +msgid "2 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" +msgid "3 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" +msgid "3 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4818,6 +4995,10 @@ msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "ÐаÑтройки" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "" @@ -4838,14 +5019,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5262,11 +5435,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5278,7 +5451,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5494,6 +5667,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "УÑтройÑтво" @@ -5560,7 +5737,7 @@ msgstr "" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "ÐаÑтройки на проекта" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5677,10 +5854,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "ПоÑтавÑне" @@ -5868,6 +6041,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5945,10 +6122,58 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "ÐаÑтройки за отÑтранÑване на грешки" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Ðова Ñцена" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5993,77 +6218,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "ÐеуÑпешно Ñъздаване на папка." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Грешка при зареждането на шрифта." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy -msgid "Error loading script from %s" -msgstr "Грешка при зареждането на шрифта." +msgid "Invalid inherited parent name or path" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Създаване на папка" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6755,11 +6989,11 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "ParallaxLayer работи Ñамо когато е наÑледник на ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Параметърът 'Path' трÑбва да Ñочи към дейÑтвителен възел Particles2D, за да " -"работи." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6830,12 +7064,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6854,6 +7082,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Тревога!" @@ -6896,6 +7132,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6907,9 +7149,13 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "ВнаÑÑне на обекти в проекта." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "ÐаÑтройки на проекта" +#~ msgid "Export the project to many platforms." +#~ msgstr "ИзнаÑÑне на проекта на много платформи." + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Параметърът 'Path' трÑбва да Ñочи към дейÑтвителен възел Particles2D, за " +#~ "да работи." #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 3e4dec7656..abf7b8c8b9 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -1,6 +1,5 @@ # Bengali translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Abu Md. Maruf Sarker <maruf.webdev@gmail.com>, 2016-2017. @@ -545,7 +544,8 @@ msgid "Search:" msgstr "অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -591,7 +591,7 @@ msgstr "সমরà§à¦¥à¦¨.." msgid "Official" msgstr "অফিসিয়াল/পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• উৎস" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "কমিউনিটি/যৌথ-সামাজিক উৎস" @@ -737,6 +737,7 @@ msgstr "সংযোজন করà§à¦¨" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "অপসারণ করà§à¦¨" @@ -846,6 +847,7 @@ msgstr "রিসোরà§à¦¸" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "পথ" @@ -950,8 +952,7 @@ msgstr "" msgid "Add Bus" msgstr "%s সংযà§à¦•à§à¦¤ করà§à¦¨" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "লোড" @@ -961,6 +962,7 @@ msgid "Save As" msgstr "à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "সাধারণ/ডিফলà§à¦Ÿ" @@ -1035,8 +1037,7 @@ msgid "Rearrange Autoloads" msgstr "Autoload সমূহ পà§à¦¨à¦°à§à¦¬à¦¿à¦¨à§à¦¯à¦¸à§à¦¤ করà§à¦¨" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "পথ:" @@ -1228,7 +1229,8 @@ msgstr "উৎসসমূহ সà§à¦•à§à¦¯à¦¾à¦¨ করà§à¦¨" msgid "(Re)Importing Assets" msgstr "পà§à¦¨à¦°à¦¾à§Ÿ ইমà§à¦ªà§‹à¦°à§à¦Ÿ হচà§à¦›à§‡" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "সাহাযà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করà§à¦¨" @@ -1245,7 +1247,6 @@ msgid "Class:" msgstr "কà§à¦²à¦¾à¦¸:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "গà§à¦°à¦¹à¦£ করে:" @@ -1415,10 +1416,11 @@ msgid "There is no defined scene to run." msgstr "চালানোর জনà§à¦¯ কোনো দৃশà§à¦¯ নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করা নেই।" #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "কোনো মà§à¦–à§à¦¯ দৃশà§à¦¯ নিরà§à¦§à¦¾à¦°à¦£ করা হয়নি, নিরà§à¦§à¦¾à¦°à¦£ করবেন?\n" "আপনি পরবরà§à¦¤à¦¿à¦¤à§‡ তা 'অà§à¦¯à¦¾à¦ªà§à¦²à¦¿à¦•েশন (application)' বিà¦à¦¾à¦—ের \\\"পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস " @@ -1483,6 +1485,11 @@ msgid "Save Scene As.." msgstr "দৃশà§à¦¯ à¦à¦‡à¦°à§‚পে সংরকà§à¦·à¦£ করà§à¦¨.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "নোড" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "à¦à¦‡ দৃশà§à¦¯à¦Ÿà¦¿ কখনোই সংরকà§à¦·à¦£ করা হয় নি। চালানোর পূরà§à¦¬à§‡ সংরকà§à¦·à¦£ করবেন?" @@ -1541,7 +1548,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "আহà§â€Œ" @@ -1581,6 +1588,10 @@ msgstr "%d টি অধিক ফাইল(সমূহ)" msgid "%d more file(s) or folder(s)" msgstr "%d টি অধিক ফাইল(সমূহ) বা ফোলà§à¦¡à¦¾à¦°(সমূহ)" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "বিকà§à¦·à§‡à¦ª-হীন মোড" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "দৃশà§à¦¯" @@ -1634,7 +1645,7 @@ msgstr "দৃশà§à¦¯ বনà§à¦§ করà§à¦¨" msgid "Close Goto Prev. Scene" msgstr "বনà§à¦§ করে পূরà§à¦¬à§‡à¦° দৃশà§à¦¯à§‡ যান" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "সামà§à¦ªà§à¦°à¦¤à¦¿à¦•সমূহ খà§à¦²à§à¦¨" @@ -1662,84 +1673,41 @@ msgid "Redo" msgstr "পà§à¦¨à¦°à¦¾à¦¯à¦¼ করà§à¦¨" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ চালান" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "দৃশà§à¦¯ পà§à¦°à¦¤à§à¦¯à¦¾à¦¬à§ƒà¦¤à§à¦¤ করà§à¦¨" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° তালিকায় পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "বিকà§à¦·à§‡à¦ª-হীন মোড" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "পà§à¦°à¦•লà§à¦ª অথবা দৃশà§à¦¯à§‡-বà§à¦¯à¦¾à¦ªà§€ বিবিধ সরঞà§à¦œà¦¾à¦®-সমূহ।" #: editor/editor_node.cpp -msgid "Tools" -msgstr "সরঞà§à¦œà¦¾à¦®-সমূহ" +#, fuzzy +msgid "Project" +msgstr "নতà§à¦¨ পà§à¦°à¦•লà§à¦ª" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "পà§à¦°à¦•লà§à¦ªà¦Ÿà¦¿ à¦à¦•াধিক পà§à¦²à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤" +msgid "Project Settings" +msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ চালান" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "পà§à¦°à¦•লà§à¦ªà¦Ÿà¦¿ চালান।" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "চালান" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•ে বিরতি দিন" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "দৃশà§à¦¯à¦•ে বিরতি দিন" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•ে থামান।" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "থামান" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ দৃশà§à¦¯à¦Ÿà¦¿ চালান।" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "দৃশà§à¦¯ চালান" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "সà§à¦¬à¦¨à¦¿à¦°à§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯ চালান" +msgid "Tools" +msgstr "সরঞà§à¦œà¦¾à¦®-সমূহ" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "সà§à¦¬à¦¨à¦¿à¦°à§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯ চালান" +msgid "Quit to Project List" +msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° তালিকায় পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "ডিবাগের সিদà§à¦§à¦¾à¦¨à§à¦¤à¦¸à¦®à§‚হ" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "ডিবাগ" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1829,9 +1797,10 @@ msgstr "" "রিমোট ডিà¦à¦¾à¦‡à¦¸à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° সময়, নেটওয়ারà§à¦• ফাইল-সিসà§à¦Ÿà§‡à¦® (filesystem) à¦à¦Ÿà¦¿à¦•ে আরো " "কারà§à¦¯à¦•র করবে।" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "সেটিংস" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨ (Edit)" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1851,12 +1820,69 @@ msgid "Manage Export Templates" msgstr "à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ লোড হচà§à¦›à§‡" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "কà§à¦²à¦¾à¦¸à¦¸à¦®à§‚হ" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "ডকà§à¦®à§‡à¦¨à§à¦Ÿà¦¸à¦®à§‚হ বনà§à¦§ করà§à¦¨" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "সমà§à¦¬à¦¨à§à¦§à§‡/সমà§à¦ªà¦°à§à¦•ে" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "বহি:সà§à¦¥ রিসোরà§à¦¸à§‡à¦° পরিবরà§à¦¤à¦¨à§‡ সতরà§à¦• করে।" +msgid "Play the project." +msgstr "পà§à¦°à¦•লà§à¦ªà¦Ÿà¦¿ চালান।" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "চালান" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•ে বিরতি দিন" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "দৃশà§à¦¯à¦•ে বিরতি দিন" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "দৃশà§à¦¯à¦Ÿà¦¿à¦•ে থামান।" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "থামান" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ দৃশà§à¦¯à¦Ÿà¦¿ চালান।" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "দৃশà§à¦¯ চালান" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "সà§à¦¬à¦¨à¦¿à¦°à§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯ চালান" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "সà§à¦¬à¦¨à¦¿à¦°à§à¦¬à¦¾à¦šà¦¿à¦¤ দৃশà§à¦¯ চালান" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1939,6 +1965,14 @@ msgid "Thanks!" msgstr "ধনà§à¦¯à¦¬à¦¾à¦¦!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "ZIP ফাইল হতে টেমপà§à¦²à§‡à¦Ÿ-সমূহ ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" @@ -1966,6 +2000,36 @@ msgstr "à¦à¦•টি সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ খà§à¦²à§à¦¨ à¦à¦¬à¦‚ চঠmsgid "Load Errors" msgstr "à¦à§à¦²/সমসà§à¦¯à¦¾-সমূহ লোড করà§à¦¨" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "লাইবà§à¦°à§‡à¦°à¦¿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "à¦à¦¡à¦¿à¦Ÿà¦°à§‡ খà§à¦²à§à¦¨" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "ইনà§à¦¸à¦Ÿà¦²-কৃত পà§à¦²à¦¾à¦—ইন-সমূহ:" @@ -2225,6 +2289,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "ফাইল-মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°à§‡ দেখà§à¦¨" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "ইনসà§à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸" @@ -2253,10 +2321,6 @@ msgid "Info" msgstr "তথà§à¦¯" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "ফাইল-মà§à¦¯à¦¾à¦¨à§‡à¦œà¦¾à¦°à§‡ দেখà§à¦¨" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "পà§à¦¨-ইমà§à¦ªà§‹à¦°à§à¦Ÿ.." @@ -2423,9 +2487,10 @@ msgid "No target font resource!" msgstr "ফনà§à¦Ÿà§‡à¦° কোনো উদà§à¦¦à§‡à¦¶à§à¦¯à¦¿à¦¤ রিসোরà§à¦¸ নেই!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "ফাইলের অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à¥¤\n" "অনà§à¦—à§à¦°à¦¹ করে .fnt বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤" @@ -2909,7 +2974,7 @@ msgstr "সঙà§à¦•োচন করà§à¦¨" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "পà§à¦°à¦•লà§à¦ªà§‡ সংযà§à¦•à§à¦¤ করà§à¦¨ (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3573,7 +3638,7 @@ msgid "Change default type" msgstr "ডিফলà§à¦Ÿ ধরণ পরিবরà§à¦¤à¦¨ করà§à¦¨" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "সঠিক" @@ -3624,17 +3689,6 @@ msgstr "Poly3D তৈরি করà§à¦¨" msgid "Set Handle" msgstr "হà§à¦¯à¦¾à¦¨à§à¦¡à§‡à¦² সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "রঙà§à¦—ের রâ€à§à¦¯à¦¾à¦®à§à¦ª বিনà§à¦¦à§ সংযোজন/বিয়োজন করà§à¦¨" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "রঙà§à¦—ের রâ€à§à¦¯à¦¾à¦®à§à¦ª পরিবরà§à¦¤à¦¨ করà§à¦¨" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "মেস লাইবà§à¦°à§‡à¦°à¦¿ তৈরি হচà§à¦›à§‡" @@ -3667,9 +3721,33 @@ msgstr "দৃশà§à¦¯ হতে হালনাগাদ করà§à¦¨" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "ইনপà§à¦Ÿ যোগ করà§à¦¨" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "রিসোরà§à¦¸ লোড করà§à¦¨" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Curve Map পরিবরà§à¦¤à¦¨ করà§à¦¨" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "রঙà§à¦—ের রâ€à§à¦¯à¦¾à¦®à§à¦ª বিনà§à¦¦à§ সংযোজন/বিয়োজন করà§à¦¨" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "রঙà§à¦—ের রâ€à§à¦¯à¦¾à¦®à§à¦ª পরিবরà§à¦¤à¦¨ করà§à¦¨" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "বসà§à¦¤à§ %d" @@ -3943,6 +4021,20 @@ msgid "Remove Poly And Point" msgstr "পলি à¦à¦¬à¦‚ বিনà§à¦¦à§ অপসারণ করà§à¦¨" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Emission Mask পরিসà§à¦•ার করà§à¦¨" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "AABB উৎপনà§à¦¨ করà§à¦¨" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "ছবি লোডে সমসà§à¦¯à¦¾ হয়েছে:" @@ -3955,8 +4047,8 @@ msgid "Set Emission Mask" msgstr "Emission Mask সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Emission Mask পরিসà§à¦•ার করà§à¦¨" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3966,6 +4058,27 @@ msgstr "Emission Mask লোড করà§à¦¨" msgid "Generated Point Count:" msgstr "উৎপাদিত বিনà§à¦¦à§à¦° সংখà§à¦¯à¦¾:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "গড় সময় (সেঃ)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Emission Mask সà§à¦¥à¦¾à¦ªà¦¨ করà§à¦¨" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "দৃশà§à¦¯ হতে তৈরি করবেন" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Emission-à¦à¦° সà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হ:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "নোডে কোনো জà§à¦¯à¦¾à¦®à¦¿à¦¤à¦¿à¦• আকার নেই।" @@ -3979,11 +4092,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "AABB উৎপনà§à¦¨ করà§à¦¨" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "পৃষà§à¦ সমূহ কোনো আকার নেই!" @@ -4041,13 +4149,18 @@ msgstr "Emission পূরণ:" msgid "Generate Visibility AABB" msgstr "AABB উৎপনà§à¦¨ করà§à¦¨" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "বকà§à¦°à¦°à§‡à¦–া হতে বিনà§à¦¦à§ অপসারণ করà§à¦¨" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "গড় সময় (সেঃ)" +msgid "Remove Out-Control from Curve" +msgstr "বকà§à¦°à¦°à§‡à¦–া বহিঃ-নিয়নà§à¦¤à§à¦°à¦£à§‡ সরান" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "বকà§à¦°à¦°à§‡à¦–া হতে বিনà§à¦¦à§ অপসারণ করà§à¦¨" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4105,6 +4218,16 @@ msgstr "পথ বিà¦à¦•à§à¦¤ করà§à¦¨" msgid "Remove Path Point" msgstr "পথের বিনà§à¦¦à§ অপসারণ করà§à¦¨" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "বকà§à¦°à¦°à§‡à¦–া বহিঃ-নিয়নà§à¦¤à§à¦°à¦£à§‡ সরান" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "বকà§à¦°à¦°à§‡à¦–া আনà§à¦¤-নিয়নà§à¦¤à§à¦°à¦£à§‡ সরান" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "UV Map তৈরি করà§à¦¨" @@ -4258,6 +4381,11 @@ msgid "Pitch" msgstr "পিচà§â€Œ" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "বোনà§â€Œ/হাড় পরিষà§à¦•ার করà§à¦¨" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "থিম সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে" @@ -4345,10 +4473,6 @@ msgstr "খà§à¦à¦œà§à¦¨.." msgid "Find Next" msgstr "পরবরà§à¦¤à§€ খà§à¦à¦œà§à¦¨" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "ডিবাগ" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "ধাপ লাফিয়ে যান" @@ -4382,16 +4506,9 @@ msgid "Move Right" msgstr "ডানে সরান" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "টিউটোরিয়ালসমূহ" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "টিউটোরিয়ালের সà§à¦¥à¦¾à¦¨à§‡ https://godotengine.org খà§à¦²à§à¦¨à¥¤" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "কà§à¦²à¦¾à¦¸à¦¸à¦®à§‚হ" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "রেফারেনà§à¦¸à§‡à¦° ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡ খà§à¦à¦œà§à¦¨à¥¤" #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4448,6 +4565,23 @@ msgid "Pick Color" msgstr "রঙ পছনà§à¦¦ করà§à¦¨" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "ছবিসমূহ রূপানà§à¦¤à¦° করা হচà§à¦›à§‡" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4527,6 +4661,16 @@ msgid "Goto Previous Breakpoint" msgstr "পূরà§à¦¬à§‡à¦° বিরতিবিনà§à¦¦à§à¦¤à§‡ যান" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "à¦à¦¤à§‡ রূপানà§à¦¤à¦° করà§à¦¨.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "পূরà§à¦¬à§‡ খà§à¦à¦œà§à¦¨" @@ -4549,6 +4693,10 @@ msgstr "লাইনে যান.." msgid "Contextual Help" msgstr "পà§à¦°à¦¾à¦¸à¦™à§à¦—িক সাহাযà§à¦¯" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "সà§à¦•েলার ধà§à¦°à§à¦¬à¦• পরিবরà§à¦¤à¦¨ করà§à¦¨" @@ -4766,36 +4914,106 @@ msgid "Animation Key Inserted." msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° চাবি সনà§à¦¨à¦¿à¦¬à§‡à¦¶à¦¿à¦¤ হয়েছে।" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "সামনের দিকে যান" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "পিছনের/অতীতের দিকে" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "মাউসের চাকা নিচের দিকে চকà§à¦•র।" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ হাল-নাগাদ করà§à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ হাল-নাগাদ করà§à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ হাল-নাগাদ করà§à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "দরà§à¦¶à¦¨à§‡à¦° সাথে সারিবদà§à¦§ করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "পরিবেশ (Environment)" +msgid "Display Normal" +msgstr "Normal পà§à¦°à¦¦à¦°à§à¦¶à¦¨" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "অডিও শà§à¦°à§‹à¦¤à¦¾" +msgid "Display Wireframe" +msgstr "Wireframe পà§à¦°à¦¦à¦°à§à¦¶à¦¨" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "গিজমোস" +msgid "Display Overdraw" +msgstr "Overdraw পà§à¦°à¦¦à¦°à§à¦¶à¦¨" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "XForm à¦à¦° সংলাপ" +#, fuzzy +msgid "Display Unshaded" +msgstr "Shadeless পà§à¦°à¦¦à¦°à§à¦¶à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "পরিবেশ (Environment)" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "গিজমোস" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করার জনà§à¦¯ কোনো দৃশà§à¦¯ নিরà§à¦¬à¦¾à¦šà¦¨ করা হয়নি!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "কারà§à¦¸à¦°à§‡à¦° সà§à¦¥à¦¾à¦¨à§‡ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨" +msgid "Audio Listener" +msgstr "অডিও শà§à¦°à§‹à¦¤à¦¾" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "দৃশà§à¦¯ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করা সমà§à¦à¦¬ হয়নি!" +msgid "XForm Dialog" +msgstr "XForm à¦à¦° সংলাপ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4854,6 +5072,26 @@ msgid "Align Selection With View" msgstr "নিরà§à¦¬à¦¾à¦šà¦¨à¦•ে দরà§à¦¶à¦¨à§‡à¦° সাথে সারিবদà§à¦§ করà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "সরান" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "কনà§à¦Ÿà§à¦°à§‹à¦² বোতাম: ঘূরà§à¦£à¦¨" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "সà§à¦•েল/মাপ:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°" @@ -4866,14 +5104,6 @@ msgid "Transform Dialog.." msgstr "রà§à¦ªà¦¾à¦¨à§à¦¤à¦°à§‡à¦° à¦à¦° সংলাপ.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• লাইট বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• sRGB বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "à§§ টি Viewport" @@ -4898,22 +5128,6 @@ msgid "4 Viewports" msgstr "৪ টি Viewports" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Normal পà§à¦°à¦¦à¦°à§à¦¶à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Wireframe পà§à¦°à¦¦à¦°à§à¦¶à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Overdraw পà§à¦°à¦¦à¦°à§à¦¶à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Shadeless পà§à¦°à¦¦à¦°à§à¦¶à¦¨" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "অরিজিন দেখà§à¦¨" @@ -4922,6 +5136,10 @@ msgid "View Grid" msgstr "গà§à¦°à¦¿à¦¡ দেখà§à¦¨" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "সেটিংস" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "সà§à¦¨à§à¦¯à¦¾à¦ª সেটিংস" @@ -4942,14 +5160,6 @@ msgid "Viewport Settings" msgstr "Viewport সেটিংস" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "লাইটের পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• নরমাল:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "অà§à¦¯à¦¾à¦®à§à¦¬à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ লাইটের রঙ:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "পরিপà§à¦°à§‡à¦•à§à¦·à¦¿à¦¤ (Perspective) FOV (ডিগà§à¦°à¦¿):" @@ -5379,12 +5589,12 @@ msgstr "অকারà§à¦¯à¦•র পà§à¦°à¦•লà§à¦ªà§‡à¦° পথ, পথটঠ#: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "অকারà§à¦¯à¦•র পà§à¦°à¦•লà§à¦ªà§‡à¦° পথ, engine.cfg অবশà§à¦¯à¦‡ অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤ হতে হবে।" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "অকারà§à¦¯à¦•র পà§à¦°à¦•লà§à¦ªà§‡à¦° পথ, engine.cfg অবশà§à¦¯à¦‡ উপসà§à¦¥à¦¿à¦¤ হতে হবে।" #: editor/project_manager.cpp @@ -5397,7 +5607,7 @@ msgstr "অকারà§à¦¯à¦•র পà§à¦°à¦•লà§à¦ªà§‡à¦° পথ (কোনৠ#: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° পথে engine.cfg তৈরি করা সমà§à¦à¦¬ হয়নি।" #: editor/project_manager.cpp @@ -5618,6 +5828,11 @@ msgstr "ইনপà§à¦Ÿ অà§à¦¯à¦¾à¦•শন যোগ করà§à¦¨" msgid "Erase Input Action Event" msgstr "ইনপà§à¦Ÿ অà§à¦¯à¦¾à¦•শন ইà¦à§‡à¦¨à§à¦Ÿ মà§à¦›à§‡ ফেলà§à¦¨" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "খালি বসà§à¦¤à§ যোগ করà§à¦¨" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "ডিà¦à¦¾à¦‡à¦¸/যনà§à¦¤à§à¦°" @@ -5684,8 +5899,8 @@ msgstr "রিসোরà§à¦¸à§‡à¦° পà§à¦¨à¦ƒ-নকশার সিদà§à¦§ #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস" +msgid "Project Settings (project.godot)" +msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5802,10 +6017,6 @@ msgid "Error loading file: Not a resource!" msgstr "ফাইল লোডে সমসà§à¦¯à¦¾: রিসোরà§à¦¸ নয়!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "ছবি লোড অসমà§à¦à¦¬ হয়েছে" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "à¦à¦•টি নোড নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" @@ -5995,6 +6206,11 @@ msgid "Error duplicating scene to save it." msgstr "দৃশà§à¦¯ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ করে সংরকà§à¦·à¦£à§‡ সমসà§à¦¯à¦¾ হয়েছে।" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "রিসোরà§à¦¸à¦¸à¦®à§‚হ:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "গà§à¦°à§à¦ªà¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨ করà§à¦¨" @@ -6072,10 +6288,59 @@ msgid "Toggle CanvasItem Visible" msgstr "CanvasItem দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ টগল করà§à¦¨" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "ডিবাগের সিদà§à¦§à¦¾à¦¨à§à¦¤à¦¸à¦®à§‚হ" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "পরবরà§à¦¤à§€ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Spatial দৃশà§à¦¯à¦®à¦¾à¦¨à¦¤à¦¾ টগল করà§à¦¨" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নোডের নাম, নীমà§à¦¨à§‹à¦•à§à¦¤ অকà§à¦·à¦°à¦¸à¦®à§‚হ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়:" @@ -6120,75 +6385,93 @@ msgid "Select a Node" msgstr "à¦à¦•টি নোড নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "অà¦à¦¿à¦à¦¾à¦¬à¦•ের অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®à§‡ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করা সমà§à¦à¦¬ হয়নি।" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦°à¦¸à¦®à§‚হ:" +msgid "Error loading script from %s" +msgstr "%s হতে সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" +msgid "Path is empty" +msgstr "পথটি খালি" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নাম" +msgid "Path is not local" +msgstr "পথটি সà§à¦¥à¦¾à¦¨à§€à§Ÿ নয়" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "না/আ" +msgid "Invalid base path" +msgstr "বেস পথ অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "কà§à¦²à¦¾à¦¸ নাম অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯!" +msgid "Invalid extension" +msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "অà¦à¦¿à¦à¦¾à¦¬à¦•ের কà§à¦²à¦¾à¦¸ নাম অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ পথ!" +#, fuzzy +msgid "Invalid Path" +msgstr "অকারà§à¦¯à¦•র পথ।" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "ফাইলসিসà§à¦Ÿà§‡à¦®à§‡ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করা সমà§à¦à¦¬ হয়নি।" +msgid "Invalid class name" +msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "%s হতে সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তà§à¦²à¦¤à§‡/লোডে সমসà§à¦¯à¦¾ হয়েছে" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "সূচক/ইনডেকà§à¦¸ মানের অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম।" #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "পথটি খালি" +#, fuzzy +msgid "Script valid" +msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "পথটি সà§à¦¥à¦¾à¦¨à§€à§Ÿ নয়" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "বেস পথ অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯" +msgid "N/A" +msgstr "না/আ" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "নতà§à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ তৈরি করà§à¦¨" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "বিদà§à¦¯à¦®à¦¾à¦¨ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ লোড করà§à¦¨" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "গà§à¦°à¦¹à¦£ করে:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "কà§à¦²à¦¾à¦¸ নাম:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "বসà§à¦¤à§ অপসারণ করà§à¦¨" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "পূরà§à¦¬à¦¨à¦¿à¦°à§à¦®à¦¿à¦¤ সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" #: editor/script_create_dialog.cpp @@ -6883,9 +7166,11 @@ msgid "" msgstr "" "ParallaxLayer à¦à¦•মাতà§à¦° ParallaxBackground à¦à¦° অংশ হিসেবে নিরà§à¦§à¦¾à¦°à¦¨ করলেই কাজ করে।" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "Path à¦à¦° দিক অবশà§à¦¯à¦‡ à¦à¦•টি কারà§à¦¯à¦•র Particles2D à¦à¦° দিকে নিরà§à¦¦à§‡à¦¶ করাতে হবে।" +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6970,12 +7255,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "Path à¦à¦° দিক অবশà§à¦¯à¦‡ à¦à¦•টি কারà§à¦¯à¦•র Spatial নোডের à¦à¦° দিকে নিরà§à¦¦à§‡à¦¶ করাতে হবে।" @@ -6995,6 +7274,15 @@ msgstr "" "AnimatedSprite3D দà§à¦¬à¦¾à¦°à¦¾ ফà§à¦°à§‡à¦® দেখাতে SpriteFrames রিসোরà§à¦¸ অবশà§à¦¯à¦‡ তৈরি করতে হবে " "অথবা 'Frames' à¦à¦° মান-ঠনিরà§à¦§à¦¾à¦°à¦¨ করে দিতে হবে।" +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "চালানোর মোড:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "সতরà§à¦•তা!" @@ -7040,6 +7328,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7058,9 +7352,62 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "উপাদানসমূহ পà§à¦°à¦•লà§à¦ªà§‡ ইমà§à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤" -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° সেটিংস (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "পà§à¦°à¦•লà§à¦ªà¦Ÿà¦¿ à¦à¦•াধিক পà§à¦²à¦¾à¦Ÿà¦«à¦°à§à¦®à§‡ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ করà§à¦¨à¥¤" + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "বহি:সà§à¦¥ রিসোরà§à¦¸à§‡à¦° পরিবরà§à¦¤à¦¨à§‡ সতরà§à¦• করে।" + +#~ msgid "Tutorials" +#~ msgstr "টিউটোরিয়ালসমূহ" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "টিউটোরিয়ালের সà§à¦¥à¦¾à¦¨à§‡ https://godotengine.org খà§à¦²à§à¦¨à¥¤" + +#~ msgid "No scene selected to instance!" +#~ msgstr "ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করার জনà§à¦¯ কোনো দৃশà§à¦¯ নিরà§à¦¬à¦¾à¦šà¦¨ করা হয়নি!" + +#~ msgid "Instance at Cursor" +#~ msgstr "কারà§à¦¸à¦°à§‡à¦° সà§à¦¥à¦¾à¦¨à§‡ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করà§à¦¨" + +#~ msgid "Could not instance scene!" +#~ msgstr "দৃশà§à¦¯ ইনà§à¦¸à¦Ÿà§à¦¯à¦¾à¦¨à§à¦¸ করা সমà§à¦à¦¬ হয়নি!" + +#~ msgid "Use Default Light" +#~ msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• লাইট বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" + +#~ msgid "Use Default sRGB" +#~ msgstr "পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• sRGB বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨" + +#~ msgid "Default Light Normal:" +#~ msgstr "লাইটের পà§à¦°à¦¾à¦¥à¦®à¦¿à¦• নরমাল:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "অà§à¦¯à¦¾à¦®à§à¦¬à¦¿à§Ÿà§‡à¦¨à§à¦Ÿ লাইটের রঙ:" + +#~ msgid "Couldn't load image" +#~ msgstr "ছবি লোড অসমà§à¦à¦¬ হয়েছে" + +#~ msgid "Invalid parent class name" +#~ msgstr "অà¦à¦¿à¦à¦¾à¦¬à¦•ের অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ কà§à¦²à¦¾à¦¸ নাম" + +#~ msgid "Valid chars:" +#~ msgstr "গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ অকà§à¦·à¦°à¦¸à¦®à§‚হ:" + +#~ msgid "Valid name" +#~ msgstr "গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নাম" + +#~ msgid "Class name is invalid!" +#~ msgstr "কà§à¦²à¦¾à¦¸ নাম অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "অà¦à¦¿à¦à¦¾à¦¬à¦•ের কà§à¦²à¦¾à¦¸ নাম অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯!" + +#~ msgid "Invalid path!" +#~ msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ পথ!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "Path à¦à¦° দিক অবশà§à¦¯à¦‡ à¦à¦•টি কারà§à¦¯à¦•র Particles2D à¦à¦° দিকে নিরà§à¦¦à§‡à¦¶ করাতে হবে।" #~ msgid "Surface" #~ msgstr "পৃষà§à¦ তল" @@ -7282,9 +7629,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "পরিশিষà§à¦Ÿ নীরবতা:" -#~ msgid "Script" -#~ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ" - #~ msgid "Script Export Mode:" #~ msgstr "সà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ à¦à¦•à§à¦¸à¦ªà§‹à¦°à§à¦Ÿ মোড:" @@ -7318,9 +7662,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance কোনো BakedLight রিসোরà§à¦¸ ধারণ করে না।" -#~ msgid "Vertex" -#~ msgstr "à¦à¦¾à¦°à¦Ÿà§‡à¦•à§à¦¸" - #~ msgid "Fragment" #~ msgstr "ফà§à¦°à¦¾à¦—মেনà§à¦Ÿ" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index 6d7b245e58..7273e877a9 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -1,6 +1,5 @@ # Catalan translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Roger BR <drai_kin@hotmail.com>, 2016. @@ -545,7 +544,8 @@ msgid "Search:" msgstr "Cerca:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -591,7 +591,7 @@ msgstr "Suport..." msgid "Official" msgstr "Oficial" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Comunitat" @@ -735,6 +735,7 @@ msgstr "Afegeix" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Treu" @@ -845,6 +846,7 @@ msgstr "Recurs" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "CamÃ" @@ -947,8 +949,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -958,6 +959,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Predeterminat" @@ -1029,8 +1031,7 @@ msgid "Rearrange Autoloads" msgstr "Reorganitza AutoCà rregues" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "CamÃ:" @@ -1222,7 +1223,8 @@ msgstr "Escaneja Fonts" msgid "(Re)Importing Assets" msgstr "Re-Importació" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Cerca Ajuda" @@ -1239,7 +1241,6 @@ msgid "Class:" msgstr "Classe:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Hereta:" @@ -1410,10 +1411,11 @@ msgid "There is no defined scene to run." msgstr "No s'ha definit cap escena per executar." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "No s'ha definit cap escena principal. Seleccioneu-ne una.\n" "És possible triar-ne una altra més endavant a \"Configuració del Projecte\" " @@ -1478,6 +1480,10 @@ msgid "Save Scene As.." msgstr "Desa Escena com..." #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" "Aquesta Escena no s'ha desat mai encara. Voleu desar-la abans d'executar-la?" @@ -1537,7 +1543,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Uf..." @@ -1577,6 +1583,10 @@ msgstr "%d fitxer(s) més" msgid "%d more file(s) or folder(s)" msgstr "%d fitxer(s) o directori(s) més" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Mode Lliure de Distraccions" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Escena" @@ -1630,7 +1640,7 @@ msgstr "Tanca l'Escena" msgid "Close Goto Prev. Scene" msgstr "Tanca i Vés a l'Escena anterior" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Obre Recent" @@ -1658,84 +1668,41 @@ msgid "Redo" msgstr "Refés" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Executa Script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Configuració del Projecte" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Reverteix Escena" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Surt a la Llista de Projectes" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Mode Lliure de Distraccions" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Eines và ries o d'escena." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Eines" +#, fuzzy +msgid "Project" +msgstr "Exporta Projecte" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "Configuració del Projecte" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exporta el projecte a diverses plataformes." +msgid "Run Script" +msgstr "Executa Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exporta" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Reprodueix el projecte." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Reprodueix" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausa l'escena" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Pausa Escena" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Atura l'escena." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Atura" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Reprodueix l'escena editada." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Reprodueix Escena" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Reprodueix escena personalitzada" +msgid "Tools" +msgstr "Eines" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Reprodueix Escena Personalitzada" +msgid "Quit to Project List" +msgstr "Surt a la Llista de Projectes" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opcions de Depuració (Debug)" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1825,9 +1792,10 @@ msgstr "" "En usar-se remotament en un dispositiu, un sistema de fitxers en xarxa en " "millora el rendiment." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Configuració" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Edita" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1848,12 +1816,68 @@ msgid "Manage Export Templates" msgstr "Carregant Plantilles d'Exportació" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "Quant a" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Alerta en canviar un recurs extern." +msgid "Play the project." +msgstr "Reprodueix el projecte." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Reprodueix" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pausa l'escena" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausa Escena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Atura l'escena." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Atura" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Reprodueix l'escena editada." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Reprodueix Escena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Reprodueix escena personalitzada" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Reprodueix Escena Personalitzada" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1936,6 +1960,14 @@ msgid "Thanks!" msgstr "Grà cies!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importa Plantilles des d'un Fitxer ZIP" @@ -1963,6 +1995,35 @@ msgstr "Obre i Executa un Script" msgid "Load Errors" msgstr "Errors de Cà rrega" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Obre un Directori" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Obre un Directori" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Editor de Dependències" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Exporta Biblioteca" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Editor de Dependències" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Connectors Instal·lats:" @@ -2218,6 +2279,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Mostra en el Gestor de Fitxers" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "Instà ncia" @@ -2246,10 +2311,6 @@ msgid "Info" msgstr "Informació" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Mostra en el Gestor de Fitxers" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "ReImporta..." @@ -2416,9 +2477,10 @@ msgid "No target font resource!" msgstr "Cap recurs de Lletra!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Extensió de fitxer no và lida.\n" "Utilitzeu .fnt." @@ -2902,7 +2964,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3564,7 +3626,7 @@ msgid "Change default type" msgstr "Canvia Tipus de la Matriu" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "D'acord" @@ -3613,17 +3675,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3655,9 +3706,33 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Afegeix Senyal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Treu Senyal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Errors de Cà rrega" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3928,6 +4003,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3940,7 +4028,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3951,20 +4039,34 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Temps Mitjà (s)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -4020,16 +4122,19 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generation Time (sec):" -msgstr "Temps Mitjà (s)" - #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" msgstr "" @@ -4084,6 +4189,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Treure Autocà rrega" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4237,6 +4351,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4325,10 +4443,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4362,15 +4476,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4426,6 +4532,23 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Converteix a..." + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4505,6 +4628,16 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Converteix a..." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Converteix a..." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4527,6 +4660,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4744,35 +4881,101 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Endavant" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Enrere" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Roda Avall." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Actualitza Canvis" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Actualitza Canvis" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Actualitza Canvis" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4832,23 +5035,33 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Tota la Selecció" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Mou" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4876,22 +5089,6 @@ msgid "4 Viewports" msgstr "4 Vistes" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "" @@ -4900,6 +5097,10 @@ msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Configuració" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Configuració de Desplaçament" @@ -4920,14 +5121,6 @@ msgid "Viewport Settings" msgstr "Configuració de la Vista" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5349,12 +5542,12 @@ msgstr "" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "El camà de Destinació ha d'existir." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "El camà de Destinació ha d'existir." #: editor/project_manager.cpp @@ -5366,7 +5559,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5583,6 +5776,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Dispositiu" @@ -5649,8 +5846,8 @@ msgstr "" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Configuració del Projecte" +msgid "Project Settings (project.godot)" +msgstr "Configuració del Projecte (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5768,10 +5965,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Camà al Node:" @@ -5959,6 +6152,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Recurs" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -6036,10 +6234,58 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opcions de Depuració (Debug)" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Obertura Rà pida d'Scripts..." + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6084,79 +6330,94 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "No s'ha pogut crear la carpeta." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Error carregant lletra." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "Camà no và lid." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Error carregant lletra." +msgid "Invalid inherited parent name or path" +msgstr "El Nom de la propietat index és invà lid." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Crea Subscripció" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "No s'ha pogut instanciar l'script:" #: editor/script_create_dialog.cpp -msgid "Class Name:" -msgstr "" +#, fuzzy +msgid "Inherits" +msgstr "Hereta:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" -msgstr "" +#, fuzzy +msgid "Class Name" +msgstr "Classe:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Treu la Selecció" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" +msgstr "Executa Script" #: editor/script_create_dialog.cpp #, fuzzy @@ -6869,10 +7130,11 @@ msgstr "" "Un node ParallaxLayer només funciona quan s'estableix com a fill d'un node " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Cal que la propietat Camà (Path) assenyali cap a un node Particles2D và lid." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6960,12 +7222,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6987,6 +7243,14 @@ msgstr "" "Cal crear o establir un recurs SpriteFrames en la propietat 'Frames' perquè " "AnimatedSprite3D dibuixi els quadres." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Ep!" @@ -7032,6 +7296,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7050,9 +7320,16 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importa actius al projecte." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Configuració del Projecte (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exporta el projecte a diverses plataformes." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Alerta en canviar un recurs extern." + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Cal que la propietat Camà (Path) assenyali cap a un node Particles2D " +#~ "và lid." #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 4643a9ac21..d2420e32ed 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -1,6 +1,5 @@ # Czech translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Jan 'spl!te' KondelÃk <j.kondelik@centrum.cz>, 2016. @@ -542,7 +541,8 @@ msgid "Search:" msgstr "Hledat:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -588,7 +588,7 @@ msgstr "Podpora.." msgid "Official" msgstr "OficiálnÃ" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Z komunity" @@ -732,6 +732,7 @@ msgstr "PÅ™idat" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Odebrat" @@ -841,6 +842,7 @@ msgstr "Zdroj" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Cesta" @@ -943,8 +945,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -954,6 +955,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1024,8 +1026,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Cesta:" @@ -1216,7 +1217,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1233,7 +1235,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1404,8 +1405,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1459,6 +1460,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1515,7 +1520,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1553,6 +1558,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1605,7 +1614,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1633,84 +1642,40 @@ msgid "Redo" msgstr "Znovu" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Spustit skript" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Nastavenà projektu" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." -msgstr "" +#, fuzzy +msgid "Project" +msgstr "Nastavenà projektu" #: editor/editor_node.cpp -msgid "Tools" -msgstr "" +msgid "Project Settings" +msgstr "Nastavenà projektu" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "" +msgid "Run Script" +msgstr "Spustit skript" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "PÅ™ehrát vlastnà scénu" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Play Custom Scene" -msgstr "PÅ™ehrát vlastnà scénu" - -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1781,9 +1746,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Upravit" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1802,14 +1768,71 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" msgstr "" #: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "PÅ™ehrát vlastnà scénu" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Play Custom Scene" +msgstr "PÅ™ehrát vlastnà scénu" + +#: editor/editor_node.cpp msgid "Spins when the editor window repaints!" msgstr "" @@ -1890,6 +1913,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1917,6 +1948,34 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "OtevÅ™Ãt složku" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "OtevÅ™Ãt složku" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Editor závislostÃ" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Editor závislostÃ" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2163,6 +2222,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2191,10 +2254,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2361,7 +2420,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2836,7 +2895,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3499,7 +3558,7 @@ msgid "Change default type" msgstr "ZmÄ›nit typ hodnot pole" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3548,17 +3607,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3590,9 +3638,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "PÅ™idat signál" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Odstranit signál" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3863,6 +3934,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3875,7 +3959,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3886,20 +3970,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3954,12 +4051,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4017,6 +4118,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Odstranit funkci" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4170,6 +4280,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4258,10 +4372,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4295,15 +4405,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4359,6 +4461,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4438,6 +4556,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "PÅ™ipojit k uzlu:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4460,6 +4587,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4677,35 +4808,97 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "KoleÄko dolů." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "ZmÄ›nit" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4765,23 +4958,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "VÅ¡echny vybrané" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4809,27 +5011,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4853,14 +5043,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5277,11 +5459,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5293,7 +5475,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5510,6 +5692,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "ZaÅ™ÃzenÃ" @@ -5576,7 +5762,7 @@ msgstr "" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "Nastavenà projektu" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5692,10 +5878,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Vložit uzly" @@ -5883,6 +6065,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Zdroj" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5960,10 +6147,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Spustit skript" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6008,80 +6242,93 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Nelze vytvoÅ™it složku." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Chyba nahrávánà fontu." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "Neplatná cesta." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Chyba nahrávánà fontu." +msgid "Invalid inherited parent name or path" +msgstr "Neplatné jméno vlastnosti." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "VytvoÅ™it odbÄ›r" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Odstranit výbÄ›r" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" +msgstr "Spustit skript" + +#: editor/script_create_dialog.cpp msgid "Attach Node Script" msgstr "" @@ -6779,11 +7026,11 @@ msgid "" msgstr "" "Uzel ParallaxLayer funguje pouze když je dÃtÄ›tem uzlu ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Aby ParticleAttractor2D fungoval, musà vlastnost path ukazovat na platný " -"uzel Particles2D." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6867,12 +7114,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6895,6 +7136,14 @@ msgstr "" "Zdroj SpriteFrames musà být vytvoÅ™en nebo nastaven ve vlastnosti 'Frames', " "aby mohl AnimatedSprite3D zobrazit rámeÄky." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Pozor!" @@ -6940,6 +7189,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6952,9 +7207,10 @@ msgstr "" "mohl zÃskat velikost. Jinak ho nastavte jako render target a pÅ™iÅ™aÄte jeho " "vnitÅ™nà texturu nÄ›jakému uzlu k zobrazenÃ." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Nastavenà projektu" +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Aby ParticleAttractor2D fungoval, musà vlastnost path ukazovat na platný " +#~ "uzel Particles2D." #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " diff --git a/editor/translations/da.po b/editor/translations/da.po index ba9d018e5a..51a0b05e3b 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -1,6 +1,5 @@ # Danish translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # David Lamhauge <davidlamhauge@gmail.com>, 2016. @@ -540,7 +539,8 @@ msgid "Search:" msgstr "Søgning:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -586,7 +586,7 @@ msgstr "Støtte..." msgid "Official" msgstr "Officiel" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Fællesskabet" @@ -730,6 +730,7 @@ msgstr "Tilføj" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Fjern" @@ -839,6 +840,7 @@ msgstr "Ressource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Sti" @@ -939,8 +941,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -950,6 +951,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1018,8 +1020,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Sti:" @@ -1210,7 +1211,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1227,7 +1229,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1398,8 +1399,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1453,6 +1454,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1509,7 +1514,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1547,6 +1552,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1599,7 +1608,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1627,35 +1636,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." -msgstr "" - -#: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1663,47 +1660,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1774,9 +1739,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Rediger" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1795,11 +1761,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1883,6 +1905,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1910,6 +1940,34 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Ã…bn en mappe" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Ã…bn en mappe" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Afhængigheds Editor" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Afhængigheds Editor" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2155,6 +2213,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2183,10 +2245,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2353,7 +2411,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2828,7 +2886,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3490,7 +3548,7 @@ msgid "Change default type" msgstr "Skift Array værditype" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Ok" @@ -3539,17 +3597,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3581,9 +3628,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Tilføj Signal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Fjern Signal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3854,6 +3924,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3866,7 +3949,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3877,20 +3960,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3945,12 +4041,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4008,6 +4108,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Fjern Funktion" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4161,6 +4270,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4249,10 +4362,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4286,15 +4395,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4350,6 +4451,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4429,6 +4546,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Opret forbindelse til Node:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4451,6 +4577,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4668,35 +4798,98 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Baglæns" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Hjulet ned." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Skift" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4756,23 +4949,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "All selection" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4800,27 +5002,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4844,14 +5034,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5265,11 +5447,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5281,7 +5463,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5498,6 +5680,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Enhed" @@ -5563,7 +5749,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5679,10 +5865,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Sti til Node:" @@ -5870,6 +6052,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Ressource" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5945,10 +6132,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Opret abonnement" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5993,77 +6227,89 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Kunne ikke oprette mappe." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Error loading skrifttype." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr ": Ugyldige argumenter: " #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Error loading skrifttype." +msgid "Invalid inherited parent name or path" +msgstr "Ugyldigt index egenskabsnavn." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Opret abonnement" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Fjern markering" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6756,9 +7002,11 @@ msgstr "" "ParallaxLayer node virker kun, nÃ¥r den angives som barn af en " "ParallaxBackground node." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "Egenskaben Path skal pege pÃ¥ en gyldig Particles2D node for at virke." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6844,12 +7092,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6870,6 +7112,14 @@ msgstr "" "En SpriteFrames ressource skal oprettes eller angivets i egenskaben 'Frames' " "for at AnimatedSprite3D kan vise frames." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Advarsel!" @@ -6915,6 +7165,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6927,6 +7183,10 @@ msgstr "" "den kan opnÃ¥ en størrelse. Ellers gør den til en RenderTarget og tildel dens " "indre textur til en node sÃ¥ den kan vises." +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Egenskaben Path skal pege pÃ¥ en gyldig Particles2D node for at virke." + #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " #~ "in order for SamplePlayer to play sound." diff --git a/editor/translations/de.po b/editor/translations/de.po index a10eaefa29..894f7b6028 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -1,6 +1,5 @@ # German translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Alexander Mahr <alex.mahr@gmail.com>, 2016. @@ -25,8 +24,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-03-25 22:20+0000\n" -"Last-Translator: Eurocloud KnowHow <tobias.kloy@werde-volunteer.info>\n" +"PO-Revision-Date: 2017-04-12 03:22+0000\n" +"Last-Translator: So Wieso <sowieso@dukun.de>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -34,7 +33,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.12\n" +"X-Generator: Weblate 2.13-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -562,7 +561,8 @@ msgid "Search:" msgstr "Suche:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -608,7 +608,7 @@ msgstr "Unterstützung.." msgid "Official" msgstr "Offiziell" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Gemeinschaft" @@ -754,6 +754,7 @@ msgstr "Hinzufügen" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Entfernen" @@ -863,6 +864,7 @@ msgstr "Ressource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Pfad" @@ -952,23 +954,23 @@ msgstr "Löschen" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Audiobus-Layout speichern als…" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Location for New Layout.." -msgstr "" +msgstr "Ort für neues Layout…" #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Öffne Audiobus-Layout" #: editor/editor_audio_buses.cpp #, fuzzy msgid "Add Bus" msgstr "%s hinzufügen" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Lade" @@ -978,6 +980,7 @@ msgid "Save As" msgstr "Speichern als" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Standard" @@ -1052,8 +1055,7 @@ msgid "Rearrange Autoloads" msgstr "Autoloads neu anordnen" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Pfad:" @@ -1121,7 +1123,7 @@ msgstr "Packe" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Template-Datei nicht gefunden:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1245,7 +1247,8 @@ msgstr "Lese Quellen" msgid "(Re)Importing Assets" msgstr "Importiere erneut" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Hilfe durchsuchen" @@ -1262,7 +1265,6 @@ msgid "Class:" msgstr "Klasse:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Erbt:" @@ -1432,10 +1434,11 @@ msgid "There is no defined scene to run." msgstr "Es ist keine zu startende Szene definiert." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Es ist keine Hauptszene definiert worden.\n" "Wähle eine in den Projekteinstellungen unter der Kategorie „Anwendung“." @@ -1499,6 +1502,11 @@ msgid "Save Scene As.." msgstr "Szene speichern als.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Node" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Diese Szene wurde nie gespeichert. Speichern vorm Starten?" @@ -1557,9 +1565,13 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Szene ‚%s‘ wurde automatisch importiert und kann daher nicht verändert " +"werden.\n" +"Um Änderungen an der Szene vorzunehmen kann eine abgeleitete Szene erstellt " +"werden." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Ähm" @@ -1600,6 +1612,10 @@ msgstr "%d weitere Datei(en)" msgid "%d more file(s) or folder(s)" msgstr "%d weitere Datei(en) oder Ordner" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Ablenkungsfreier Modus" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Szene" @@ -1653,7 +1669,7 @@ msgstr "Szene schließen" msgid "Close Goto Prev. Scene" msgstr "Schließen und zur letzten Szene wechseln" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Zuletzt benutzte Szenen" @@ -1681,84 +1697,41 @@ msgid "Redo" msgstr "Wiederherstellen" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Skript ausführen" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Projekteinstellungen" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Szene zurücksetzen" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Verlasse zur Projektverwaltung" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Ablenkungsfreier Modus" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Sonstiges Projekt oder szenenübergreifende Werkzeuge." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Werkzeuge" +#, fuzzy +msgid "Project" +msgstr "Neues Projekt" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exportiere das Projekt für viele Plattformen." +msgid "Project Settings" +msgstr "Projekteinstellungen" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Skript ausführen" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exportieren" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Projekt abspielen." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Starten" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Szene pausieren" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Szene pausieren" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Szene stoppen." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Stop" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Spiele die bearbeitete Szene." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Szene starten" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Spiele angepasste Szene" +msgid "Tools" +msgstr "Werkzeuge" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Spiele angepasste Szene" +msgid "Quit to Project List" +msgstr "Verlasse zur Projektverwaltung" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Fehlerbehebungsoptionen" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Debuggen" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1848,9 +1821,10 @@ msgstr "" "Sollte dies beim Abspielen auf externen Geräten genutzt werden, ist es am " "effizientesten das Netzwerk-Dateisystem zu nutzen." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Einstellungen" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Bearbeiten" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1870,12 +1844,69 @@ msgid "Manage Export Templates" msgstr "Lade Exportvorlagen" #: editor/editor_node.cpp +msgid "Help" +msgstr "Hilfe" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Klassen" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Dokumentation schließen" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "Über" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Signalisiert, wenn sich eine externe Ressource verändert hat." +msgid "Play the project." +msgstr "Projekt abspielen." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Starten" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Szene pausieren" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Szene pausieren" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Szene stoppen." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Stop" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Spiele die bearbeitete Szene." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Szene starten" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Spiele angepasste Szene" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Spiele angepasste Szene" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1958,6 +1989,14 @@ msgid "Thanks!" msgstr "Danke!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Vorlagen aus ZIP-Datei importieren" @@ -1985,6 +2024,36 @@ msgstr "Skript öffnen und ausführen" msgid "Load Errors" msgstr "Ladefehler" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Im Editor öffnen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Im Editor öffnen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Im Editor öffnen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Bibliothek exportieren" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Im Editor öffnen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Im Editor öffnen" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Installierte Erweiterungen:" @@ -2123,7 +2192,7 @@ msgstr "Herunter" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Fehlend)" #: editor/export_template_manager.cpp #, fuzzy @@ -2132,7 +2201,7 @@ msgstr "Laufend:" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Template-Version ‚%s‘ entfernen?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2140,17 +2209,19 @@ msgstr "Exportvorlagen-ZIP-Datei konnte nicht geöffnet werden." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Ungültiges version.txt-Format in Templates." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Ungültiges version.txt-Format in Templates. Revision ist kein gültiger " +"Bezeichner." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Keine version.txt in Templates gefunden." #: editor/export_template_manager.cpp #, fuzzy @@ -2208,7 +2279,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "Kann Ordner ‚" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2241,7 +2312,11 @@ msgstr "Auf übergeordnetes Node ausdehnen" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Alle einklappen" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Zeige im Dateimanager" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2272,10 +2347,6 @@ msgid "Info" msgstr "Info" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Zeige im Dateimanager" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Neuimport.." @@ -2442,9 +2513,10 @@ msgid "No target font resource!" msgstr "Keine Zielschriftart-Ressource!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Ungültige Dateiendung.\n" "Nutze .fnt als Dateiendung." @@ -2657,7 +2729,7 @@ msgstr "Post-Process Skript:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Custom Root Node Type:" -msgstr "Angepasster Stamm-Node Typ:" +msgstr "Angepasster Root-Node-Typ:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Auto" @@ -2927,7 +2999,7 @@ msgstr "Komprimieren" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Zu Projekt hinzufügen (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3594,7 +3666,7 @@ msgid "Change default type" msgstr "Standardtyp ändern" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3645,17 +3717,6 @@ msgstr "Polygon3D erstellen" msgid "Set Handle" msgstr "Wähle Griff" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Farbverlaufspunkt hinzufügen/entfernen" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Farbverlauf anpassen" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Erzeuge MeshLibrary" @@ -3688,9 +3749,33 @@ msgstr "Aus Szene aktualisieren" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Eingang hinzufügen" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Pfadpunkt entfernen" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Ressource laden" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Verändere Curve-Map" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Farbverlaufspunkt hinzufügen/entfernen" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Farbverlauf anpassen" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Element %d" @@ -3965,6 +4050,20 @@ msgid "Remove Poly And Point" msgstr "Polygon und Punkt entfernen" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Emissionsmaske leeren" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Erzeuge AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Fehler beim Laden des Bilds:" @@ -3977,8 +4076,8 @@ msgid "Set Emission Mask" msgstr "Emissionsmaske setzen" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Emissionsmaske leeren" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3988,6 +4087,27 @@ msgstr "Emissionsmaske laden" msgid "Generated Point Count:" msgstr "Anzahl generierter Punkte:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Durchschnittszeit (Sek)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Emissionsmaske setzen" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Von Szene erstellen" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Emissionsorte:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "Knoten enthält keine Geometrie." @@ -3998,12 +4118,7 @@ msgstr "Knoten enthält keine Geometrie (Flächen)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Erzeuge AABB" +msgstr "Ein Verarbeitungsmaterial des Typs ‚ParticlesMaterial‘ wird benötigt." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4047,7 +4162,7 @@ msgstr "Oberfläche %d" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Oberflächenpunkte + Normale (gerichtet)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" @@ -4063,13 +4178,18 @@ msgstr "Emissionsfüllung:" msgid "Generate Visibility AABB" msgstr "Erzeuge AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Punkt von Kurve entfernen" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Durchschnittszeit (Sek)" +msgid "Remove Out-Control from Curve" +msgstr "Ausgangsgriff auf Kurve verschieben" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Punkt von Kurve entfernen" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4127,6 +4247,16 @@ msgstr "Pfad aufteilen" msgid "Remove Path Point" msgstr "Pfadpunkt entfernen" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Ausgangsgriff auf Kurve verschieben" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Eingangsgriff auf Kurve verschieben" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Erzeuge UV-Map" @@ -4280,6 +4410,11 @@ msgid "Pitch" msgstr "Tonhöhe" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Knochen entfernen" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Fehler beim Speichern des Motivs" @@ -4367,10 +4502,6 @@ msgstr "Finde.." msgid "Find Next" msgstr "Finde Nächstes" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Debuggen" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Überspringen" @@ -4404,16 +4535,9 @@ msgid "Move Right" msgstr "nach rechts" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Anleitungen" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Öffnet https://godotengine.org im Abschnitt ‚Tutorials‘." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Klassen" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Durchsuche die Referenzdokumentation." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4472,6 +4596,23 @@ msgid "Pick Color" msgstr "Farbe auswählen" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Bilder werden konvertiert" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4551,6 +4692,16 @@ msgid "Goto Previous Breakpoint" msgstr "Springe zum vorigen Haltepunkt" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Umwandeln zu.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Umwandeln zu.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Finde Vorheriges" @@ -4573,6 +4724,10 @@ msgstr "Springe zu Zeile.." msgid "Contextual Help" msgstr "Kontexthilfe" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Ändere skalare Konstante" @@ -4790,36 +4945,106 @@ msgid "Animation Key Inserted." msgstr "Animationsschlüsselbild eingefügt." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Vor" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Rückwärts" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Mausrad runter." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Änderungen aktualisieren" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Änderungen aktualisieren" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Änderungen aktualisieren" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vertex" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Auf Sicht ausrichten" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Umgebung" +msgid "Display Normal" +msgstr "Normale Ansicht" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Audiosenke" +msgid "Display Wireframe" +msgstr "Wireframe-Ansicht" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Overdraw-Ansicht" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Transformationsdialog" +#, fuzzy +msgid "Display Unshaded" +msgstr "Shadeless-Ansicht" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Umgebung" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Keine Szene für Instanz ausgewählt!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Instanz am Mauszeiger" +msgid "Audio Listener" +msgstr "Audiosenke" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Konnte Szene nicht instantiieren!" +msgid "XForm Dialog" +msgstr "Transformationsdialog" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4878,6 +5103,26 @@ msgid "Align Selection With View" msgstr "Auswahl auf Ansicht ausrichten" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Auswählen" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Verschieben" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Strg: Rotieren" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Skalierung:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transformation" @@ -4890,14 +5135,6 @@ msgid "Transform Dialog.." msgstr "Transformationsdialog.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Nutze Standardlicht" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Nutze Standard-sRGB" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "Eine Ansicht" @@ -4922,22 +5159,6 @@ msgid "4 Viewports" msgstr "Vier Ansichten" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Normale Ansicht" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Wireframe-Ansicht" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Overdraw-Ansicht" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Shadeless-Ansicht" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Zeige Ursprung" @@ -4946,6 +5167,10 @@ msgid "View Grid" msgstr "Zeige Gitter" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Einstellungen" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Einrasteinstellungen" @@ -4966,14 +5191,6 @@ msgid "Viewport Settings" msgstr "Einstellungen für Ansichten" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Standardlichtnormale:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Umgebungslichtfarbe:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "Perspektivisches FOV (Grad):" @@ -5391,7 +5608,7 @@ msgstr "Zielpfad:" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Export-Templates für diese Systeme fehlen:" #: editor/project_export.cpp #, fuzzy @@ -5404,12 +5621,12 @@ msgstr "Ungültiger Projektpfad, der Pfad muss existieren!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Ungültiger Projektpfad, engine.cfg darf nicht existieren." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Ungültiger Projektpfad, engine.cfg muss existieren." #: editor/project_manager.cpp @@ -5422,7 +5639,7 @@ msgstr "Ungültiger Projektpfad (etwas geändert?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "Konnte engine.cfg in Projektpfad nicht erzeugen." #: editor/project_manager.cpp @@ -5643,6 +5860,11 @@ msgstr "Füge Eingabeaktion hinzu" msgid "Erase Input Action Event" msgstr "Lösche Eingabeaktionsereignis" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Empty einfügen" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Gerät" @@ -5709,8 +5931,8 @@ msgstr "Ressourcen-Remap-Option entfernen" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Projekteinstellungen" +msgid "Project Settings (project.godot)" +msgstr "Projekteinstellungen (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5827,10 +6049,6 @@ msgid "Error loading file: Not a resource!" msgstr "Fehler beim Laden der Datei: Keine Ressource!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Konnte Bild nicht laden" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Wähle ein Node" @@ -5980,7 +6198,7 @@ msgstr "Diese Aktion kann nicht ohne eine Szene ausgeführt werden." #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Lässt sich nicht an Root-Node ausführen." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6023,6 +6241,11 @@ msgid "Error duplicating scene to save it." msgstr "Fehler beim Duplizieren der Szene zum Speichern." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Ressourcen:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Gruppen bearbeiten" @@ -6081,7 +6304,7 @@ msgid "" "exists." msgstr "" "Instantiiere eine Szenendatei als Node. Erzeugt eine geerbte Szene falls " -"keine Root-Node existiert." +"kein Root-Node existiert." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." @@ -6100,10 +6323,59 @@ msgid "Toggle CanvasItem Visible" msgstr "CanvasItem-Sichtbarkeit umschalten" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Fehlerbehebungsoptionen" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instanz:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Nächstes Skript" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Spatial-Sichtbarkeit umschalten" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" "Ungültiger Name für ein Node, die folgenden Zeichen sind nicht gestattet:" @@ -6149,75 +6421,93 @@ msgid "Select a Node" msgstr "Wähle ein Node" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Ungültiger Name für Elternklasse" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Skript konnte nicht im Dateisystem erstellt werden." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Gültige Zeichen:" +msgid "Error loading script from %s" +msgstr "Fehler beim Laden des Skripts von %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Ungültiger Klassenname" +msgid "Path is empty" +msgstr "Pfad ist leer" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Gültiger Name" +msgid "Path is not local" +msgstr "Pfad ist nicht lokal" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "Nicht verfügbar" +msgid "Invalid base path" +msgstr "Ungültiger Pfad" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Name der Klasse ist ungültig!" +msgid "Invalid extension" +msgstr "Ungültige Erweiterung" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Name der Elternklasse ist ungültig!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Ungültiger Pfad!" +#, fuzzy +msgid "Invalid Path" +msgstr "Ungültiger Pfad." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Skript konnte nicht im Dateisystem erstellt werden." +msgid "Invalid class name" +msgstr "Ungültiger Klassenname" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "Fehler beim Laden des Skripts von %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Ungültiger Name der Index-Eigenschaft." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Pfad ist leer" +#, fuzzy +msgid "Script valid" +msgstr "Skript" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Pfad ist nicht lokal" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Ungültiger Pfad" +msgid "N/A" +msgstr "Nicht verfügbar" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Ungültige Erweiterung" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "Neues Skript erstellen" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "Lade bestehendes Skript" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Erbt:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Klassenname:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Entferne Element" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Built-In-Skript" #: editor/script_create_dialog.cpp @@ -6739,7 +7029,7 @@ msgstr "Durchstöbern" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Führe exportiertes HTML im Standard-Browser des Betriebssystems aus." #: platform/javascript/export/export.cpp #, fuzzy @@ -6929,9 +7219,11 @@ msgstr "" "Das ParallaxLayer-Node lässt sich nur als Unterobjekt eines " "ParallaxBackground-Node verwenden." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "Die Pfad-Eigenschaft muss auf ein gültiges Particles2D-Node verweisen." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7020,12 +7312,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "Die Pfad-Eigenschaft muss auf ein gültiges Spatial-Node verweisen." @@ -7045,6 +7331,15 @@ msgstr "" "Eine SpriteFrames-Ressource muss in der ‚Frames‘-Eigenschaft erzeugt oder " "definiert werden, damit AnimatedSprite3D Einzelbilder anzeigen kann." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Ausführungsmodus:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Warnung!" @@ -7090,6 +7385,17 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer sollte mit einem einzigen Control-Unterobjekt verwendet " +"werden.\n" +"Um die Minimalgröße einzustellen sollte ein Behälter (VBox, HBox, …) oder " +"ein Control als Unterobjekt verwendet und dessen Minimalgröße eingestellt " +"werden." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7110,9 +7416,63 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importiere Medieninhalte ins Projekt." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Projekteinstellungen (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exportiere das Projekt für viele Plattformen." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Signalisiert, wenn sich eine externe Ressource verändert hat." + +#~ msgid "Tutorials" +#~ msgstr "Anleitungen" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Öffnet https://godotengine.org im Abschnitt ‚Tutorials‘." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Keine Szene für Instanz ausgewählt!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Instanz am Mauszeiger" + +#~ msgid "Could not instance scene!" +#~ msgstr "Konnte Szene nicht instantiieren!" + +#~ msgid "Use Default Light" +#~ msgstr "Nutze Standardlicht" + +#~ msgid "Use Default sRGB" +#~ msgstr "Nutze Standard-sRGB" + +#~ msgid "Default Light Normal:" +#~ msgstr "Standardlichtnormale:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Umgebungslichtfarbe:" + +#~ msgid "Couldn't load image" +#~ msgstr "Konnte Bild nicht laden" + +#~ msgid "Invalid parent class name" +#~ msgstr "Ungültiger Name für Elternklasse" + +#~ msgid "Valid chars:" +#~ msgstr "Gültige Zeichen:" + +#~ msgid "Valid name" +#~ msgstr "Gültiger Name" + +#~ msgid "Class name is invalid!" +#~ msgstr "Name der Klasse ist ungültig!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Name der Elternklasse ist ungültig!" + +#~ msgid "Invalid path!" +#~ msgstr "Ungültiger Pfad!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Die Pfad-Eigenschaft muss auf ein gültiges Particles2D-Node verweisen." #~ msgid "Surface" #~ msgstr "Oberfläche" @@ -7334,9 +7694,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Auslaufende Stille:" -#~ msgid "Script" -#~ msgstr "Skript" - #~ msgid "Script Export Mode:" #~ msgstr "Skript-Exportmodus:" @@ -7370,9 +7727,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance enthält keine BakedLight-Ressource." -#~ msgid "Vertex" -#~ msgstr "Vertex" - #~ msgid "Fragment" #~ msgstr "Fragment" @@ -7408,9 +7762,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Unterordner kann nicht geöffnet werden:" -#~ msgid "Help" -#~ msgstr "Hilfe" - #~ msgid "Imported Resources" #~ msgstr "Importierte Ressourcen" diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po index 183f09e9a6..15b70b2172 100644 --- a/editor/translations/de_CH.po +++ b/editor/translations/de_CH.po @@ -1,6 +1,5 @@ # Swiss High German translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Christian Fisch <christian.fiesel@gmail.com>, 2016. @@ -536,7 +535,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -582,7 +582,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -726,6 +726,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -831,6 +832,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -931,8 +933,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -942,6 +943,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1010,8 +1012,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1202,7 +1203,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1219,7 +1221,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1389,8 +1390,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1444,6 +1445,11 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Node" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1500,7 +1506,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1538,6 +1544,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1591,7 +1601,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1619,84 +1629,40 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Projekteinstellungen" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Zurück zur Projektliste" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Verschiedene Projekte oder Szenenweite Werkzeuge." #: editor/editor_node.cpp -msgid "Tools" -msgstr "" - -#: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exportiere das Projekt für viele Plattformen." - -#: editor/editor_node.cpp editor/project_export.cpp -msgid "Export" -msgstr "" +#, fuzzy +msgid "Project" +msgstr "Projektname:" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Projekt starten." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Abspielen" +msgid "Project Settings" +msgstr "Projekteinstellungen" #: editor/editor_node.cpp -msgid "Pause the scene" +msgid "Run Script" msgstr "" -#: editor/editor_node.cpp -msgid "Pause Scene" +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Spiele die editierte Szene." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Szene starten" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Spiele angepasste Szene" - -#: editor/editor_node.cpp -#, fuzzy -msgid "Play Custom Scene" -msgstr "Spiele angepasste Szene" +msgid "Quit to Project List" +msgstr "Zurück zur Projektliste" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1770,8 +1736,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1791,14 +1757,71 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "Projekt starten." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Abspielen" + +#: editor/editor_node.cpp +msgid "Pause the scene" msgstr "" #: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Spiele die editierte Szene." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Szene starten" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Spiele angepasste Szene" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Play Custom Scene" +msgstr "Spiele angepasste Szene" + +#: editor/editor_node.cpp msgid "Spins when the editor window repaints!" msgstr "" @@ -1879,6 +1902,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1906,6 +1937,32 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Verzeichnis öffnen" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Verzeichnis öffnen" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2151,6 +2208,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2179,10 +2240,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2349,7 +2406,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2829,7 +2886,7 @@ msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Zum Projekt hinzufügen (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3500,7 +3557,7 @@ msgid "Change default type" msgstr "Typ ändern" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Okay" @@ -3549,17 +3606,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3591,9 +3637,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Script hinzufügen" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Ungültige Bilder löschen" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3864,6 +3933,20 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Clear Emission Mask" +msgstr "Inhalt der Emissions-Masken löschen" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3876,9 +3959,8 @@ msgid "Set Emission Mask" msgstr "Emissions-Maske setzen" #: editor/plugins/particles_2d_editor_plugin.cpp -#, fuzzy -msgid "Clear Emission Mask" -msgstr "Inhalt der Emissions-Masken löschen" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3888,6 +3970,25 @@ msgstr "Emissions-Maske laden" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Emissions-Maske setzen" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Emissions-Maske setzen" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "" @@ -3901,10 +4002,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Flächen enthalten keinen Bereich!" @@ -3958,12 +4055,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4021,6 +4122,14 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4174,6 +4283,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4261,10 +4374,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4298,15 +4407,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4361,6 +4462,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4440,6 +4557,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Verbindung zu Node:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4462,6 +4588,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4679,35 +4809,97 @@ msgid "Animation Key Inserted." msgstr "Animationsbild eingefügt." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Typ ändern" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Oberfläche %d" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4768,71 +4960,67 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Select" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "1 Viewport" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports (Alt)" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports" +msgid "1 Viewport" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports (Alt)" +msgid "2 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "4 Viewports" +msgid "2 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" +msgid "3 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" +msgid "3 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" +msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4856,14 +5044,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5279,12 +5459,12 @@ msgstr "Ungültiger Projektpfad, Pfad existiert nicht!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Ungültiger Projektpfad, engine.cfg vorhanden!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Ungültiger Projektpfad, engine.cfg nicht vorhanden!" #: editor/project_manager.cpp @@ -5297,7 +5477,7 @@ msgstr "Ungültiger Projektpfad, (wurde was geändert?)!" #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "Die engine.cfg kann im Projektverzeichnis nicht erstellt werden." #: editor/project_manager.cpp @@ -5514,6 +5694,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5580,7 +5764,7 @@ msgstr "" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "Projekteinstellungen" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5697,10 +5881,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "TimeScale-Node" @@ -5887,6 +6067,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5964,10 +6148,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Script hinzufügen" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6012,77 +6243,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Fehler beim Instanzieren der %s Szene" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy -msgid "Error loading script from %s" -msgstr "Fehler beim Instanzieren der %s Szene" +msgid "Invalid inherited parent name or path" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Neues Projekt erstellen" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Ungültige Bilder löschen" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6762,9 +7002,11 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6838,12 +7080,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6860,6 +7096,15 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Node erstellen" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alert!" @@ -6902,6 +7147,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6916,9 +7167,12 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Assets zum Projekt importieren." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Projekteinstellungen" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exportiere das Projekt für viele Plattformen." + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Die Pfad-Variable muss auf einen gültigen Particles2D Node verweisen." #~ msgid "Surface" #~ msgstr "Oberfläche" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index 5f50c159b8..9821ef4e01 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -526,7 +526,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -572,7 +573,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -715,6 +716,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -820,6 +822,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -920,8 +923,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -931,6 +933,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -999,8 +1002,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1191,7 +1193,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1208,7 +1211,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1378,8 +1380,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1433,6 +1435,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1489,7 +1495,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1527,6 +1533,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1579,7 +1589,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1607,35 +1617,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1643,47 +1641,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1754,8 +1720,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1775,11 +1741,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1863,6 +1885,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1890,6 +1920,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2133,6 +2187,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2161,10 +2219,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2330,7 +2384,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2805,7 +2859,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3465,7 +3519,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3514,17 +3568,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3556,9 +3599,30 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3828,6 +3892,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3840,7 +3917,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3851,20 +3928,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3919,12 +4009,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3982,6 +4076,14 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4135,6 +4237,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4222,10 +4328,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4259,15 +4361,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4322,6 +4416,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4401,6 +4511,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4423,6 +4541,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4640,35 +4762,95 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4728,71 +4910,67 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Select" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "1 Viewport" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports (Alt)" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports" +msgid "1 Viewport" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports (Alt)" +msgid "2 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "4 Viewports" +msgid "2 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" +msgid "3 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" +msgid "3 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" +msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4816,14 +4994,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5236,11 +5406,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5252,7 +5422,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5468,6 +5638,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5533,7 +5707,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5649,10 +5823,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5837,6 +6007,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5911,10 +6085,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5959,75 +6179,83 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6679,8 +6907,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6748,12 +6978,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6769,6 +6993,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6811,6 +7043,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/el.po b/editor/translations/el.po index 0879b693ff..bd95d6e6f6 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -1,6 +1,5 @@ # Greek translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # gtsiam <gtsiam@windowslive.com>, 2017. @@ -8,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-02-15 17:48+0000\n" +"PO-Revision-Date: 2017-06-24 22:14+0000\n" "Last-Translator: gtsiam <gtsiam@windowslive.com>\n" "Language-Team: Greek <https://hosted.weblate.org/projects/godot-engine/godot/" "el/>\n" @@ -16,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.12-dev\n" +"X-Generator: Weblate 2.15-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -83,9 +82,8 @@ msgid "Anim Track Change Value Mode" msgstr "Anim ΛειτουÏγία αλλαγής τιμής κομματιοÏ" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Anim ΛειτουÏγία αλλαγής τιμής κομματιοÏ" +msgstr "Αλλαγή λειτουÏγίας αναδίπλωσης ÎºÎ¿Î¼Î¼Î±Ï„Î¹Î¿Ï ÎºÎ¯Î½Î·ÏƒÎ·Ï‚" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -255,7 +253,7 @@ msgstr "Βήμα (s):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "Βήμα κλειδώματος δείκτη (σε δευτεÏόλεπτα)." +msgstr "Βήμα κουμπώματος δÏομÎα (σε δευτεÏόλεπτα)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." @@ -365,7 +363,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp editor/editor_plugin_settings.cpp msgid "Version:" -msgstr "" +msgstr "Έκδοση:" #: editor/asset_library_editor_plugin.cpp #, fuzzy @@ -375,7 +373,7 @@ msgstr "ΣταθεÏÎÏ‚:" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "ΑÏχείο:" +msgstr " ΑÏχεία" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp @@ -385,7 +383,7 @@ msgstr "ΠεÏιγÏαφή:" #: editor/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" -msgstr "" +msgstr "Εγκατάσταση" #: editor/asset_library_editor_plugin.cpp editor/call_dialog.cpp #: editor/connections_dialog.cpp editor/export_template_manager.cpp @@ -481,8 +479,9 @@ msgid "Fetching:" msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Resolving.." -msgstr "" +msgstr "Αποθήκευση..." #: editor/asset_library_editor_plugin.cpp #, fuzzy @@ -508,8 +507,9 @@ msgid "Retry" msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Download Error" -msgstr "" +msgstr "Λήψη" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -543,7 +543,8 @@ msgid "Search:" msgstr "Αναζήτηση:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -563,7 +564,7 @@ msgstr "Εισαγωγή" #: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp msgid "Plugins" -msgstr "" +msgstr "Î Ïόσθετα" #: editor/asset_library_editor_plugin.cpp msgid "Sort:" @@ -589,7 +590,7 @@ msgstr "ΥποστήÏιξη.." msgid "Official" msgstr "Επίσημα" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Κοινότητα" @@ -634,7 +635,6 @@ msgid "No Matches" msgstr "Δεν υπάÏχουν αντιστοιχίες" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "Αντικαταστάθηκαν %d εμφανίσεις." @@ -719,8 +719,8 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" -"Η στοχευμÎνη συνάÏτηση δεν βÏÎθηκε! ΟÏίστε μία ÎγκυÏη μÎθοδο ή συνδÎστε Îνα " -"script στον στοχευμÎνο κόμβο." +"Η στοχευμÎνη συνάÏτηση δεν βÏÎθηκε! ΟÏίστε μία ÎγκυÏη μÎθοδο ή συνδÎστε μία " +"δεσμή ενεÏγειών στον στοχευμÎνο κόμβο." #: editor/connections_dialog.cpp msgid "Connect To Node:" @@ -735,6 +735,7 @@ msgstr "Î Ïοσθήκη" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "ΑφαίÏεση" @@ -844,6 +845,7 @@ msgstr "Î ÏŒÏος" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "ΔιαδÏομή" @@ -932,33 +934,33 @@ msgstr "ΔιαγÏαφή" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Αποθήκευση διάταξης διαÏλων ήχου ÏŽÏ‚.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Τοποθεσία για νÎα διάταξη.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Άνοιγμα διάταξης διαÏλων ήχου" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Î Ïοσθήκη διαÏλου" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "ΦόÏτωσε" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Αποθήκευση ÏŽÏ‚" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" -msgstr "Î ÏοεπιλεγμÎνη" +msgstr "Î Ïοεπιλογή" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1027,8 +1029,7 @@ msgid "Rearrange Autoloads" msgstr "Αναδιάταξη των AutoLoad" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "ΔιαδÏομή:" @@ -1043,7 +1044,6 @@ msgid "Name" msgstr "Όνομα" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Singleton" msgstr "ΜονοσÏνολο" @@ -1088,7 +1088,6 @@ msgid "Choose" msgstr "ΕπιλÎξτε" #: editor/editor_export.cpp -#, fuzzy msgid "Storing File:" msgstr "ΑÏχείο αποθήκευσης:" @@ -1098,7 +1097,7 @@ msgstr "ΠακετάÏισμα" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Δεν βÏÎθηκε το αÏχείο Ï€ÏοτÏπου:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1181,9 +1180,8 @@ msgid "Toggle Mode" msgstr "Εναλλαγή λειτουÏγίας" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Focus Path" -msgstr "ΕπικÎντÏωση στη διαδÏομή" +msgstr "Εστίαση στη διαδÏομή" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" @@ -1219,11 +1217,11 @@ msgid "ScanSources" msgstr "ΣάÏωση πηγών" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Επανεισαγωγή" +msgstr "(Επαν)εισαγωγή πόÏων" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Αναζήτηση βοήθειας" @@ -1240,7 +1238,6 @@ msgid "Class:" msgstr "Κλάση:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "ΚληÏονομεί:" @@ -1338,7 +1335,7 @@ msgstr "ΔημιουÏγία μικÏογÏαφίας" msgid "" "Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." msgstr "" -"ΑδÏνατη η αποθήκευση σκηνής. Πιθανώς οι εξαÏτήσεις (στιγμιότυπα) να μην " +"ΑδÏνατη η αποθήκευση σκηνής. Πιθανώς οι εξαÏτήσεις (στιγμιότυπα) να μην " "μποÏοÏσαν να ικανοποιηθοÏν." #: editor/editor_node.cpp @@ -1347,11 +1344,11 @@ msgstr "ΑπÎτυχε η φόÏτωση πόÏου." #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "ΑδÏνατο το φόÏτωμα του MeshLibrary για συγχώνευση!" +msgstr "ΑδÏνατο το φόÏτωμα της βιβλιοθήκης πλεγμάτων για συγχώνευση!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "Σφάλμα κατά την αποθήκευση MeshLibrary!" +msgstr "Σφάλμα κατά την αποθήκευση της βιβλιοθήκης πλεγμάτων !" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" @@ -1410,10 +1407,11 @@ msgid "There is no defined scene to run." msgstr "Δεν υπάÏχει καθοÏισμÎνη σκηνή για εκτελÎση." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Η κÏÏια σκηνή δεν Îχει καθοÏιστεί, θÎλετε να επιλÎξετε μία;\n" "ΜποÏείτε να την αλλάξετε αÏγότεÏα στις «Ρυθμίσεις ÎÏγου» κάτω από την " @@ -1464,7 +1462,7 @@ msgstr "ΓÏήγοÏο άνοιγμα σκηνής..." #: editor/editor_node.cpp msgid "Quick Open Script.." -msgstr "ΓÏήγοÏη ανοιχτό script..." +msgstr "ΓÏήγοÏη άνοιγμα δεσμής ενεÏγειών..." #: editor/editor_node.cpp msgid "Yes" @@ -1479,13 +1477,17 @@ msgid "Save Scene As.." msgstr "Αποθήκευση σκηνή ως..." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Κόμβος" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Αυτή η σκηνή δεν Îχει αποθηκευτεί. Αποθήκευση Ï€Ïιν από την εκτÎλεση;" #: editor/editor_node.cpp -#, fuzzy msgid "Export Mesh Library" -msgstr "Εξαγωγή βιβλιοθήκης mesh" +msgstr "Εξαγωγή βιβλιοθήκης πλεγμάτων" #: editor/editor_node.cpp msgid "Export Tile Set" @@ -1539,9 +1541,12 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Η σκηνή '%s' Îχει εισαχθεί αυτόματα και δεν μποÏεί να Ï„Ïοποποιηθεί.\n" +"Για να κάνετε αλλαγÎÏ‚ σε αυτή, Ï€ÏÎπει να δημιουÏγηθεί μία νÎα κληÏονομημÎνη " +"σκηνή." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "α..." @@ -1582,6 +1587,10 @@ msgstr "%d πεÏισσότεÏα αÏχεία" msgid "%d more file(s) or folder(s)" msgstr "%d πεÏισσότεÏα αÏχεία ή φάκελοι" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "ΛειτουÏγία χωÏίς διάσπαση Ï€Ïοσοχής" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Σκηνή" @@ -1599,9 +1608,8 @@ msgid "Previous tab" msgstr "Î ÏοηγοÏμενη καÏÏ„Îλα" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "ΓÏήγοÏο φιλτÏάÏισμα αÏχείων..." +msgstr "ΦιλτÏάÏισμα αÏχείων..." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1635,7 +1643,7 @@ msgstr "Κλείσιμο σκηνής" msgid "Close Goto Prev. Scene" msgstr "Κλείσιμο και μετάβαση στην Ï€ÏοηγοÏμενη σκηνή" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Άνοιγμα Ï€Ïόσφατων" @@ -1645,7 +1653,7 @@ msgstr "ΜετατÏοπή σε..." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "Βιβλιοθήκη mesh..." +msgstr "Βιβλιοθήκη πλεγμάτων..." #: editor/editor_node.cpp msgid "TileSet.." @@ -1663,84 +1671,41 @@ msgid "Redo" msgstr "ΑκÏÏωση αναίÏεσης" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "ΕκτÎλεση script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Ρυθμίσεις ÎÏγου" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "ΕπαναφοÏά σκηνής" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Έξοδος στη λίστα ÎÏγων" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "ΛειτουÏγία χωÏίς διάσπαση Ï€Ïοσοχής" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Λοιπά ÎÏγα ή εÏγαλεία για όλη τη σκηνή." #: editor/editor_node.cpp -msgid "Tools" -msgstr "ΕÏγαλεία" +#, fuzzy +msgid "Project" +msgstr "ÎÎο ÎÏγο" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Εξαγωγή ÎÏγου σε πολλÎÏ‚ πλατφόÏμες." +msgid "Project Settings" +msgstr "Ρυθμίσεις ÎÏγου" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "ΕκτÎλεση δεσμής ενεÏγειών" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Εξαγωγή" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "ΑναπαÏαγωγή του ÎÏγου." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "ΑναπαÏαγωγή" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ΠαÏση της σκηνής" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "ΠαÏση της σκηνής" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "ΔιÎκοψε τη σκηνή." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Διακοπή" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "ΑναπαÏαγωγή επεξεÏγαζόμενης σκηνής." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "ΑναπαÏαγωγή σκηνής" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "ΑναπαÏαγωγή Ï€ÏοσαÏμοσμÎνης σκηνής" +msgid "Tools" +msgstr "ΕÏγαλεία" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "ΑναπαÏαγωγή Ï€ÏοσαÏμοσμÎνης σκηνής" +msgid "Quit to Project List" +msgstr "Έξοδος στη λίστα ÎÏγων" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "ΕπιλογÎÏ‚ ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Αποσφαλμάτωση" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1795,7 +1760,7 @@ msgid "" "Navigation meshes and polygons will be visible on the running game if this " "option is turned on." msgstr "" -"ΠλÎγματα πλοήγησης και πολÏγονα θα είναι οÏατά στο παιχνίδι εάν αυτή η " +"Τα πλÎγματα πλοήγησης και τα πολÏγονα θα είναι οÏατά στο παιχνίδι εάν αυτή η " "επιλογή είναι ενεÏγοποιημÎνη." #: editor/editor_node.cpp @@ -1816,7 +1781,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Sync Script Changes" -msgstr "ΣυγχÏονισμός αλλαγών στα script" +msgstr "ΣυγχÏονισμός αλλαγών στις δεσμÎÏ‚ ενεÏγειών" #: editor/editor_node.cpp msgid "" @@ -1825,14 +1790,15 @@ msgid "" "When used remotely on a device, this is more efficient with network " "filesystem." msgstr "" -"Όταν αυτή η επιλογή είναι ενεÏγοποιημÎνη, όποιο script αποθηκευτεί θα " -"επαναφοÏτωθεί στο παιχνίδι.\n" +"Όταν αυτή η επιλογή είναι ενεÏγοποιημÎνη, όποια δεσμή ενεÏγειών αποθηκευτεί " +"θα επαναφοÏτωθεί στο παιχνίδι.\n" "Όταν χÏησιμοποιηθεί απομακÏυσμÎνα σε μία συσκευή, αυτό είναι ποιο " "αποτελεσματικό με δικτυωμÎνο σÏστημα αÏχείων." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Ρυθμίσεις" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "ΕπεξεÏγασία" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1847,17 +1813,73 @@ msgid "Toggle Fullscreen" msgstr "Εναλλαγή πλήÏους οθόνης" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "ΦόÏτωση Ï€ÏοτÏπων εξαγωγής" +msgstr "ΔιαχείÏιση Ï€ÏοτÏπων εξαγωγής" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Κλάσεις" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Κλείσιμο τεκμηÏίωσης" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "Σχετικά" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Ειδοποίηση όταν Îνας εξωτεÏικός πόÏος Îχει αλλάξει." +msgid "Play the project." +msgstr "ΑναπαÏαγωγή του ÎÏγου." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "ΑναπαÏαγωγή" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "ΠαÏση της σκηνής" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "ΠαÏση της σκηνής" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "ΔιÎκοψε τη σκηνή." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Διακοπή" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "ΑναπαÏαγωγή επεξεÏγαζόμενης σκηνής." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "ΑναπαÏαγωγή σκηνής" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "ΑναπαÏαγωγή Ï€ÏοσαÏμοσμÎνης σκηνής" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "ΑναπαÏαγωγή Ï€ÏοσαÏμοσμÎνης σκηνής" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1940,6 +1962,14 @@ msgid "Thanks!" msgstr "ΕυχαÏιστώ!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Εισαγωγή Ï€ÏοτÏπων από αÏχείο ZIP" @@ -1961,79 +1991,109 @@ msgstr "Κωδικός:" #: editor/editor_node.cpp msgid "Open & Run a Script" -msgstr "Άνοιξε & ΤÏÎξε Îνα script" +msgstr "Άνοιξε & ΤÏÎξε μία δεσμή ενεÏγειών" #: editor/editor_node.cpp msgid "Load Errors" -msgstr "" +msgstr "Σφάλματα φόÏτωσης" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Άνοιγμα στον επεξεÏγαστή" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Άνοιγμα στον επεξεÏγαστή" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Άνοιγμα στον επεξεÏγαστή" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Εξαγωγή βιβλιοθήκης" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Άνοιγμα στον επεξεÏγαστή" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Άνοιγμα στον επεξεÏγαστή" #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" -msgstr "" +msgstr "ΕγκατεστημÎνα Ï€Ïόσθετα:" #: editor/editor_plugin_settings.cpp msgid "Author:" -msgstr "" +msgstr "ΣυγγÏαφÎας:" #: editor/editor_plugin_settings.cpp msgid "Status:" -msgstr "" +msgstr "Κατάσταση:" #: editor/editor_profiler.cpp msgid "Stop Profiling" -msgstr "" +msgstr "Διακοπή Ï€Ïοφίλ" #: editor/editor_profiler.cpp msgid "Start Profiling" -msgstr "" +msgstr "ΈναÏξη Ï€Ïοφίλ" #: editor/editor_profiler.cpp msgid "Measure:" -msgstr "" +msgstr "ΜÎÏ„Ïο:" #: editor/editor_profiler.cpp msgid "Frame Time (sec)" -msgstr "" +msgstr "ΧÏόνος καÏÎ (sec)" #: editor/editor_profiler.cpp msgid "Average Time (sec)" -msgstr "" +msgstr "ΜÎσος ΧÏόνος (sec)" #: editor/editor_profiler.cpp msgid "Frame %" -msgstr "" +msgstr "ΚαÏÎ %" #: editor/editor_profiler.cpp msgid "Fixed Frame %" -msgstr "" +msgstr "ΣταθεÏÏŒ καÏÎ %" #: editor/editor_profiler.cpp editor/script_editor_debugger.cpp msgid "Time:" -msgstr "" +msgstr "ΧÏόνος:" #: editor/editor_profiler.cpp msgid "Inclusive" -msgstr "" +msgstr "ΠεÏιοκτικός" #: editor/editor_profiler.cpp msgid "Self" -msgstr "" +msgstr "Εαυτός" #: editor/editor_profiler.cpp msgid "Frame #:" -msgstr "" +msgstr "ΚαÏÎ #:" #: editor/editor_reimport_dialog.cpp msgid "Please wait for scan to complete." -msgstr "" +msgstr "ΠαÏακαλώ πεÏιμÎνετε να ολοκληÏωθεί η σάÏωση." #: editor/editor_reimport_dialog.cpp msgid "Current scene must be saved to re-import." -msgstr "" +msgstr "Η Ï„ÏÎχουσα σκηνή Ï€ÏÎπει να αποθηκευτεί για να επαν-εισάγετε." #: editor/editor_reimport_dialog.cpp msgid "Save & Re-Import" -msgstr "" +msgstr "Αποθήκευση & Επανεισαγωγή" #: editor/editor_reimport_dialog.cpp msgid "Re-Importing" @@ -2041,75 +2101,75 @@ msgstr "Επανεισαγωγή" #: editor/editor_reimport_dialog.cpp msgid "Re-Import Changed Resources" -msgstr "" +msgstr "Επανεισαγωγή Ï„ÏοποπιημÎνων πόÏων" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." -msgstr "" +msgstr "ΓÏάψτε τη λογική σας στη μÎθοδο _run()." #: editor/editor_run_script.cpp msgid "There is an edited scene already." -msgstr "" +msgstr "ΥπάÏχει ήδη μία σκηνή για επεξεÏγασία." #: editor/editor_run_script.cpp msgid "Couldn't instance script:" -msgstr "" +msgstr "ΑδÏνατη η δημιουÏγία στιγμιοτÏπου δεσμής ενεÏγειών:" #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "" +msgstr "Μήπως ξεχάσατε τη λÎξη-κλειδί \"tool\"?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" -msgstr "" +msgstr "ΑδÏνατη η εκτÎλεση της δεσμής ενεÏγειών:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "" +msgstr "Μήπως ξεχάσατε τη μÎθοδο '_run';" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" -msgstr "" +msgstr "Î Ïοεπιλογή (Το ίδιο με τον επεξεÏγαστή)" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" -msgstr "" +msgstr "ΕπιλÎξτε κόμβους για εισαγωγή" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "" +msgstr "ΔιαδÏομή σκηνής:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" -msgstr "" +msgstr "Εισαγωγή σκηνής από κόμβο:" #: editor/export_template_manager.cpp msgid "Re-Download" -msgstr "" +msgstr "Εκ νÎου λήψη" #: editor/export_template_manager.cpp msgid "Uninstall" -msgstr "" +msgstr "Απεγκατάσταση" #: editor/export_template_manager.cpp msgid "(Installed)" -msgstr "" +msgstr "(ΕγκατεστημÎνο)" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Λήψη" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Λείπει)" #: editor/export_template_manager.cpp msgid "(Current)" -msgstr "" +msgstr "(ΤÏÎχων)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "ΑφαίÏεση Ï€Ïότυπης εκδοχής '%s';" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2117,27 +2177,27 @@ msgstr "ΑδÏνατο το άνοιγμα του zip των Ï€ÏοτÏπων ε #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "ΆκυÏη μοÏφή version.txt μÎσα στα Ï€Ïότυπα." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"ΆκυÏη μοÏφή version.txt μÎσα στα Ï€Ïότυπα. Το Revision δεν είναι ÎγκυÏο " +"αναγνωÏιστικό." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Δεν βÏÎθηκε version.txt μÎσα στα Ï€Ïότυπα." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Σφάλμα κατά την αποθήκευση άτλαντα:" +msgstr "Σφάλμα κατά τη δημιουÏγία διαδÏομης για τα Ï€Ïότυπα:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "ΦόÏτωση Ï€ÏοτÏπων εξαγωγής" +msgstr "Εξαγωγή Ï€ÏοτÏπων εξαγωγής" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2149,238 +2209,238 @@ msgstr "ΦόÏτωση Ï€ÏοτÏπων εξαγωγής" #: editor/export_template_manager.cpp msgid "Current Version:" -msgstr "" +msgstr "ΤÏÎχουσα Îκδοση:" #: editor/export_template_manager.cpp msgid "Installed Versions:" -msgstr "" +msgstr "ΕγκατεστημÎνες εκδόσεις:" #: editor/export_template_manager.cpp msgid "Install From File" -msgstr "" +msgstr "Εγκατάσταση από αÏχείο" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "ΑφαίÏεση επιλογής" +msgstr "ΑφαίÏεση Ï€ÏοτÏπου" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "ΔιαγÏαφή επιλεγμÎνων αÏχείων;" +msgstr "ΕπιλÎξτε Îνα αÏχείο Ï€ÏοτÏπων" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "ΦόÏτωση Ï€ÏοτÏπων εξαγωγής" +msgstr "ΔιαχειÏιστής Ï€ÏοτÏπων εξαγωγής" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" msgstr "" +"ΑδÏνατο το άνοιγμα του αÏχείου file_type_cache.cch για εγγÏαφή, παÏάλειψη " +"αποθήκευσης cache Ï„Ïπου αÏχείου!" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "ΑδÏνατη η πλοήγηση στο '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." -msgstr "" +msgstr "Ίδια αÏχεία πηγής και Ï€ÏοοÏισμοÏ, παÏάλειψη ενÎÏγειας." #: editor/filesystem_dock.cpp msgid "Same source and destination paths, doing nothing." -msgstr "" +msgstr "Ίδιες διαδÏομÎÏ‚ πηγής και Ï€ÏοοÏισμοÏ, παÏάλειψη ενÎÏγειας." #: editor/filesystem_dock.cpp msgid "Can't move directories to within themselves." -msgstr "" +msgstr "ΑδÏνατη η μετακίνηση καταλόγων μÎσα στους εαυτοÏÏ‚ τους." #: editor/filesystem_dock.cpp msgid "Can't operate on '..'" -msgstr "" +msgstr "ΑδÏνατη η λειτουÏγία στο '..'" #: editor/filesystem_dock.cpp msgid "Pick New Name and Location For:" -msgstr "" +msgstr "ΕπιλÎξτε νÎο όνομα και θÎση για:" #: editor/filesystem_dock.cpp msgid "No files selected!" -msgstr "" +msgstr "Δεν επιλÎχθηκαν αÏχεία!" #: editor/filesystem_dock.cpp msgid "Expand all" -msgstr "" +msgstr "Ανάπτυξη όλων" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "ΣÏμπτηξη όλων" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Εμφάνιση στη διαχείÏιση αÏχείων" #: editor/filesystem_dock.cpp msgid "Instance" -msgstr "" +msgstr "Στιγμιότυπο" #: editor/filesystem_dock.cpp msgid "Edit Dependencies.." -msgstr "" +msgstr "ΕπεξεÏγασία εξαÏτήσεων .." #: editor/filesystem_dock.cpp msgid "View Owners.." -msgstr "" +msgstr "Î Ïοβολή Ιδιοκτητών .." #: editor/filesystem_dock.cpp msgid "Copy Path" -msgstr "" +msgstr "ΑντιγÏαφή διαδÏομής" #: editor/filesystem_dock.cpp msgid "Rename or Move.." -msgstr "" +msgstr "Μετονομασία ή μετακίνηση.." #: editor/filesystem_dock.cpp msgid "Move To.." -msgstr "" +msgstr "Μετακίνηση σε..." #: editor/filesystem_dock.cpp msgid "Info" -msgstr "" - -#: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" +msgstr "ΠληÏοφοÏίες" #: editor/filesystem_dock.cpp msgid "Re-Import.." -msgstr "" +msgstr "Εκ νÎου εισαγωγή..." #: editor/filesystem_dock.cpp msgid "Previous Directory" -msgstr "" +msgstr "Î ÏοηγοÏμενος κατάλογος" #: editor/filesystem_dock.cpp msgid "Next Directory" -msgstr "" +msgstr "Επόμενος κατάλογος" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "" +msgstr "Εκ νÎου σάÏωση το συστήματος αÏχείων" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" -msgstr "" +msgstr "Εναλλαγή αγαπημÎνου" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." msgstr "" +"ΔημιουÏγία στιγμιοτÏπων των επιλεγμÎνων σκηνών ως παιδιά του επιλεγμÎνου " +"κόμβου." #: editor/filesystem_dock.cpp msgid "Move" -msgstr "" +msgstr "Μετακίνηση" #: editor/groups_editor.cpp msgid "Add to Group" -msgstr "" +msgstr "Î Ïοσθήκη σε Ομάδα" #: editor/groups_editor.cpp msgid "Remove from Group" -msgstr "" +msgstr "ΚατάÏγηση από την ομάδα" #: editor/import/resource_importer_obj.cpp #: editor/io_plugins/editor_mesh_import_plugin.cpp msgid "Surface %d" -msgstr "" +msgstr "Επιφάνεια %d" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "" +msgstr "Εισαγωγή σκηνής" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Importing Scene.." -msgstr "" +msgstr "Εισαγωγή σκηνής..." #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Running Custom Script.." -msgstr "" +msgstr "ΕκτÎλεση Ï€ÏοσαÏμοσμÎνης δÎσμης ενεÏγειών..." #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Couldn't load post-import script:" -msgstr "" +msgstr "Δεν ήταν δυνατή η φόÏτωση της δεσμής ενεÏγειών για μετά την εισαγωγή:" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Invalid/broken script for post-import (check console):" msgstr "" +"ΆκυÏη / χαλασμÎνη δεσμή ενεÏγειών για την διαδικασία της μετ-εισαγωγής " +"(ελÎγξτε την κονσόλα):" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Error running post-import script:" -msgstr "" +msgstr "Σφάλμα κατά την εκτÎλεση της δÎσμης ενεÏγειών μετ-εισαγωγής:" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Saving.." -msgstr "" +msgstr "Αποθήκευση..." #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "ΑÏχείο:" +msgstr " ΑÏχεία" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Εισαγωγή" +msgstr "Εισαγωγή ÏŽÏ‚:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "Î ÏοκαθοÏισμÎνο..." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" msgstr "Επανεισαγωγή" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "No bit masks to import!" -msgstr "" +msgstr "Δεν υπάÏχουν μάσκες bit για εισαγωγή!" #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Target path is empty." -msgstr "" +msgstr "Η διαδÏομή Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ άδεια." #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Target path must be a complete resource path." -msgstr "" +msgstr "Η διαδÏομή Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏÎπει να είναι μία πλήÏης διαδÏομή σε πόÏο." #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Target path must exist." -msgstr "" +msgstr "Η διαδÏομή Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏÎπει να υπάÏχει." #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_mesh_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp msgid "Save path is empty!" -msgstr "" +msgstr "Η διαδÏομή αποθήκευσης είναι άδεια!" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "Import BitMasks" -msgstr "" +msgstr "Εισαγωγή μάσκας bit" #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Source Texture(s):" -msgstr "" +msgstr "Πηγαίες υφÎÏ‚:" #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_mesh_import_plugin.cpp @@ -2389,7 +2449,7 @@ msgstr "" #: editor/io_plugins/editor_texture_import_plugin.cpp #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Target Path:" -msgstr "" +msgstr "ΔιαδÏομή Ï€ÏοοÏισμοÏ:" #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2398,74 +2458,79 @@ msgstr "" #: editor/io_plugins/editor_texture_import_plugin.cpp #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Accept" -msgstr "" +msgstr "Αποδοχή" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "Bit Mask" -msgstr "" +msgstr "Μάσκα bit" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "No source font file!" -msgstr "" +msgstr "Δεν δόθηκε πηγαίο αÏχείο γÏαμματοσειÏάς!" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "No target font resource!" -msgstr "" +msgstr "Δε δόθηκε πόÏος γÏαμματοσειÏάς Ï€ÏοοÏισμοÏ!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" +"ΆκυÏη επÎκταση αÏχείου.\n" +"ΠαÏακαλώ χÏησιμοποιήστε .fnt." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Can't load/process source font." -msgstr "" +msgstr "Δεν ήταν δυνατή η φόÏτωση/επεξεÏγασία της πηγαίας γÏαμματοσειÏάς." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Couldn't save font." -msgstr "" +msgstr "Δεν ήταν δυνατή η αποθήκευση της γÏαμματοσειÏάς." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Source Font:" -msgstr "" +msgstr "Πηγαία γÏαμματοσειÏά:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Source Font Size:" -msgstr "" +msgstr "ΜÎγεθος πηγαίας γÏαμματοσειÏάς:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Dest Resource:" -msgstr "" +msgstr "Î ÏŒÏος Ï€ÏοοÏισμοÏ:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "The quick brown fox jumps over the lazy dog." -msgstr "" +msgstr "ΓαζÎες καὶ μυÏτιὲς δὲν θὰ βÏá¿¶ πιὰ στὸ χÏυσαφὶ ξÎφωτο." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Test:" -msgstr "" +msgstr "Δοκιμή:" #: editor/io_plugins/editor_font_import_plugin.cpp #: editor/io_plugins/editor_mesh_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Options:" -msgstr "" +msgstr "ΕπιλογÎÏ‚:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Font Import" -msgstr "" +msgstr "Εισαγωγή γÏαμματοσειÏάς" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "This file is already a Godot font file, please supply a BMFont type file " "instead." msgstr "" +"Αυτό το αÏχείο είναι ήδη Îνα αÏχείο γÏαμματοσειÏάς της Godot, παÏακαλώ " +"υποβάλετε Îνα αÏχείο Ï„Ïπου BMFont." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Failed opening as BMFont file." -msgstr "" +msgstr "ΑπÎτυχε το άνοιγμα ως αÏχείο BMFont." #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp @@ -2489,158 +2554,159 @@ msgstr "Μη ÎγκυÏο μÎγεθος γÏαμματοσειÏάς." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Invalid font custom source." -msgstr "" +msgstr "ΆκυÏη Ï€ÏοσαÏμοσμÎνη πηγή γÏαμματοσειÏάς." #: editor/io_plugins/editor_font_import_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "" +msgstr "ΓÏαμματοσειÏά" #: editor/io_plugins/editor_mesh_import_plugin.cpp msgid "No meshes to import!" -msgstr "" +msgstr "Δεν υπάÏχουν πλÎγματα για εισαγωγή!" #: editor/io_plugins/editor_mesh_import_plugin.cpp msgid "Single Mesh Import" -msgstr "" +msgstr "Εισαγωγή ενός πλÎγματος" #: editor/io_plugins/editor_mesh_import_plugin.cpp msgid "Source Mesh(es):" -msgstr "" +msgstr "Πηγαία πλÎγματα:" #: editor/io_plugins/editor_mesh_import_plugin.cpp #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh" -msgstr "" +msgstr "ΠλÎγμα" #: editor/io_plugins/editor_sample_import_plugin.cpp msgid "No samples to import!" -msgstr "" +msgstr "Δεν υπάÏχουν δείγματα για εισαγωγή!" #: editor/io_plugins/editor_sample_import_plugin.cpp msgid "Import Audio Samples" -msgstr "" +msgstr "Εισαγωγή δειγμάτων ήχου" #: editor/io_plugins/editor_sample_import_plugin.cpp msgid "Source Sample(s):" -msgstr "" +msgstr "Πηγαία δείγματα:" #: editor/io_plugins/editor_sample_import_plugin.cpp msgid "Audio Sample" -msgstr "" +msgstr "Δείγμα ήχου" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "New Clip" -msgstr "" +msgstr "ÎÎο απόσπασμα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Animation Options" -msgstr "" +msgstr "ΕπιλογÎÏ‚ κίνησης" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Flags" -msgstr "" +msgstr "Σημαίες" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Bake FPS:" -msgstr "" +msgstr "Ψήστε FPS:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Optimizer" -msgstr "" +msgstr "ΕÏγαλείο βελτιστοποίησης" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Max Linear Error" -msgstr "" +msgstr "ΜÎγιστο γÏαμμικό σφάλμα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Max Angular Error" -msgstr "" +msgstr "ΜÎγιστο γωνιακό σφάλμα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Max Angle" -msgstr "" +msgstr "Ανώτατη Γωνία" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Clips" -msgstr "" +msgstr "Αποσπάσματα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Start(s)" -msgstr "" +msgstr "ΑÏχή" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "End(s)" -msgstr "" +msgstr "ΤÎλος" #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Loop" -msgstr "" +msgstr "Επανάληψη" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Filters" -msgstr "" +msgstr "ΦίλτÏα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Source path is empty." -msgstr "" +msgstr "Η διαδÏομή Ï€ÏοÎλευσης είναι άδεια." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Couldn't load post-import script." -msgstr "" +msgstr "Δεν ήταν δυνατή η φόÏτωση της δεσμής ενεÏγειών μετ-εισαγωγής." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Invalid/broken script for post-import." msgstr "" +"ΆκυÏη / χαλασμÎνη δεσμή ενεÏγειών για την διαδικασία της μετ-εισαγωγής." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Error importing scene." -msgstr "" +msgstr "Σφάλμα κατά την εισαγωγή της σκηνής." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import 3D Scene" -msgstr "" +msgstr "Εισαγωγή 3D σκηνής" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Source Scene:" -msgstr "" +msgstr "Σκηνή Ï€ÏοÎλευσης:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Same as Target Scene" -msgstr "" +msgstr "Το ίδιο με την στοχευμÎνη σκηνή" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Shared" -msgstr "" +msgstr "ΚοινόχÏηστο" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Target Texture Folder:" -msgstr "" +msgstr "ΕπιλεγμÎνος φάκλος υφών:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Post-Process Script:" -msgstr "" +msgstr "Δεσμή ενεÏγειών μετ-επεξεÏγασίας:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Custom Root Node Type:" -msgstr "" +msgstr "Î ÏοσαÏμοσμÎνος Ï„Ïπος ÏÎ¹Î¶Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Auto" -msgstr "" +msgstr "Αυτόματο" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Root Node Name:" -msgstr "" +msgstr "Όνομα ÏÎ¹Î¶Î¹ÎºÎ¿Ï ÎºÏŒÎ¼Î²Î¿Ï…:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "The Following Files are Missing:" -msgstr "" +msgstr "Τα ακόλουθα αÏχεία λείπουν:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import Anyway" -msgstr "" +msgstr "Εισαγωγή οÏτως ή άλλως" #: editor/io_plugins/editor_scene_import_plugin.cpp scene/gui/dialogs.cpp msgid "Cancel" @@ -2648,422 +2714,427 @@ msgstr "ΑκÏÏωση" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import & Open" -msgstr "" +msgstr "Εισαγωγή & Άνοιγμα" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Edited scene has not been saved, open imported scene anyway?" msgstr "" +"Η Ï„ÏÎχουσα σκηνή δεν Îχει αποθηκευτεί, άνοιγμα της εισαγμÎνης σκηνής οÏτως ή " +"άλλως;" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import Image:" -msgstr "" +msgstr "Εισαγωγή εικόνας:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Can't import a file over itself:" -msgstr "" +msgstr "Δεν είναι δυνατή η εισαγωγή ενός αÏχείου πάνω στον εαυτό του:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Couldn't localize path: %s (already local)" msgstr "" +"Δεν είναι δυνατή η μετατÏοπή της διαδÏομής σε τοπική: %s (είναι ήδη τοπικό)" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "3D Scene Animation" -msgstr "" +msgstr "Κίνηση Ï„Ïισδιάστατης σκηνής" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Uncompressed" -msgstr "" +msgstr "Ασυμπίεστο" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Compress Lossless (PNG)" -msgstr "" +msgstr "Συμπίεση χωÏίς απώλειες (PNG)" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Compress Lossy (WebP)" -msgstr "" +msgstr "Συμπίεση με απώλειες (WebP)" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Compress (VRAM)" -msgstr "" +msgstr "Συμπίεση (VRAM)" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Texture Format" -msgstr "" +msgstr "ΜοÏφή υφής" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Texture Compression Quality (WebP):" -msgstr "" +msgstr "Ποιότητα συμπίεσης υφής (WebP):" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Texture Options" -msgstr "" +msgstr "ΕπιλογÎÏ‚ υφής" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Please specify some files!" -msgstr "" +msgstr "ΠαÏακαλώ καθοÏίστε κάποια αÏχεία!" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "At least one file needed for Atlas." -msgstr "" +msgstr "Τουλάχιστον Îνα αÏχείο απαιτείται για τον άτλαντα." #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Error importing:" -msgstr "" +msgstr "Σφάλμα κατά την εισαγωγή:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Only one file is required for large texture." -msgstr "" +msgstr "Μόνο Îνα αÏχείο είναι απαÏαίτητη για μεγάλη υφή." #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Max Texture Size:" -msgstr "" +msgstr "ΜÎγιστο μÎγεθος υφής:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Textures for Atlas (2D)" -msgstr "" +msgstr "Εισαγωγή υφών για τον άτλαντα (2D)" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Cell Size:" -msgstr "" +msgstr "ΜÎγεθος κελιοÏ:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Large Texture" -msgstr "" +msgstr "Μεγάλη υφή" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Large Textures (2D)" -msgstr "" +msgstr "Εισαγωγής Μεγάλων Υφών (2D)" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Source Texture" -msgstr "" +msgstr "Υφή Ï€ÏοÎλευσης" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Base Atlas Texture" -msgstr "" +msgstr "Βασική υφή άτλαντα" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Source Texture(s)" -msgstr "" +msgstr "ΥφÎÏ‚ Ï€ÏοÎλευσης" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Textures for 2D" -msgstr "" +msgstr "Εισαγωγή υφών για 2 διαστάσεις" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Textures for 3D" -msgstr "" +msgstr "Εισαγωγή υφών για 3 διαστάσεις" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Textures" -msgstr "" +msgstr "Εισαγωγή υφών" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "2D Texture" -msgstr "" +msgstr "Υφή 2 διαστάσεων" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "3D Texture" -msgstr "" +msgstr "Υφή 3 διαστάσεων" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Atlas Texture" -msgstr "" +msgstr "Υφή άτλαντα" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "" "NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to " "the project." msgstr "" +"ΣΗΜΕΙΩΣΗ: Η εισαγωγή δισδιάστατων υφών δεν είναι υποχÏεωτική. Απλά " +"αντιγÏάψτε τα αÏχεία png/jpg στο ÎÏγο." #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Crop empty space." -msgstr "" +msgstr "ΠεÏικοπή άδειου χώÏου." #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Texture" -msgstr "" +msgstr "Υφή" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Large Texture" -msgstr "" +msgstr "Εισαγωγή μεγάλης υφής" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Load Source Image" -msgstr "" +msgstr "ΦόÏτωση εικόνας Ï€ÏοÎλευσης" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Slicing" -msgstr "" +msgstr "Κατάτμηση" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Inserting" -msgstr "" +msgstr "Εισαγωγή" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Saving" -msgstr "" +msgstr "Αποθήκευση" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Couldn't save large texture:" -msgstr "" +msgstr "Δεν ήταν δυνατή η αποθήκευση μεγάλης υφής:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Build Atlas For:" -msgstr "" +msgstr "Κατασκευή άτλαντα για:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Loading Image:" -msgstr "" +msgstr "ΦόÏτωση εικόνας:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Couldn't load image:" -msgstr "" +msgstr "Δεν ήταν δυνατή η φόÏτωση της εικόνας:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Converting Images" -msgstr "" +msgstr "ΜετατÏοπή Εικόνων" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Cropping Images" -msgstr "" +msgstr "ΠεÏικοπή Εικόνων" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Blitting Images" -msgstr "" +msgstr "Συνδυασμός εικόνων" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Couldn't save atlas image:" -msgstr "" +msgstr "Δεν ήταν δυνατή η αποθήκευση εικόνας άτλαντα:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Couldn't save converted texture:" -msgstr "" +msgstr "Δεν ήταν δυνατή η αποθήκευση υφής που Îχει μετατÏαπεί:" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Invalid source!" -msgstr "" +msgstr "Μη ÎγκυÏη πηγή!" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Invalid translation source!" -msgstr "" +msgstr "Μη ÎγκυÏη πηγή μετάφÏασης!" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Column" -msgstr "" +msgstr "Στήλη" #: editor/io_plugins/editor_translation_import_plugin.cpp #: editor/script_create_dialog.cpp msgid "Language" -msgstr "" +msgstr "Γλώσσα" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "No items to import!" -msgstr "" +msgstr "Δεν υπάÏχουν στοιχεία για εισαγωγή!" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "No target path!" -msgstr "" +msgstr "Καμία διαδÏομή Ï€ÏοοÏισμοÏ!" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Translations" -msgstr "" +msgstr "Εισαγωγή μεταφÏάσεων" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Couldn't import!" -msgstr "" +msgstr "Δεν ήταν δυνατή η εισαγωγή!" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Translation" -msgstr "" +msgstr "Εισαγωγή μετάφÏασης" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Source CSV:" -msgstr "" +msgstr "CSV Ï€ÏοÎλευσης:" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Ignore First Row" -msgstr "" +msgstr "Αγνόησε την Ï€Ïώτη γÏαμμή" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Compress" -msgstr "" +msgstr "Συμπίεση" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" -msgstr "" +#, fuzzy +msgid "Add to Project (project.godot)" +msgstr "Î Ïόσθεσε στο ÎÏγο (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" -msgstr "" +msgstr "Εισαγωγή γλωσσών:" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Translation" -msgstr "" +msgstr "ΜετάφÏαση" #: editor/multi_node_edit.cpp msgid "MultiNode Set" -msgstr "" +msgstr "Σετ πολλαπλών κόμβων" #: editor/node_dock.cpp msgid "Groups" -msgstr "" +msgstr "Ομάδες" #: editor/node_dock.cpp msgid "Select a Node to edit Signals and Groups." -msgstr "" +msgstr "ΕπιλÎξτε Îνα κόμβο για να επεξεÏγαστείτε τα σήματα και τις ομάδες." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Toggle Autoplay" -msgstr "" +msgstr "Εναλλαγή αυτόματης αναπαÏαγωγής" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Animation Name:" -msgstr "" +msgstr "Όνομα νÎας κίνησης:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "New Anim" -msgstr "" +msgstr "ÎÎα κίνηση" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Animation Name:" -msgstr "" +msgstr "Αλλαγή ονόματος κίνησης:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Βελτιστοποίηση animation" +msgstr "ΔιαγÏαφή κίνησης;" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Remove Animation" -msgstr "" +msgstr "ΚατάÏγηση κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Invalid animation name!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Μη ÎγκυÏο όνομα κίνησης!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: Animation name already exists!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Αυτό το όνομα κίνησης υπάÏχει ήδη!" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Rename Animation" -msgstr "" +msgstr "Μετονομασία κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Animation" -msgstr "" +msgstr "Î Ïοσθήκη κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Next Changed" -msgstr "" +msgstr "Το επόμενο στην μείξη κίνησης άλλαξε" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Change Blend Time" -msgstr "" +msgstr "Αλλαγή χÏόνου ανάμειξης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load Animation" -msgstr "" +msgstr "ΦόÏτωση κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Duplicate Animation" -msgstr "" +msgstr "ΑναπαÏαγωγή κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to copy!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει κίνηση για αντÏιγÏαφή!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει πόÏος κίνησης στο Ï€ÏόχειÏο!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" -msgstr "" +msgstr "ΕπικολλημÎνη κίνηση" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Paste Animation" -msgstr "" +msgstr "Επικόλληση κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation to edit!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Δεν υπάÏχει κίνηση για επεξεÏγασία!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from current pos. (A)" -msgstr "" +msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης ανάποδα από την Ï„ÏÎχουσα θÎση. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης ανάποδα από το Ï„Îλος. (Shift + A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" -msgstr "" +msgstr "Πάυση αναπαÏγωγής κίνησης. (S)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from start. (Shift+D)" -msgstr "" +msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης από την αÏχή. (Shift + D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation from current pos. (D)" -msgstr "" +msgstr "ΑναπαÏαγωγή της επιλεγμÎνης κίνησης από την Ï„ÏÎχουσα θÎση. (D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation position (in seconds)." -msgstr "" +msgstr "ΘÎση κίνησης (σε δευτεÏόλεπτα)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "" +msgstr "Κλιμάκωση αναπαÏαγωγής κίνησης παγκοσμίως για τον κόμβο." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." -msgstr "" +msgstr "ΔημιουÏγία νÎας κίνησης στον αναπαÏαγωγÎα." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." -msgstr "" +msgstr "ΦόÏτωση κίνησης από τον δίσκο." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load an animation from disk." -msgstr "" +msgstr "ΦόÏτωση μίας κίνησης από τον δίσκο." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save the current animation" -msgstr "" +msgstr "Αποθήκεση της Ï„ÏÎχουσας κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Display list of animations in player." -msgstr "" +msgstr "Εμφάνιση λίστας κινήσεων στον αναπαÏαγωγÎα." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Autoplay on Load" -msgstr "" +msgstr "Αυτόματη αναπαÏαγωγή" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Target Blend Times" -msgstr "" +msgstr "ΕπεξεÏγασία χÏόνων ανάμειξης κινήσεων" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" -msgstr "" +msgstr "ΕÏγαλεία κινήσεων" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Copy Animation" -msgstr "" +msgstr "ΑνιγÏαφή κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create New Animation" -msgstr "" +msgstr "ΔημιουÏγία νÎας κίνησης" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Name:" -msgstr "" +msgstr "Όνομα κίνησης:" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/resource_preloader_editor_plugin.cpp @@ -3071,305 +3142,308 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp #: editor/script_create_dialog.cpp msgid "Error!" -msgstr "" +msgstr "Σφάλμα!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Blend Times:" -msgstr "" +msgstr "ΧÏόνοι ανάμειξης:" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "Επόμενο (Αυτόματη σειÏά):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" -msgstr "" +msgstr "ΧÏόνοι ανάμειξης κινήσεων" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Animation" -msgstr "" +msgstr "Κίνηση" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "New name:" -msgstr "" +msgstr "ÎÎο όνομα:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "Κλιμάκωση:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" -msgstr "" +msgstr "Εμφάνιση σε (δευτεÏόλεπτα):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade Out (s):" -msgstr "" +msgstr "ΑπόκÏυψη σε (δευτεÏόλεπτα):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "Ανάμειξη" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix" -msgstr "" +msgstr "Μείξη" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Auto Restart:" -msgstr "" +msgstr "Αυτόματη επανεκκίνηση:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Restart (s):" -msgstr "" +msgstr "Επανεκκίνηση (δευτεÏόλεπτα):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "" +msgstr "Τυχαία επανεκκίνηση (δευτεÏόλεπτα):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" -msgstr "" +msgstr "Εκκινιση!" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "Ποσότητα:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "Ανάμειξη:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 0:" -msgstr "" +msgstr "Ανάμειξη 0:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 1:" -msgstr "" +msgstr "Ανάμειξη 1:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "" +msgstr "ΧÏόνος ÏƒÏ…Î½Î´Î¹Î±ÏƒÎ¼Î¿Ï (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" -msgstr "" +msgstr "ΤÏÎχων:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Add Input" -msgstr "" +msgstr "Î Ïοσθήκη εισόδου" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Clear Auto-Advance" -msgstr "" +msgstr "ΕκκαθάÏιση αυτόματης Ï€ÏοÎλασης" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Set Auto-Advance" -msgstr "" +msgstr "ΟÏισμός αυτόματης Ï€ÏοÎλασης" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Delete Input" -msgstr "" +msgstr "ΔιαγÏαφή εισόδου" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Rename" -msgstr "" +msgstr "Μετονομασία" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "" +msgstr "Το δÎντÏο κίνησης είναι ÎγκυÏο." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "" +msgstr "Το δÎντÏο κίνησης δεν είναι ÎγκυÏο." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "Κόμβος κίνησης" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "Κόμβος OneShot" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "Κόμβος μείξης" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "Κόμβος Ανάμειξης 2" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "Κόμβος Ανάμειξης 3" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "Κόμβος Ανάμειξης 4" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "Κόμβος κλιμάκωσης χÏόνου" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "Κόμβος εÏÏεσης χÏόνου" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" -msgstr "" +msgstr "Κόμβος μετάβασης" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Import Animations.." -msgstr "" +msgstr "Εισαγωγή κινήσεων.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "ΕπεξεÏγασία φίλτÏων κόμβων" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." -msgstr "" +msgstr "ΦίλτÏα.." #: editor/plugins/baked_light_baker.cpp msgid "Parsing %d Triangles:" -msgstr "" +msgstr "Ανάλυση %d ΤÏιγώνων:" #: editor/plugins/baked_light_baker.cpp msgid "Triangle #" -msgstr "" +msgstr "ΤÏίγωνο #" #: editor/plugins/baked_light_baker.cpp msgid "Light Baker Setup:" -msgstr "" +msgstr "ΡÏθμιση Ï€ÏοεπεγεÏγαστή φωτός:" #: editor/plugins/baked_light_baker.cpp msgid "Parsing Geometry" -msgstr "" +msgstr "Ανάλυση γεωμετÏίας" #: editor/plugins/baked_light_baker.cpp msgid "Fixing Lights" -msgstr "" +msgstr "ΔιόÏθωση φώτων" #: editor/plugins/baked_light_baker.cpp msgid "Making BVH" -msgstr "" +msgstr "ΔημιουÏγία BVH" #: editor/plugins/baked_light_baker.cpp msgid "Creating Light Octree" -msgstr "" +msgstr "ΔημιουÏγία Î¿ÎºÏ„Î±Î´Î¹ÎºÎ¿Ï Î´ÎντÏου φωτός" #: editor/plugins/baked_light_baker.cpp msgid "Creating Octree Texture" -msgstr "" +msgstr "ΔημιουÏγία υφής Î¿ÎºÏ„Î±Î´Î¹ÎºÎ¿Ï Î´ÎντÏου" #: editor/plugins/baked_light_baker.cpp msgid "Transfer to Lightmaps:" -msgstr "" +msgstr "ΜεταφοÏά στους χάÏτες φωτός:" #: editor/plugins/baked_light_baker.cpp msgid "Allocating Texture #" -msgstr "" +msgstr "ΔÎσμευση υφής #" #: editor/plugins/baked_light_baker.cpp msgid "Baking Triangle #" -msgstr "" +msgstr "Î ÏοεπεξεÏγασία Ï„Ïιγώνου #" #: editor/plugins/baked_light_baker.cpp msgid "Post-Processing Texture #" -msgstr "" +msgstr "ΜετεπεξεÏγασία υφής #" #: editor/plugins/baked_light_editor_plugin.cpp msgid "Bake!" -msgstr "" +msgstr "Î ÏοεπεξεÏγάσου!" #: editor/plugins/baked_light_editor_plugin.cpp msgid "Reset the lightmap octree baking process (start over)." msgstr "" +"ΕπαναφοÏά της Ï€ÏοεπεξεÏγασίας του Î¿ÎºÏ„Î±Î´Î¹ÎºÎ¿Ï Î´ÎντÏου του χάÏτη φωτός " +"(Εκκίνηση από την αÏχή)." #: editor/plugins/camera_editor_plugin.cpp #: editor/plugins/sample_library_editor_plugin.cpp msgid "Preview" -msgstr "" +msgstr "Î Ïοεπισκόπηση" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "" +msgstr "Î ÏοσαÏμογή Ï€Ïοσκόλλησης" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Offset:" -msgstr "" +msgstr "Μετατόπιση πλÎγατος:" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid Step:" -msgstr "" +msgstr "Βήμα πλÎγματος:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Offset:" -msgstr "" +msgstr "Μετατόπιση πεÏιστÏοφής:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotation Step:" -msgstr "" +msgstr "Βήμα πεÏιστÏοφής:" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Pivot" -msgstr "" +msgstr "Μετακίνηση πηγαίου σημείου" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Action" -msgstr "" +msgstr "ΕνÎÏγεια μετακίνησης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit IK Chain" -msgstr "" +msgstr "ΕπεξεÏγασία Αλυσίδας IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Edit CanvasItem" -msgstr "" +msgstr "ΕπεξεÏγασία στοιχείου κανβά" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "" +msgstr "Αλλαγή αγκυÏών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom (%):" -msgstr "" +msgstr "ΜεγÎθυνση (%):" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Paste Pose" -msgstr "" +msgstr "Επικόληση στάσης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "" +msgstr "Επιλογή λειτουÏγίας" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" -msgstr "" +msgstr "ΣÏÏσιμο: ΠεÏιστÏοφή" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Move" -msgstr "" +msgstr "Alt + ΣÏÏσιμο: Μετακίνηση" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "" +"Πατήστε 'v' για να αλλάξετε το πηγαίο σημείο, ή 'Shift+v' για το να σÏÏετε." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+RMB: Depth list selection" -msgstr "" +msgstr "Alt+Δεξί κλικ: Επιλογή λίστας βάθους" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move Mode" -msgstr "" +msgstr "ΛειτουÏγία μετακίνησης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Rotate Mode" -msgstr "" +msgstr "ΛειτουÏγία πεÏιστÏοφής" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -3377,30 +3451,33 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" +"Εμφάνιση λίστας όλων των αντικειμÎνων στην θÎση που κάνετε κλικ\n" +"(Το ίδιο με Alt+Δεξί κλικ στην λειτουÏγία επιλογής)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." msgstr "" +"Κάντε κλικ για να αλλάξετε το πηγαίο σημείο πεÏιστÏοφής του αντικειμÎνου." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Pan Mode" -msgstr "" +msgstr "ΛειτουÏγία Μετακίνησης κάμεÏας" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Lock the selected object in place (can't be moved)." -msgstr "" +msgstr "Κλείδωμα του επιλεγμÎνου αντικείμÎνου (Δεν μποÏεί να μετακινηθεί)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Unlock the selected object (can be moved)." -msgstr "" +msgstr "Ξεκλείδωμα του επιλεγμÎνου αντικείμÎνου (ΜποÏεί να μετακινηθεί)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Makes sure the object's children are not selectable." -msgstr "" +msgstr "ΣιγουÏεÏεται ότι τα παιδιά του αντικειμÎνου δεν μποÏοÏν να επιλεχθοÏν." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Restores the object's children's ability to be selected." -msgstr "" +msgstr "ΕπαναφÎÏει την δυνατότητα των παιδιών του αντικειμÎνου να επιλεγοÏν." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -3413,145 +3490,146 @@ msgstr "ΕπεξεÏγασία" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Use Snap" -msgstr "" +msgstr "ΧÏήση κουμπώματος" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "" +msgstr "Εμφάνιση πλÎγματος" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" -msgstr "" +msgstr "ΧÏήση κουμπώματος πεÏιστÏοφής" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "" +msgstr "Σχετικό κοÏμπωμα" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Configure Snap.." -msgstr "" +msgstr "ΔιαμόÏφωση κουμπώματος.." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "" +msgstr "ΧÏήση κουμπώματος εικονοστοιχείου" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Expand to Parent" -msgstr "" +msgstr "Επικάλυψη γονÎα" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton.." -msgstr "" +msgstr "Σκελετός.." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make Bones" -msgstr "" +msgstr "ΔημιουÏγία οστών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Bones" -msgstr "" +msgstr "ΕκκαθάÏιση οστών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show Bones" -msgstr "" +msgstr "Εμφάνιση οστών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Make IK Chain" -msgstr "" +msgstr "ΔημιουÏγία αλυσίδας IK" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear IK Chain" -msgstr "" +msgstr "ΕκκαθάÏιση αλυσίδας IK" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "View" -msgstr "" +msgstr "ΚάμεÏα" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom Reset" -msgstr "" +msgstr "ΕπαναφοÏά μεγÎθυνσης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom Set.." -msgstr "" +msgstr "ΟÏισμός μεγÎθυνσης.." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Center Selection" -msgstr "" +msgstr "ΚεντÏάÏισμα επιλογής" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Frame Selection" -msgstr "" +msgstr "Πλαισίωμα επιλογής" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Anchor" -msgstr "" +msgstr "ΆγκυÏα" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Keys" -msgstr "" +msgstr "Εισαγωγή κλειδιών" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "" +msgstr "Εισαγωγή κλειδιοÏ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key (Existing Tracks)" -msgstr "" +msgstr "Εισαγωγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï (ΥπαÏκτά κομμάτια)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Copy Pose" -msgstr "" +msgstr "ΑντιγÏαφή στάσης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Clear Pose" -msgstr "" +msgstr "ΕκκαθάÏιση στάσης" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Set a Value" -msgstr "" +msgstr "ΟÏισμός τιμής" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap (Pixels):" -msgstr "" +msgstr "ΚοÏμπωμα (Εικονοστοιχεία):" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Add %s" -msgstr "" +msgstr "Î Ïόσθεσε %s" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "Î Ïοσθήκη %s..." #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" -msgstr "" +msgstr "ΔημιουÏγία κόμβου" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "" +msgstr "Σφάλμα κατά την αÏχικοποίηση σκηνής από %s" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "OK :(" -msgstr "" +msgstr "Εντάξει :(" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "No parent to instance a child at." msgstr "" +"Δεν υπάÏχει γονÎας στον οποίο μποÏεί να γίνει αÏχικοποίηση του παιδιοÏ." #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "" +msgstr "Αυτή η λειτουÏγία απαιτεί Îναν μόνο επιλεγμÎνο κόμβο." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change default type" -msgstr "" +msgstr "Αλλαγή Ï€ÏοεπιλεγμÎνου Ï„Ïπου" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Εντάξει" @@ -3560,13 +3638,15 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" +"ΣÏÏσιμο & απόθεση + Shift: Î Ïοσθήκη του κόμβου ως αδελφό\n" +"ΣÏÏσιμο & απόθεση + Alt: Αλλαγή του Ï„Ïπου του κόμβου" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Poly" -msgstr "" +msgstr "Δημιουγία πολυγώνου" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -3575,7 +3655,7 @@ msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Edit Poly" -msgstr "" +msgstr "ΕπεγεÏγασία πολυγώνου" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/collision_polygon_editor_plugin.cpp @@ -3584,581 +3664,643 @@ msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Edit Poly (Remove Point)" -msgstr "" +msgstr "ΕπεγεÏγασία πολυγώνου (ΑφαίÏεση σημείου)" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create a new polygon from scratch." -msgstr "" +msgstr "ΔημιουÏγία νÎου πολυγώνου από την αÏχή." #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Poly3D" -msgstr "" +msgstr "ΔημιουÏγία πολυγώνου 3D" #: editor/plugins/collision_shape_2d_editor_plugin.cpp msgid "Set Handle" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" +msgstr "ΟÏισμός λαβής" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" -msgstr "" +msgstr "ΔημιουÏγία βιβλιοθήκης πλεγμάτων" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Thumbnail.." -msgstr "" +msgstr "ΜικÏογÏαφία.." #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove item %d?" -msgstr "" +msgstr "ΑφαίÏεση του στοιχείου %d?" #: editor/plugins/cube_grid_theme_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Item" -msgstr "" +msgstr "Î Ïοσθήκη στοιχείου" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Remove Selected Item" -msgstr "" +msgstr "ΑφαίÏεση του επιλεγμÎνου στοιοχείου" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import from Scene" -msgstr "" +msgstr "Εισαγωγή από την σκηνή" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Update from Scene" -msgstr "" +msgstr "ΑναπÏοσαÏμογή από την σκηνή" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Î Ïοσθήκη εισόδου" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "ΑφαίÏεση σημείου διαδÏομής" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "ΦόÏτωση πόÏου" #: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" -msgstr "" +msgstr "ΤÏοποπίηση καμπÏλης" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Î Ïοσθήκη αφαίÏεση σημείου διαβάθμισης χÏωμάτων" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "ΕπεξεÏγασία διαβάθμισης χÏωμάτων" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" -msgstr "" +msgstr "Στοιχείο %d" #: editor/plugins/item_list_editor_plugin.cpp msgid "Items" -msgstr "" +msgstr "Στοιχεία" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item List Editor" -msgstr "" +msgstr "ΕπεξεÏγαστής λίστας στοιχείων" #: editor/plugins/light_occluder_2d_editor_plugin.cpp msgid "Create Occluder Polygon" -msgstr "" +msgstr "ΔημιουÏγία πολυγώνου εμποδίου" #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Edit existing polygon:" -msgstr "" +msgstr "ΕπεξεÏγασία υπαÏÎºÏ„Î¿Ï Ï€Î¿Î»Ï…Î³ÏŽÎ½Î¿Ï…:" #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "LMB: Move Point." -msgstr "" +msgstr "ΑÏιστεÏÏŒ κλίκ: ΜΕτακίνηση σημείου." #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Ctrl+LMB: Split Segment." -msgstr "" +msgstr "Ctrl+ΑÏιστεÏÏŒ κλικ: ΔιαχωÏσμός τμήματος." #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "RMB: Erase Point." -msgstr "" +msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου." #: editor/plugins/line_2d_editor_plugin.cpp msgid "Remove Point from Line2D" -msgstr "" +msgstr "ΔιαγÏαφή σημείου από την δισδιάστατη γÏαμμή" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" -msgstr "Πήγαινε στη γÏαμμή" +msgstr "Î Ïόσθεσε σημείο στην δισδυάστατη γÏαμμή" #: editor/plugins/line_2d_editor_plugin.cpp msgid "Move Point in Line2D" -msgstr "" +msgstr "Μετακίινηση σημείου στην δισδιάστατη γÏαμμή" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Select Points" -msgstr "" +msgstr "Επιλογή σημείων" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Shift+Drag: Select Control Points" -msgstr "" +msgstr "Shift + ΣÏÏσιμο: Επιλογή σημείψν ελÎγχου" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Click: Add Point" -msgstr "" +msgstr "Κλικ: Î Ïοσθήκη σημείου" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Right Click: Delete Point" -msgstr "" +msgstr "Δεξί κλικ: ΔιαγÏαφή σημείου" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point (in empty space)" -msgstr "" +msgstr "Î Ïοσθήκη σημείου (σε άδειο χώÏο)" #: editor/plugins/line_2d_editor_plugin.cpp msgid "Split Segment (in line)" -msgstr "" +msgstr "ΔιαχωÏισμός τμήματος (στη γÏαμμή)" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Delete Point" -msgstr "" +msgstr "ΔιαγÏαφή σημείου" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "Το πλÎγμα είναι άδειο!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" -msgstr "" +msgstr "ΔημιουÏγία ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï ÏƒÏŽÎ¼Î±Ï„Î¿Ï‚ πλÎγματος Ï„Ïιγώνων" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Convex Body" -msgstr "" +msgstr "ΔημιουÏγία ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï ÎºÏ…ÏÏ„Î¿Ï ÏƒÏŽÎ¼Î±Ï„Î¿Ï‚" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "" +msgstr "Αυτό δεν δουλεÏει στη Ïίζα της σκηνής!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Shape" -msgstr "" +msgstr "ΔημιουÏγία σχήματος πλÎγματος Ï„Ïιγώνων" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Shape" -msgstr "" +msgstr "ΔημιουÏγία κυÏÏ„Î¿Ï ÏƒÏ‡Î®Î¼Î±Ï„Î¿Ï‚" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Navigation Mesh" -msgstr "" +msgstr "ΔημιουÏγία πλÎγματος πλοήγησης" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "MeshInstance lacks a Mesh!" -msgstr "" +msgstr "Το στιγμιότυπο πλÎγματος δεν Îχει πλÎγμα!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh has not surface to create outlines from!" -msgstr "" +msgstr "Το πλÎγμα δεν Îχει επιφάνει από την οποία να δημιουÏγήσει πεÏιγÏάματα!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Could not create outline!" -msgstr "" +msgstr "Δεν ήταν δυνατή η δημιουÏγία πεÏιγÏάμματος!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline" -msgstr "" +msgstr "ΔημιουÏγία πεÏιγÏάμματος" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Static Body" -msgstr "" +msgstr "ΔημιουÏγία ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï ÏƒÏŽÎ¼Î±Ï„Î¿Ï‚ πλÎγματος Ï„Ïιγώνων" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Static Body" -msgstr "" +msgstr "ΔημιουÏγία ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï ÎºÏ…ÏÏ„Î¿Ï ÏƒÏŽÎ¼Î±Ï„Î¿Ï‚" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Collision Sibling" -msgstr "" +msgstr "ΔημιουÏγία Î±Î´ÎµÎ»Ï†Î¿Ï ÏƒÏγκÏουσης πλÎγατος Ï„Ïιγώνων" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Convex Collision Sibling" -msgstr "" +msgstr "ΔημιουÏγία Î±Î´ÎµÎ»Ï†Î¿Ï ÏƒÏγκÏουσης κυÏÏ„Î¿Ï ÏƒÏŽÎ¼Î±Ï„Î¿Ï‚" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh.." -msgstr "" +msgstr "ΔημιουÏγία πλÎγματος πεÏιγÏάμματος.." #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Outline Mesh" -msgstr "" +msgstr "ΔημιουÏγία πλÎγματος πεÏιγÏάμματος" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Outline Size:" -msgstr "" +msgstr "ΜÎγεθος πεÏιγÏάμματος:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." -msgstr "" +msgstr "Δεν οÏίστικε πηγαίο πλÎγμα (οÏτε πολλαπλό πλÎγμα στον κόμβο)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and MultiMesh contains no Mesh)." msgstr "" +"Δεν οÏίστικε πηγαίο πλÎγμα (και το πολλαπλό πλÎγμα δεν πεÏιÎχει κανÎνα " +"πλÎγμα)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (invalid path)." -msgstr "" +msgstr "Το πηγαίο πλÎγμα δεν είναι ÎγκυÏο (Μη ÎγκυÏη διαδÏομή)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (not a MeshInstance)." -msgstr "" +msgstr "Το πηγαίο πλÎγμα δεν είναι ÎγκυÏο (Δεν είναι στιγμιότυπο πλÎγματος)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh source is invalid (contains no Mesh resource)." -msgstr "" +msgstr "Το πηγαίο πλÎγμα δεν είναι ÎγκυÏο (Δεν πεÏιÎχει πόÏο πλÎγματος)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "No surface source specified." -msgstr "" +msgstr "Δεν οÏίστηκε πηγαία επιφάνεια." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (invalid path)." -msgstr "" +msgstr "Η πηγαία επιφάνεια δεν είναι ÎγκυÏη (Μη ÎγκυÏη διαδÏομή)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no geometry)." -msgstr "" +msgstr "Η πηγαία επιφάνεια δεν είναι ÎγκυÏη (Δεν υπάÏχει γεωμετÏία)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Surface source is invalid (no faces)." -msgstr "" +msgstr "Η πηγαία επιφάνεια δεν είναι ÎγκυÏη (Δεν υπάÏχουν επιφάνειες)." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Parent has no solid faces to populate." -msgstr "" +msgstr "Ο γονÎας δεν Îχει συμπαγείς επιφάνειες για να συμπληÏωθοÏν." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Couldn't map area." -msgstr "" +msgstr "Δεν ήταν δυνατή η χαÏτογÏάφηση της πεÏιοχής." #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Source Mesh:" -msgstr "" +msgstr "ΈπιλÎξτε Îνα πηγαίο πλÎγμα:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Select a Target Surface:" -msgstr "" +msgstr "ΕπιλÎξτε την στοχευμÎνη επιφάνεια:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate Surface" -msgstr "" +msgstr "ΣυμπλήÏωση επιφάνειας" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate MultiMesh" -msgstr "" +msgstr "ΣυμπλήÏωση Ï€Î¿Î»Î»Î±Ï€Î»Î¿Ï Ï€Î»Îγματος" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Target Surface:" -msgstr "" +msgstr "ΣτοχευμÎνη επιφάνεια:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Source Mesh:" -msgstr "" +msgstr "Πηγαίο πλÎγμα:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "X-Axis" -msgstr "" +msgstr "Χ άξονας" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Y-Axis" -msgstr "" +msgstr "Î¥ άξονας" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Z-Axis" -msgstr "" +msgstr "Ζ άξονας" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Mesh Up Axis:" -msgstr "" +msgstr "Πάνω άξονας πλÎγματος:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" -msgstr "" +msgstr "Τυχαία πεÏιστÏοφή:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Tilt:" -msgstr "" +msgstr "Τυχαία κλίση:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "" +msgstr "Τυχαία κλιμάκωση:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" -msgstr "" +msgstr "ΣυμπλήÏωση" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create Navigation Polygon" -msgstr "" +msgstr "ΔημιουÏγία πολυγώνου πλοήγησης" #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Remove Poly And Point" +msgstr "ΑφαίÏεση πολυγώνου και σημείου" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ΕκκαθάÏιση μάσκας εκπομπής" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "ΔημιουÏία AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" -msgstr "" +msgstr "Σφάλμα κατά την φόÏτωση εικόνας:" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "No pixels with transparency > 128 in image.." -msgstr "" +msgstr "Δεν υπάÏχουν εικονοστοιχεία με διαφάνεια >128 στην εικόνα.." #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Set Emission Mask" -msgstr "" +msgstr "ΟÏισμός μάσκας εκπομπής" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" -msgstr "" +msgstr "ΦόÏτωση μάσκας εκπομπής" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" -msgstr "" +msgstr "ΑÏιθμός δημιουÏγημÎνων σημείων:" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "ΜÎσος ΧÏόνος (sec)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "ΟÏισμός μάσκας εκπομπής" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "ΔημιουÏγία από σκηνή" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Σημεία εκπομπής:" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "" +msgstr "Ο κόμβος δεν πεÏιÎχει γεωμετÏία." #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." -msgstr "" +msgstr "Ο κόμβος δεν πεÏιÎχει γεωμετÏία (Επιφάνειες)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" -msgstr "" +msgstr "Απαιτείται Îνα υλικό επεξεÏγασίας Ï„Ïπου 'ParticlesMaterial'." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" -msgstr "" +msgstr "Οι επιφάνειες Îχουν μηδενικό εμβαδόν!" #: editor/plugins/particles_editor_plugin.cpp msgid "No faces!" -msgstr "" +msgstr "Δεν υπάÏχουν επιφάνειες!" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" -msgstr "" +msgstr "ΔημιουÏία AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "ΔημιουÏγία σημείων εκπομπής από πλÎγμα" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "ΔημιουÏγία σημείων εκπομπής από κόμβο" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" -msgstr "" +msgstr "ΕκκαθάÏιση πομποÏ" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emitter" -msgstr "" +msgstr "ΔημιουÏγία πομποÏ" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "Σημεία εκπομπής:" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points" -msgstr "" +msgstr "Σημεία επιφάνειας" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Σημεία επιφάνειας + Κανονικό δίανυσμα (Κατευθηνόμενο)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" -msgstr "" +msgstr "Ένταση" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "Πηγή εκπομπής: " #: editor/plugins/particles_editor_plugin.cpp +#, fuzzy msgid "Generate Visibility AABB" -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" -msgstr "" +msgstr "ΔημιουÏία AABB" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Remove Point from Curve" -msgstr "" +msgstr "ΑφαίÏεση σημείου από την καμπÏλη" + +#: editor/plugins/path_2d_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control from Curve" +msgstr "Μετακίνηση ελεγκτή εξόδου στην καμπÏλη" + +#: editor/plugins/path_2d_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control from Curve" +msgstr "ΑφαίÏεση σημείου από την καμπÏλη" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" -msgstr "" +msgstr "Î Ïοσθήκη σημείου στην καμπÏλη" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "" +msgstr "Μετακίνηση σημείου στην καμπÏλη" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" -msgstr "" +msgstr "Μετακίνηση ελεγκτή εισόδου στην καμπÏλη" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Out-Control in Curve" -msgstr "" +msgstr "Μετακίνηση ελεγκτή εξόδου στην καμπÏλη" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Select Control Points (Shift+Drag)" -msgstr "" +msgstr "Επλογή σημείων ελÎγχου (Shift + ΣÏÏσιμο)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Split Segment (in curve)" -msgstr "" +msgstr "ΔιαχωÏισμός τμήματος (στην καμπÏλη)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Close Curve" -msgstr "" +msgstr "κλείσιμο καμπÏλης" #: editor/plugins/path_editor_plugin.cpp msgid "Curve Point #" -msgstr "" +msgstr "Σημείο καμπÏλης #" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Point Pos" -msgstr "" +msgstr "ΟÏισμός θÎσης σημείου καμπÏλης" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve In Pos" -msgstr "" +msgstr "ΟÏισμός θÎσης εισόδου καμπÏλης" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Out Pos" -msgstr "" +msgstr "ΟÏισμός θÎσης εξόδου καμπÏλης" #: editor/plugins/path_editor_plugin.cpp msgid "Split Path" -msgstr "" +msgstr "ΔιαχωÏισμός διαδÏομής" #: editor/plugins/path_editor_plugin.cpp msgid "Remove Path Point" -msgstr "" +msgstr "ΑφαίÏεση σημείου διαδÏομής" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Μετακίνηση ελεγκτή εξόδου στην καμπÏλη" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Μετακίνηση ελεγκτή εισόδου στην καμπÏλη" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" -msgstr "" +msgstr "ΔημιουÏγία χάÏτη UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Transform UV Map" -msgstr "" +msgstr "Μετασχηματισμός χάÏτη UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon 2D UV Editor" -msgstr "" +msgstr "ΕπεξεÏγαστής δισδιάστατου πολυγώνου" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Point" -msgstr "" +msgstr "Μετακίνηση σημείου" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Ctrl: Rotate" -msgstr "" +msgstr "Ctrl: ΠεÏιστÏοφή" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift: Move All" -msgstr "" +msgstr "Shift: Μετακίνηση όλων" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Shift+Ctrl: Scale" -msgstr "" +msgstr "Shift + Ctrl: Κλιμάκωση" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Move Polygon" -msgstr "" +msgstr "Μετακίνηση πολυγώνου" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Rotate Polygon" -msgstr "" +msgstr "ΠεÏιστÏοφή πολυγώνου" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "" +msgstr "Κλιμάκωση πολυγώνου" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Polygon->UV" -msgstr "" +msgstr "ΠολÏγωνο -> UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "UV->Polygon" -msgstr "" +msgstr "UV -> ΠολÏγωνο" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Clear UV" -msgstr "" +msgstr "ΕκκαθάÏιση UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "ΚοÏμπωμα" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "ΕνεÏγοποίηση κουμπώματος" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" -msgstr "" +msgstr "ΠλÎγμα" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" -msgstr "" +msgstr "Σφάλμα: Δεν ήταν δυνατή η φόÏτωση πόÏου!" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Add Resource" -msgstr "" +msgstr "Î Ïοσθήκη πόÏου" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Rename Resource" -msgstr "" +msgstr "Μετονομασία πόÏου" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Delete Resource" -msgstr "" +msgstr "ΔιαγÏαφή πόÏου" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Resource clipboard is empty!" -msgstr "" +msgstr "Το Ï€ÏόχειÏο πόÏων είναι άδειο!" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Load Resource" -msgstr "" +msgstr "ΦόÏτωση πόÏου" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp @@ -4170,243 +4312,257 @@ msgstr "Επικόληση" #: editor/plugins/rich_text_editor_plugin.cpp msgid "Parse BBCode" -msgstr "" +msgstr "Ανάλυση BBCode" #: editor/plugins/sample_editor_plugin.cpp msgid "Length:" -msgstr "" +msgstr "Μήκος:" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Open Sample File(s)" -msgstr "" +msgstr "Άνοιγμα αÏχείων δειγμάτων" #: editor/plugins/sample_library_editor_plugin.cpp msgid "ERROR: Couldn't load sample!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Δεν ήταν δυνατή η φόÏτωση δείγματος!" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Add Sample" -msgstr "" +msgstr "Î Ïοσθήκη δείγματος" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Rename Sample" -msgstr "" +msgstr "Μετονομασία δείγματος" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Delete Sample" -msgstr "" +msgstr "ΔιαγÏαφή δείγματος" #: editor/plugins/sample_library_editor_plugin.cpp msgid "16 Bits" -msgstr "" +msgstr "16 Δυαδικά ψηφία" #: editor/plugins/sample_library_editor_plugin.cpp msgid "8 Bits" -msgstr "" +msgstr "8 Δυαδικά ψηφία" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Stereo" -msgstr "" +msgstr "ΣτεÏεοφωνικό" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Mono" -msgstr "" +msgstr "Μονοφωνικό" #: editor/plugins/sample_library_editor_plugin.cpp #: editor/script_editor_debugger.cpp msgid "Format" -msgstr "" +msgstr "ΜοÏφή" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Pitch" -msgstr "" +msgstr "Τόνος" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "ΕκκαθάÏιση οστών" #: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" -msgstr "" +msgstr "Σφάλμα κατά την αποθήκευση θÎματος" #: editor/plugins/script_editor_plugin.cpp msgid "Error saving" -msgstr "" +msgstr "Σφάλμα κατά την αποθήκευση" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing theme" -msgstr "" +msgstr "Σφάλμα κατά την εισαγωγή θÎματος" #: editor/plugins/script_editor_plugin.cpp msgid "Error importing" -msgstr "" +msgstr "Σφάλμα κατά την εισαγωγή" #: editor/plugins/script_editor_plugin.cpp msgid "Import Theme" -msgstr "" +msgstr "Εισαγωγή θÎματος" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As.." -msgstr "" +msgstr "Αποθήκευση θÎματος ως.." #: editor/plugins/script_editor_plugin.cpp msgid "Next script" -msgstr "" +msgstr "Επόμενη δεσμή ενεÏγειών" #: editor/plugins/script_editor_plugin.cpp msgid "Previous script" -msgstr "" +msgstr "Î ÏοηγοÏμενη δεσμή ενεÏγειών" #: editor/plugins/script_editor_plugin.cpp msgid "File" -msgstr "" +msgstr "ΑÏχείο" #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp msgid "New" -msgstr "" +msgstr "ÎÎο" #: editor/plugins/script_editor_plugin.cpp msgid "Save All" -msgstr "" +msgstr "Αποθήκευση όλων" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "" +msgstr "Απλή επαναφόÏτωση δεσμής ενεÏγειών" #: editor/plugins/script_editor_plugin.cpp msgid "History Prev" -msgstr "" +msgstr "ΙστοÏικά Ï€ÏοηγοÏμενο" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" -msgstr "" +msgstr "ΙστοÏικά επόμενο" #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" -msgstr "" +msgstr "ΕπαναφόÏτωση θÎματος" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme" -msgstr "" +msgstr "Αποθήκευση θÎματος" #: editor/plugins/script_editor_plugin.cpp msgid "Save Theme As" -msgstr "" +msgstr "Αποθήκευση θÎματος ως" #: editor/plugins/script_editor_plugin.cpp msgid "Close Docs" -msgstr "" +msgstr "Κλείσιμο τεκμηÏίωσης" #: editor/plugins/script_editor_plugin.cpp msgid "Close All" -msgstr "" +msgstr "Κλείσιμο όλων" #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find.." -msgstr "" +msgstr "ΕÏÏεση.." #: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Next" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" +msgstr "ΕÏÏεση επόμενου" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "Βήμα πάνω" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "Βήμα μÎσα" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" -msgstr "" +msgstr "Διακοπή" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Continue" -msgstr "" +msgstr "ΣυνÎχιση" #: editor/plugins/script_editor_plugin.cpp msgid "Keep Debugger Open" -msgstr "" +msgstr "ΔιατήÏησε τον αποσφαλματωτή ανοιχτό" #: editor/plugins/script_editor_plugin.cpp msgid "Window" -msgstr "" +msgstr "ΠαÏάθυÏο" #: editor/plugins/script_editor_plugin.cpp msgid "Move Left" -msgstr "" +msgstr "Μετκίνιση αÏιστεÏά" #: editor/plugins/script_editor_plugin.cpp msgid "Move Right" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" +msgstr "Μετακίνηση δεξιά" #: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Αναζήτηση στην τεκμηÏίωση αναφοÏάς." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." -msgstr "" +msgstr "Αναζήτηση στην ιεÏαÏχεία κλάσεων." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "Αναζήτηση στην τεκμηÏίωση αναφοÏάς." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." -msgstr "" +msgstr "Πήγαινε στο Ï€ÏοηγοÏμενo ÎγγÏαφο." #: editor/plugins/script_editor_plugin.cpp msgid "Go to next edited document." -msgstr "" +msgstr "Πήγαινε στο επόμενο ÎγγÏαφο." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "ΞεχωÏιστή" +msgstr "ΑπόÏÏιψη" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" -msgstr "" +msgstr "ΔημιουÏγία δεσμής ενεÏγειών" #: editor/plugins/script_editor_plugin.cpp msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" +"Τα ακόλουθα αÏχεία είναι νεότεÏα στον δίσκο.\n" +"Τι δÏάση να ληφθεί;:" #: editor/plugins/script_editor_plugin.cpp msgid "Reload" -msgstr "" +msgstr "ΕπαναφόÏτωση" #: editor/plugins/script_editor_plugin.cpp msgid "Resave" -msgstr "" +msgstr "Επαναποθήκευση" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Debugger" -msgstr "" +msgstr "Αποσφαλματωτής" #: editor/plugins/script_editor_plugin.cpp msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" +"Οι ενσωματομÎνες δεσμÎÏ‚ ενεÏγειών μποÏοÏν να επεξεÏγαστοÏν μόνο όταν η σκηνή " +"στην οποία ανοίκουν είναι φοÏτωμÎνη" #: editor/plugins/script_text_editor.cpp msgid "Pick Color" +msgstr "Επιλογή χÏώματος" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "ΜετατÏοπή Εικόνων" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" msgstr "" #: editor/plugins/script_text_editor.cpp @@ -4429,35 +4585,35 @@ msgstr "Επιλογή όλων" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Up" -msgstr "" +msgstr "Μετακίνηση πάνω" #: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp msgid "Move Down" -msgstr "" +msgstr "Μετακίνηση κάτω" #: editor/plugins/script_text_editor.cpp msgid "Indent Left" -msgstr "" +msgstr "στοιχειοθÎτηση αÏιστεÏά" #: editor/plugins/script_text_editor.cpp msgid "Indent Right" -msgstr "" +msgstr "στοιχειοθÎτηση δεξιά" #: editor/plugins/script_text_editor.cpp msgid "Toggle Comment" -msgstr "" +msgstr "Εναλλαγή σχολιασμοÏ" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "Κλωνοποίηση κάτω" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" -msgstr "" +msgstr "ΣυμπλήÏωση συμβόλου" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" -msgstr "" +msgstr "ΠεÏικοπή ÎºÎ±Ï„Î±Î»Î·ÎºÏ„Î¹ÎºÎ¿Ï ÎºÎµÎ½Î¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" @@ -4469,7 +4625,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "Αυτόματη στοιχειοθÎτηση" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4478,1007 +4634,1088 @@ msgstr "Εναλλαγή σημείου διακοπής" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "" +msgstr "ΑφαίÏεση όλων των σημείων διακοπής" #: editor/plugins/script_text_editor.cpp msgid "Goto Next Breakpoint" -msgstr "" +msgstr "Πήγαινε στο επόμενο σημείο διακοπής" #: editor/plugins/script_text_editor.cpp msgid "Goto Previous Breakpoint" -msgstr "" +msgstr "Πήγαινε στο Ï€ÏοηγοÏμενο σημείο διακοπής" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "ΜετατÏοπή σε..." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "ΜετατÏοπή σε..." #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" -msgstr "" +msgstr "ΈυÏεση Ï€ÏοηγοÏμενου" #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Replace.." -msgstr "" +msgstr "Αντικατάσταση.." #: editor/plugins/script_text_editor.cpp msgid "Goto Function.." -msgstr "" +msgstr "Πήγαινε σε συνάÏτηση.." #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Goto Line.." -msgstr "" +msgstr "Πήγαινε σε γÏαμμή.." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" +msgstr "Βοήθεια ανάλογα με τα συμφÏαζόμενα" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" msgstr "" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" -msgstr "" +msgstr "Αλλαγή μονόμετÏης σταθεÏάς" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Constant" -msgstr "" +msgstr "Αλλαγή διανυσματικής σταθεÏάς" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Constant" -msgstr "" +msgstr "Αλλαγή χÏωματικής σταθεÏάς" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Operator" -msgstr "" +msgstr "Αλλαγή μονόμετÏου τελεστή" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Operator" -msgstr "" +msgstr "Αλλαγή Î´Î¹Î±Î½Ï…ÏƒÎ¼Î±Ï„Î¹ÎºÎ¿Ï Ï„ÎµÎ»ÎµÏƒÏ„Î®" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Scalar Operator" -msgstr "" +msgstr "Αλλαγή Î´Î¹Î±Î½Ï…ÏƒÎ¼Î±Ï„Î¹ÎºÎ¿Ï - μονόμετÏου τελεστή" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Operator" -msgstr "" +msgstr "Αλλαγή χÏÏ‰Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï„ÎµÎ»ÎµÏƒÏ„Î®" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Toggle Rot Only" -msgstr "" +msgstr "Εναλλαγή μόνο πεÏιστÏοφή" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Function" -msgstr "" +msgstr "Αλλαγή μονόμετÏης συνάÏτησης" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Function" -msgstr "" +msgstr "Αλλαγή διανυσματικής συνάÏτησης" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Uniform" -msgstr "" +msgstr "Αλλαγή μονόμετÏης ομοιόμοÏφης μεταβλητής" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Uniform" -msgstr "" +msgstr "Αλλαγή διανυσματικής ομοιόμοÏφης μεταβλητής" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Uniform" -msgstr "" +msgstr "Αλλαγή χÏωματικής ομοιόμοÏφης μεταβλητής" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Default Value" -msgstr "" +msgstr "Αλλαγή Ï€ÏοεπιλλεγμÎνης τιμής" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change XForm Uniform" -msgstr "" +msgstr "Αλλαγή ομοιόμοÏφης μεταβλητής XForm" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Texture Uniform" -msgstr "" +msgstr "Αλλαγή ομοιόμοÏφης μεταβλητής υφής" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Cubemap Uniform" -msgstr "" +msgstr "Αλλαγή ομοιόμοÏφης μεταβλητής χάÏτη κÏβου" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Comment" -msgstr "" +msgstr "Αλλαγή σχολίου" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add/Remove to Color Ramp" -msgstr "" +msgstr "Î Ïοσθήκη/ΑφαίÏεση σε διαβάθμηση χÏώματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add/Remove to Curve Map" -msgstr "" +msgstr "Î Ïοσθήκη/ΑφαίÏεση σε χάÏτη καμπÏλης" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Modify Curve Map" -msgstr "" +msgstr "ΤÏοποποίηση χάÏτη καμπÏλης" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Input Name" -msgstr "" +msgstr "Αλλαγή ονόματος εισόδου" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Connect Graph Nodes" -msgstr "" +msgstr "ΣÏνδεση κόμβων γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Disconnect Graph Nodes" -msgstr "" +msgstr "ΑποσÏνδεση κόμβων γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Remove Shader Graph Node" -msgstr "" +msgstr "ΑφαίÏεση κόμβου γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Move Shader Graph Node" -msgstr "" +msgstr "Μετακίνηση κόμβου γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Duplicate Graph Node(s)" -msgstr "" +msgstr "Διπλασιασμός κόμβων γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Delete Shader Graph Node(s)" -msgstr "" +msgstr "ΔιαγÏαφή κόμβων γÏαφήματος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Error: Cyclic Connection Link" -msgstr "" +msgstr "Σφάλμα: Κυκλικός σÏνδεσμος" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Error: Missing Input Connections" -msgstr "" +msgstr "Σφάλμα: Οι συνδÎσεις εισόδου λείπουν" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Add Shader Graph Node" -msgstr "" +msgstr "Î Ïοσθήκη κόμβου γÏαφήματος" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "ΟÏθογώνια" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "Î Ïοοπτική" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." -msgstr "" +msgstr "Ο μετασχηματισμός ματαιώθηκε." #: editor/plugins/spatial_editor_plugin.cpp msgid "X-Axis Transform." -msgstr "" +msgstr "Μετασχηματισμός στον Χ άξονα." #: editor/plugins/spatial_editor_plugin.cpp msgid "Y-Axis Transform." -msgstr "" +msgstr "Μετασχηματισμός στον Î¥ άξονα." #: editor/plugins/spatial_editor_plugin.cpp msgid "Z-Axis Transform." -msgstr "" +msgstr "Μετασχηματισμός στον Ζ άξονα." #: editor/plugins/spatial_editor_plugin.cpp msgid "View Plane Transform." -msgstr "" +msgstr "Μετασχηματισμός στο επίπεδο θÎασης." #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling to %s%%." -msgstr "" +msgstr "Κλιμάκωση to %s%%." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "ΠεÏιστÏοφή %s μοίÏες." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "Κάτω όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "Κάτω" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "Πάνω όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Πάνω" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "Πίσω όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" -msgstr "" +msgstr "Πίσω" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "ΕμπÏόσθια όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" -msgstr "" +msgstr "ΜπÏοστά" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "ΑÏιστεÏή όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "ΑÏιστεÏά" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "Δεξιά όψη." #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "Δεξιά" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." msgstr "" +"Η δημιουÏγία κλειδιών είναι απενεÏγοποιημÎνη (Δεν Îχει εισαχθεί κλειδί)." #: editor/plugins/spatial_editor_plugin.cpp msgid "Animation Key Inserted." -msgstr "" +msgstr "Το κλειδί κίνησης Îχει εισαχθεί." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with view" +msgid "Freelook Left" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Freelook Right" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "" +#, fuzzy +msgid "Freelook Forward" +msgstr "Πήγαινε μπÏοστά" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +#, fuzzy +msgid "Freelook Backwards" +msgstr "ΑντίστÏοφα" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +#, fuzzy +msgid "Freelook Down" +msgstr "ΡοδÎλα κάτω." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "Objects Drawn" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +#, fuzzy +msgid "Material Changes" +msgstr "ΕνημÎÏωση αλλαγών" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "ΕνημÎÏωση αλλαγών" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "ΕνημÎÏωση αλλαγών" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +#, fuzzy +msgid "Vertices" +msgstr "Ιδιότητες:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "Στοίχηση με την Ï€Ïοβολή" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "Κανονική εμφάνιση" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "Εμφάνιση πεÏιγÏάμματος επιφάνειας" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "Εμφάνιση Ï€ÏÎ¿ÏƒÎ¸ÎµÏ„Î¹ÎºÎ¿Ï ÏƒÏ‡ÎµÎ´Î¹Î±ÏƒÎ¼Î¿Ï" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Display Unshaded" +msgstr "Άσκια εμφάνιση" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "ΠεÏιβάλλον" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "ΜαÏαφÎτια" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "ΑκÏοατής ήχου" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Διάλογος XForm" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" -msgstr "" +msgstr "ΛειτουÏγία μετακίνησης (W)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Mode (E)" -msgstr "" +msgstr "ΛειτουÏγία πεÏιστÏοφής (E)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode (R)" -msgstr "" +msgstr "ΛειτουÏγία κλιμάκωσης (R)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "Κάτω όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "Πάνω όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "Πίσω όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "ΕμπÏόσθια όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "ΑÏιστεÏή όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "Δεξιά όψη" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal view" -msgstr "" +msgstr "Εναλλαγή Î Ïοοπτικής / ΟÏθογώνιας Ï€Ïοβολής" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" -msgstr "" +msgstr "Εισαγωγή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÎºÎ¯Î½Î·ÏƒÎ·Ï‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "Εστίαση στην αÏχή" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "Εστίαση στην επιλογή" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Selection With View" -msgstr "" +msgstr "Στοίχηση επιλογής με την Ï€Ïοβολή" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" +#, fuzzy +msgid "Tool Select" +msgstr "Επιλογή" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" -msgstr "" +#, fuzzy +msgid "Tool Move" +msgstr "Μετακίνηση" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." -msgstr "" +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: ΠεÏιστÏοφή" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "" +#, fuzzy +msgid "Tool Scale" +msgstr "Κλιμάκωση:" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "" +msgid "Transform" +msgstr "Μετασχηματισμός" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "ΤοπικÎÏ‚ συντεταγμÎνες" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "Διάλογος μετασχηματισμοÏ.." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "1 Οπτική γωνία" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "2 ΟπτικÎÏ‚ γωνίες" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "2 ΟπτικÎÏ‚ γωνίες (Εναλλακτικό)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3 ΟπτικÎÏ‚ γωνίες" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3 ΟπτικÎÏ‚ γωνίες (Εναλλακτικό)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "" +msgstr "4 ΟπτικÎÏ‚ γωνίες" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "Î Ïοβολή ΑÏχής" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "Î Ïοβολή πλÎγματος" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Ρυθμίσεις" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "Ρυθμίσεις κουμπώματος" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "ΚοÏμπωμα μετατόπισης:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "ΚοÏμπωμα πεÏιστÏοφής (μοίÏες):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "ΚοÏμπωμα κλιμάκωσης (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" +msgstr "Ρυθμίσεις οπτικής γωνίας" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "ΈυÏος Î¿Ï€Ï„Î¹ÎºÎ¿Ï Ï€ÎµÎ´Î¯Î¿Ï… Ï€Ïοοπτικής (μοίÏες):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" -msgstr "" +msgstr "Κοντινό απόσταση Ï€Ïοβολής:" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Far:" -msgstr "" +msgstr "ΜακÏινή απόσταση Ï€Ïοβολής:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" -msgstr "" +msgstr "Αλλαγή μετασχηματισμοÏ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate:" -msgstr "" +msgstr "Μετατόπιση:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate (deg.):" -msgstr "" +msgstr "ΠεÏιστÏοφή (μοίÏες):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "Κλιμάκωση (αναλογία):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "" +msgstr "Είδος μετασχηματισμοÏ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" -msgstr "" +msgstr "Î Ïιν" #: editor/plugins/spatial_editor_plugin.cpp msgid "Post" -msgstr "" +msgstr "Μετά" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "ΣΦΑΛΜΑ: Δεν ήταν δυνατή η φόÏτωση πόÏου Ï„Ïπου καÏÎ!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Î Ïοσθήκη καÏÎ" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "Το Ï€ÏόχειÏο πόÏων είναι άδειο ή δεν είναι υφή!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "Επικόλληση καÏÎ" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" -msgstr "" +msgstr "Î Ïοσθήκη άδειου" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "Αλλαγή βÏόχου κίνησης" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" -msgstr "" +msgstr "Αλλαγή FPS κίνησης" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "(empty)" -msgstr "" +msgstr "(άδειο)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animations" -msgstr "" +msgstr "Κινήσεις" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed (FPS):" -msgstr "" +msgstr "ΤαχÏτητα (FPS):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames" -msgstr "" +msgstr "ΚαÏΠκίνησης" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" -msgstr "" +msgstr "Εισαγωγή άδειου (Î Ïιν)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (After)" -msgstr "" +msgstr "Εισαγωγή άδειου (Μετά)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Up" -msgstr "" +msgstr "Πάνω" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Down" -msgstr "" +msgstr "Κάτω" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" -msgstr "" +msgstr "Î Ïοεπισκόπηση StyleBox:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "ΛειτουÏγία κουμπώματος:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "<None>" -msgstr "" +msgstr "<Τίποτα>" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "ΚοÏμπωμα στα εικονοστοιχεία" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "ΚοÏμπωμα στο πλÎγμα" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "Αυτόματο κόψιμο" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "Μετατόπιση:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" -msgstr "" +msgstr "Βήμα:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Separation:" -msgstr "" +msgstr "ΔιαχωÏισμός:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region" -msgstr "" +msgstr "ΠεÏιοχή υφής" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region Editor" -msgstr "" +msgstr "ΕπεξεÏγαστής πεÏιοχής υφής" #: editor/plugins/theme_editor_plugin.cpp msgid "Can't save theme to file:" -msgstr "" +msgstr "Δεν ήταν δυνατή η αποθήκευση θÎματος σε αÏχείο:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All Items" -msgstr "" +msgstr "Î Ïοσθήκη όλων των στοιχείων" #: editor/plugins/theme_editor_plugin.cpp msgid "Add All" -msgstr "" +msgstr "Î Ïοσθήκη όλων" #: editor/plugins/theme_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp msgid "Remove Item" -msgstr "" +msgstr "ΑφαίÏεση στοιχείου" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme" -msgstr "" +msgstr "ΘÎμα" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" -msgstr "" +msgstr "Î Ïοσθήκη στοιχείων κλάσης" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" -msgstr "" +msgstr "ΑφαίÏεση στοιχείων κλάσης" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "" +msgstr "ΔημιουÏγία άδειου Ï€ÏοτÏπου" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "" +msgstr "ΔημιουÏγία άδειου Ï€ÏοτÏπου επεξεÏγαστή" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" -msgstr "" +msgstr "Κουμπί επιλογής1" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio2" -msgstr "" +msgstr "Κουμπί επιλογής 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Item" -msgstr "" +msgstr "Στοιχείο" #: editor/plugins/theme_editor_plugin.cpp msgid "Check Item" -msgstr "" +msgstr "Επιλογή στοιχείου" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" -msgstr "" +msgstr "ΕπιλεγμÎνο στοιχείο" #: editor/plugins/theme_editor_plugin.cpp msgid "Has" -msgstr "" +msgstr "Έχει" #: editor/plugins/theme_editor_plugin.cpp msgid "Many" -msgstr "" +msgstr "ΠολλÎÏ‚" #: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp msgid "Options" -msgstr "" +msgstr "ΕπιλογÎÏ‚" #: editor/plugins/theme_editor_plugin.cpp msgid "Have,Many,Several,Options!" -msgstr "" +msgstr "Έχει,ΠάÏα,ΠολλÎÏ‚,ΕπιλογÎÏ‚!" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 1" -msgstr "" +msgstr "ΚαÏÏ„Îλα 1" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 2" -msgstr "" +msgstr "ΚαÏÏ„Îλα 2" #: editor/plugins/theme_editor_plugin.cpp msgid "Tab 3" -msgstr "" +msgstr "ΚαÏÏ„Îλα 3" #: editor/plugins/theme_editor_plugin.cpp editor/project_settings.cpp #: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp msgid "Type:" -msgstr "" +msgstr "ΤÏπος:" #: editor/plugins/theme_editor_plugin.cpp msgid "Data Type:" -msgstr "" +msgstr "ΤÏπος δεδομÎνων:" #: editor/plugins/theme_editor_plugin.cpp msgid "Icon" -msgstr "" +msgstr "Εικονίδιο" #: editor/plugins/theme_editor_plugin.cpp msgid "Style" -msgstr "" +msgstr "Στυλ" #: editor/plugins/theme_editor_plugin.cpp msgid "Color" -msgstr "" +msgstr "ΧÏώμα" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "Βάψιμο TileMap" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" -msgstr "" +msgstr "Διπλασιασμός" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "ΔιαγÏαφή TileMap" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase selection" -msgstr "" +msgstr "ΔιαγÏαφή επιλογής" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find tile" -msgstr "" +msgstr "ΕÏÏεση πλακιδίου" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "Μετατόπιση" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror X" -msgstr "" +msgstr "ΣυμμετÏία στον άξονα Χ" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror Y" -msgstr "" +msgstr "ΣυμμετÏία στον άξονα Î¥" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket" -msgstr "" +msgstr "Κουβάς" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "Επιλογή πλακιδίου" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Select" -msgstr "" +msgstr "Επιλογή" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 0 degrees" -msgstr "" +msgstr "ΠεÏιστÏοφή 0 μοίÏες" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 90 degrees" -msgstr "" +msgstr "ΠεÏιστÏοφή 90 μοίÏες" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 180 degrees" -msgstr "" +msgstr "ΠεÏιστÏοφή 180 μοίÏες" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Rotate 270 degrees" -msgstr "" +msgstr "ΠεÏιστÏοφή 270 μοίÏες" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Could not find tile:" -msgstr "" +msgstr "Δεν ήταν δυνατή η εÏÏεση πλακιδίου:" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Item name or ID:" -msgstr "" +msgstr "Όνομα στοιχείου ή αναγνωÏιστικοÏ:" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from scene?" -msgstr "" +msgstr "ΔημιουÏγία από σκηνή;" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from scene?" -msgstr "" +msgstr "Συγχώνευση από σκηνή;" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Create from Scene" -msgstr "" +msgstr "ΔημιουÏγία από σκηνή" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Merge from Scene" -msgstr "" +msgstr "Συγχώνευση από σκηνή" #: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Error" -msgstr "" +msgstr "Σφάλμα" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "ΕνεÏγοποίηση" +msgstr "ΕκτελÎσιμο" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '" -msgstr "ΔιαγÏαφή διάταξης" +msgstr "ΔιαγÏαφή ενημÎÏωσης '" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "ΔιαγÏαφή επιλεγμÎνων αÏχείων;" +msgstr "ΔιαγÏαφή διαμόÏφωσης '%s';" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "ΔιαμοÏφώσεις" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." -msgstr "" +msgstr "Î Ïοσθήκη.." #: editor/project_export.cpp msgid "Resources" -msgstr "" +msgstr "Î ÏŒÏοι" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Εισαγωγή πόÏων στο ÎÏγο." +msgstr "Εξαγωγή όλων των πόÏων στο ÎÏγο" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "Εξαγωγή επιλεγμÎνων σκηνών (και εξαÏτήσεων)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "Εξαγωγή επιλεγμÎνων πόÏων (και εξαÏτήσεων)" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "ΛειτουÏγία εξαγωγής:" #: editor/project_export.cpp msgid "Resources to export:" -msgstr "" +msgstr "Î ÏŒÏοι για εξαγωγή:" #: editor/project_export.cpp msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" +"ΦίλτÏα για εξαγωγή για αÏχεία που δεν είναι πόÏοι (χωÏισμÎνα με κόμμα Ï€.χ. *." +"json, *.txt)" #: editor/project_export.cpp msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" +"ΦίλτÏα για την εξαίÏεση αÏχείων από το ÎÏγο (χωÏισμÎνα με κόμμα Ï€.χ. *.json, " +"*.txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "Αντιστοιχίες:" +msgstr "ΕνημεÏώσεις" #: editor/project_export.cpp msgid "Make Patch" -msgstr "" +msgstr "ΔημιουÏγία ενημÎÏωσης" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Τα Ï€Ïότυπα εξαγωγής για αυτή την πλατφόÏτμα λείπουν:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Εξαγωγή σετ πλακιδίων" +msgstr "Εξαγωγή με αποσφαλμάτωση" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" -msgstr "" +msgstr "Μη ÎγκυÏη διαδÏομή ÎÏγου, η διαδÏομή Ï€ÏÎπει να υπάÏχει!" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." -msgstr "" +#, fuzzy +msgid "Invalid project path, project.godot must not exist." +msgstr "Μη ÎγκυÏη διαδÏομή ÎÏγου, το godot.cfg δεν Ï€ÏÎπει να υπάÏχει." #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." -msgstr "" +#, fuzzy +msgid "Invalid project path, project.godot must exist." +msgstr "Μη ÎγκυÏη διαδÏομή ÎÏγου, το godot.cfg Ï€ÏÎπει να υπάÏχει." #: editor/project_manager.cpp msgid "Imported Project" -msgstr "" +msgstr "ΕισαγμÎνο ÎÏγο" #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "" +msgstr "Μη ÎγκυÏη διαδÏομή ÎÏγου (Αλλάξατε τίποτα;)." #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." -msgstr "" +#, fuzzy +msgid "Couldn't create project.godot in project path." +msgstr "Δεν ήταν δυνατή η δημιουÏγία του godot.cfg στη διαδÏομή ÎÏγου." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "Η εξαγωγή των ακόλουθων αÏχείων από το πακÎτο απÎτυχε:" #: editor/project_manager.cpp msgid "Package Installed Successfully!" -msgstr "" +msgstr "Το πακÎτο εγκαταστάθηκε επιτυχώς!" #: editor/project_manager.cpp msgid "Import Existing Project" -msgstr "" +msgstr "Εισαγωγή υπαÏÎºÏ„Î¿Ï ÎÏγου" #: editor/project_manager.cpp msgid "Project Path (Must Exist):" -msgstr "" +msgstr "ΔιαδÏομή ÎÏγου (Î ÏÎπει να υπάÏχει):" #: editor/project_manager.cpp msgid "Project Name:" -msgstr "" +msgstr "Όνομα ÎÏγου:" #: editor/project_manager.cpp msgid "Create New Project" -msgstr "" +msgstr "ΔημιουÏγία νÎου ÎÏγου" #: editor/project_manager.cpp msgid "Project Path:" -msgstr "" +msgstr "ΔιαδÏομή ÎÏγου:" #: editor/project_manager.cpp msgid "Install Project:" -msgstr "" +msgstr "Εγκατάσταση ÎÏγου:" #: editor/project_manager.cpp msgid "Browse" -msgstr "" +msgstr "ΠεÏιήγηση" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "ÎÎο ÎÏγο παιχνιδιοÏ" #: editor/project_manager.cpp msgid "That's a BINGO!" -msgstr "" +msgstr "Αυτό είναι Îνα «ΕÏÏηκα»!" #: editor/project_manager.cpp msgid "Unnamed Project" -msgstr "" +msgstr "Ανώνυμο ÎÏγο" #: editor/project_manager.cpp msgid "Are you sure to open more than one project?" -msgstr "" +msgstr "Είστε σίγουÏοι πως θÎλετε να ανοίξετε πεÏισσότεÏα από Îνα ÎÏγα;" #: editor/project_manager.cpp msgid "Are you sure to run more than one project?" -msgstr "" +msgstr "Είστε σίγουÏοι πως θÎλετε να Ï„ÏÎξετε πεÏισσότεÏα από Îνα ÎÏγα;" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" msgstr "" +"ΑφαίÏεση ÎÏγου από την λίστα; (Τα πεÏιεχόμενα το φακÎλου δεν θα " +"Ï„ÏοποποιηθοÏν)" #: editor/project_manager.cpp msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" msgstr "" +"Είστε Îτοιμοι να σαÏώσετε %s φακÎλους για υπαÏκτά ÎÏγα Godot. Είστε σίγουÏοι;" #: editor/project_manager.cpp msgid "Project Manager" -msgstr "" +msgstr "ΔιαχειÏιστής" #: editor/project_manager.cpp msgid "Project List" -msgstr "" +msgstr "Λίστα ÎÏγων" #: editor/project_manager.cpp msgid "Run" -msgstr "" +msgstr "ΕκτÎλεση" #: editor/project_manager.cpp msgid "Scan" -msgstr "" +msgstr "ΣάÏωση" #: editor/project_manager.cpp msgid "Select a Folder to Scan" -msgstr "" +msgstr "ΕπιλÎξτε Îναν φάκελο για σάÏωση" #: editor/project_manager.cpp msgid "New Project" -msgstr "" +msgstr "ÎÎο ÎÏγο" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "ΑφαίÏεση επιλογής" +msgstr "ΑφαίÏεση Ï€ÏοτÏπου" #: editor/project_manager.cpp msgid "Exit" -msgstr "" +msgstr "Έξοδος" #: editor/project_settings.cpp msgid "Key " -msgstr "" +msgstr "Κλειδί " #: editor/project_settings.cpp msgid "Joy Button" -msgstr "" +msgstr "Κουμπί Joystick" #: editor/project_settings.cpp msgid "Joy Axis" -msgstr "" +msgstr "Άξονας Joystick" #: editor/project_settings.cpp msgid "Mouse Button" -msgstr "" +msgstr "Κουμπί ποντικιοÏ" #: editor/project_settings.cpp msgid "Invalid action (anything goes but '/' or ':')." -msgstr "" +msgstr "Μη ÎγκυÏη ενÎÏγεια (Όλα επιτÏÎποντα εκτός από το '/' και το ':')." #: editor/project_settings.cpp msgid "Action '%s' already exists!" -msgstr "" +msgstr "Η ενÎÏγεια '%s' υπάÏχει ήδη!" #: editor/project_settings.cpp msgid "Rename Input Action Event" -msgstr "" +msgstr "Μετονομασία συμβάντος εισόδου" #: editor/project_settings.cpp msgid "Add Input Action Event" -msgstr "" +msgstr "Î Ïοσθήκη συμβάντος εισόδου" #: editor/project_settings.cpp editor/settings_config_dialog.cpp #: scene/gui/input_action.cpp @@ -5497,55 +5734,55 @@ msgstr "Alt+" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "Control+" -msgstr "" +msgstr "Control+" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "Press a Key.." -msgstr "" +msgstr "Πατήστε Îνα κουμπί.." #: editor/project_settings.cpp msgid "Mouse Button Index:" -msgstr "" +msgstr "Kουμπί ποντικιοÏ:" #: editor/project_settings.cpp msgid "Left Button" -msgstr "" +msgstr "ΑÏιστεÏÏŒ κουμπί" #: editor/project_settings.cpp msgid "Right Button" -msgstr "" +msgstr "Δεξί κουμπί" #: editor/project_settings.cpp msgid "Middle Button" -msgstr "" +msgstr "Μεσαίο κουμπί" #: editor/project_settings.cpp msgid "Wheel Up Button" -msgstr "" +msgstr "ΡοδÎλα πάνω" #: editor/project_settings.cpp msgid "Wheel Down Button" -msgstr "" +msgstr "ΡοδÎλα κάτω" #: editor/project_settings.cpp msgid "Button 6" -msgstr "" +msgstr "Κουμπί 6" #: editor/project_settings.cpp msgid "Button 7" -msgstr "" +msgstr "Κουμπί 7" #: editor/project_settings.cpp msgid "Button 8" -msgstr "" +msgstr "Κουμπί 8" #: editor/project_settings.cpp msgid "Button 9" -msgstr "" +msgstr "Κουμπί 9" #: editor/project_settings.cpp msgid "Joypad Axis Index:" -msgstr "" +msgstr "ΑÏιθμός άξονα Joypad:" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Axis" @@ -5553,15 +5790,20 @@ msgstr "Άξονας" #: editor/project_settings.cpp msgid "Joypad Button Index:" -msgstr "" +msgstr "ΑÏιθμός ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Joypad:" #: editor/project_settings.cpp msgid "Add Input Action" -msgstr "" +msgstr "Î Ïοσθήκη συμβάντος ενÎÏγειας εισόδου" #: editor/project_settings.cpp msgid "Erase Input Action Event" -msgstr "" +msgstr "ΔιαγÏαφή συμβάντος ενÎÏγειας εισόδου" + +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Î Ïοσθήκη άδειου" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" @@ -5593,174 +5835,168 @@ msgstr "ΡοδÎλα κάτω." #: editor/project_settings.cpp msgid "Error saving settings." -msgstr "" +msgstr "Σφάλμα κατά την αποθήκευση Ïυθμίσεων." #: editor/project_settings.cpp msgid "Settings saved OK." -msgstr "" +msgstr "Οι Ïυθμίσεις αποθηκεÏτικαν εντάξει." #: editor/project_settings.cpp msgid "Add Translation" -msgstr "" +msgstr "Î Ïοσθήκη μετάφÏασης" #: editor/project_settings.cpp msgid "Remove Translation" -msgstr "" +msgstr "ΑφαίÏεση μετάφÏασης" #: editor/project_settings.cpp msgid "Add Remapped Path" -msgstr "" +msgstr "Î Ïοσθήκη ανακατεÏθυνσης διαδÏομής" #: editor/project_settings.cpp msgid "Resource Remap Add Remap" -msgstr "" +msgstr "Î Ïοσθήκη ανακατεÏθυνσης διαδÏομής πόÏου" #: editor/project_settings.cpp msgid "Change Resource Remap Language" -msgstr "" +msgstr "Αλλαγή γλώσσας ανακατεÏθυνσης πόÏων" #: editor/project_settings.cpp msgid "Remove Resource Remap" -msgstr "" +msgstr "ΑφαίÏεση ανακατεÏθυνσης πόÏου" #: editor/project_settings.cpp msgid "Remove Resource Remap Option" -msgstr "" +msgstr "ΑφαίÏεση επιλογής ανακατεÏθυνσης πόÏου" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Ρυθμίσεις ÎÏγου" +msgid "Project Settings (project.godot)" +msgstr "Ρυθμίσεις ÎÏγου (godot.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" -msgstr "" +msgstr "Γενικά" #: editor/project_settings.cpp editor/property_editor.cpp msgid "Property:" -msgstr "" +msgstr "Ιδιότητα:" #: editor/project_settings.cpp msgid "Del" -msgstr "" +msgstr "ΔιαγÏαφή" #: editor/project_settings.cpp msgid "Copy To Platform.." -msgstr "" +msgstr "ΑντιγÏαφή σε πλατφόÏμα.." #: editor/project_settings.cpp msgid "Input Map" -msgstr "" +msgstr "ΧάÏτης εισόδου" #: editor/project_settings.cpp msgid "Action:" -msgstr "" +msgstr "ΕνÎÏγεια:" #: editor/project_settings.cpp msgid "Device:" -msgstr "" +msgstr "Συσκευή:" #: editor/project_settings.cpp msgid "Index:" -msgstr "" +msgstr "Δείκτης:" #: editor/project_settings.cpp msgid "Localization" -msgstr "" +msgstr "Τοπική Ï€ÏοσαÏμογή" #: editor/project_settings.cpp msgid "Translations" -msgstr "" +msgstr "ΜεταφÏάσεις" #: editor/project_settings.cpp msgid "Translations:" -msgstr "" +msgstr "ΜεταφÏάσεις:" #: editor/project_settings.cpp msgid "Remaps" -msgstr "" +msgstr "ΑνακατευθÏνσεις" #: editor/project_settings.cpp msgid "Resources:" -msgstr "" +msgstr "Î ÏŒÏοι:" #: editor/project_settings.cpp msgid "Remaps by Locale:" -msgstr "" +msgstr "ΑνακατευθÏνσεις ανά πεÏιοχή:" #: editor/project_settings.cpp msgid "Locale" -msgstr "" +msgstr "ΠεÏιοχή" #: editor/project_settings.cpp msgid "AutoLoad" -msgstr "" +msgstr "Αυτόματη φόÏτωση" #: editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "ΕπιλÎξτε μία οπτική γωνία" #: editor/property_editor.cpp msgid "Ease In" -msgstr "" +msgstr "Ομαλή κίνηση Ï€Ïος τα μÎσα" #: editor/property_editor.cpp msgid "Ease Out" -msgstr "" +msgstr "Ομαλή κίνηση Ï€Ïος τα Îξω" #: editor/property_editor.cpp msgid "Zero" -msgstr "" +msgstr "ΜηδÎν" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "" +msgstr "Ομαλή κίνηση από μÎσα Ï€Ïος τα Îξω" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "" +msgstr "Ομαλή κίνηση από Îξω Ï€Ïος τα μÎσα" #: editor/property_editor.cpp msgid "File.." -msgstr "" +msgstr "ΑÏχείο.." #: editor/property_editor.cpp msgid "Dir.." -msgstr "" +msgstr "Κατάλογος.." #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Ανάθεση" #: editor/property_editor.cpp msgid "New Script" -msgstr "" +msgstr "Îεα δεσμή ενεÏγειών" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "ΣÏστημα αÏχείων" +msgstr "Εμφάνιση στο σÏστημα αÏχείων" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" -msgstr "" +msgstr "Σφάλμα κατά την φόÏτωση αÏχείου: Δεν είναι πόÏος!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" -msgstr "Επικόλληση κόμβων" +msgstr "ΕπιλÎξτε Îναν κόμβο" #: editor/property_editor.cpp msgid "Bit %d, val %d." -msgstr "" +msgstr "Δυαδικό ψηφίο %d, τιμή %d." #: editor/property_editor.cpp msgid "On" -msgstr "" +msgstr "Îαι" #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Set" @@ -5768,534 +6004,616 @@ msgstr "ÎŒÏισε" #: editor/property_editor.cpp msgid "Properties:" -msgstr "" +msgstr "Ιδιότητες:" #: editor/property_editor.cpp msgid "Sections:" -msgstr "" +msgstr "Ενότητες:" #: editor/property_selector.cpp msgid "Select Property" -msgstr "" +msgstr "Επιλογή ιδιότητας" #: editor/property_selector.cpp msgid "Select Method" -msgstr "" +msgstr "Επιλογή μεθόδου" #: editor/pvrtc_compress.cpp msgid "Could not execute PVRTC tool:" -msgstr "" +msgstr "Δεν ήταν δυνατή η εκτÎλεση του εÏγαλείου PVRTC:" #: editor/pvrtc_compress.cpp msgid "Can't load back converted image using PVRTC tool:" msgstr "" +"Δεν ήταν δυνατή η επαναφόÏτωση της εικόνας που Îχει μετατÏαπεί με το " +"εÏγαλείο PVRTC:" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" -msgstr "" +msgstr "ΕπαναπÏοσδιοÏισμός γονÎα κόμβου" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" -msgstr "" +msgstr "ΘÎση γονÎα (ΕπιλÎξτε νÎο γονÎα):" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" -msgstr "" +msgstr "ΔιατήÏηση παγκόσμιου μετασχηματισμοÏ" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" -msgstr "" +msgstr "ΕπαναπÏοσδιοÏισμός γονÎα" #: editor/resources_dock.cpp msgid "Create New Resource" -msgstr "" +msgstr "ΔημιουÏγία νÎου πόÏου" #: editor/resources_dock.cpp msgid "Open Resource" -msgstr "" +msgstr "Άνοιγμα πόÏου" #: editor/resources_dock.cpp msgid "Save Resource" -msgstr "" +msgstr "Αποθήκευση πόÏου" #: editor/resources_dock.cpp msgid "Resource Tools" -msgstr "" +msgstr "ΕÏγαλεία πόÏων" #: editor/resources_dock.cpp msgid "Make Local" -msgstr "" +msgstr "Κάνε τοπικό" #: editor/run_settings_dialog.cpp msgid "Run Mode:" -msgstr "" +msgstr "ΛειτουÏγία εκτÎλεσης:" #: editor/run_settings_dialog.cpp msgid "Current Scene" -msgstr "" +msgstr "ΤÏÎχουσα σκηνή" #: editor/run_settings_dialog.cpp msgid "Main Scene" -msgstr "" +msgstr "ΚÏÏια σκηνή" #: editor/run_settings_dialog.cpp msgid "Main Scene Arguments:" -msgstr "" +msgstr "ΟÏίσματα κÏÏιας σκηνής:" #: editor/run_settings_dialog.cpp msgid "Scene Run Settings" -msgstr "" +msgstr "Ρυθμίσης εκτÎλεσης σκηνής" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "" +msgstr "Δεν υπάÏχει γονÎας για να δημιουÏγηθοÏν τα στιγμιότυπα των σκηνών." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" -msgstr "" +msgstr "Σφάλμα κατά τη φόÏτωση σκηνής από %s" #: editor/scene_tree_dock.cpp msgid "Ok" -msgstr "" +msgstr "Εντάξει" #: editor/scene_tree_dock.cpp msgid "" "Cannot instance the scene '%s' because the current scene exists within one " "of its nodes." msgstr "" +"Δεν ήταν δυνατή η δημιουÏγία στιγμιοτÏπου της σκηνής '%s', επειδή η Ï„ÏÎχουσα " +"σκηνή υπάÏχει μÎσα σε Îναν από τους κόμβους της." #: editor/scene_tree_dock.cpp msgid "Instance Scene(s)" -msgstr "" +msgstr "ΔημιουÏγία στιγμιοτÏπυ σκηνών" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on the tree root." -msgstr "" +msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει στην Ïίζα το δÎντÏου." #: editor/scene_tree_dock.cpp msgid "Move Node In Parent" -msgstr "" +msgstr "Μετακίνηση κόμβου στον γονÎα" #: editor/scene_tree_dock.cpp msgid "Move Nodes In Parent" -msgstr "" +msgstr "Μετακίνηση κόμβων στον γονÎα" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" -msgstr "" +msgstr "Διπλασιασμός κόμβων" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)?" -msgstr "" +msgstr "ΔιαγÏαφή κόμβων;" #: editor/scene_tree_dock.cpp msgid "This operation can't be done without a scene." -msgstr "" +msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χωÏίς σκηνή." #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Δεν είναι δυνατή η εκτÎλεση με τον πηγαίο κόμβο." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." msgstr "" +"Αυτή η λειτουÏγία δεν μποÏεί να γίνει σε σκηνÎÏ‚ από τις οποίες Îχουν " +"δημιουÏγηθεί στιγμιότυπα." #: editor/scene_tree_dock.cpp msgid "Save New Scene As.." -msgstr "" +msgstr "Αποθήκευση νÎας σκηνής ως.." #: editor/scene_tree_dock.cpp msgid "Makes Sense!" -msgstr "" +msgstr "Βγάζει νόημα!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "" +msgstr "Δεν είναι δυνατή η λειτουÏγία σε κόμβους από ξÎνη σκηνή!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" msgstr "" +"Δεν είναι δυνατή η λειτουÏγία σε κόμβους από τους οποίους κληÏονομεί η " +"Ï„ÏÎχουσα σκηνή!" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" -msgstr "" +msgstr "ΑφαίÏεση κόμβων" #: editor/scene_tree_dock.cpp msgid "" "Couldn't save new scene. Likely dependencies (instances) couldn't be " "satisfied." msgstr "" +"Δεν ήταν δυνατή η αποθήκευση νÎας σκηνής. Πιθανώς οι εξαÏτήσεις " +"(στιγμιότυπα) δεν μποÏοÏσαν να ικανοποιηθοÏν." #: editor/scene_tree_dock.cpp msgid "Error saving scene." -msgstr "" +msgstr "Σφάλμα κατά την αποθήκευση σκηνής." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "" +msgstr "Σφάλμα κατά τον διπλασιασμό σκηνής για αποθήκευση." + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Î ÏŒÏοι:" #: editor/scene_tree_dock.cpp msgid "Edit Groups" -msgstr "" +msgstr "ΕπεξεÏγασία Ομάδων" #: editor/scene_tree_dock.cpp msgid "Edit Connections" -msgstr "" +msgstr "ΕπεξεÏγασία συνδÎσεων" #: editor/scene_tree_dock.cpp msgid "Delete Node(s)" -msgstr "" +msgstr "ΔιαγÏαφή Κόμβων" #: editor/scene_tree_dock.cpp msgid "Add Child Node" -msgstr "" +msgstr "Î Ïοσθήκη κόμβου ως παιδί" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "" +msgstr "ΑÏχικοποίηση σκηνής ως παιδί" #: editor/scene_tree_dock.cpp msgid "Change Type" -msgstr "" +msgstr "Αλλαγή Ï„Ïπου" #: editor/scene_tree_dock.cpp msgid "Attach Script" -msgstr "" +msgstr "ΣÏνδεση δεσμής ενεÏγειών" #: editor/scene_tree_dock.cpp msgid "Clear Script" -msgstr "" +msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" -msgstr "" +msgstr "Συγχώνευση από σκηνή" #: editor/scene_tree_dock.cpp msgid "Save Branch as Scene" -msgstr "" +msgstr "Αποθήκευσι ÎºÎ»Î±Î´Î¹Î¿Ï Ï‰Ï‚ σκηνή" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "ΑντιγÏαφή κόμβων" +msgstr "ΑντιγÏαφή διαδÏομής κόμβου" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" -msgstr "" +msgstr "ΔιαγÏαφή (ΧωÏίς επιβεβαίωση)" #: editor/scene_tree_dock.cpp msgid "Add/Create a New Node" -msgstr "" +msgstr "Î Ïοσθήκη/ΔημιουÏγία κόμβου" #: editor/scene_tree_dock.cpp msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" +"ΑÏχικοποίηση σκηνής ως κόμβο. ΔημιουÏγεί μία κληÏονομημÎνη σκηνή αν δεν " +"υπάÏχει πηγαίος κόμβος." #: editor/scene_tree_dock.cpp msgid "Attach a new or existing script for the selected node." -msgstr "" +msgstr "ΣÏνδεση νÎας ή υπαÏκτής δεσμής ενεÏγειών για τον επιλεγμÎνο κόμβο." #: editor/scene_tree_dock.cpp msgid "Clear a script for the selected node." -msgstr "" +msgstr "ΕκκαθάÏιση δεσμής ενεÏγειών για τον επιλεγμÎνο κόμβο." #: editor/scene_tree_editor.cpp msgid "Toggle Spatial Visible" -msgstr "" +msgstr "Εναλλαγή οÏατότητας Spatial" #: editor/scene_tree_editor.cpp msgid "Toggle CanvasItem Visible" +msgstr "Εναλλαγή οÏατότητας CanvasItem" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "ΕπιλογÎÏ‚ ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½" + +#: editor/scene_tree_editor.cpp msgid "Instance:" +msgstr "Στιγμιότυπο:" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Επόμενη δεσμή ενεÏγειών" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" msgstr "" #: editor/scene_tree_editor.cpp -msgid "Invalid node name, the following characters are not allowed:" +msgid "" +"Children are not selectable.\n" +"Click to make selectable" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Εναλλαγή οÏατότητας Spatial" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "ΆκυÏο όνομα κόμβου, οι ακόλουθοι χαÏακτήÏες δεν επιτÏÎπονται:" + +#: editor/scene_tree_editor.cpp msgid "Rename Node" -msgstr "" +msgstr "Μετονομασία κόμβου" #: editor/scene_tree_editor.cpp msgid "Scene Tree (Nodes):" -msgstr "" +msgstr "ΔÎντÏο σκηνής (Κόμβοι):" #: editor/scene_tree_editor.cpp msgid "Editable Children" -msgstr "" +msgstr "ΕπεξεÏγάσιμα παιδιά" #: editor/scene_tree_editor.cpp msgid "Load As Placeholder" -msgstr "" +msgstr "ΦόÏτωση ως μÎσο κÏάτησης θÎσης" #: editor/scene_tree_editor.cpp msgid "Discard Instancing" -msgstr "" +msgstr "ΑπόÏÏιψη στιγμιοτÏπισης" #: editor/scene_tree_editor.cpp msgid "Open in Editor" -msgstr "" +msgstr "Άνοιγμα στον επεξεÏγαστή" #: editor/scene_tree_editor.cpp msgid "Clear Inheritance" -msgstr "" +msgstr "ΕκκαθάÏιση κληÏονομικότητας" #: editor/scene_tree_editor.cpp msgid "Clear Inheritance? (No Undo!)" -msgstr "" +msgstr "ΕκκαθάÏιση κληÏονομικότητας; (Δεν γίνεται ανÎÏαιση!)" #: editor/scene_tree_editor.cpp msgid "Clear!" -msgstr "" +msgstr "ΕκκαθάÏιση!" #: editor/scene_tree_editor.cpp msgid "Select a Node" -msgstr "" +msgstr "ΕπιλÎξτε Îναν κόμβο" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Δεν ήταν δυνατή η δημιουÏγία δεσμής ενεÏγειών στο σÏστημα αÏχείων." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +msgid "Error loading script from %s" +msgstr "Σφάλμα κατά την φόÏτωση δεσμής ενεÏγειών από %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "" +msgid "Path is empty" +msgstr "Η διαδÏομή είναι άδεια" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "" +msgid "Path is not local" +msgstr "Η διαδÏομή δεν είναι τοπική" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "" +msgid "Invalid base path" +msgstr "Μη ÎγκυÏη βασική διαδÏομή" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "" +msgid "Invalid extension" +msgstr "Μη ÎγκυÏη επÎκταση" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "ΆκυÏη διαδÏομή." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "" +msgid "Invalid class name" +msgstr "Μη ÎγκυÏο όνομα κλάσης" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "ΆκυÏο όνομα ιδιότητας δείκτη." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "" +msgid "N/A" +msgstr "Δ/Î¥" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" -msgstr "" +#, fuzzy +msgid "Create new script file" +msgstr "ΔημιουÏγία νÎας δεσμής ενεÏγειών" #: editor/script_create_dialog.cpp -msgid "Load existing script" -msgstr "" +#, fuzzy +msgid "Load existing script file" +msgstr "ΦόÏτωση υπαÏκτής δεσμής ενεÏγειών" #: editor/script_create_dialog.cpp -msgid "Class Name:" -msgstr "" +#, fuzzy +msgid "Inherits" +msgstr "ΚληÏονομεί:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" -msgstr "" +#, fuzzy +msgid "Class Name" +msgstr "Όνομα κλάσης:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "ΑφαίÏεση Ï€ÏοτÏπου" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" +msgstr "ΕνσωματωμÎνη δεσμή ενεÏγειών" #: editor/script_create_dialog.cpp msgid "Attach Node Script" -msgstr "" +msgstr "ΣÏνδεση δεσμής ενεÏγειών κόμβου" #: editor/script_editor_debugger.cpp msgid "Bytes:" -msgstr "" +msgstr "ΨηφιολÎξεις:" #: editor/script_editor_debugger.cpp msgid "Warning" -msgstr "" +msgstr "Î Ïοειδοποίηση" #: editor/script_editor_debugger.cpp msgid "Error:" -msgstr "" +msgstr "Σφάλμα:" #: editor/script_editor_debugger.cpp msgid "Source:" -msgstr "" +msgstr "Πηγή:" #: editor/script_editor_debugger.cpp msgid "Function:" -msgstr "" +msgstr "ΣυνάÏτηση:" #: editor/script_editor_debugger.cpp msgid "Errors" -msgstr "" +msgstr "Σφάλματα" #: editor/script_editor_debugger.cpp msgid "Child Process Connected" -msgstr "" +msgstr "Η παιδική διαδικασία συνδÎθηκε" #: editor/script_editor_debugger.cpp msgid "Inspect Previous Instance" -msgstr "" +msgstr "ΕπιθεώÏηση του Ï€ÏοηγοÏμενου στιγμιοτÏπου" #: editor/script_editor_debugger.cpp msgid "Inspect Next Instance" -msgstr "" +msgstr "ΕπιθεώÏηση του επόμενου στιγμιοτÏπου" #: editor/script_editor_debugger.cpp msgid "Stack Frames" -msgstr "" +msgstr "Στοίβαξη καÏÎ" #: editor/script_editor_debugger.cpp msgid "Variable" -msgstr "" +msgstr "Μεταβλητή" #: editor/script_editor_debugger.cpp msgid "Errors:" -msgstr "" +msgstr "Σφάλματα:" #: editor/script_editor_debugger.cpp msgid "Stack Trace (if applicable):" -msgstr "" +msgstr "Ιχνηλάτηση στοίβας (Εάν υφίσταται):" #: editor/script_editor_debugger.cpp msgid "Remote Inspector" -msgstr "" +msgstr "ΑπομακÏυσμÎνος επιθεωÏητής" #: editor/script_editor_debugger.cpp msgid "Live Scene Tree:" -msgstr "" +msgstr "Ζωντανό δÎντÏο σκηνής:" #: editor/script_editor_debugger.cpp msgid "Remote Object Properties: " -msgstr "" +msgstr "ΑπομακÏυσμÎνες ιδιότητες αντικειμÎνου: " #: editor/script_editor_debugger.cpp msgid "Profiler" -msgstr "" +msgstr "Î ÏόγÏαμμα δημιουÏγίας Ï€Ïοφιλ" #: editor/script_editor_debugger.cpp msgid "Monitor" -msgstr "" +msgstr "Κλειδί" #: editor/script_editor_debugger.cpp msgid "Value" -msgstr "" +msgstr "Τιμή" #: editor/script_editor_debugger.cpp msgid "Monitors" -msgstr "" +msgstr "ΠαÏακολοÏθηση" #: editor/script_editor_debugger.cpp msgid "List of Video Memory Usage by Resource:" -msgstr "" +msgstr "Λίστα χÏήσης βιντεο-μνήμης ανά πόÏο:" #: editor/script_editor_debugger.cpp msgid "Total:" -msgstr "" +msgstr "Συνολικά:" #: editor/script_editor_debugger.cpp msgid "Video Mem" -msgstr "" +msgstr "βιντεο-μνήμη" #: editor/script_editor_debugger.cpp msgid "Resource Path" -msgstr "" +msgstr "ΔιαδÏομή πόÏου" #: editor/script_editor_debugger.cpp msgid "Type" -msgstr "" +msgstr "ΤÏπος" #: editor/script_editor_debugger.cpp msgid "Usage" -msgstr "" +msgstr "ΧÏήση" #: editor/script_editor_debugger.cpp msgid "Misc" -msgstr "" +msgstr "ΔιάφοÏα" #: editor/script_editor_debugger.cpp msgid "Clicked Control:" -msgstr "" +msgstr "ΠατημÎνο στοιχείο ελÎγχου:" #: editor/script_editor_debugger.cpp msgid "Clicked Control Type:" -msgstr "" +msgstr "ΤÏπος πατημÎνου στοιχείου ελÎγχου:" #: editor/script_editor_debugger.cpp msgid "Live Edit Root:" -msgstr "" +msgstr "Ρίζα ζωντανής επεξεÏγασίας:" #: editor/script_editor_debugger.cpp msgid "Set From Tree" -msgstr "" +msgstr "ΟÏισμός από το δÎντÏο" #: editor/settings_config_dialog.cpp msgid "Shortcuts" -msgstr "" +msgstr "ΣυντομεÏσεις" #: editor/spatial_editor_gizmos.cpp msgid "Change Light Radius" -msgstr "" +msgstr "Αλλαγή διαμÎÏ„Ïου φωτός" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" -msgstr "" +msgstr "Αλλαγή εÏÏους πεδίου κάμεÏας" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera Size" -msgstr "" +msgstr "Αλλαγή μεγÎθους κάμεÏας" #: editor/spatial_editor_gizmos.cpp msgid "Change Sphere Shape Radius" -msgstr "" +msgstr "Αλλαγή ακτίνας σφαιÏÎ¹ÎºÎ¿Ï ÏƒÏ‡Î®Î¼Î±Ï„Î¿Ï‚" #: editor/spatial_editor_gizmos.cpp msgid "Change Box Shape Extents" -msgstr "" +msgstr "Αλλαγή διαστάσεων ÎºÏ…Î²Î¹ÎºÎ¿Ï ÏƒÏ‡Î®Î¼Î±Ï„Î¿Ï‚" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Radius" -msgstr "" +msgstr "Αλλαγή ακτίνας κάψουλας" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "" +msgstr "Αλλαγή Ïψους κάψουλας" #: editor/spatial_editor_gizmos.cpp msgid "Change Ray Shape Length" -msgstr "" +msgstr "Αλλαγή μήκους ακτίνας" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier Extents" -msgstr "" +msgstr "Αλλαγή διαστάσεων ειδοποιητή" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" @@ -6303,7 +6621,7 @@ msgstr "" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" -msgstr "" +msgstr "Αλλαγή διαστάσεων αισθητήÏα" #: modules/gdscript/gd_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -6321,14 +6639,12 @@ msgid "step argument is zero!" msgstr "Η παÏάμετÏος step είναι μηδÎν!" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Not a script with an instance" -msgstr "Δεν είναι script με παÏουσία" +msgstr "Δεν είναι δεσμή ενεÏγειών με στιγμιότυπο" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Not based on a script" -msgstr "Δεν είναι βασισμÎνο σε script" +msgstr "Δεν είναι βασισμÎνο σε δεσμή ενεÏγειών" #: modules/gdscript/gd_functions.cpp msgid "Not based on a resource file" @@ -6341,11 +6657,12 @@ msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (λείπΠ#: modules/gdscript/gd_functions.cpp msgid "Invalid instance dictionary format (can't load script at @path)" msgstr "" -"ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (αδÏνατη η φόÏτωση του script στο @path)" +"ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (αδÏνατη η φόÏτωση της δεσμής ενεÏγειών στο " +"@path)" #: modules/gdscript/gd_functions.cpp msgid "Invalid instance dictionary format (invalid script at @path)" -msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (άκυÏο script στο @path)" +msgstr "ΆκυÏη μοÏφή Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î¹Î³Î¼Î¹Î¿Ï„Ïπων (Μη ÎγκυÏη δεσμή ενεÏγειών στο @path)" #: modules/gdscript/gd_functions.cpp msgid "Invalid instance dictionary (invalid subclasses)" @@ -6615,11 +6932,11 @@ msgstr ": ΆκυÏοι παÏάμετÏοι: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script: " -msgstr "Το VariableGet δεν βÏÎθηκε στο script: " +msgstr "Το VariableGet δεν βÏÎθηκε στη δεσμή ενεÏγειών: " #: modules/visual_script/visual_script_nodes.cpp msgid "VariableSet not found in script: " -msgstr "Το VariableSet δεν βÏÎθηκε στο script: " +msgstr "Το VariableSet δεν βÏÎθηκε στη δεσμή ενεÏγειών: " #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -6644,34 +6961,30 @@ msgstr "μόλις απελευθεÏώθηκε" #: platform/javascript/export/export.cpp msgid "Run in Browser" -msgstr "" +msgstr "ΕκτÎλεση στον πεÏιηγητή" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "ΕκτÎλεση εξαγόμενης HTMP στον Ï€ÏοεπιλεγμÎνο πεÏιηγητή του συστήματος." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "ΑδÏνατη η δημιουÏγία φακÎλου." +msgstr "Δεν ήταν δυνατό το γÏάψιμο στο αÏχείο:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "ΑδÏνατη η δημιουÏγία φακÎλου." +msgstr "Δεν ήταν δυνατή η ανάγνωση του αÏχείου:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "ΑδÏνατη η δημιουÏγία φακÎλου." +msgstr "Δεν ήταν δυνατό το άνοιγμα Ï€ÏοτÏπου για εξαγωγή:\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "" -"ΑδÏνατη η ανάγνωση του αÏχείου πιστοποιητικών. Είναι η διαδÏομή και ο " -"κωδικός σωστοί;" +"Δεν ήταν δυνατή η ανάγνωση του αÏχείου πιστοποιητικών. Είναι η διαδÏομή και " +"ο κωδικός σωστοί;" #: platform/uwp/export/export.cpp msgid "Error creating the signature object." @@ -6793,26 +7106,22 @@ msgstr "" "ΔημιουÏγήστε Îνα πόÏο σχήματος για αυτό!" #: scene/2d/light_2d.cpp -#, fuzzy msgid "" "A texture with the shape of the light must be supplied to the 'texture' " "property." -msgstr "" -"Μία εικόνα με το σχήμα του φωτός Ï€ÏÎπει να δοθεί στην ιδιότητα 'texture'" +msgstr "Μία υφή με το σχήμα του φωτός Ï€ÏÎπει να δοθεί στην ιδιότητα 'texture'." #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"Ένα πολÏγωνο occluder Ï€ÏÎπει να οÏιστεί (ή ζωγÏαφιστεί) για να λειτουÏγήσει " -"αυτός ο occluder." +"Ένα πολÏγωνο εμποδίου Ï€ÏÎπει να οÏιστεί (ή ζωγÏαφιστεί) για να λειτουÏγήσει " +"αυτό το εμπόδιο." #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" msgstr "" -"Το πολÏγωνο occluder για αυτόν τον occluder είναι άδειο. ΖωγÏαφίστε Îνα " +"Το πολÏγωνο εμποδίου για αυτό το εμπόδιο είναι άδειο. ΖωγÏαφίστε Îνα " "πολÏγονο!" #: scene/2d/navigation_polygon.cpp @@ -6838,11 +7147,11 @@ msgstr "" "Ένας κόμβος ParallaxLayer δουλεÏει μόνο όταν κληÏονομεί Îναν κόμβο Ï„Ïπου " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Η ιδιότητα Path Ï€ÏÎπει να δείχνει σε Îναν ÎγκυÏο κόμβο Particles2D για να " -"δουλÎψει." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6915,28 +7224,22 @@ msgstr "Ένα άδειο CollisionPolygon δεν επηÏεάζει την ÏƒÏ #: scene/3d/navigation_mesh.cpp msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "" -"Ένας πόÏος NavigationMesh Ï€ÏÎπει να Îχει οÏισθεί ή δημιουÏγηθεί για να " -"δουλÎψει αυτός ο κόμβος." +"Ένας πόÏος πλÎγματος πλοήγησης θα Ï€ÏÎπει να Îχει οÏισθεί ή δημιουÏγηθεί για " +"να δουλÎψει αυτός ο κόμβος." #: scene/3d/navigation_mesh.cpp msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." msgstr "" -"Ένας κόμβος NavigationMeshInstance Ï€ÏÎπει να κληÏονομεί Îναν κόμβο Ï„Ïπου " -"Navigation, διότι διαθÎτει μόνο δεδομÎνα πλοήγησης." +"Ένας κόμβος Ï„Ïπου στιγμιοτÏπου πλÎγματος πλοήγησης Ï€ÏÎπει να κληÏονομεί Îναν " +"κόμβο Ï„Ïπου πλοήγηση, διότι διαθÎτει μόνο δεδομÎνα πλοήγησης." #: scene/3d/particles.cpp msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6958,6 +7261,15 @@ msgstr "" "Ένας πόÏος SpriteFrames Ï€ÏÎπει να δημιουÏγηθεί ή οÏισθεί στην ιδιότητα " "'Frames' για να δείξει frames το AnimatedSprite3D." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "ΛειτουÏγία εκτÎλεσης:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Ειδοποίηση!" @@ -7002,6 +7314,16 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"Το ScrollContainer είναι φτιαγμÎνο για να δουλεÏει με Îνα μόνο υπο-στοιχείο " +"control.\n" +"ΧÏησιμοποιήστε Îνα container ως παιδί (VBox, HBox, κτλ), ή Îνα Control και " +"οÏίστε το Ï€ÏοσαÏμοσμÎνο ελάχιστο μÎγεθος χειÏοκίνητα." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7021,9 +7343,65 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Εισαγωγή πόÏων στο ÎÏγο." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Ρυθμίσεις ÎÏγου" +#~ msgid "Export the project to many platforms." +#~ msgstr "Εξαγωγή ÎÏγου σε πολλÎÏ‚ πλατφόÏμες." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Ειδοποίηση όταν Îνας εξωτεÏικός πόÏος Îχει αλλάξει." + +#~ msgid "Tutorials" +#~ msgstr "Βοηθήματα" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "" +#~ "Άνοιγμα της ιστοσελίδας https://godotengine.org στην πεÏιοχή tutorials." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Δεν Îχει επιλεγεί σκηνή για τη δημιουÏγία στιγμιοτÏπου!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Στιγμιότυπο στον δÏομÎα" + +#~ msgid "Could not instance scene!" +#~ msgstr "Δεν ήταν δυνατή η δημιουÏγία στιγμιοτÏπου της σκηνής!" + +#~ msgid "Use Default Light" +#~ msgstr "ΧÏήση Ï€ÏοεπιλεγμÎου φωτός" + +#~ msgid "Use Default sRGB" +#~ msgstr "ΧÏήση Ï€ÏοεπιλεγμÎνου sRGB" + +#~ msgid "Default Light Normal:" +#~ msgstr "Î ÏοεπιλεγμÎνο διάνυσμα κανονικής ανάκλασης φωτός:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "ΧÏώμα φωτός πεÏιβάλλοντος:" + +#~ msgid "Couldn't load image" +#~ msgstr "Δεν ήταν δυνατή η φόÏτωση εικόνας" + +#~ msgid "Invalid parent class name" +#~ msgstr "Μη ÎγκυÏο όνομα γονικής κλάσης" + +#~ msgid "Valid chars:" +#~ msgstr "ΈγκυÏοι χαÏακτήÏες:" + +#~ msgid "Valid name" +#~ msgstr "ΈγκυÏο όνομα" + +#~ msgid "Class name is invalid!" +#~ msgstr "Το όνομα της κλάσης δεν είναι ÎγκυÏο!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Το όνομα της γονικής κλάσης δεν είναι ÎγκυÏο!" + +#~ msgid "Invalid path!" +#~ msgstr "Μη ÎγκυÏη διαδÏομή!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Η ιδιότητα Path Ï€ÏÎπει να δείχνει σε Îναν ÎγκυÏο κόμβο Particles2D για να " +#~ "δουλÎψει." #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " diff --git a/editor/translations/es.po b/editor/translations/es.po index f01c84718b..053bbc1085 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -1,6 +1,5 @@ # Spanish translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Alejandro Alvarez <eliluminado00@gmail.com>, 2017. @@ -553,7 +552,8 @@ msgid "Search:" msgstr "Buscar:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -599,7 +599,7 @@ msgstr "Soporte.." msgid "Official" msgstr "Oficial" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Comunidad" @@ -746,6 +746,7 @@ msgstr "Añadir" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Quitar" @@ -856,6 +857,7 @@ msgstr "Recursos" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Ruta" @@ -962,8 +964,7 @@ msgstr "" msgid "Add Bus" msgstr "Añadir todos" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Cargar" @@ -973,6 +974,7 @@ msgid "Save As" msgstr "Guardar como" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Predeterminado" @@ -1047,8 +1049,7 @@ msgid "Rearrange Autoloads" msgstr "Reordenar «Autoloads»" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Ruta:" @@ -1240,7 +1241,8 @@ msgstr "AnalizandoFuentes" msgid "(Re)Importing Assets" msgstr "Reimportando" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Ayuda de búsqueda" @@ -1257,7 +1259,6 @@ msgid "Class:" msgstr "Clase:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Hereda:" @@ -1428,10 +1429,11 @@ msgid "There is no defined scene to run." msgstr "No hay escena definida para ejecutar." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "No se ha definido ninguna escena principal, ¿quieres elegir alguna?\n" "Es posible cambiarla más tarde en «Ajustes del proyecto» bajo la categorÃa " @@ -1496,6 +1498,11 @@ msgid "Save Scene As.." msgstr "Guardar escena como…" #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Nodo" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" "Esta escena nunca se ha guardado. ¿Quieres guardarla antes de ejecutarla?" @@ -1555,7 +1562,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Vaya" @@ -1596,6 +1603,10 @@ msgstr "%d archivos más" msgid "%d more file(s) or folder(s)" msgstr "%d archivos o carpetas más" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Modo sin distracciones" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Escena" @@ -1649,7 +1660,7 @@ msgstr "Cerrar escena" msgid "Close Goto Prev. Scene" msgstr "Cerrar e ir a escena anterior" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Abrir reciente" @@ -1677,84 +1688,41 @@ msgid "Redo" msgstr "Rehacer" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Ejecutar script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Ajustes del proyecto" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Revertir escena" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Salir al listado del proyecto" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Modo sin distracciones" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Herramientas varias o de escenas." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Herramientas" +#, fuzzy +msgid "Project" +msgstr "Proyecto nuevo" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exportar el proyecto a varias plataformas." +msgid "Project Settings" +msgstr "Ajustes del proyecto" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Ejecutar script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exportar" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Inicia el proyecto para poder jugarlo." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Reproducir" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar la escena" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Pausar la escena" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Detener la escena." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Detener" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Reproducir la escena editada." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Reproducir escena" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Reproducir escena personalizada" +msgid "Tools" +msgstr "Herramientas" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Reproducir escena personalizada" +msgid "Quit to Project List" +msgstr "Salir al listado del proyecto" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opciones de depuración" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Depurar" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1843,9 +1811,10 @@ msgstr "" "Cuando se use remotamente en un dispositivo, esto es mas eficiente con un " "sistema de archivos de red." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Ajustes" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Editar" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1866,12 +1835,69 @@ msgid "Manage Export Templates" msgstr "Cargando plantillas de exportación" #: editor/editor_node.cpp +msgid "Help" +msgstr "Ayuda" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Clases" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Cerrar documentación" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "Acerca de" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Alerta cuando un recurso externo haya cambiado." +msgid "Play the project." +msgstr "Inicia el proyecto para poder jugarlo." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Reproducir" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pausar la escena" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausar la escena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Detener la escena." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Detener" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Reproducir la escena editada." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Reproducir escena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Reproducir escena personalizada" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Reproducir escena personalizada" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1955,6 +1981,14 @@ msgid "Thanks!" msgstr "¡Gracias!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importar plantillas desde un archivo ZIP" @@ -1982,6 +2016,36 @@ msgstr "Abrir y ejecutar un script" msgid "Load Errors" msgstr "Errores de carga" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Abrir en el editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Abrir en el editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Abrir en el editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Exportar biblioteca" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Abrir en el editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Abrir en el editor" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Plugins instalados:" @@ -2243,6 +2307,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Mostrar en el navegador de archivos" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "Instanciar" @@ -2271,10 +2339,6 @@ msgid "Info" msgstr "Info" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Mostrar en el navegador de archivos" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Reimportando…" @@ -2443,9 +2507,10 @@ msgid "No target font resource!" msgstr "¡No se ha elegido ningún recurso de tipografÃas!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "La extensión del archivo no es correcta.\n" "Prueba con la extensión .fnt." @@ -2930,7 +2995,7 @@ msgstr "Comprimir" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Añadir al proyecto (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3603,7 +3668,7 @@ msgid "Change default type" msgstr "Cambiar Valor por Defecto" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Aceptar" @@ -3655,18 +3720,6 @@ msgstr "Crear Poly3D" msgid "Set Handle" msgstr "Establecer handle" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#, fuzzy -msgid "Add/Remove Color Ramp Point" -msgstr "Añadir/quitar punto de rampa de color" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Modificar rampa de color" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Crear biblioteca de modelos 3D" @@ -3699,9 +3752,34 @@ msgstr "Actualizar desde escena" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Añadir entrada" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Quitar Punto de ruta" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Cargar recurso" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Modificar Mapa de Curvas" +#: editor/plugins/gradient_editor_plugin.cpp +#, fuzzy +msgid "Add/Remove Color Ramp Point" +msgstr "Añadir/quitar punto de rampa de color" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modificar rampa de color" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Elemento %d" @@ -3980,6 +4058,20 @@ msgid "Remove Poly And Point" msgstr "Quitar polÃgono y punto" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Borrar máscara de emisión" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Generar AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Error al cargar la imagen:" @@ -3993,8 +4085,8 @@ msgid "Set Emission Mask" msgstr "Establecer máscara de emisión" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Borrar máscara de emisión" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4004,6 +4096,27 @@ msgstr "Cargar máscara de emisión" msgid "Generated Point Count:" msgstr "Conteo de puntos generados:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Tiempo promedio (seg)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Establecer máscara de emisión" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Crear desde escena" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Posiciones de emisión:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "El nodo no contiene geometrÃa." @@ -4017,11 +4130,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Generar AABB" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "¡Las caras no contienen área!" @@ -4079,13 +4187,18 @@ msgstr "Relleno de emisión:" msgid "Generate Visibility AABB" msgstr "Generar AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Borrar punto de curva" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Tiempo promedio (seg)" +msgid "Remove Out-Control from Curve" +msgstr "Mover Out-Control en Curva" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Borrar punto de curva" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4144,6 +4257,16 @@ msgstr "Dividir ruta" msgid "Remove Path Point" msgstr "Quitar Punto de ruta" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Mover Out-Control en Curva" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Mover In-Control en Curva" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Crear mapa UV" @@ -4297,6 +4420,11 @@ msgid "Pitch" msgstr "Altura" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Reestablecer huesos" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Error al guardar el tema" @@ -4385,10 +4513,6 @@ msgstr "Buscar…" msgid "Find Next" msgstr "Buscar siguiente" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Depurar" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Step Over" @@ -4422,16 +4546,9 @@ msgid "Move Right" msgstr "Mover a la derecha" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Tutoriales" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Abre https://godotengine.org en la sección de tutoriales." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Clases" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Buscar en la documentación de referencia." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4491,6 +4608,23 @@ msgid "Pick Color" msgstr "Color" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Convirtiendo imágenes" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4570,6 +4704,16 @@ msgid "Goto Previous Breakpoint" msgstr "Ir al «breakpoint» anterior" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Convertir a…" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Convertir a…" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Buscar anterior" @@ -4592,6 +4736,10 @@ msgstr "Ir a lÃnea…" msgid "Contextual Help" msgstr "Ayuda contextual" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Cambiar Constante Escalar" @@ -4811,36 +4959,106 @@ msgid "Animation Key Inserted." msgstr "Clave de animación insertada." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Avanzar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Hacia atrás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Rueda hacia abajo." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Actualizar cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Actualizar cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Actualizar cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vértice" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Alinear con vista" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Entorno" +msgid "Display Normal" +msgstr "Mostrar normales" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Oyente de Audio" +msgid "Display Wireframe" +msgstr "Mostrar polÃgonos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Mostrar superposiciones" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Ventana de transformación" +#, fuzzy +msgid "Display Unshaded" +msgstr "Mostrar sin sombras" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Entorno" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "¡No se ha elegido ninguna escena a instanciar!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Instanciar en cursor" +msgid "Audio Listener" +msgstr "Oyente de Audio" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "¡No se pudo instanciar la escena!" +msgid "XForm Dialog" +msgstr "Ventana de transformación" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4900,6 +5118,26 @@ msgid "Align Selection With View" msgstr "Alinear selección con visor" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Seleccionar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Mover" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Rotar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Escala:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transformar" @@ -4912,14 +5150,6 @@ msgid "Transform Dialog.." msgstr "Ventana de transformación…" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Usar iluminación predeterminada" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Usar sRGB predeterminado" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 visor" @@ -4944,22 +5174,6 @@ msgid "4 Viewports" msgstr "4 visores" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Mostrar normales" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Mostrar polÃgonos" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Mostrar superposiciones" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Mostrar sin sombras" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Ver origen" @@ -4968,6 +5182,10 @@ msgid "View Grid" msgstr "Ver rejilla" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Ajustes" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Ajustes de fijado" @@ -4988,14 +5206,6 @@ msgid "Viewport Settings" msgstr "Ajustes del visor" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Iluminación por normales predeterminada:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Color de iluminación ambiental:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "Anchura de perspectiva (en grados):" @@ -5427,12 +5637,12 @@ msgstr "¡La ruta del proyecto no es correcta, tiene que existir!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "La ruta del proyecto no es correcta, engine.cfg no debe existir." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "¡La ruta del proyecto no es correcta, engine.cfg debe existir." #: editor/project_manager.cpp @@ -5445,7 +5655,7 @@ msgstr "La ruta del proyecto no es correcta (¿has cambiado algo?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "No se pudo crear engine.cfg en la ruta de proyecto." #: editor/project_manager.cpp @@ -5668,6 +5878,11 @@ msgstr "Añadir acción de entrada" msgid "Erase Input Action Event" msgstr "Borrar evento de acción de entrada" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Añadir elemento vacÃo" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Dispositivo" @@ -5734,8 +5949,8 @@ msgstr "Quitar opción de remapeo de recursos" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Ajustes del proyecto" +msgid "Project Settings (project.godot)" +msgstr "Ajustes de proyecto (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5853,10 +6068,6 @@ msgid "Error loading file: Not a resource!" msgstr "Error al cargar el archivo: ¡No es un recurso!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "No se pudo cargar la imagen" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Selecciona un nodo" @@ -6049,6 +6260,11 @@ msgid "Error duplicating scene to save it." msgstr "Error al duplicar escena para guardarla." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Recursos:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Editar grupos" @@ -6130,10 +6346,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Act/Desact. CanvasItem Visible" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opciones de depuración" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instancia:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Script siguiente" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Act/Desact. Espacial Visible" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" "El nombre del nodo no es correcto, las siguientes letras no están permitidas:" @@ -6179,78 +6444,94 @@ msgid "Select a Node" msgstr "Selecciona un nodo" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "El nombre de clase padre no es correcto" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "No se puede crear el script en el sistema de archivos." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Letras permitidas:" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Error al cargar escena desde %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "El nombre de clase no es correcto" +msgid "Path is empty" +msgstr "La ruta está vacia" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Nombre válido" +msgid "Path is not local" +msgstr "La ruta no es local" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/D" +msgid "Invalid base path" +msgstr "Ruta base incorrecta" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "¡El nombre de clase no es correcto!" +msgid "Invalid extension" +msgstr "La extensión no es correcta" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "¡El nombre de clase padre no es correcto!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "¡Ruta incorrecta!" +#, fuzzy +msgid "Invalid Path" +msgstr "Ruta incorrecta." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "No se puede crear el script en el sistema de archivos." +msgid "Invalid class name" +msgstr "El nombre de clase no es correcto" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Error al cargar escena desde %s" +msgid "Invalid inherited parent name or path" +msgstr "El nombre de la propiedad Ãndice no es correcto." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "La ruta está vacia" +#, fuzzy +msgid "Script valid" +msgstr "Script" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "La ruta no es local" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Ruta base incorrecta" +msgid "N/A" +msgstr "N/D" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "La extensión no es correcta" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Crear script" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "Script siguiente" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Hereda:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nombre de clase:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Remover Item" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Script integrado" #: editor/script_create_dialog.cpp @@ -6988,10 +7269,11 @@ msgstr "" "ParallaxLayer node solo funciona cuando esta seteado como hijo de un nodo " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"La propiedad Path debe apuntar a un nodo Particles2D valido para funcionar." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7077,12 +7359,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -7104,6 +7380,15 @@ msgstr "" "Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' " "para que AnimatedSprite3D pueda mostrar frames." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Modo de ejecución:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alerta!" @@ -7149,6 +7434,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7167,9 +7458,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importar elementos al proyecto." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Ajustes de proyecto (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exportar el proyecto a varias plataformas." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Alerta cuando un recurso externo haya cambiado." + +#~ msgid "Tutorials" +#~ msgstr "Tutoriales" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Abre https://godotengine.org en la sección de tutoriales." + +#~ msgid "No scene selected to instance!" +#~ msgstr "¡No se ha elegido ninguna escena a instanciar!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Instanciar en cursor" + +#~ msgid "Could not instance scene!" +#~ msgstr "¡No se pudo instanciar la escena!" + +#~ msgid "Use Default Light" +#~ msgstr "Usar iluminación predeterminada" + +#~ msgid "Use Default sRGB" +#~ msgstr "Usar sRGB predeterminado" + +#~ msgid "Default Light Normal:" +#~ msgstr "Iluminación por normales predeterminada:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Color de iluminación ambiental:" + +#~ msgid "Couldn't load image" +#~ msgstr "No se pudo cargar la imagen" + +#~ msgid "Invalid parent class name" +#~ msgstr "El nombre de clase padre no es correcto" + +#~ msgid "Valid chars:" +#~ msgstr "Letras permitidas:" + +#~ msgid "Valid name" +#~ msgstr "Nombre válido" + +#~ msgid "Class name is invalid!" +#~ msgstr "¡El nombre de clase no es correcto!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "¡El nombre de clase padre no es correcto!" + +#~ msgid "Invalid path!" +#~ msgstr "¡Ruta incorrecta!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "La propiedad Path debe apuntar a un nodo Particles2D valido para " +#~ "funcionar." #~ msgid "Surface" #~ msgstr "Superficie" @@ -7398,9 +7744,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Silencio sobrante al final:" -#~ msgid "Script" -#~ msgstr "Script" - #~ msgid "Script Export Mode:" #~ msgstr "Modo de exportación de scipts:" @@ -7434,9 +7777,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance no contiene un recurso BakedLight." -#~ msgid "Vertex" -#~ msgstr "Vértice" - #~ msgid "Fragment" #~ msgstr "Fragmento" @@ -7472,9 +7812,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "No se puede acceder al subdir:" -#~ msgid "Help" -#~ msgstr "Ayuda" - #~ msgid "Imported Resources" #~ msgstr "Importar Recursos" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index f826517b27..3457d72d9a 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -1,6 +1,5 @@ # Spanish (Argentina) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Lisandro Lorea <lisandrolorea@gmail.com>, 2016-2017. @@ -11,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-01-09 23:10+0000\n" +"PO-Revision-Date: 2017-04-17 00:30+0000\n" "Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" @@ -20,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.14-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -87,9 +86,8 @@ msgid "Anim Track Change Value Mode" msgstr "Cambiar Modo de Valor de Track de Anim" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Cambiar Modo de Valor de Track de Anim" +msgstr "Cambiar Modo de Envoltura de Track de Anim" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -378,7 +376,7 @@ msgstr "Constantes:" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "Archivo" +msgstr " Archivos" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp @@ -514,7 +512,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "Abajo" +msgstr "Descargar" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -548,7 +546,8 @@ msgid "Search:" msgstr "Buscar:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -594,7 +593,7 @@ msgstr "Soporte.." msgid "Official" msgstr "Oficial" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Comunidad" @@ -639,9 +638,8 @@ msgid "No Matches" msgstr "Sin Coincidencias" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." -msgstr "%d Ocurrencia(s) Reemplazadas." +msgstr "%d ocurrencia(s) Reemplazadas." #: editor/code_editor.cpp msgid "Replace" @@ -740,6 +738,7 @@ msgstr "Agregar" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Quitar" @@ -847,6 +846,7 @@ msgstr "Recursos" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Ruta" @@ -937,23 +937,21 @@ msgstr "Eliminar" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Guardar Layout de Bus de Audio Como.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Ubicación para el Nuevo Layout.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Abrir Layout de Bus de Audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Agregar %s" +msgstr "Agregar Bus" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Cargar" @@ -963,6 +961,7 @@ msgid "Save As" msgstr "Guardar Como" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Por Defecto" @@ -1037,8 +1036,7 @@ msgid "Rearrange Autoloads" msgstr "Reordenar Autoloads" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Ruta:" @@ -1106,7 +1104,7 @@ msgstr "Empaquetando" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Plantilla no encontrada:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1226,11 +1224,11 @@ msgid "ScanSources" msgstr "EscanearFuentes" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Reimportando" +msgstr "(Re)Importando Assets" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Buscar en la Ayuda" @@ -1247,7 +1245,6 @@ msgid "Class:" msgstr "Clase:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Hereda:" @@ -1417,10 +1414,11 @@ msgid "There is no defined scene to run." msgstr "No hay escena definida para ejecutar." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "No se ha definido ninguna escena principal, ¿elegir una?\n" "Es posible cambiarla más tarde en \"Ajustes del Proyecto\" bajo la categoria " @@ -1485,6 +1483,11 @@ msgid "Save Scene As.." msgstr "Guardar Escena Como.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Nodo" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Esta escena nunca ha sido guardada. Guardar antes de ejecutar?" @@ -1539,9 +1542,12 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"La escena '%s' fue importada automaticamente, por lo tanto no puede ser " +"modificada.\n" +"Para realizar cambios, se debe crear una nueva escena heredada." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Ugh" @@ -1582,6 +1588,10 @@ msgstr "%d archivo(s) más" msgid "%d more file(s) or folder(s)" msgstr "%d archivo(s) o carpeta(s) más" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Modo Sin Distracciones" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Escena" @@ -1599,9 +1609,8 @@ msgid "Previous tab" msgstr "Pestaña anterior" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "Filtrado Rápido de Archivos.." +msgstr "Filtrar Archivos.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1635,7 +1644,7 @@ msgstr "Cerrar Escena" msgid "Close Goto Prev. Scene" msgstr "Cerrar e Ir a Escena Prev." -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Abrir Reciente" @@ -1663,84 +1672,41 @@ msgid "Redo" msgstr "Rehacer" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Ejecutar Script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Configuración de Proyecto" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Revertir Escena" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Salir a Listado de Proyecto" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Modo Sin Distracciones" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Herramientas misceláneas a nivel proyecto o escena." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Herramientas" +#, fuzzy +msgid "Project" +msgstr "Proyecto Nuevo" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exportar el proyecto a munchas plataformas." +msgid "Project Settings" +msgstr "Configuración de Proyecto" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Ejecutar Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exportar" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Reproducir el proyecto." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Reproducir" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar la escena" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Pausar la Escena" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Parar la escena." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Detener" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Reproducir la escena editada." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Reproducir Escena" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Reproducir escena personalizada" +msgid "Tools" +msgstr "Herramientas" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Reproducir Escena Personalizada" +msgid "Quit to Project List" +msgstr "Salir a Listado de Proyecto" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opciones de debugueo" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Debuguear" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1830,9 +1796,10 @@ msgstr "" "Cuando se use remotamente en un dispositivo, esto es mas eficiente con un " "sistema de archivos de red." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Configuración" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Editar" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1847,17 +1814,73 @@ msgid "Toggle Fullscreen" msgstr "Act./Desact. Pantalla Completa" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Cargando Templates de Exportación" +msgstr "Gestionar Plantillas de Exportación" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Ayuda" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Clases" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Cerrar Docs" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "Acerca de" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Alerta cuando un recurso externo haya cambiado." +msgid "Play the project." +msgstr "Reproducir el proyecto." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Reproducir" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pausar la escena" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausar la Escena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Parar la escena." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Detener" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Reproducir la escena editada." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Reproducir Escena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Reproducir escena personalizada" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Reproducir Escena Personalizada" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1940,8 +1963,16 @@ msgid "Thanks!" msgstr "Gracias!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" -msgstr "Importar Templates Desde Archivo ZIP" +msgstr "Importar Plantillas Desde Archivo ZIP" #: editor/editor_node.cpp msgid "Export Project" @@ -1967,6 +1998,36 @@ msgstr "Abrir y Correr un Script" msgid "Load Errors" msgstr "Erroes de carga" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Abrir en Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Abrir en Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Abrir en Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Exportar Libreria" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Abrir en Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Abrir en Editor" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Plugins Instalados:" @@ -2084,65 +2145,60 @@ msgid "Import From Node:" msgstr "Importar Desde Nodo:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "Volver a Cargar" +msgstr "Volver a Descargar" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Instalar" +msgstr "Desinstalar" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Instalar" +msgstr "(Instalado)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "Abajo" +msgstr "Descargar" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Faltante)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Actual:" +msgstr "(Actual)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Quitar plantilla version '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." -msgstr "No se puede abir el zip de templates de exportación." +msgstr "No se puede abir el zip de plantillas de exportación." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Formato de version.txt invalido dentro de plantillas." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Formato de version.txt invalido dentro de plantillas. Revision no es un " +"identificador valido." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "No se encontro ningún version.txt dentro de las plantillas." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Error al guardar atlas:" +msgstr "Error creando ruta para las plantillas:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Cargando Templates de Exportación" +msgstr "Extrayendo Plantillas de Exportación" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2150,37 +2206,31 @@ msgstr "Importando:" #: editor/export_template_manager.cpp msgid "Loading Export Templates" -msgstr "Cargando Templates de Exportación" +msgstr "Cargando Plantillas de Exportación" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Escena Actual" +msgstr "Version Actual:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Plugins Instalados:" +msgstr "Versiones Instaladas:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "Instalar Proyecto:" +msgstr "Instalar Desde Archivo" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Remover Item" +msgstr "Remover Plantilla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Eliminar archivos seleccionados?" +msgstr "Elegir archivo de plantilla" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "Cargando Templates de Exportación" +msgstr "Gestor de Plantillas de Exportación" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2190,7 +2240,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "No se puede navegar a '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2217,13 +2267,16 @@ msgid "No files selected!" msgstr "Ningún Archivo seleccionado!" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "Expandir al Padre" +msgstr "Expandir todos" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Colapsar todos" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Mostrar en Gestor de Archivos" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2254,10 +2307,6 @@ msgid "Info" msgstr "Info" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Mostrar en Gestor de Archivos" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Reimportando.." @@ -2336,21 +2385,18 @@ msgid "Saving.." msgstr "Guardando.." #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Archivo" +msgstr " Archivos" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Importar" +msgstr "Importar Como:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." msgstr "Preseteo.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" msgstr "Reimportar" @@ -2425,9 +2471,10 @@ msgid "No target font resource!" msgstr "Sin recurso de tipografÃas de destino!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Extension de archivo inválida.\n" "Usá .fnt, por favor." @@ -2911,8 +2958,8 @@ msgstr "Comprimir" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" -msgstr "Agregar al Proyecto (engine.cfg)" +msgid "Add to Project (project.godot)" +msgstr "Agregar al Proyecto (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" @@ -2951,9 +2998,8 @@ msgid "Change Animation Name:" msgstr "Cambiar Nombre de Animación:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Duplicar Animación" +msgstr "Eliminar Animación?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3357,7 +3403,7 @@ msgstr "Editar CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Change Anchors" -msgstr "Cambiar Anchors" +msgstr "Cambiar Anclas" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom (%):" @@ -3579,7 +3625,7 @@ msgid "Change default type" msgstr "Cambiar typo por defecto" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3630,17 +3676,6 @@ msgstr "Crear Poly3D" msgid "Set Handle" msgstr "Setear Handle" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Agregar/Quitar Punto de Rampa de Color" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Modificar Rampa de Color" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Crear LibrerÃa de Meshes" @@ -3673,8 +3708,31 @@ msgstr "Acutalizar desde Escena" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Agregar Entrada" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Quitar Punto del Path" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Cargar Recurso" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" -msgstr "Modificar Mapa de Curvas" +msgstr "Modificar Curva" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Agregar/Quitar Punto de Rampa de Color" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modificar Rampa de Color" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -3713,19 +3771,16 @@ msgid "RMB: Erase Point." msgstr "Click Der.: Borrar Punto." #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Point from Line2D" -msgstr "Remover Punto de Curva" +msgstr "Remover Punto de Line2D" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" -msgstr "Agregar Punto a Curva" +msgstr "Agregar Punto a Line2D" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Move Point in Line2D" -msgstr "Mover Punto en Curva" +msgstr "Mover Punto en Line2D" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3758,9 +3813,8 @@ msgid "Add Point (in empty space)" msgstr "Agregar Punto (en espacio vacÃo)" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Split Segment (in line)" -msgstr "Partir Segmento (en curva)" +msgstr "Partir Segmento (en lÃnea)" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3950,6 +4004,20 @@ msgid "Remove Poly And Point" msgstr "Remover PolÃgono y Punto" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Limpiar Máscara de Emisión" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Generar AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Error al cargar la imagen:" @@ -3962,8 +4030,8 @@ msgid "Set Emission Mask" msgstr "Setear Máscara de Emisión" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Limpiar Máscara de Emisión" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3973,6 +4041,27 @@ msgstr "Cargar Máscara de Emisión" msgid "Generated Point Count:" msgstr "Conteo de Puntos Generados:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Tiempo Promedio (seg)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Setear Máscara de Emisión" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Crear desde Escena" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Puntos de Emisión:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "El nodo no contiene geometrÃa." @@ -3983,12 +4072,7 @@ msgstr "El nodo no contiene geometrÃa (caras)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Generar AABB" +msgstr "Se requiere un material procesador de tipo 'ParticlesMaterial'." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4003,14 +4087,12 @@ msgid "Generate AABB" msgstr "Generar AABB" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Mesh" -msgstr "Crear Emisor desde Mesh" +msgstr "Crear Puntos de Emisión desde Mesh" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Node" -msgstr "Crear Emisor desde Nodo" +msgstr "Crear Puntos de Emisión Desde Nodo" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" @@ -4021,40 +4103,42 @@ msgid "Create Emitter" msgstr "Crear Emisor" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "Posiciones de Emisión:" +msgstr "Puntos de Emisión:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "Superficie %d" +msgstr "Puntos de Superficie" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Puntos de Superficia+Normal (Dirigida)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" msgstr "Volumen" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source: " -msgstr "Relleno de Emisión:" +msgstr "Fuente de Emisión: " #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Generate Visibility AABB" msgstr "Generar AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Remover Punto de Curva" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Tiempo Promedio (seg)" +msgid "Remove Out-Control from Curve" +msgstr "Mover Out-Control en Curva" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Remover Punto de Curva" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4112,6 +4196,16 @@ msgstr "Partir Path" msgid "Remove Path Point" msgstr "Quitar Punto del Path" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Mover Out-Control en Curva" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Mover In-Control en Curva" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Crear Mapa UV" @@ -4265,6 +4359,11 @@ msgid "Pitch" msgstr "Altura" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Reestablecer Huesos" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Error al guardar el tema" @@ -4352,10 +4451,6 @@ msgstr "Encontrar.." msgid "Find Next" msgstr "Encontrar Siguiente" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Debuguear" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Step Over" @@ -4389,16 +4484,9 @@ msgid "Move Right" msgstr "Mover a la Derecha" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Tutoriales" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Abrir https://godotengine.org en la sección de tutoriales." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Clases" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Buscar en la documentación de referencia." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4417,9 +4505,8 @@ msgid "Go to next edited document." msgstr "Ir a siguiente documento editado." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "Discreto" +msgstr "Descartar" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4457,6 +4544,23 @@ msgid "Pick Color" msgstr "Elegir Color" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Convirtiendo Imágenes" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4536,6 +4640,16 @@ msgid "Goto Previous Breakpoint" msgstr "Ir a Anterior Breakpoint" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Convertir A.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Convertir A.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Encontrar Anterior" @@ -4558,6 +4672,10 @@ msgstr "Ir a LÃnea.." msgid "Contextual Help" msgstr "Ayuda Contextual" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Cambiar Constante Escalar" @@ -4775,36 +4893,106 @@ msgid "Animation Key Inserted." msgstr "Clave de Animación Insertada." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Avanzar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Hacia Atrás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Rueda Abajo." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Actualizar Cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Actualizar Cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Actualizar Cambios" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vértice" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Alinear con vista" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Entorno" +msgid "Display Normal" +msgstr "Mostrar Normal" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Oyente de Audio" +msgid "Display Wireframe" +msgstr "Mostrar Wireframe" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Mostrar Overdraw" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Dialogo XForm" +#, fuzzy +msgid "Display Unshaded" +msgstr "Mostrar sin Sombreado" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Ninguna escena seleccionada a la instancia!" +#, fuzzy +msgid "View Environment" +msgstr "Entorno" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Instancia en Cursor" +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "No se pudo instanciar la escena!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "Oyente de Audio" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Dialogo XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4863,6 +5051,26 @@ msgid "Align Selection With View" msgstr "Alinear Selección Con Vista" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Seleccionar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Mover" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Rotar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Escala:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transformar" @@ -4875,14 +5083,6 @@ msgid "Transform Dialog.." msgstr "Dialogo de Transformación.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Usar Luz por Defecto" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Usar sRGB por Defecto" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 Viewport" @@ -4907,22 +5107,6 @@ msgid "4 Viewports" msgstr "4 Viewports" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Mostrar Normales" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Mostrar Wireframe" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Mostrar Overdraw" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Mostrar sin Sombreado" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Ver Origen" @@ -4931,6 +5115,10 @@ msgid "View Grid" msgstr "Ver Grilla" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Configuración" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Ajustes de Snap" @@ -4951,14 +5139,6 @@ msgid "Viewport Settings" msgstr "Ajustes de Viewport" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Normales de Luces por Defecto:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Color de Luz Ambiental:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "FOV de Perspectiva (grados.):" @@ -5133,11 +5313,11 @@ msgstr "Quitar Items de Clases" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "Crear Template VacÃo" +msgstr "Crear Plantilla VacÃa" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "Crear Template de Editor VacÃo" +msgstr "Crear Plantilla de Editor VacÃa" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5297,24 +5477,20 @@ msgid "Error" msgstr "Error" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Activar" +msgstr "Ejecutable" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '" -msgstr "Eliminar Entrada" +msgstr "Eliminar parche '" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Eliminar archivos seleccionados?" +msgstr "Eliminar preset '%s'?" #: editor/project_export.cpp -#, fuzzy msgid "Presets" -msgstr "Preseteo.." +msgstr "Presets" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5325,63 +5501,54 @@ msgid "Resources" msgstr "Recursos" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Exportar todos los recursos en el proyecto." +msgstr "Exportar todos los recursos en el proyecto" #: editor/project_export.cpp -#, fuzzy msgid "Export selected scenes (and dependencies)" -msgstr "Exportar los recursos seleccionado (incluyendo dependencias)." +msgstr "Exportar escenas seleccionadas (y dependencias)" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" -msgstr "Exportar los recursos seleccionado (incluyendo dependencias)." +msgstr "Exportar ecursos seleccionados (y dependencias)" #: editor/project_export.cpp msgid "Export Mode:" msgstr "Modo de Exportación:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "Recursos a Exportar:" +msgstr "Recursos a exportar:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" "Filtros para exportar archivos que no son recursos (separados por comas, ej: " -"*.json, *.txt):" +"*.json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" -"Filtros para excluir de la exportación (separados por comas, ej: *.json, *." -"txt):" +"Filtros para excluir archivos del proyecto (separados por comas, ej: *.json, " +"*.txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "Coincidencias:" +msgstr "Parches" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Ruta de Destino:" +msgstr "Crear Parche" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Faltan las plantillas de exportación para esta plataforma:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Exportar Tile Set" +msgstr "Exportar Como Debug" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" @@ -5389,13 +5556,13 @@ msgstr "Ruta de proyecto inválida, la ruta debe existir!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." -msgstr "Ruta de proyecto inválida, engine.cfg no debe existir." +msgid "Invalid project path, project.godot must not exist." +msgstr "Ruta de proyecto inválida, godot.cfg no debe existir." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." -msgstr "Ruta de proyecto inválida, engine.cfg debe existir." +msgid "Invalid project path, project.godot must exist." +msgstr "Ruta de proyecto inválida, godot.cfg debe existir." #: editor/project_manager.cpp msgid "Imported Project" @@ -5407,8 +5574,8 @@ msgstr "Ruta de proyecto inválida (cambiaste algo?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." -msgstr "No se pudo crear engine.cfg en la ruta de proyecto." +msgid "Couldn't create project.godot in project path." +msgstr "No se pudo crear godot.cfg en la ruta de proyecto." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" @@ -5507,7 +5674,7 @@ msgstr "Proyecto Nuevo" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "Remover Item" +msgstr "Remover Plantilla" #: editor/project_manager.cpp msgid "Exit" @@ -5609,18 +5776,16 @@ msgid "Button 9" msgstr "Botón 9" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Axis Index:" -msgstr "Indice de Ejes de Joystick:" +msgstr "Indice del Eje del Gamepad:" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Axis" msgstr "Eje" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Button Index:" -msgstr "Indice de Botones de Joystick:" +msgstr "Indice del Boton del Gamepad:" #: editor/project_settings.cpp msgid "Add Input Action" @@ -5630,6 +5795,11 @@ msgstr "Agregar Acción de Entrada" msgid "Erase Input Action Event" msgstr "Borrar Evento de Acción de Entrada" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Agregar VacÃo" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Dispositivo" @@ -5696,8 +5866,8 @@ msgstr "Remover Opción de Remapeo de Recursos" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Configuración de Proyecto" +msgid "Project Settings (project.godot)" +msgstr "Configuración de Proyecto (godot.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5764,9 +5934,8 @@ msgid "AutoLoad" msgstr "AutoLoad" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 Viewport" +msgstr "Seleccionar un Viewport" #: editor/property_editor.cpp msgid "Ease In" @@ -5805,20 +5974,14 @@ msgid "New Script" msgstr "Nuevo Script" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "FileSystem" +msgstr "Mostrar en Sistema de Archivos" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "Error al cargar el archivo: No es un recurso!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "No se pudo cargar la imagen" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "Seleccionar un Nodo" @@ -5965,7 +6128,7 @@ msgstr "Esta operación no puede hacerse sin una escena." #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "No se puede realizar sobre el nodo raÃz." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6009,6 +6172,11 @@ msgid "Error duplicating scene to save it." msgstr "Error al duplicar escena para guardarla." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Recursos:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Editar Grupos" @@ -6049,9 +6217,8 @@ msgid "Save Branch as Scene" msgstr "Guardar Rama como Escena" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "Copiar Ruta" +msgstr "Copiar Ruta del Nodo" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -6086,10 +6253,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Act/Desact. CanvasItem Visible" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opciones de debugueo" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instancia:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Script siguiente" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Act/Desact. Espacial Visible" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Nobre de nodo inválido, los siguientes caracteres no estan permitidos:" @@ -6134,75 +6350,93 @@ msgid "Select a Node" msgstr "Seleccionar un Nodo" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Nombre de clase padre inválido" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "No se puede crear el script en el sistema de archivos." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Caracteres válidos:" +msgid "Error loading script from %s" +msgstr "Error al cargar el script desde %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Nombre de clase inválido" +msgid "Path is empty" +msgstr "La ruta está vacia" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Nombre válido" +msgid "Path is not local" +msgstr "La ruta no es local" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid base path" +msgstr "Ruta base inválida" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "El nombre de clase es inválido!" +msgid "Invalid extension" +msgstr "Extensión invalida" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "El nombre de la clase padre es inválido!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Ruta inválida!" +#, fuzzy +msgid "Invalid Path" +msgstr "Ruta inválida." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "No se puede crear el script en el sistema de archivos." +msgid "Invalid class name" +msgstr "Nombre de clase inválido" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "Error al cargar el script desde %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Nombre de propiedad indÃce inválido." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "La ruta está vacia" +#, fuzzy +msgid "Script valid" +msgstr "Script" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "La ruta no es local" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Ruta base inválida" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Extensión invalida" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "Crear script nuevo" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "Cargar script existente" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Hereda:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nombre de Clase:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Remover Plantilla" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Script Integrado (Built-In)" #: editor/script_create_dialog.cpp @@ -6432,8 +6666,8 @@ msgid "" "A node yielded without working memory, please read the docs on how to yield " "properly!" msgstr "" -"Un nodo rindió(yielded) sin memoria de trabajo, por favor lee los docs sobre " -"como usar yield correctamente!" +"Un nodo realizó un yield sin memoria de trabajo, por favor leé la " +"documentacion sobre como usar yield correctamente!" #: modules/visual_script/visual_script.cpp msgid "" @@ -6715,31 +6949,26 @@ msgid "just released" msgstr "recién soltado" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "Examinar" +msgstr "Ejecutar en el Navegador" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Ejecutar HTML exportado en el navegador por defecto del sistema." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "No se pudo cargar el tile:" +msgstr "No se pudo escribir el archivo:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "No se pudo cargar el tile:" +msgstr "No se pudo leer el archivo:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "No se pudo crear la carpeta." +msgstr "No se pudo abrir la plantilla para exportar:\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "" @@ -6759,8 +6988,8 @@ msgid "" "No export templates found.\n" "Download and install export templates." msgstr "" -"No se encontraron export templates.\n" -"Descargá o instalá export templates." +"No se encontraron plantillas de exportación.\n" +"Descargá o instalá plantillas de exportación." #: platform/uwp/export/export.cpp msgid "Custom debug package not found." @@ -6915,10 +7144,11 @@ msgstr "" "ParallaxLayer node solo funciona cuando esta seteado como hijo de un nodo " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"La propiedad Path debe apuntar a un nodo Particles2D valido para funcionar." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7003,12 +7233,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -7029,6 +7253,15 @@ msgstr "" "Un recurso SpriteFrames debe ser creado o asignado en la propiedad 'Frames' " "para que AnimatedSprite3D pueda mostrar frames." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Modo de Ejecución:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alerta!" @@ -7073,6 +7306,15 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer esta diseñado para trabajan con un unico control hijo.\n" +"Usá un container como hijo (VBox, HBox, etc), o un Control y seteá el tamaño " +"mÃnimo personalizado de forma manual." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7092,9 +7334,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importar assets al proyecto." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Ajustes de Proyecto (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exportar el proyecto a munchas plataformas." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Alerta cuando un recurso externo haya cambiado." + +#~ msgid "Tutorials" +#~ msgstr "Tutoriales" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Abrir https://godotengine.org en la sección de tutoriales." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Ninguna escena seleccionada a la instancia!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Instancia en Cursor" + +#~ msgid "Could not instance scene!" +#~ msgstr "No se pudo instanciar la escena!" + +#~ msgid "Use Default Light" +#~ msgstr "Usar Luz por Defecto" + +#~ msgid "Use Default sRGB" +#~ msgstr "Usar sRGB por Defecto" + +#~ msgid "Default Light Normal:" +#~ msgstr "Normales de Luces por Defecto:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Color de Luz Ambiental:" + +#~ msgid "Couldn't load image" +#~ msgstr "No se pudo cargar la imagen" + +#~ msgid "Invalid parent class name" +#~ msgstr "Nombre de clase padre inválido" + +#~ msgid "Valid chars:" +#~ msgstr "Caracteres válidos:" + +#~ msgid "Valid name" +#~ msgstr "Nombre válido" + +#~ msgid "Class name is invalid!" +#~ msgstr "El nombre de clase es inválido!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "El nombre de la clase padre es inválido!" + +#~ msgid "Invalid path!" +#~ msgstr "Ruta inválida!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "La propiedad Path debe apuntar a un nodo Particles2D valido para " +#~ "funcionar." #~ msgid "Surface" #~ msgstr "Superficie" @@ -7315,9 +7612,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Silencio Sobrante al Final:" -#~ msgid "Script" -#~ msgstr "Script" - #~ msgid "Script Export Mode:" #~ msgstr "Modo de Exportación de Scipts:" @@ -7351,9 +7645,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance no contiene un recurso BakedLight." -#~ msgid "Vertex" -#~ msgstr "Vértice" - #~ msgid "Fragment" #~ msgstr "Fragmento" @@ -7396,9 +7687,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "No se puede acceder al subdir:" -#~ msgid "Help" -#~ msgstr "Ayuda" - #~ msgid "Imported Resources" #~ msgstr "Importar Recursos" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index e8402fcb25..e8132b9936 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -1,6 +1,5 @@ # Persian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # alabd14313 <alabd14313@yahoo.com>, 2016. @@ -545,7 +544,8 @@ msgid "Search:" msgstr "جستجو:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -591,7 +591,7 @@ msgstr "پشتیبانی.." msgid "Official" msgstr "Ø¯ÙØªØ±ÛŒ" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "انجمن" @@ -735,6 +735,7 @@ msgstr "Ø§ÙØ²ÙˆØ¯Ù†" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "برداشتن" @@ -846,6 +847,7 @@ msgstr "منبع" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "مسیر" @@ -950,8 +952,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -961,6 +962,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Ù¾ÛŒØ´ÙØ±Ø¶" @@ -1029,8 +1031,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "مسیر:" @@ -1222,7 +1223,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "در ØØ§Ù„ وارد کردن دوباره..." -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1239,7 +1241,6 @@ msgid "Class:" msgstr "کلاس:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "میراث:" @@ -1410,8 +1411,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1465,6 +1466,10 @@ msgid "Save Scene As.." msgstr "ذخیره صØÙ†Ù‡ در ..." #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1521,7 +1526,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1559,6 +1564,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "صØÙ†Ù‡" @@ -1611,7 +1620,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1639,35 +1648,24 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "" +#, fuzzy +msgid "Project" +msgstr "صادر کردن پروژه" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Tools" -msgstr "ابزارها" - -#: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1675,47 +1673,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "پخش" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" +msgid "Tools" +msgstr "ابزارها" #: editor/editor_node.cpp -msgid "Play the edited scene." +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "پخش صØÙ†Ù‡" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" - -#: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" - -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1786,9 +1752,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "ØªØ±Ø¬ÛŒØØ§Øª" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "ویرایش کردن" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1808,14 +1775,70 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "معرÙÛŒ" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "پخش" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." msgstr "" #: editor/editor_node.cpp +msgid "Play Scene" +msgstr "پخش صØÙ†Ù‡" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "پخش Ø³ÙØ§Ø±Ø´ÛŒ صØÙ†Ù‡" + +#: editor/editor_node.cpp msgid "Spins when the editor window repaints!" msgstr "" @@ -1896,6 +1919,14 @@ msgid "Thanks!" msgstr "تشکرات!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "واردکردن قالب ها از درون یک ÙØ§ÛŒÙ„ ZIP" @@ -1923,6 +1954,35 @@ msgstr "باز کردن Ùˆ اجرای یک اسکریپت" msgid "Load Errors" msgstr "خطاهای بارگذاری" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "یک دیکشنری را باز Ú©Ù†" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "یک دیکشنری را باز Ú©Ù†" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "ویرایشگر بستگی" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "صادکردن ÙØ§ÛŒÙ„ کتابخانه ای" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "ویرایشگر بستگی" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Ø§ÙØ²ÙˆÙ†Ù‡ های نصب شده:" @@ -2171,6 +2231,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2199,10 +2263,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2370,7 +2430,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2847,7 +2907,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3509,7 +3569,7 @@ msgid "Change default type" msgstr "نوع مقدار آرایه را تغییر بده" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "مواÙقت" @@ -3558,17 +3618,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3600,9 +3649,33 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Signal را اضاÙÙ‡ Ú©Ù†" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "برداشتن موج" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "خطاهای بارگذاری" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3873,6 +3946,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3885,7 +3971,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3896,20 +3982,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3964,12 +4063,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4027,6 +4130,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "برداشتن نقش" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4180,6 +4292,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4268,10 +4384,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4305,15 +4417,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4369,6 +4473,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4448,6 +4568,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "اتصال به گره:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4470,6 +4599,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4687,35 +4820,98 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "به سمت عقب" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "غلطاندن به پایین." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "تغییر بده" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4775,23 +4971,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "همه‌ی انتخاب ها" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4819,22 +5024,6 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "" @@ -4843,6 +5032,10 @@ msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "ØªØ±Ø¬ÛŒØØ§Øª" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "" @@ -4863,14 +5056,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5286,11 +5471,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5302,7 +5487,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5521,6 +5706,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "دستگاه" @@ -5586,9 +5775,8 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -#, fuzzy -msgid "Project Settings " -msgstr "ØªØ±Ø¬ÛŒØØ§Øª" +msgid "Project Settings (project.godot)" +msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5704,10 +5892,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "مسیر به سمت گره:" @@ -5895,6 +6079,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "منبع" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5971,10 +6160,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "باز کردن Ùˆ اجرای یک اسکریپت" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6019,77 +6255,91 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "نمی‌تواند یک پوشه ایجاد شود." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "خطای بارگذاری قلم." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "مسیر نامعتبر." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "خطای بارگذاری قلم." +msgid "Invalid inherited parent name or path" +msgstr "نام دارایی ایندکس نامعتبر." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "جدید ایجاد Ú©Ù†" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" -msgstr "" +#, fuzzy +msgid "Inherits" +msgstr "میراث:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" +msgstr "کلاس:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "برداشتن انتخاب شده" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6796,9 +7046,11 @@ msgstr "" "گره ParallaxLayer تنها در زمانی Ú©Ù‡ به عنوان ÙØ±Ø²Ù†Ø¯ یک گره ParallaxBackground " "تنظیم شود کار می‌کند." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "دارایی Path باید به یک گره Particles2D معتبر اشاره کند تا کار کند." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6885,12 +7137,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6911,6 +7157,14 @@ msgstr "" "یک منبع SpriteFrames باید در دارایی Frames ایجاد شده باشد تا " "AnimatedSprite3D ÙØ±ÛŒÙ…‌ها را نمایش دهد." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "هشدار!" @@ -6956,6 +7210,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6968,6 +7228,9 @@ msgstr "" "تا بتواند یک اندازه بگیرد. در غیر اینصورت، آن را یک RenderTarget قرار دهید Ùˆ " "Ø¨Ø§ÙØª داخلی آن را برای نمایش به تعدادی گره تخصیص دهید." +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "دارایی Path باید به یک گره Particles2D معتبر اشاره کند تا کار کند." + #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " #~ "in order for SamplePlayer to play sound." diff --git a/editor/translations/fi.po b/editor/translations/fi.po new file mode 100644 index 0000000000..d2b6a98223 --- /dev/null +++ b/editor/translations/fi.po @@ -0,0 +1,7260 @@ +# Finnish translation of the Godot Engine editor +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community +# This file is distributed under the same license as the Godot source code. +# +# ekeimaja <ekeimaja@gmail.com>, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Godot Engine editor\n" +"PO-Revision-Date: 2017-04-16 13:21+0000\n" +"Last-Translator: ekeimaja <ekeimaja@gmail.com>\n" +"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" +"godot/fi/>\n" +"Language: fi\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.14-dev\n" + +#: editor/animation_editor.cpp +msgid "Disabled" +msgstr "Poistettu käytöstä" + +#: editor/animation_editor.cpp +msgid "All Selection" +msgstr "Koko valinta" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Move Add Key" +msgstr "Siirrä lisäyspainiketta" + +#: editor/animation_editor.cpp +msgid "Anim Change Transition" +msgstr "Vaihda animaation siirtymää" + +#: editor/animation_editor.cpp +msgid "Anim Change Transform" +msgstr "Vaihda animaation muunnosta" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Anim Change Value" +msgstr "Animaation muutosarvo" + +#: editor/animation_editor.cpp +msgid "Anim Change Call" +msgstr "" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Anim Add Track" +msgstr "Lisää animaatioraita" + +#: editor/animation_editor.cpp +msgid "Anim Duplicate Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Up" +msgstr "Siirrä animaatioraita ylös" + +#: editor/animation_editor.cpp +msgid "Move Anim Track Down" +msgstr "Siirrä animaatioraita alas" + +#: editor/animation_editor.cpp +msgid "Remove Anim Track" +msgstr "Poista animaation raita" + +#: editor/animation_editor.cpp +msgid "Set Transitions to:" +msgstr "Aseta siirtymät:" + +#: editor/animation_editor.cpp +msgid "Anim Track Rename" +msgstr "Nimeä animaatioraita uudelleen" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Interpolation" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Value Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Track Change Wrap Mode" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Node Curve" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Edit Selection Curve" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Delete Keys" +msgstr "Poista avaimet" + +#: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp +msgid "Duplicate Selection" +msgstr "Monista valinta" + +#: editor/animation_editor.cpp +msgid "Duplicate Transposed" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove Selection" +msgstr "Poista valinta" + +#: editor/animation_editor.cpp +msgid "Continuous" +msgstr "Jatkuva" + +#: editor/animation_editor.cpp +msgid "Discrete" +msgstr "Erillinen" + +#: editor/animation_editor.cpp +msgid "Trigger" +msgstr "Liipaisin" + +#: editor/animation_editor.cpp +msgid "Anim Add Key" +msgstr "Lisää avain" + +#: editor/animation_editor.cpp +msgid "Anim Move Keys" +msgstr "SIirrä avaimia" + +#: editor/animation_editor.cpp +msgid "Scale Selection" +msgstr "Skaalaa valintaa" + +#: editor/animation_editor.cpp +msgid "Scale From Cursor" +msgstr "Skaalaa kursorista" + +#: editor/animation_editor.cpp +msgid "Goto Next Step" +msgstr "Mene seuraavaan vaiheeseen" + +#: editor/animation_editor.cpp +msgid "Goto Prev Step" +msgstr "Mene edelliseen vaiheeseen" + +#: editor/animation_editor.cpp editor/property_editor.cpp +msgid "Linear" +msgstr "Lineaarinen" + +#: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Constant" +msgstr "Jatkuva" + +#: editor/animation_editor.cpp +msgid "In" +msgstr "Sisään" + +#: editor/animation_editor.cpp +msgid "Out" +msgstr "Ulos" + +#: editor/animation_editor.cpp +msgid "In-Out" +msgstr "Sisältä ulos" + +#: editor/animation_editor.cpp +msgid "Out-In" +msgstr "Ulkoa sisään" + +#: editor/animation_editor.cpp +msgid "Transitions" +msgstr "Siirtymät" + +#: editor/animation_editor.cpp +msgid "Optimize Animation" +msgstr "Optimoi animaatio" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation" +msgstr "Siivoa animaatio" + +#: editor/animation_editor.cpp +msgid "Create NEW track for %s and insert key?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Create %d NEW tracks and insert keys?" +msgstr "" + +#: editor/animation_editor.cpp editor/create_dialog.cpp +#: editor/editor_audio_buses.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp +#: editor/script_create_dialog.cpp +msgid "Create" +msgstr "Luo" + +#: editor/animation_editor.cpp +msgid "Anim Create & Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Track & Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Change Anim Len" +msgstr "" + +#: editor/animation_editor.cpp +#, fuzzy +msgid "Change Anim Loop" +msgstr "Vaihda animaation toistoa" + +#: editor/animation_editor.cpp +msgid "Anim Create Typed Value Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Insert" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Scale Keys" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim Add Call Track" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Animation zoom." +msgstr "Animaation zoom." + +#: editor/animation_editor.cpp +msgid "Length (s):" +msgstr "Pituus (s):" + +#: editor/animation_editor.cpp +msgid "Animation length (in seconds)." +msgstr "Animaation pituus (sekunteina)." + +#: editor/animation_editor.cpp +msgid "Step (s):" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Cursor step snap (in seconds)." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Enable/Disable looping in animation." +msgstr "Ota käyttöön/poista käytöstä animaation toisto." + +#: editor/animation_editor.cpp +msgid "Add new tracks." +msgstr "Lisää uusia raitoja." + +#: editor/animation_editor.cpp +msgid "Move current track up." +msgstr "Siirrä nykyinen raita ylös." + +#: editor/animation_editor.cpp +msgid "Move current track down." +msgstr "Siirrä nykyinen raita alas." + +#: editor/animation_editor.cpp +msgid "Remove selected track." +msgstr "Poista valittu raita." + +#: editor/animation_editor.cpp +msgid "Track tools" +msgstr "Raidan työkalut" + +#: editor/animation_editor.cpp +msgid "Enable editing of individual keys by clicking them." +msgstr "" + +#: editor/animation_editor.cpp +msgid "Anim. Optimizer" +msgstr "Animaation optimoija" + +#: editor/animation_editor.cpp +msgid "Max. Linear Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max. Angular Error:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Max Optimizable Angle:" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Optimize" +msgstr "Optimoi" + +#: editor/animation_editor.cpp +msgid "Select an AnimationPlayer from the Scene Tree to edit animations." +msgstr "Valitse AnimationPlayer Scenepuusta muokataksesi animaatioita." + +#: editor/animation_editor.cpp +msgid "Key" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Transition" +msgstr "Siirtymä" + +#: editor/animation_editor.cpp +msgid "Scale Ratio:" +msgstr "Skaalaussuhde:" + +#: editor/animation_editor.cpp +msgid "Call Functions in Which Node?" +msgstr "" + +#: editor/animation_editor.cpp +msgid "Remove invalid keys" +msgstr "Poista virheelliset avaimet" + +#: editor/animation_editor.cpp +msgid "Remove unresolved and empty tracks" +msgstr "Poista ratkaisemattomat ja tyhjät raidat" + +#: editor/animation_editor.cpp +msgid "Clean-up all animations" +msgstr "Siivoa kaikki animaatiot" + +#: editor/animation_editor.cpp +msgid "Clean-Up Animation(s) (NO UNDO!)" +msgstr "Siivoa animaatio(t) (EI VOI KUMOTA)" + +#: editor/animation_editor.cpp +msgid "Clean-Up" +msgstr "Siivoa" + +#: editor/array_property_edit.cpp +msgid "Resize Array" +msgstr "Muuta taulukon kokoa" + +#: editor/array_property_edit.cpp +msgid "Change Array Value Type" +msgstr "Vaihda taulukon arvon tyyppiä" + +#: editor/array_property_edit.cpp +msgid "Change Array Value" +msgstr "Vaihda taulukon arvoa" + +#: editor/asset_library_editor_plugin.cpp +msgid "Free" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp editor/editor_plugin_settings.cpp +msgid "Version:" +msgstr "Versio:" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Contents:" +msgstr "Vakiot:" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "View Files" +msgstr " Tiedostot" + +#: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp +#: editor/editor_help.cpp editor/property_selector.cpp +#: editor/script_editor_debugger.cpp +msgid "Description:" +msgstr "Kuvaus:" + +#: editor/asset_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Install" +msgstr "Asenna" + +#: editor/asset_library_editor_plugin.cpp editor/call_dialog.cpp +#: editor/connections_dialog.cpp editor/export_template_manager.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sample_library_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/project_settings.cpp +#: editor/property_editor.cpp editor/run_settings_dialog.cpp +#: editor/settings_config_dialog.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Close" +msgstr "Sulje" + +#: editor/asset_library_editor_plugin.cpp +msgid "Can't resolve hostname:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Can't resolve." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Connection error, please try again." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Can't connect." +msgstr "Yhdistä..." + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Can't connect to host:" +msgstr "Yhdistä Nodeen:" + +#: editor/asset_library_editor_plugin.cpp +msgid "No response from host:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "No response." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Request failed, return code:" +msgstr "Pyydetty tiedostomuoto tuntematon:" + +#: editor/asset_library_editor_plugin.cpp +msgid "Req. Failed." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Request failed, too many redirects" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Redirect Loop." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Failed:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Bad download hash, assuming file has been tampered with." +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Expected:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Got:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Failed sha256 hash check" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Asset Download Error:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Success!" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Fetching:" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Resolving.." +msgstr "Tallennetaan..." + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Connecting.." +msgstr "Yhdistä..." + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Requesting.." +msgstr "Testaus" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Error making request" +msgstr "Virhe tallennettaessa resurssia!" + +#: editor/asset_library_editor_plugin.cpp +msgid "Idle" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Retry" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Download Error" +msgstr "Lataa" + +#: editor/asset_library_editor_plugin.cpp +msgid "Download for this asset is already in progress!" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "first" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "prev" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "next" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "last" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "All" +msgstr "Kaikki" + +#: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp editor/settings_config_dialog.cpp +msgid "Search:" +msgstr "Hae:" + +#: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp +msgid "Search" +msgstr "Hae" + +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp +#: editor/io_plugins/editor_mesh_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +#: editor/io_plugins/editor_translation_import_plugin.cpp +#: editor/project_manager.cpp +msgid "Import" +msgstr "Tuo" + +#: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp +msgid "Plugins" +msgstr "" + +#: editor/asset_library_editor_plugin.cpp +msgid "Sort:" +msgstr "Lajittele:" + +#: editor/asset_library_editor_plugin.cpp +msgid "Reverse" +msgstr "Käänteinen" + +#: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp +msgid "Category:" +msgstr "Kategoria:" + +#: editor/asset_library_editor_plugin.cpp +msgid "Site:" +msgstr "Sivu:" + +#: editor/asset_library_editor_plugin.cpp +msgid "Support.." +msgstr "Tuki..." + +#: editor/asset_library_editor_plugin.cpp +msgid "Official" +msgstr "Virallinen" + +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp +msgid "Community" +msgstr "Yhteisö" + +#: editor/asset_library_editor_plugin.cpp +#, fuzzy +msgid "Testing" +msgstr "Testaus" + +#: editor/asset_library_editor_plugin.cpp +msgid "Assets ZIP File" +msgstr "" + +#: editor/call_dialog.cpp +msgid "Method List For '%s':" +msgstr "" + +#: editor/call_dialog.cpp modules/visual_script/visual_script_editor.cpp +msgid "Call" +msgstr "Kutsu" + +#: editor/call_dialog.cpp +msgid "Method List:" +msgstr "Metodilista:" + +#: editor/call_dialog.cpp +msgid "Arguments:" +msgstr "Argumentit:" + +#: editor/call_dialog.cpp +msgid "Return:" +msgstr "Palaa:" + +#: editor/code_editor.cpp +msgid "Go to Line" +msgstr "Mene riville" + +#: editor/code_editor.cpp +msgid "Line Number:" +msgstr "RIvinumero:" + +#: editor/code_editor.cpp +msgid "No Matches" +msgstr "Ei osumia" + +#: editor/code_editor.cpp +msgid "Replaced %d occurrence(s)." +msgstr "Korvattu %d osuvuutta." + +#: editor/code_editor.cpp +msgid "Replace" +msgstr "Korvaa" + +#: editor/code_editor.cpp +msgid "Replace All" +msgstr "Korvaa kaikki" + +#: editor/code_editor.cpp +msgid "Match Case" +msgstr "Huomioi kirjainkoko" + +#: editor/code_editor.cpp +msgid "Whole Words" +msgstr "Kokonaisia sanoja" + +#: editor/code_editor.cpp +msgid "Selection Only" +msgstr "Pelkkä valinta" + +#: editor/code_editor.cpp editor/editor_help.cpp +msgid "Find" +msgstr "Etsi" + +#: editor/code_editor.cpp +msgid "Next" +msgstr "Seuraava" + +#: editor/code_editor.cpp +msgid "Not found!" +msgstr "Ei löytynyt!" + +#: editor/code_editor.cpp +msgid "Replace By" +msgstr "Korvaa" + +#: editor/code_editor.cpp +msgid "Case Sensitive" +msgstr "Merkkikokoriippuvainen" + +#: editor/code_editor.cpp +msgid "Backwards" +msgstr "Taaksepäin" + +#: editor/code_editor.cpp +msgid "Prompt On Replace" +msgstr "" + +#: editor/code_editor.cpp +msgid "Skip" +msgstr "Ohita" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom In" +msgstr "Lähennä" + +#: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Out" +msgstr "Loitonna" + +#: editor/code_editor.cpp +msgid "Reset Zoom" +msgstr "Nollaa lähennys" + +#: editor/code_editor.cpp editor/script_editor_debugger.cpp +msgid "Line:" +msgstr "Rivi:" + +#: editor/code_editor.cpp +msgid "Col:" +msgstr "Kolumni:" + +#: editor/connections_dialog.cpp +msgid "Method in target Node must be specified!" +msgstr "Kohdenoden metodi täytyy määrittää!" + +#: editor/connections_dialog.cpp +msgid "" +"Target method not found! Specify a valid method or attach a script to target " +"Node." +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Connect To Node:" +msgstr "Yhdistä Nodeen:" + +#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp +#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings.cpp +msgid "Add" +msgstr "Lisää" + +#: editor/connections_dialog.cpp editor/dependency_editor.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp +msgid "Remove" +msgstr "Poista" + +#: editor/connections_dialog.cpp +msgid "Add Extra Call Argument:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Extra Call Arguments:" +msgstr "" + +#: editor/connections_dialog.cpp +msgid "Path to Node:" +msgstr "Polku Nodeen:" + +#: editor/connections_dialog.cpp +msgid "Make Function" +msgstr "Tee funktio" + +#: editor/connections_dialog.cpp +msgid "Deferred" +msgstr "Lykätty" + +#: editor/connections_dialog.cpp +#, fuzzy +msgid "Oneshot" +msgstr "Ainoa" + +#: editor/connections_dialog.cpp +msgid "Connect" +msgstr "Yhdistä" + +#: editor/connections_dialog.cpp +msgid "Connect '%s' to '%s'" +msgstr "Yhdistä '%s' '%s':n" + +#: editor/connections_dialog.cpp +msgid "Connecting Signal:" +msgstr "Yhdistävä signaali:" + +#: editor/connections_dialog.cpp +msgid "Create Subscription" +msgstr "Luo tilaus" + +#: editor/connections_dialog.cpp +msgid "Connect.." +msgstr "Yhdistä..." + +#: editor/connections_dialog.cpp +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Disconnect" +msgstr "Katkaise yhteys" + +#: editor/connections_dialog.cpp editor/node_dock.cpp +msgid "Signals" +msgstr "Signaalit" + +#: editor/create_dialog.cpp +msgid "Create New" +msgstr "Luo uusi" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#: editor/filesystem_dock.cpp +msgid "Favorites:" +msgstr "Suosikit:" + +#: editor/create_dialog.cpp editor/editor_file_dialog.cpp +#, fuzzy +msgid "Recent:" +msgstr "Viimeaikainen / Viimeaikaiset:" + +#: editor/create_dialog.cpp editor/editor_help.cpp +#: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp +#: editor/quick_open.cpp +msgid "Matches:" +msgstr "Osumat:" + +#: editor/dependency_editor.cpp +msgid "Search Replacement For:" +msgstr "Hae korvattava:" + +#: editor/dependency_editor.cpp +msgid "Dependencies For:" +msgstr "Riippuvuudet:" + +#: editor/dependency_editor.cpp +msgid "" +"Scene '%s' is currently being edited.\n" +"Changes will not take effect unless reloaded." +msgstr "" +"Sceneä '%s' muokataan parhaillaan.\n" +"Muutokset tulevat voimaan vasta päivityksen jälkeen." + +#: editor/dependency_editor.cpp +msgid "" +"Resource '%s' is in use.\n" +"Changes will take effect when reloaded." +msgstr "" +"Resurssi '%s' on käytössä.\n" +"Muutokset tulevat voimaan päivitettäessä." + +#: editor/dependency_editor.cpp +msgid "Dependencies" +msgstr "Riippuvuudet" + +#: editor/dependency_editor.cpp +msgid "Resource" +msgstr "Resurssi" + +#: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp +#: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp +msgid "Path" +msgstr "Polku" + +#: editor/dependency_editor.cpp +msgid "Dependencies:" +msgstr "Riippuvuudet:" + +#: editor/dependency_editor.cpp +msgid "Fix Broken" +msgstr "Korjaa rikkinäinen" + +#: editor/dependency_editor.cpp +msgid "Dependency Editor" +msgstr "Riippuvuusmuokkain" + +#: editor/dependency_editor.cpp +msgid "Search Replacement Resource:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Owners Of:" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "" +"The files being removed are required by other resources in order for them to " +"work.\n" +"Remove them anyway? (no undo)" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Remove selected files from the project? (no undo)" +msgstr "Poista valitut tiedostot projektista? (ei voi kumota)" + +#: editor/dependency_editor.cpp +msgid "Error loading:" +msgstr "Virhe ladatessa:" + +#: editor/dependency_editor.cpp +msgid "Scene failed to load due to missing dependencies:" +msgstr "Scenen lataaminen epäonnistui puuttuvan riippuvuuden takia:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Open Anyway" +msgstr "Avaa kuitenkin" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Which action should be taken?" +msgstr "Mikä toiminto pitäisi tehdä? / Mitkä toiminnot" + +#: editor/dependency_editor.cpp +msgid "Fix Dependencies" +msgstr "Korjaa riippuvuudet" + +#: editor/dependency_editor.cpp +msgid "Errors loading!" +msgstr "Virheitä ladatessa!" + +#: editor/dependency_editor.cpp +#, fuzzy +msgid "Permanently delete %d item(s)? (No undo!)" +msgstr "Poista pysyvästi %d ? (Ei voi kumota!)" + +#: editor/dependency_editor.cpp +msgid "Owns" +msgstr "Omistaa" + +#: editor/dependency_editor.cpp +msgid "Resources Without Explicit Ownership:" +msgstr "Resurssit, joilla ei ole selvää omistajaa:" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +msgid "Orphan Resource Explorer" +msgstr "" + +#: editor/dependency_editor.cpp +msgid "Delete selected files?" +msgstr "Poista valitut tiedostot?" + +#: editor/dependency_editor.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp +#: editor/project_export.cpp editor/scene_tree_dock.cpp +msgid "Delete" +msgstr "Poista" + +#: editor/editor_audio_buses.cpp +msgid "Save Audio Bus Layout As.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Location for New Layout.." +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Open Audio Bus Layout" +msgstr "" + +#: editor/editor_audio_buses.cpp +msgid "Add Bus" +msgstr "Lisää väylä" + +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp +msgid "Load" +msgstr "Lataa" + +#: editor/editor_audio_buses.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save As" +msgstr "Tallenna nimellä" + +#: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp +msgid "Default" +msgstr "Oletus" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name." +msgstr "Virheellinen nimi." + +#: editor/editor_autoload_settings.cpp +msgid "Valid characters:" +msgstr "Kelvolliset merkit:" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing engine class name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing buit-in type name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid name. Must not collide with an existing global constant name." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Invalid Path." +msgstr "Virheellinen polku." + +#: editor/editor_autoload_settings.cpp +msgid "File does not exist." +msgstr "Tiedostoa ei ole olemassa." + +#: editor/editor_autoload_settings.cpp +msgid "Not in resource path." +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Add AutoLoad" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Autoload '%s' already exists!" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Rename Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Toggle AutoLoad Globals" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Move Autoload" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "Remove Autoload" +msgstr "Poista automaattinen lataus" + +#: editor/editor_autoload_settings.cpp +msgid "Enable" +msgstr "Ota käyttöön" + +#: editor/editor_autoload_settings.cpp +msgid "Rearrange Autoloads" +msgstr "" + +#: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp +msgid "Path:" +msgstr "Polku:" + +#: editor/editor_autoload_settings.cpp +msgid "Node Name:" +msgstr "Noden nimi:" + +#: editor/editor_autoload_settings.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/plugins/sample_library_editor_plugin.cpp editor/project_manager.cpp +msgid "Name" +msgstr "Nimi" + +#: editor/editor_autoload_settings.cpp +msgid "Singleton" +msgstr "" + +#: editor/editor_autoload_settings.cpp +msgid "List:" +msgstr "Lista:" + +#: editor/editor_data.cpp +msgid "Updating Scene" +msgstr "Päivitetään sceneä" + +#: editor/editor_data.cpp +msgid "Storing local changes.." +msgstr "Varastoidaan paikalliset muutokset..." + +#: editor/editor_data.cpp +msgid "Updating scene.." +msgstr "Päivitetään sceneä..." + +#: editor/editor_dir_dialog.cpp +msgid "Choose a Directory" +msgstr "Valitse hakemisto" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Create Folder" +msgstr "Luo kansio" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: editor/editor_plugin_settings.cpp editor/plugins/theme_editor_plugin.cpp +#: editor/project_export.cpp scene/gui/file_dialog.cpp +msgid "Name:" +msgstr "Nimi:" + +#: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp +#: scene/gui/file_dialog.cpp +msgid "Could not create folder." +msgstr "Kansiota ei voitu luoda." + +#: editor/editor_dir_dialog.cpp +msgid "Choose" +msgstr "Valitse" + +#: editor/editor_export.cpp +msgid "Storing File:" +msgstr "Varastoidaan tiedostoa:" + +#: editor/editor_export.cpp +msgid "Packing" +msgstr "Pakataan" + +#: editor/editor_export.cpp platform/javascript/export/export.cpp +msgid "Template file not found:\n" +msgstr "Mallitiedostoa ei löytynyt:\n" + +#: editor/editor_export.cpp +msgid "Added:" +msgstr "Lisätty:" + +#: editor/editor_export.cpp +msgid "Removed:" +msgstr "Poistettu:" + +#: editor/editor_export.cpp +msgid "Error saving atlas:" +msgstr "Virhe tallennettaessa atlas-kuvaa:" + +#: editor/editor_export.cpp +msgid "Could not save atlas subtexture:" +msgstr "" + +#: editor/editor_export.cpp +msgid "Exporting for %s" +msgstr "" + +#: editor/editor_export.cpp +msgid "Setting Up.." +msgstr "" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "File Exists, Overwrite?" +msgstr "Tiedosto on jo olemassa, korvaa?" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Recognized" +msgstr "Kaikki tunnistettu" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "All Files (*)" +msgstr "Kaikki tiedostot (*)" + +#: editor/editor_file_dialog.cpp editor/editor_help.cpp editor/editor_node.cpp +#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp +#: editor/property_selector.cpp editor/quick_open.cpp scene/gui/file_dialog.cpp +msgid "Open" +msgstr "Avaa" + +#: editor/editor_file_dialog.cpp editor/editor_node.cpp +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp +msgid "Save" +msgstr "Tallenna" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Save a File" +msgstr "Tallenna tiedosto" + +#: editor/editor_file_dialog.cpp +msgid "Go Back" +msgstr "Mene taaksepäin" + +#: editor/editor_file_dialog.cpp +msgid "Go Forward" +msgstr "Mene eteenpäin" + +#: editor/editor_file_dialog.cpp +msgid "Go Up" +msgstr "Mene ylös" + +#: editor/editor_file_dialog.cpp +msgid "Refresh" +msgstr "Päivitä" + +#: editor/editor_file_dialog.cpp +msgid "Toggle Hidden Files" +msgstr "Näytä piilotiedostot" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Favorite" +msgstr "Näytä suosikit" + +#: editor/editor_file_dialog.cpp +#, fuzzy +msgid "Toggle Mode" +msgstr "Näytä/piilota" + +#: editor/editor_file_dialog.cpp +msgid "Focus Path" +msgstr "" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Up" +msgstr "Siirrä suosikkia ylös" + +#: editor/editor_file_dialog.cpp +msgid "Move Favorite Down" +msgstr "Siirrä suosikkia alas" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Directories & Files:" +msgstr "Hakemistot & tiedostot:" + +#: editor/editor_file_dialog.cpp +msgid "Preview:" +msgstr "Esikatselu:" + +#: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp +#: scene/gui/file_dialog.cpp +msgid "File:" +msgstr "Tiedosto:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +msgid "Filter:" +msgstr "Suodatin:" + +#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp +#, fuzzy +msgid "Must use a valid extension." +msgstr "Käytä sopivaa laajennusta" + +#: editor/editor_file_system.cpp +msgid "ScanSources" +msgstr "" + +#: editor/editor_file_system.cpp +msgid "(Re)Importing Assets" +msgstr "Tuodaan (uudelleen) Assetteja" + +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Search Help" +msgstr "Hae oppaasta" + +#: editor/editor_help.cpp +msgid "Class List:" +msgstr "Luokkaluettelo:" + +#: editor/editor_help.cpp +msgid "Search Classes" +msgstr "Etsi luokkia" + +#: editor/editor_help.cpp editor/property_editor.cpp +msgid "Class:" +msgstr "Luokka:" + +#: editor/editor_help.cpp editor/scene_tree_editor.cpp +msgid "Inherits:" +msgstr "Perii:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Inherited by:" +msgstr "Peritty:" + +#: editor/editor_help.cpp +msgid "Brief Description:" +msgstr "Lyhyt kuvaus:" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Members:" +msgstr "Jäsenet:" + +#: editor/editor_help.cpp +msgid "Public Methods:" +msgstr "Julkiset metodit:" + +#: editor/editor_help.cpp +msgid "GUI Theme Items:" +msgstr "" + +#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp +msgid "Signals:" +msgstr "" + +#: editor/editor_help.cpp +msgid "Constants:" +msgstr "Vakiot:" + +#: editor/editor_help.cpp +#, fuzzy +msgid "Property Description:" +msgstr "Ominaisuuden kuvaus:" + +#: editor/editor_help.cpp +msgid "Method Description:" +msgstr "Metodin kuvaus:" + +#: editor/editor_help.cpp +msgid "Search Text" +msgstr "Hae tekstiä" + +#: editor/editor_log.cpp +msgid " Output:" +msgstr " Tuloste:" + +#: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/rich_text_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_editor_debugger.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Clear" +msgstr "Tyhjennä" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/resources_dock.cpp +msgid "Error saving resource!" +msgstr "Virhe tallennettaessa resurssia!" + +#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp +#: editor/resources_dock.cpp +msgid "Save Resource As.." +msgstr "Tallenna resurssi nimellä..." + +#: editor/editor_node.cpp editor/export_template_manager.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "I see.." +msgstr "Ymmärrän..." + +#: editor/editor_node.cpp +msgid "Can't open file for writing:" +msgstr "Ei voida avata tiedostoa kirjoitettavaksi:" + +#: editor/editor_node.cpp +msgid "Requested file format unknown:" +msgstr "Pyydetty tiedostomuoto tuntematon:" + +#: editor/editor_node.cpp +msgid "Error while saving." +msgstr "Virhe tallennettaessa." + +#: editor/editor_node.cpp +msgid "Saving Scene" +msgstr "Tallennetaan sceneä" + +#: editor/editor_node.cpp +msgid "Analyzing" +msgstr "Analysoidaan" + +#: editor/editor_node.cpp +msgid "Creating Thumbnail" +msgstr "Luodaan pienoiskuvaa" + +#: editor/editor_node.cpp +msgid "" +"Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." +msgstr "Sceneä ei voitu tallentaa. Riippuvuuksia ei voitu tyydyttää." + +#: editor/editor_node.cpp +msgid "Failed to load resource." +msgstr "Resurssin lataaminen epäonnistui." + +#: editor/editor_node.cpp +msgid "Can't load MeshLibrary for merging!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Error saving MeshLibrary!" +msgstr "Virhe tallennettaessa MeshLibrarya!" + +#: editor/editor_node.cpp +msgid "Can't load TileSet for merging!" +msgstr "Ei voida ladata tilesetiä tuontia varten!" + +#: editor/editor_node.cpp +msgid "Error saving TileSet!" +msgstr "Virhe tallennettaessa tilesetiä!" + +#: editor/editor_node.cpp +msgid "Error trying to save layout!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Default editor layout overridden." +msgstr "Editorin oletusulkoasu ylikirjoitettu." + +#: editor/editor_node.cpp +msgid "Layout name not found!" +msgstr "Layoutin nimeä ei löytynyt!" + +#: editor/editor_node.cpp +msgid "Restored default layout to base settings." +msgstr "" + +#: editor/editor_node.cpp +msgid "Copy Params" +msgstr "Kopioi parametrit" + +#: editor/editor_node.cpp +msgid "Paste Params" +msgstr "Liitä parametrit" + +#: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Paste Resource" +msgstr "Liitä resurssi" + +#: editor/editor_node.cpp +msgid "Copy Resource" +msgstr "Kopioi resurssi" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Make Built-In" +msgstr "Tee sisäänrakennettu" + +#: editor/editor_node.cpp +msgid "Make Sub-Resources Unique" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open in Help" +msgstr "Avaa ohjeessa" + +#: editor/editor_node.cpp +msgid "There is no defined scene to run." +msgstr "Suoritettavaa sceneä ei ole määritetty." + +#: editor/editor_node.cpp +#, fuzzy +msgid "" +"No main scene has ever been defined, select one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Pääsceneä ei ole määritetty, haluatko valita sen?\n" +"Voit muuttaa sitä myöhemmin projektin asetuksista." + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' does not exist, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Valittua sceneä '%s' ei ole olemassa, valitse kelvollinen?\n" +"Voit muuttaa sitä myöhemmin projektin asetuksista." + +#: editor/editor_node.cpp +msgid "" +"Selected scene '%s' is not a scene file, select a valid one?\n" +"You can change it later in \"Project Settings\" under the 'application' " +"category." +msgstr "" +"Valittu scene '%s' ei ole scene-tiedosto, valitse kelvollinen?\n" +"Voit muuttaa sitä myöhemmin projektin asetuksista." + +#: editor/editor_node.cpp +msgid "Current scene was never saved, please save it prior to running." +msgstr "" +"Nykyistä sceneä ei ole vielä tallennettu. Tallenna se ennen suorittamista." + +#: editor/editor_node.cpp +msgid "Could not start subprocess!" +msgstr "Aliprosessia ei voitu käynnistää!" + +#: editor/editor_node.cpp +msgid "Open Scene" +msgstr "Avaa scene" + +#: editor/editor_node.cpp +msgid "Open Base Scene" +msgstr "Avaa kantascene" + +#: editor/editor_node.cpp +msgid "Quick Open Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Quick Open Script.." +msgstr "" + +#: editor/editor_node.cpp +msgid "Yes" +msgstr "Kyllä" + +#: editor/editor_node.cpp +msgid "Close scene? (Unsaved changes will be lost)" +msgstr "Sulje scene? (tallentamattomat muutokset menetetään)" + +#: editor/editor_node.cpp +msgid "Save Scene As.." +msgstr "Tallenna scene nimellä..." + +#: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Node" + +#: editor/editor_node.cpp +msgid "This scene has never been saved. Save before running?" +msgstr "Tätä sceneä ei ole koskaan tallennettu. Tallenna ennen suorittamista?" + +#: editor/editor_node.cpp +msgid "Export Mesh Library" +msgstr "Tuo Mesh-kirjasto" + +#: editor/editor_node.cpp +msgid "Export Tile Set" +msgstr "Tuo tileset" + +#: editor/editor_node.cpp +msgid "Quit" +msgstr "Lopeta" + +#: editor/editor_node.cpp +msgid "Exit the editor?" +msgstr "Poistu editorista?" + +#: editor/editor_node.cpp +msgid "Current scene not saved. Open anyway?" +msgstr "Nykyistä sceneä ei ole tallennettu. Avaa joka tapauksessa?" + +#: editor/editor_node.cpp +msgid "Can't reload a scene that was never saved." +msgstr "" + +#: editor/editor_node.cpp +msgid "Revert" +msgstr "Palauta" + +#: editor/editor_node.cpp +msgid "This action cannot be undone. Revert anyway?" +msgstr "Tätä toimintoa ei voida peruttaa. Palauta joka tapauksessa?" + +#: editor/editor_node.cpp +msgid "Quick Run Scene.." +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Open Project Manager? \n" +"(Unsaved changes will be lost)" +msgstr "" +"Avaa projektinhallinta?\n" +"(tallentamattomat muutokset menetetään)" + +#: editor/editor_node.cpp +msgid "Pick a Main Scene" +msgstr "Valitse pääscene" + +#: editor/editor_node.cpp +msgid "" +"Scene '%s' was automatically imported, so it can't be modified.\n" +"To make changes to it, a new inherited scene can be created." +msgstr "" +"Scene '%s' tuotiin automaattisesti, joten sitä ei voida muokata.\n" +"Muokataksesi sitä voit luoda uuden perityn Scenen." + +#: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp +#: editor/scene_tree_dock.cpp +msgid "Ugh" +msgstr "Äh" + +#: editor/editor_node.cpp +msgid "" +"Error loading scene, it must be inside the project path. Use 'Import' to " +"open the scene, then save it inside the project path." +msgstr "" +"Virhe Scenen latauksessa, sen täytyy sijaita projektin polussa. Käytä 'Tuo' -" +"toimintoa avataksesi Scenen ja tallenna se projektin polkuun." + +#: editor/editor_node.cpp +msgid "Error loading scene." +msgstr "Virhe ladatessa Sceneä." + +#: editor/editor_node.cpp +msgid "Scene '%s' has broken dependencies:" +msgstr "Scenellä '%s' on rikkinäisiä riippuvuuksia:" + +#: editor/editor_node.cpp +msgid "Save Layout" +msgstr "Tallenna Layout" + +#: editor/editor_node.cpp +msgid "Delete Layout" +msgstr "Poista Layout" + +#: editor/editor_node.cpp +msgid "Switch Scene Tab" +msgstr "Vaihda Scenen välilehteä" + +#: editor/editor_node.cpp +#, fuzzy +msgid "%d more file(s)" +msgstr "%d muuta tiedostoa" + +#: editor/editor_node.cpp +msgid "%d more file(s) or folder(s)" +msgstr "" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + +#: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Scene" +msgstr "Scene" + +#: editor/editor_node.cpp +msgid "Go to previously opened scene." +msgstr "Mene aiemmin avattuun sceneen." + +#: editor/editor_node.cpp +msgid "Next tab" +msgstr "Seuraava välilehti" + +#: editor/editor_node.cpp +msgid "Previous tab" +msgstr "Edellinen välilehti" + +#: editor/editor_node.cpp +msgid "Filter Files.." +msgstr "Suodata tiedostot..." + +#: editor/editor_node.cpp +msgid "Operations with scene files." +msgstr "" + +#: editor/editor_node.cpp +msgid "New Scene" +msgstr "Uusi Scene" + +#: editor/editor_node.cpp +msgid "New Inherited Scene.." +msgstr "Uusi peritty Scene..." + +#: editor/editor_node.cpp +msgid "Open Scene.." +msgstr "Avaa Scene..." + +#: editor/editor_node.cpp +msgid "Save Scene" +msgstr "Tallenna scene" + +#: editor/editor_node.cpp +msgid "Save all Scenes" +msgstr "Tallenna kaikki scenet" + +#: editor/editor_node.cpp +msgid "Close Scene" +msgstr "Sulje scene" + +#: editor/editor_node.cpp +msgid "Close Goto Prev. Scene" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Open Recent" +msgstr "Avaa viimeaikainen" + +#: editor/editor_node.cpp +msgid "Convert To.." +msgstr "Muunna..." + +#: editor/editor_node.cpp +msgid "MeshLibrary.." +msgstr "" + +#: editor/editor_node.cpp +msgid "TileSet.." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Undo" +msgstr "Peru" + +#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Redo" +msgstr "Tee uudelleen" + +#: editor/editor_node.cpp +msgid "Revert Scene" +msgstr "Palauta Scene" + +#: editor/editor_node.cpp +msgid "Miscellaneous project or scene-wide tools." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Project" +msgstr "Uusi projekti" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "Projektin asetukset" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Suorita skripti" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Export" +msgstr "Vie" + +#: editor/editor_node.cpp +msgid "Tools" +msgstr "Työkalut" + +#: editor/editor_node.cpp +msgid "Quit to Project List" +msgstr "Lopeta ja palaa projektiluetteloon" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "Deploy with Remote Debug" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When exporting or deploying, the resulting executable will attempt to " +"connect to the IP of this computer in order to be debugged." +msgstr "" + +#: editor/editor_node.cpp +msgid "Small Deploy with Network FS" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"When this option is enabled, export or deploy will produce a minimal " +"executable.\n" +"The filesystem will be provided from the project by the editor over the " +"network.\n" +"On Android, deploy will use the USB cable for faster performance. This " +"option speeds up testing for games with a large footprint." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Collision Shapes" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Collision shapes and raycast nodes (for 2D and 3D) will be visible on the " +"running game if this option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Visible Navigation" +msgstr "" + +#: editor/editor_node.cpp +msgid "" +"Navigation meshes and polygons will be visible on the running game if this " +"option is turned on." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Scene Changes" +msgstr "Synkronoi Scenen muutokset" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any changes made to the scene in the editor " +"will be replicated in the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +msgid "Sync Script Changes" +msgstr "Synkronoi skriptin muutokset" + +#: editor/editor_node.cpp +msgid "" +"When this option is turned on, any script that is saved will be reloaded on " +"the running game.\n" +"When used remotely on a device, this is more efficient with network " +"filesystem." +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Muokkaa" + +#: editor/editor_node.cpp editor/settings_config_dialog.cpp +msgid "Editor Settings" +msgstr "Editorin asetukset" + +#: editor/editor_node.cpp +msgid "Editor Layout" +msgstr "Editorin ulkoasu" + +#: editor/editor_node.cpp +msgid "Toggle Fullscreen" +msgstr "Siirry koko näytön tilaan" + +#: editor/editor_node.cpp editor/project_export.cpp +msgid "Manage Export Templates" +msgstr "Hallitse vietäviä Templateja" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Luokat" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Sulje dokumentaatio" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp +msgid "About" +msgstr "Tietoja" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Play the project." +msgstr "Toista projekti" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +#, fuzzy +msgid "Play" +msgstr "Toista" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pysäytä Scene" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pysäytä Scene" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Lopeta Scene." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Pysäytä" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Toista Scene" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Spins when the editor window repaints!" +msgstr "" + +#: editor/editor_node.cpp +msgid "Update Always" +msgstr "Päivitä aina" + +#: editor/editor_node.cpp +msgid "Update Changes" +msgstr "Päivitä muutokset" + +#: editor/editor_node.cpp +msgid "Disable Update Spinner" +msgstr "Poista päivitysanimaatio" + +#: editor/editor_node.cpp +msgid "Inspector" +msgstr "Tarkastaja" + +#: editor/editor_node.cpp +msgid "Create a new resource in memory and edit it." +msgstr "Luo uusi resurssi muistiin ja muokkaa sitä." + +#: editor/editor_node.cpp +msgid "Load an existing resource from disk and edit it." +msgstr "Lataa olemassaoleva resurssi levyltä ja muokkaa sitä." + +#: editor/editor_node.cpp +msgid "Save the currently edited resource." +msgstr "Tallenna tällä hetkellä muokattu resurssi." + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Save As.." +msgstr "Tallenna nimellä..." + +#: editor/editor_node.cpp +msgid "Go to the previous edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "Go to the next edited object in history." +msgstr "" + +#: editor/editor_node.cpp +msgid "History of recently edited objects." +msgstr "Viimeisimmin muokatut objektit." + +#: editor/editor_node.cpp +msgid "Object properties." +msgstr "Objektin ominaisuudet." + +#: editor/editor_node.cpp +msgid "FileSystem" +msgstr "Tiedostojärjestelmä" + +#: editor/editor_node.cpp editor/node_dock.cpp +msgid "Node" +msgstr "Node" + +#: editor/editor_node.cpp +msgid "Output" +msgstr "Tuloste" + +#: editor/editor_node.cpp editor/editor_reimport_dialog.cpp +msgid "Re-Import" +msgstr "Tuo uudelleen" + +#: editor/editor_node.cpp editor/editor_plugin_settings.cpp +msgid "Update" +msgstr "Päivitä" + +#: editor/editor_node.cpp +msgid "Thanks from the Godot community!" +msgstr "Kiitos Godot-yhteisöltä!" + +#: editor/editor_node.cpp +msgid "Thanks!" +msgstr "Kiitos!" + +#: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp +msgid "Import Templates From ZIP File" +msgstr "Tuo mallit ZIP-tiedostosta" + +#: editor/editor_node.cpp +msgid "Export Project" +msgstr "Vie projekti" + +#: editor/editor_node.cpp +msgid "Export Library" +msgstr "Vie kirjasto" + +#: editor/editor_node.cpp +msgid "Merge With Existing" +msgstr "Yhdistä olemassaolevaan" + +#: editor/editor_node.cpp +msgid "Password:" +msgstr "Salasana:" + +#: editor/editor_node.cpp +msgid "Open & Run a Script" +msgstr "Avaa & suorita skripti" + +#: editor/editor_node.cpp +msgid "Load Errors" +msgstr "Lataa virheet" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Avaa editorissa" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Avaa editorissa" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Avaa editorissa" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Vie kirjasto" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Avaa editorissa" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Avaa editorissa" + +#: editor/editor_plugin_settings.cpp +msgid "Installed Plugins:" +msgstr "Asennetut lisäosat:" + +#: editor/editor_plugin_settings.cpp +msgid "Author:" +msgstr "Tekijä:" + +#: editor/editor_plugin_settings.cpp +msgid "Status:" +msgstr "Tila:" + +#: editor/editor_profiler.cpp +msgid "Stop Profiling" +msgstr "Lopeta profilointi" + +#: editor/editor_profiler.cpp +msgid "Start Profiling" +msgstr "Aloita profilointi" + +#: editor/editor_profiler.cpp +#, fuzzy +msgid "Measure:" +msgstr "Mittayksikkö:" + +#: editor/editor_profiler.cpp +msgid "Frame Time (sec)" +msgstr "Framen aika (sek)" + +#: editor/editor_profiler.cpp +msgid "Average Time (sec)" +msgstr "Keskimääräinen aika (sek)" + +#: editor/editor_profiler.cpp +msgid "Frame %" +msgstr "Frame %" + +#: editor/editor_profiler.cpp +msgid "Fixed Frame %" +msgstr "Kiinteä Frame %" + +#: editor/editor_profiler.cpp editor/script_editor_debugger.cpp +msgid "Time:" +msgstr "Aika:" + +#: editor/editor_profiler.cpp +msgid "Inclusive" +msgstr "" + +#: editor/editor_profiler.cpp +msgid "Self" +msgstr "Itse" + +#: editor/editor_profiler.cpp +msgid "Frame #:" +msgstr "" + +#: editor/editor_reimport_dialog.cpp +#, fuzzy +msgid "Please wait for scan to complete." +msgstr "Ole hyvä ja odota läpikäynnin valmistumista." + +#: editor/editor_reimport_dialog.cpp +msgid "Current scene must be saved to re-import." +msgstr "Nykyinen Scene täytyy tallentaa, jotta se voidaan tuoda uudelleen." + +#: editor/editor_reimport_dialog.cpp +msgid "Save & Re-Import" +msgstr "Tallenna & tuo uudelleen" + +#: editor/editor_reimport_dialog.cpp +msgid "Re-Importing" +msgstr "Tuodaan uudelleen" + +#: editor/editor_reimport_dialog.cpp +msgid "Re-Import Changed Resources" +msgstr "Tuo uudelleen vaihtuneet resurssit" + +#: editor/editor_run_script.cpp +msgid "Write your logic in the _run() method." +msgstr "Kirjoita logiikka _run() -metodiin." + +#: editor/editor_run_script.cpp +msgid "There is an edited scene already." +msgstr "Muokattu Scene on jo olemassa." + +#: editor/editor_run_script.cpp +msgid "Couldn't instance script:" +msgstr "" + +#: editor/editor_run_script.cpp +msgid "Did you forget the 'tool' keyword?" +msgstr "Unohditko 'tool' hakusanan?" + +#: editor/editor_run_script.cpp +msgid "Couldn't run script:" +msgstr "Skriptiä ei voitu suorittaa:" + +#: editor/editor_run_script.cpp +msgid "Did you forget the '_run' method?" +msgstr "Unohditko '_run' -metodin?" + +#: editor/editor_settings.cpp +msgid "Default (Same as Editor)" +msgstr "Oletus (sama kuin editori)" + +#: editor/editor_sub_scene.cpp +msgid "Select Node(s) to Import" +msgstr "Valitse tuotava(t) node(t)" + +#: editor/editor_sub_scene.cpp +msgid "Scene Path:" +msgstr "Scenen polku:" + +#: editor/editor_sub_scene.cpp +msgid "Import From Node:" +msgstr "Tuo Nodesta:" + +#: editor/export_template_manager.cpp +msgid "Re-Download" +msgstr "Lataa uudelleen" + +#: editor/export_template_manager.cpp +msgid "Uninstall" +msgstr "Poista" + +#: editor/export_template_manager.cpp +msgid "(Installed)" +msgstr "(Asennettu)" + +#: editor/export_template_manager.cpp +msgid "Download" +msgstr "Lataa" + +#: editor/export_template_manager.cpp +msgid "(Missing)" +msgstr "(Puuttuva)" + +#: editor/export_template_manager.cpp +msgid "(Current)" +msgstr "(Nykyinen)" + +#: editor/export_template_manager.cpp +msgid "Remove template version '%s'?" +msgstr "Poista mallin versio '%s'?" + +#: editor/export_template_manager.cpp +msgid "Can't open export templates zip." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Invalid version.txt format inside templates." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "" +"Invalid version.txt format inside templates. Revision is not a valid " +"identifier." +msgstr "" + +#: editor/export_template_manager.cpp +msgid "No version.txt found inside templates." +msgstr "version.txt -tiedostoa ei löytynyt." + +#: editor/export_template_manager.cpp +msgid "Error creating path for templates:\n" +msgstr "Virhe luotaessa polkua mallille:\n" + +#: editor/export_template_manager.cpp +msgid "Extracting Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Importing:" +msgstr "Tuodaan:" + +#: editor/export_template_manager.cpp +msgid "Loading Export Templates" +msgstr "" + +#: editor/export_template_manager.cpp +msgid "Current Version:" +msgstr "Nykyinen versio:" + +#: editor/export_template_manager.cpp +msgid "Installed Versions:" +msgstr "Asennetut versiot:" + +#: editor/export_template_manager.cpp +msgid "Install From File" +msgstr "Asenna tiedostosta" + +#: editor/export_template_manager.cpp +msgid "Remove Template" +msgstr "Poista malli" + +#: editor/export_template_manager.cpp +msgid "Select template file" +msgstr "Valitse mallin tiedosto" + +#: editor/export_template_manager.cpp +msgid "Export Template Manager" +msgstr "" + +#: editor/file_type_cache.cpp +msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Cannot navigate to '" +msgstr "Ei voida navigoida '" + +#: editor/filesystem_dock.cpp +msgid "Same source and destination files, doing nothing." +msgstr "Sama lähde ja kohdetiedosto, ei toimenpiteitä." + +#: editor/filesystem_dock.cpp +msgid "Same source and destination paths, doing nothing." +msgstr "Sama lähde ja kohdepolku, ei toimenpiteitä." + +#: editor/filesystem_dock.cpp +msgid "Can't move directories to within themselves." +msgstr "Hakemisto(j)a ei voida siirtää itseensä." + +#: editor/filesystem_dock.cpp +msgid "Can't operate on '..'" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Pick New Name and Location For:" +msgstr "Valitse uusi nimi ja sijainti:" + +#: editor/filesystem_dock.cpp +msgid "No files selected!" +msgstr "Ei valittuja tiedostoja!" + +#: editor/filesystem_dock.cpp +msgid "Expand all" +msgstr "Laajenna kaikki" + +#: editor/filesystem_dock.cpp +msgid "Collapse all" +msgstr "Pienennä kaikki" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Näytä tiedostonhallinnassa" + +#: editor/filesystem_dock.cpp +msgid "Instance" +msgstr "Instanssi" + +#: editor/filesystem_dock.cpp +msgid "Edit Dependencies.." +msgstr "Muokkaa riippuvuuksia..." + +#: editor/filesystem_dock.cpp +msgid "View Owners.." +msgstr "Tarkastele omistajia..." + +#: editor/filesystem_dock.cpp +msgid "Copy Path" +msgstr "Kopioi polku" + +#: editor/filesystem_dock.cpp +msgid "Rename or Move.." +msgstr "Nimeä uudelleen tai siirrä..." + +#: editor/filesystem_dock.cpp +msgid "Move To.." +msgstr "Siirrä..." + +#: editor/filesystem_dock.cpp +msgid "Info" +msgstr "Tietoja" + +#: editor/filesystem_dock.cpp +msgid "Re-Import.." +msgstr "Tuo uudelleen..." + +#: editor/filesystem_dock.cpp +msgid "Previous Directory" +msgstr "Edellinen hakemisto" + +#: editor/filesystem_dock.cpp +msgid "Next Directory" +msgstr "Seuraava hakemisto" + +#: editor/filesystem_dock.cpp +msgid "Re-Scan Filesystem" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Toggle folder status as Favorite" +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Instance the selected scene(s) as child of the selected node." +msgstr "" + +#: editor/filesystem_dock.cpp +msgid "Move" +msgstr "Siirrä" + +#: editor/groups_editor.cpp +msgid "Add to Group" +msgstr "Lisää ryhmään" + +#: editor/groups_editor.cpp +msgid "Remove from Group" +msgstr "Poista ryhmästä" + +#: editor/import/resource_importer_obj.cpp +#: editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Surface %d" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import Scene" +msgstr "Tuo Scene" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Importing Scene.." +msgstr "Tuodaan Scene..." + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Running Custom Script.." +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't load post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Invalid/broken script for post-import (check console):" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Error running post-import script:" +msgstr "" + +#: editor/import/resource_importer_scene.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Saving.." +msgstr "Tallennetaan..." + +#: editor/import_dock.cpp +msgid " Files" +msgstr " Tiedostot" + +#: editor/import_dock.cpp +msgid "Import As:" +msgstr "Tuo nimellä:" + +#: editor/import_dock.cpp editor/property_editor.cpp +#, fuzzy +msgid "Preset.." +msgstr "Esiasetus..." + +#: editor/import_dock.cpp +msgid "Reimport" +msgstr "Tuo uudelleen" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +msgid "No bit masks to import!" +msgstr "" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Target path is empty." +msgstr "Kohdepolku on tyhjä." + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Target path must be a complete resource path." +msgstr "" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Target path must exist." +msgstr "Kohdepolku täytyy olla olemassa." + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_mesh_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Save path is empty!" +msgstr "Tallennuspolku on tyhjä!" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +msgid "Import BitMasks" +msgstr "" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Source Texture(s):" +msgstr "" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_mesh_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Target Path:" +msgstr "Kohdepolku:" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/io_plugins/editor_texture_import_plugin.cpp +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Accept" +msgstr "Hyväksy" + +#: editor/io_plugins/editor_bitmask_import_plugin.cpp +msgid "Bit Mask" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "No source font file!" +msgstr "Ei fontin lähdetiedostoa!" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "No target font resource!" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy +msgid "" +"Invalid file extension.\n" +"Please use .font." +msgstr "" +"Virheellinen tiedostolaajennus.\n" +"Käytä .fnt -tiedostoa." + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Can't load/process source font." +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Couldn't save font." +msgstr "Fonttia ei voitu tallentaa." + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Source Font:" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Source Font Size:" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Dest Resource:" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "The quick brown fox jumps over the lazy dog." +msgstr "Ovela kettu punaturkki laiskan koiran takaa kurkki." + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Test:" +msgstr "" + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: editor/io_plugins/editor_mesh_import_plugin.cpp +#: editor/io_plugins/editor_sample_import_plugin.cpp +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Options:" +msgstr "Asetukset:" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Font Import" +msgstr "Fontin tuonti" + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "" +"This file is already a Godot font file, please supply a BMFont type file " +"instead." +msgstr "" +"Tämä tiedosto on jo Godotin fonttitiedosto, ole hyvä ja syötä BMFont -" +"tiedosto." + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Failed opening as BMFont file." +msgstr "BMFont -tiedoston avaus epäonnistui." + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: scene/resources/dynamic_font.cpp +msgid "Error initializing FreeType." +msgstr "Virhe FreetType:n alustamisessa." + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: scene/resources/dynamic_font.cpp +msgid "Unknown font format." +msgstr "Tuntematon fonttimuoto." + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: scene/resources/dynamic_font.cpp +msgid "Error loading font." +msgstr "Virhe fontin latauksessa." + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: scene/resources/dynamic_font.cpp +msgid "Invalid font size." +msgstr "Virheellinen fonttikoko." + +#: editor/io_plugins/editor_font_import_plugin.cpp +msgid "Invalid font custom source." +msgstr "Virheellinen fontin lähde." + +#: editor/io_plugins/editor_font_import_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +msgid "Font" +msgstr "Fontti" + +#: editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "No meshes to import!" +msgstr "" + +#: editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Single Mesh Import" +msgstr "" + +#: editor/io_plugins/editor_mesh_import_plugin.cpp +msgid "Source Mesh(es):" +msgstr "" + +#: editor/io_plugins/editor_mesh_import_plugin.cpp +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh" +msgstr "" + +#: editor/io_plugins/editor_sample_import_plugin.cpp +msgid "No samples to import!" +msgstr "" + +#: editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Import Audio Samples" +msgstr "" + +#: editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Source Sample(s):" +msgstr "" + +#: editor/io_plugins/editor_sample_import_plugin.cpp +msgid "Audio Sample" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "New Clip" +msgstr "Uusi klippi" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Animation Options" +msgstr "Animaation asetukset" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Flags" +msgstr "Liput" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Bake FPS:" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Optimizer" +msgstr "Optimoija" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Linear Error" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Angular Error" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Max Angle" +msgstr "Enimmäiskulma" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Clips" +msgstr "Klippejä" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +#, fuzzy +msgid "Start(s)" +msgstr "Alkaa" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +#, fuzzy +msgid "End(s)" +msgstr "Loppu(u)" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +#, fuzzy +msgid "Loop" +msgstr "Toisto" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Filters" +msgstr "Suodattimet" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Source path is empty." +msgstr "Lähdepolku on tyhjä." + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't load post-import script." +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Invalid/broken script for post-import." +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Error importing scene." +msgstr "Virhe tuotaessa Sceneä." + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import 3D Scene" +msgstr "Tuo 3D Scene" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Source Scene:" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Same as Target Scene" +msgstr "Sama kuin kohdescene" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Shared" +msgstr "Jaettu" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +#, fuzzy +msgid "Target Texture Folder:" +msgstr "Kohdetekstuurin kansio:" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Post-Process Script:" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Custom Root Node Type:" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Auto" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Root Node Name:" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "The Following Files are Missing:" +msgstr "Seuraavat tiedostot puuttuvat:" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import Anyway" +msgstr "Tuo joka tapauksessa" + +#: editor/io_plugins/editor_scene_import_plugin.cpp scene/gui/dialogs.cpp +msgid "Cancel" +msgstr "Peru" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import & Open" +msgstr "Tuo & Avaa" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Edited scene has not been saved, open imported scene anyway?" +msgstr "" +"Muokattua Sceneä ei ole tallennettu, avaa tuotu Scene joka tapauksessa?" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Import Image:" +msgstr "Tuo kuva:" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Can't import a file over itself:" +msgstr "Tiedostoa ei voi tuoda itseensä:" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "Couldn't localize path: %s (already local)" +msgstr "" + +#: editor/io_plugins/editor_scene_import_plugin.cpp +msgid "3D Scene Animation" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Uncompressed" +msgstr "Purettu" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress Lossless (PNG)" +msgstr "Pakkaa häviötön (PNG)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress Lossy (WebP)" +msgstr "Pakkaa häviöllinen (WebP)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Compress (VRAM)" +msgstr "Pakkaa (VRAM)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Format" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Compression Quality (WebP):" +msgstr "Tekstuurin pakkauksen latu (WebP):" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture Options" +msgstr "Tekstuurin asetukset" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Please specify some files!" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "At least one file needed for Atlas." +msgstr "Ainakin yksi tiedosto tarvitaan Atlas-kuvaa varten." + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Error importing:" +msgstr "Virhe tuotaessa:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Only one file is required for large texture." +msgstr "Vain yksi tiedosto vaaditaan suurikokoiselle tekstuurille." + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Max Texture Size:" +msgstr "Tekstuurin enimmäiskoko:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for Atlas (2D)" +msgstr "Tuo tekstuuri Atlakselle (2D)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Cell Size:" +msgstr "Solun koko:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Large Texture" +msgstr "Suurikokoinen tekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Large Textures (2D)" +msgstr "Tuo suurikokoisia tekstuureita (2D)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Source Texture" +msgstr "Lähdetekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Base Atlas Texture" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Source Texture(s)" +msgstr "Lähdetekstuuri(t)" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for 2D" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures for 3D" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Textures" +msgstr "Tuo tekstuurit" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "2D Texture" +msgstr "2D tekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "3D Texture" +msgstr "Kolmiulotteinen tekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Atlas Texture" +msgstr "Atlastekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "" +"NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to " +"the project." +msgstr "" +"HUOMAA: 2D tekstuurin tuonti ei ole pakollista. Voit kopioida png/jpg -" +"tiedostot projektiin." + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Crop empty space." +msgstr "Leikkaa pois tyhjä tila." + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Texture" +msgstr "Tekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Import Large Texture" +msgstr "Tuo suurikokoinen tekstuuri" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Load Source Image" +msgstr "Lataa lähdekuva" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +#, fuzzy +msgid "Slicing" +msgstr "Siivutus" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Inserting" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Saving" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save large texture:" +msgstr "Isoa tekstuuria ei voitu tallentaa:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +#, fuzzy +msgid "Build Atlas For:" +msgstr "Luo atlas:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Loading Image:" +msgstr "Ladataan kuvaa:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't load image:" +msgstr "Kuvaa ei voitu ladata:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Converting Images" +msgstr "Muunnetaan kuvia" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Cropping Images" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Blitting Images" +msgstr "" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save atlas image:" +msgstr "Atlas-kuvaa ei voitu tallentaa:" + +#: editor/io_plugins/editor_texture_import_plugin.cpp +msgid "Couldn't save converted texture:" +msgstr "" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Invalid source!" +msgstr "Virheellinen lähde!" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Invalid translation source!" +msgstr "" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Column" +msgstr "Kolumni" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +#: editor/script_create_dialog.cpp +msgid "Language" +msgstr "Kieli" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +#, fuzzy +msgid "No items to import!" +msgstr "Ei tuotavia asioita!" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "No target path!" +msgstr "Ei kohdepolkua!" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Translations" +msgstr "Tuo käännökset" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Couldn't import!" +msgstr "Ei voitu tuoda!" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Translation" +msgstr "Tuo käännös" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Source CSV:" +msgstr "" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Ignore First Row" +msgstr "Sivuuta ensimmäinen rivi" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Compress" +msgstr "Tiivistä" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +#, fuzzy +msgid "Add to Project (project.godot)" +msgstr "Lisää projektiin (godot.cfg)" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Import Languages:" +msgstr "Tuo kielet:" + +#: editor/io_plugins/editor_translation_import_plugin.cpp +msgid "Translation" +msgstr "Siirtymä" + +#: editor/multi_node_edit.cpp +msgid "MultiNode Set" +msgstr "" + +#: editor/node_dock.cpp +msgid "Groups" +msgstr "Ryhmät" + +#: editor/node_dock.cpp +msgid "Select a Node to edit Signals and Groups." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Toggle Autoplay" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Animation Name:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "New Anim" +msgstr "Uusi animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Animation Name:" +msgstr "Vaihda animaation nimi:" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Delete Animation?" +msgstr "Poista animaatio?" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Remove Animation" +msgstr "Poista animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Invalid animation name!" +msgstr "VIRHE: Virheellinen animaation nimi!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: Animation name already exists!" +msgstr "VIrhe: Samanniminen animaatio on jo olemassa!" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Rename Animation" +msgstr "Nimeä animaatio uudelleen" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Animation" +msgstr "Lisää animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Next Changed" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Change Blend Time" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load Animation" +msgstr "Lataa animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Duplicate Animation" +msgstr "Monista animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to copy!" +msgstr "VIRHE: Ei kopioitavaa animaatiota!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation resource on clipboard!" +msgstr "VIRHE: Ei animaation resurssia leikepöydällä!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Pasted Animation" +msgstr "Liitetty animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Paste Animation" +msgstr "Liitä animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "ERROR: No animation to edit!" +msgstr "VIRHE: Ei muokattavaa animaatiota!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from current pos. (A)" +msgstr "Toista valittu animaatio takaperin nykyisestä kohdasta. (A)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation backwards from end. (Shift+A)" +msgstr "Toista valittu animaatio takaperin lopusta. (Shift+A)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Stop animation playback. (S)" +msgstr "Lopeta animaation toisto. (S)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from start. (Shift+D)" +msgstr "Toista valittu animaatio alusta. (Shift+D)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Play selected animation from current pos. (D)" +msgstr "Toista valittu animaatio nykyisestä kohdasta. (D)" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation position (in seconds)." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Scale animation playback globally for the node." +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create new animation in player." +msgstr "Luo uusi animaatio soittimessa." + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load animation from disk." +msgstr "Lataa animaatio levyltä." + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Load an animation from disk." +msgstr "Lataa animaatio levyltä." + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Save the current animation" +msgstr "Tallenna nykyinen animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Display list of animations in player." +msgstr "Näytä lista animaatioista soittimessa." + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Autoplay on Load" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Edit Target Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Tools" +msgstr "Animaatiotyökalut" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Copy Animation" +msgstr "Kopioi animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Create New Animation" +msgstr "Luo uusi animaatio" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Animation Name:" +msgstr "Animaation nimi:" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sample_library_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/script_create_dialog.cpp +msgid "Error!" +msgstr "Virhe!" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Blend Times:" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Next (Auto Queue):" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +msgid "Cross-Animation Blend Times" +msgstr "" + +#: editor/plugins/animation_player_editor_plugin.cpp +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Animation" +msgstr "Animaatio" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "New name:" +msgstr "Uusi nimi:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Scale:" +msgstr "Skaalaus:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade In (s):" +msgstr "Häivytys sisään (s):" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Fade Out (s):" +msgstr "Häivytys ulos (s):" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend" +msgstr "Sekoita" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Auto Restart:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Restart (s):" +msgstr "Käynnistä uudelleen (s):" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Random Restart (s):" +msgstr "Satunnainen uudelleenaloitus (s):" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Start!" +msgstr "Aloita!" + +#: editor/plugins/animation_tree_editor_plugin.cpp +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Amount:" +msgstr "Määrä:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 0:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend 1:" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "X-Fade Time (s):" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Current:" +msgstr "Nykyinen:" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Add Input" +msgstr "Lisää syöte" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Clear Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Set Auto-Advance" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Delete Input" +msgstr "Poista syöte" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Rename" +msgstr "Nimeä uudelleen" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is valid." +msgstr "Animaatiopuu on kelvollinen." + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation tree is invalid." +msgstr "Animaatiopuu ei ole kelvollinen." + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Animation Node" +msgstr "Animaationode" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "OneShot Node" +msgstr "OneShot Node" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Mix Node" +msgstr "Mix Node" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend2 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend3 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Blend4 Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeScale Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "TimeSeek Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Transition Node" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Import Animations.." +msgstr "Tuo animaatiot..." + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Edit Node Filters" +msgstr "" + +#: editor/plugins/animation_tree_editor_plugin.cpp +msgid "Filters.." +msgstr "Suodattimet..." + +#: editor/plugins/baked_light_baker.cpp +msgid "Parsing %d Triangles:" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Triangle #" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Light Baker Setup:" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Parsing Geometry" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Fixing Lights" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Making BVH" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Creating Light Octree" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Creating Octree Texture" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Transfer to Lightmaps:" +msgstr "Muunna Lightmapiksi:" + +#: editor/plugins/baked_light_baker.cpp +msgid "Allocating Texture #" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Baking Triangle #" +msgstr "" + +#: editor/plugins/baked_light_baker.cpp +msgid "Post-Processing Texture #" +msgstr "" + +#: editor/plugins/baked_light_editor_plugin.cpp +msgid "Bake!" +msgstr "" + +#: editor/plugins/baked_light_editor_plugin.cpp +msgid "Reset the lightmap octree baking process (start over)." +msgstr "" + +#: editor/plugins/camera_editor_plugin.cpp +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Preview" +msgstr "Esikatselu" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Configure Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Offset:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotation Step:" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Pivot" +msgstr "Siirrä keskikohtaa" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Action" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Edit CanvasItem" +msgstr "Muokkaa CanvasItemiä" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change Anchors" +msgstr "Muuta ankkureita" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom (%):" +msgstr "Lähennä (%):" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Paste Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Select Mode" +msgstr "Valitse tila" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Drag: Rotate" +msgstr "Vedä: Kierrä" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+Drag: Move" +msgstr "Alt+Vedä: Siirrä" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." +msgstr "" +"Paina 'V' vaihtaaksesi kääntökeskiötä. 'Shift+V' vetääksesi keskiötä " +"(liikkuessa)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Alt+RMB: Depth list selection" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Move Mode" +msgstr "Siirtotila" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Rotate Mode" +msgstr "Kääntötila" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "" +"Show a list of all objects at the position clicked\n" +"(same as Alt+RMB in select mode)." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Click to change object's rotation pivot." +msgstr "Klikkaa vaihtaaksesi objektin kääntökeskiötä." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Pan Mode" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Lock the selected object in place (can't be moved)." +msgstr "Lukitse valitut objektit paikalleen (ei voi liikutella)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Unlock the selected object (can be moved)." +msgstr "Poista valittujen objektien lukitus (voi liikutella)." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Makes sure the object's children are not selectable." +msgstr "Varmistaa ettei objektin lapsia voi valita." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Restores the object's children's ability to be selected." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/project_manager.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit" +msgstr "Muokkaa" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Use Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Show Grid" +msgstr "Näytä ruudukko" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Rotation Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap Relative" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Configure Snap.." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Use Pixel Snap" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Expand to Parent" +msgstr "Laajenna Parentiin" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Skeleton.." +msgstr "Luuranko..." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make Bones" +msgstr "Tee luut" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Bones" +msgstr "Tyhjennä luut" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Show Bones" +msgstr "Näytä luut" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Make IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear IK Chain" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View" +msgstr "Näytä/Tarkastele" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Reset" +msgstr "Palauta lähennys" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Zoom Set.." +msgstr "Aseta Zoomaus..." + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Center Selection" +msgstr "Valinta keskikohtaan" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Frame Selection" +msgstr "Framen valinta" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Anchor" +msgstr "Ankkuri" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Keys" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Insert Key (Existing Tracks)" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Copy Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Clear Pose" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Set a Value" +msgstr "Aseta arvo" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Snap (Pixels):" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Add %s" +msgstr "Lisää %s" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Adding %s..." +msgstr "Lisätään %s..." + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Create Node" +msgstr "Luo Node" + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Error instancing scene from %s" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "OK :(" +msgstr "Asia kunnossa :(" + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "No parent to instance a child at." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "This operation requires a single selected node." +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "Change default type" +msgstr "Muuta oletustyyppiä" + +#: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp +msgid "OK" +msgstr "" + +#: editor/plugins/canvas_item_editor_plugin.cpp +msgid "" +"Drag & drop + Shift : Add node as sibling\n" +"Drag & drop + Alt : Change node type" +msgstr "" +"Vedä & pudota + Shift: Lisää Node sisarena\n" +"Vedä & pudota + Alt: Muuta Noden tyyppiä" + +#: editor/plugins/collision_polygon_2d_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create Poly" +msgstr "Luo polygoni" + +#: editor/plugins/collision_polygon_2d_editor_plugin.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Edit Poly" +msgstr "Muokkaa polygonia" + +#: editor/plugins/collision_polygon_2d_editor_plugin.cpp +#: editor/plugins/collision_polygon_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Edit Poly (Remove Point)" +msgstr "Muokkaa polygonia (poista piste)" + +#: editor/plugins/collision_polygon_2d_editor_plugin.cpp +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create a new polygon from scratch." +msgstr "Luo uusi piste tyhjästä." + +#: editor/plugins/collision_polygon_editor_plugin.cpp +msgid "Create Poly3D" +msgstr "Luo Poly3D" + +#: editor/plugins/collision_shape_2d_editor_plugin.cpp +msgid "Set Handle" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Creating Mesh Library" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Thumbnail.." +msgstr "Pienoiskuva..." + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Remove item %d?" +msgstr "" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +#, fuzzy +msgid "Add Item" +msgstr "Lisää" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +#, fuzzy +msgid "Remove Selected Item" +msgstr "Poista valitut" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Import from Scene" +msgstr "Tuo Scenestä" + +#: editor/plugins/cube_grid_theme_editor_plugin.cpp +msgid "Update from Scene" +msgstr "Päivitä Scenestä" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Lisää syöte" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Siirrä pistettä" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Lataa resurssi" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Modify Curve" +msgstr "Muokkaa käyrää" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item %d" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Items" +msgstr "" + +#: editor/plugins/item_list_editor_plugin.cpp +msgid "Item List Editor" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +msgid "Create Occluder Polygon" +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Edit existing polygon:" +msgstr "Muokkaa olemassaolevaa polygonia:" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "LMB: Move Point." +msgstr "VHP: Siirrä pistettä." + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Ctrl+LMB: Split Segment." +msgstr "" + +#: editor/plugins/light_occluder_2d_editor_plugin.cpp +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "RMB: Erase Point." +msgstr "OHP: Pyyhi piste." + +#: editor/plugins/line_2d_editor_plugin.cpp +msgid "Remove Point from Line2D" +msgstr "Poista piste Line2D:stä" + +#: editor/plugins/line_2d_editor_plugin.cpp +msgid "Add Point to Line2D" +msgstr "Lisää piste Line2D:hen" + +#: editor/plugins/line_2d_editor_plugin.cpp +msgid "Move Point in Line2D" +msgstr "Siirrä pistettä LIne 2D:ssä" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Select Points" +msgstr "Valitse pisteet" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Shift+Drag: Select Control Points" +msgstr "" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Click: Add Point" +msgstr "Klikkaa: lisää piste" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Right Click: Delete Point" +msgstr "Oikea klikkaus: Poista piste" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point (in empty space)" +msgstr "Lisää piste (tyhjyydessä)" + +#: editor/plugins/line_2d_editor_plugin.cpp +msgid "Split Segment (in line)" +msgstr "" + +#: editor/plugins/line_2d_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Delete Point" +msgstr "Poista piste" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh is empty!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Trimesh Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Static Convex Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +#, fuzzy +msgid "This doesn't work on scene root!" +msgstr "Tämä ei toimi root-Scenessä!" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Shape" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Navigation Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "MeshInstance lacks a Mesh!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Mesh has not surface to create outlines from!" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Could not create outline!" +msgstr "Ääriviivoja ei voitu luoda!" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline" +msgstr "Luo ääriviivat" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Static Body" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Trimesh Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Convex Collision Sibling" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh.." +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Create Outline Mesh" +msgstr "" + +#: editor/plugins/mesh_instance_editor_plugin.cpp +msgid "Outline Size:" +msgstr "Ääriviivojen koko:" + +#: editor/plugins/multimesh_editor_plugin.cpp +#, fuzzy +msgid "No mesh source specified (and no MultiMesh set in node)." +msgstr "Mesh:in lähdettä ei määritetty" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No mesh source specified (and MultiMesh contains no Mesh)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (invalid path)." +msgstr "Virheellinen Mesh:in lähde (virheellinen polku)." + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (not a MeshInstance)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh source is invalid (contains no Mesh resource)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "No surface source specified." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (invalid path)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no geometry)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Surface source is invalid (no faces)." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Parent has no solid faces to populate." +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Couldn't map area." +msgstr "Aluetta ei voitu kartoittaa." + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Select a Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate Surface" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate MultiMesh" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Target Surface:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Source Mesh:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "X-Axis" +msgstr "X-akseli" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Y-Axis" +msgstr "Y-akseli" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Z-Axis" +msgstr "Z-akseli" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Mesh Up Axis:" +msgstr "" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Rotation:" +msgstr "Satunnainen kierto:" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Tilt:" +msgstr "Satunnainen kallistus:" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Random Scale:" +msgstr "Satunnainen skaalaus:" + +#: editor/plugins/multimesh_editor_plugin.cpp +msgid "Populate" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Create Navigation Polygon" +msgstr "" + +#: editor/plugins/navigation_polygon_editor_plugin.cpp +msgid "Remove Poly And Point" +msgstr "Poista polygoni ja piste" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Luo AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Error loading image:" +msgstr "Virhe ladattaessa kuvaa:" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "No pixels with transparency > 128 in image.." +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Set Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generate Visibility Rect" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Load Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Generated Point Count:" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Keskimääräinen aika (sek)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Luo Scenestä" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry." +msgstr "Node ei sisällä geometriaa." + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Node does not contain geometry (faces)." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "A processor material of type 'ParticlesMaterial' is required." +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Faces contain no area!" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "No faces!" +msgstr "Ei pintoja!" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generate AABB" +msgstr "Luo AABB" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Mesh" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Create Emission Points From Node" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Clear Emitter" +msgstr "Tyhjennä säteilijä/lähetin" + +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Create Emitter" +msgstr "Luo säteilijä/lähetin" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Points:" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Surface Points+Normal (Directed)" +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Volume" +msgstr "Äänenvoimakkuus" + +#: editor/plugins/particles_editor_plugin.cpp +msgid "Emission Source: " +msgstr "" + +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generate Visibility AABB" +msgstr "Luo AABB" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Poista pisteet käyrästä" + +#: editor/plugins/path_2d_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control from Curve" +msgstr "Poista pisteet käyrästä" + +#: editor/plugins/path_2d_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control from Curve" +msgstr "Poista pisteet käyrästä" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Add Point to Curve" +msgstr "Lisää käyrään piste" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Point in Curve" +msgstr "Siirrä pistettä käyrällä" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move In-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Move Out-Control in Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Select Control Points (Shift+Drag)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Segment (in curve)" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +#: editor/plugins/path_editor_plugin.cpp +msgid "Close Curve" +msgstr "Sulje käyrä" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Curve Point #" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Point Pos" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve In Pos" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Set Curve Out Pos" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Split Path" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Path Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Poista polygoni ja piste" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Poista polygoni ja piste" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Create UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Transform UV Map" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon 2D UV Editor" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Point" +msgstr "Siirrä pistettä" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#, fuzzy +msgid "Ctrl: Rotate" +msgstr "Ctrl: Pyöritä/kierrä" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift: Move All" +msgstr "Shift: Siirrä kaikkia" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Shift+Ctrl: Scale" +msgstr "Shift+Ctrl: Skaalaa" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Move Polygon" +msgstr "Siirrä polygonia" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Rotate Polygon" +msgstr "Käännä polygonia" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Scale Polygon" +msgstr "Skaalaa polygonia" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Polygon->UV" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "UV->Polygon" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Clear UV" +msgstr "Tyhjennä UV" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Enable Snap" +msgstr "" + +#: editor/plugins/polygon_2d_editor_plugin.cpp +msgid "Grid" +msgstr "Ruudukko" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "ERROR: Couldn't load resource!" +msgstr "VIRHE: Resurssia ei voitu ladata!" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Add Resource" +msgstr "Lisää resurssi" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Rename Resource" +msgstr "Nimeä resurssi uudelleen" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Delete Resource" +msgstr "Poista resurssi" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +msgid "Resource clipboard is empty!" +msgstr "Resurssien leikepöytä on tyhjä!" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Load Resource" +msgstr "Lataa resurssi" + +#: editor/plugins/resource_preloader_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +#: editor/plugins/sprite_frames_editor_plugin.cpp editor/property_editor.cpp +#: editor/resources_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Paste" +msgstr "Liitä" + +#: editor/plugins/rich_text_editor_plugin.cpp +msgid "Parse BBCode" +msgstr "Liitä BBCode" + +#: editor/plugins/sample_editor_plugin.cpp +msgid "Length:" +msgstr "Pituus:" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Open Sample File(s)" +msgstr "Avaa Sample-tiedosto(t)" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "ERROR: Couldn't load sample!" +msgstr "VIRHE: Samplea ei voitu ladata!" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Add Sample" +msgstr "Lisää Sample" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Rename Sample" +msgstr "Nimeä Sample uudelleen" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Delete Sample" +msgstr "Poista Sample" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "16 Bits" +msgstr "16 bittiä" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "8 Bits" +msgstr "8 bittiä" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Stereo" +msgstr "" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Mono" +msgstr "" + +#: editor/plugins/sample_library_editor_plugin.cpp +#: editor/script_editor_debugger.cpp +msgid "Format" +msgstr "Muoto" + +#: editor/plugins/sample_library_editor_plugin.cpp +msgid "Pitch" +msgstr "Sävelkorkeus" + +#: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Tyhjennä luut" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error while saving theme" +msgstr "Virhe tallennettaessa teemaa" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error saving" +msgstr "Virhe tallennettaessa" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing theme" +msgstr "Virhe tuotaessa teemaa" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Error importing" +msgstr "Virhe tuonnissa" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Import Theme" +msgstr "Tuo teema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As.." +msgstr "Tallenna teema nimellä..." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Next script" +msgstr "Seuraava skripti" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Previous script" +msgstr "Edellinen skripti" + +#: editor/plugins/script_editor_plugin.cpp +msgid "File" +msgstr "Tiedosto" + +#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp +msgid "New" +msgstr "Uusi" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save All" +msgstr "Tallenna kaikki" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Soft Reload Script" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Prev" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "History Next" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload Theme" +msgstr "Lataa teema uudelleen" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme" +msgstr "Tallenna teema" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Save Theme As" +msgstr "Tallenna teema nimellä" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close Docs" +msgstr "Sulje dokumentaatio" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Close All" +msgstr "Sulje kaikki" + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Find.." +msgstr "Etsi..." + +#: editor/plugins/script_editor_plugin.cpp +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Find Next" +msgstr "Etsi seuraava" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +#, fuzzy +msgid "Step Over" +msgstr "Ohita" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Step Into" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Break" +msgstr "Keskeytä" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Continue" +msgstr "Jatka" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Keep Debugger Open" +msgstr "Pidä debuggeri auki" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Window" +msgstr "Ikkuna" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Move Left" +msgstr "Siirry vasemmalle" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Move Right" +msgstr "Siirry oikealle" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Open Godot online documentation" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the class hierarchy." +msgstr "Etsi luokkahierarkia." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Search the reference documentation." +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to previous edited document." +msgstr "Mene edelliseen muokattuun dokumenttiin." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Go to next edited document." +msgstr "Mene seuraavaan muokattuun dokumenttiin." + +#: editor/plugins/script_editor_plugin.cpp +msgid "Discard" +msgstr "Hylkää" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Create Script" +msgstr "Luo skripti" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"The following files are newer on disk.\n" +"What action should be taken?:" +msgstr "" +"Seuraavat tiedostot ovat uudempia.\n" +"MItä toimenpiteitä tulisi suorittaa?:" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Reload" +msgstr "Lataa uudelleen" + +#: editor/plugins/script_editor_plugin.cpp +msgid "Resave" +msgstr "Tallenna uudelleen" + +#: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Debugger" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp +msgid "" +"Built-in scripts can only be edited when the scene they belong to is loaded" +msgstr "" +"Sisäänrakennettuja skriptejä voi muokata ainoastaan kun Scene, johon ne " +"kuuluvat, on ladattu" + +#: editor/plugins/script_text_editor.cpp +msgid "Pick Color" +msgstr "Poimi väri" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Muunnetaan kuvia" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Cut" +msgstr "Leikkaa" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp editor/property_editor.cpp +#: editor/resources_dock.cpp scene/gui/line_edit.cpp scene/gui/text_edit.cpp +msgid "Copy" +msgstr "Kopioi" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp +#: scene/gui/text_edit.cpp +msgid "Select All" +msgstr "Valitse kaikki" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Up" +msgstr "Siirrä ylös" + +#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp +msgid "Move Down" +msgstr "Siirrä alas" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Left" +msgstr "Sisennä vasemmalle" + +#: editor/plugins/script_text_editor.cpp +msgid "Indent Right" +msgstr "Sisennä oikealle" + +#: editor/plugins/script_text_editor.cpp +msgid "Toggle Comment" +msgstr "Näytä/Piilota kommentit" + +#: editor/plugins/script_text_editor.cpp +msgid "Clone Down" +msgstr "Kloonaa alas" + +#: editor/plugins/script_text_editor.cpp +msgid "Complete Symbol" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Trim Trailing Whitespace" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Spaces" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert Indent To Tabs" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Auto Indent" +msgstr "Automaattinen sisennys" + +#: editor/plugins/script_text_editor.cpp +#: modules/visual_script/visual_script_editor.cpp +msgid "Toggle Breakpoint" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Remove All Breakpoints" +msgstr "Poista kaikki breakpointit" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Next Breakpoint" +msgstr "Mene seuraavaan breakpointiin" + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Previous Breakpoint" +msgstr "Mene edelliseen breakpointiin" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Muunna..." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Muunna..." + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Find Previous" +msgstr "Etsi edellinen" + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Replace.." +msgstr "Korvaa..." + +#: editor/plugins/script_text_editor.cpp +msgid "Goto Function.." +msgstr "Mene funktioon..." + +#: editor/plugins/script_text_editor.cpp +#: editor/plugins/shader_editor_plugin.cpp +msgid "Goto Line.." +msgstr "Mene riville..." + +#: editor/plugins/script_text_editor.cpp +msgid "Contextual Help" +msgstr "" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Constant" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Scalar Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Operator" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Toggle Rot Only" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Function" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Scalar Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Vec Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change RGB Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Default Value" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change XForm Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Texture Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Cubemap Uniform" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Comment" +msgstr "Vaihda kommenttia" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Color Ramp" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add/Remove to Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Curve Map" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Change Input Name" +msgstr "Vaihda syötteen nimi" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Connect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Disconnect Graph Nodes" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Remove Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Move Shader Graph Node" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Duplicate Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Delete Shader Graph Node(s)" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Cyclic Connection Link" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Error: Missing Input Connections" +msgstr "" + +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Add Shader Graph Node" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Orthogonal" +msgstr "Ortogonaalinen" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective" +msgstr "Perspektiivi" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Aborted." +msgstr "Muunnos keskeytetty." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "X-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Y-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Z-Axis Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Plane Transform." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scaling to %s%%." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotating %s degrees." +msgstr "Kierto %s astetta." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View." +msgstr "Pohjanäkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom" +msgstr "Pohja" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View." +msgstr "Pintanäkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top" +msgstr "Pinta" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View." +msgstr "Takanäkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Rear" +msgstr "Taka/perä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View." +msgstr "Etunäkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front" +msgstr "Etu" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View." +msgstr "Vasen näkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left" +msgstr "Vasen" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View." +msgstr "Oikea näkymä." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right" +msgstr "OIkea" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Keying is disabled (no key inserted)." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Animation Key Inserted." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Mene eteenpäin" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Taaksepäin" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Rulla alas." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Päivitä muutokset" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Päivitä muutokset" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Päivitä muutokset" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Ominaisuudet:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "Kohdista näkymään" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "Näytä normaali" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "Näytä rautalankamalli" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Display Unshaded" +msgstr "Näytä varjoton" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Ympäristö" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Näytä ruudukko" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Move Mode (W)" +msgstr "Siirtotila (W)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Mode (E)" +msgstr "Kääntötila (E)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Mode (R)" +msgstr "Skaalaustila (R)" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Bottom View" +msgstr "Pohjanäkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Top View" +msgstr "Huippunäkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rear View" +msgstr "Takanäkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Front View" +msgstr "Etunäkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Left View" +msgstr "Vasen näkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Right View" +msgstr "Oikea näkymä" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Switch Perspective/Orthogonal view" +msgstr "Vaihda perspektiiviseen/ortogonaaliseen näkymään" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Insert Animation Key" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Origin" +msgstr "Kohdista origoon" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Focus Selection" +msgstr "Kohdista valintaan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align Selection With View" +msgstr "Kohdista valinta näkymään" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Valitse" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Siirrä" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Pyöritä/kierrä" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Skaalaus:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "Muunna" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "Paikalliset koordinaatit" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "1 Viewport" +msgstr "1 näyttöruutu" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports" +msgstr "2 näyttöruutua" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "2 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports" +msgstr "3 näyttöruutua" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "3 Viewports (Alt)" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "4 Viewports" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Origin" +msgstr "Näytä origo" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Grid" +msgstr "Näytä ruudukko" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Asetukset" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Snap Settings" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate Snap:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate Snap (deg.):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale Snap (%):" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Viewport Settings" +msgstr "Näyttöruudun asetukset" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Perspective FOV (deg.):" +msgstr "Näkökentän perspektiivi (ast.):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Near:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Z-Far:" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Change" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Translate:" +msgstr "Käännä:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Rotate (deg.):" +msgstr "Kierrä (ast.):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Scale (ratio):" +msgstr "Skaalaa (kuvasuhde):" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Type" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Pre" +msgstr "Esi" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Post" +msgstr "Jälki" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "ERROR: Couldn't load frame resource!" +msgstr "VIRHE: Ei voitu ladata framen resurssia!" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Frame" +msgstr "Lisää frame" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Resource clipboard is empty or not a texture!" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Paste Frame" +msgstr "Liitä frame" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Add Empty" +msgstr "Lisää tyhjä" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation Loop" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Change Animation FPS" +msgstr "" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "(empty)" +msgstr "(tyhjä)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animations" +msgstr "Animaatiot" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Speed (FPS):" +msgstr "Nopeus (FPS):" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Animation Frames" +msgstr "Animaatioframet" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (Before)" +msgstr "Syötä tyhjä (ennen)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Insert Empty (After)" +msgstr "Syötä tyhjä (jälkeen)" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Up" +msgstr "Ylös" + +#: editor/plugins/sprite_frames_editor_plugin.cpp +msgid "Down" +msgstr "Alas" + +#: editor/plugins/style_box_editor_plugin.cpp +msgid "StyleBox Preview:" +msgstr "StyleBox:in esikatselu:" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Snap Mode:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "<None>" +msgstr "<Ei mitään>" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Pixel Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Grid Snap" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Auto Slice" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Offset:" +msgstr "Offset:" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Step:" +msgstr "" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Separation:" +msgstr "Erotus:" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region" +msgstr "Tekstuurialue" + +#: editor/plugins/texture_region_editor_plugin.cpp +msgid "Texture Region Editor" +msgstr "Tekstuurialueen editori" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Can't save theme to file:" +msgstr "Teemaa ei voi tallentaa tiedostoon:" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Add All Items" +msgstr "Lisää kaikki" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add All" +msgstr "Lisää kaikki" + +#: editor/plugins/theme_editor_plugin.cpp +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Remove Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Theme" +msgstr "Teema" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Add Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Remove Class Items" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Create Empty Template" +msgstr "Luo tyhjä Template" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Create Empty Editor Template" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio1" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "CheckBox Radio2" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Check Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Checked Item" +msgstr "" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Has" +msgstr "On" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Many" +msgstr "Moni(a)/Monta" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_export.cpp +msgid "Options" +msgstr "Asetukset" + +#: editor/plugins/theme_editor_plugin.cpp +#, fuzzy +msgid "Have,Many,Several,Options!" +msgstr "On,Monia,Useita,Asetuksia" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 1" +msgstr "Välilehti 1" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 2" +msgstr "Välilehti 2" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Tab 3" +msgstr "Välilehti 3" + +#: editor/plugins/theme_editor_plugin.cpp editor/project_settings.cpp +#: editor/scene_tree_editor.cpp editor/script_editor_debugger.cpp +msgid "Type:" +msgstr "Tyyppi:" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Data Type:" +msgstr "Tietotyyppi:" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Icon" +msgstr "Kuvake" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Style" +msgstr "Tyyli" + +#: editor/plugins/theme_editor_plugin.cpp +msgid "Color" +msgstr "Väri" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Paint TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp +msgid "Duplicate" +msgstr "Monista" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase TileMap" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Erase selection" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Find tile" +msgstr "Etsi tile" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Transpose" +msgstr "" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror X" +msgstr "Peilaa X" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Mirror Y" +msgstr "Peilaa Y" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Bucket" +msgstr "Sanko" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Pick Tile" +msgstr "Poimi tile" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Select" +msgstr "Valitse" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 0 degrees" +msgstr "Käännä 0 astetta" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 90 degrees" +msgstr "Käännä 90 astetta" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 180 degrees" +msgstr "Käännä 180 astetta" + +#: editor/plugins/tile_map_editor_plugin.cpp +msgid "Rotate 270 degrees" +msgstr "Käännä 270 astetta" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Could not find tile:" +msgstr "Tileä ei löytynyt:" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Item name or ID:" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from scene?" +msgstr "Luo Scenestä?" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from scene?" +msgstr "Yhdistä Scenestä?" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Create from Scene" +msgstr "Luo Scenestä" + +#: editor/plugins/tile_set_editor_plugin.cpp +msgid "Merge from Scene" +msgstr "" + +#: editor/plugins/tile_set_editor_plugin.cpp editor/script_editor_debugger.cpp +msgid "Error" +msgstr "Virhe" + +#: editor/project_export.cpp +msgid "Runnable" +msgstr "Suoritettava" + +#: editor/project_export.cpp +msgid "Delete patch '" +msgstr "" + +#: editor/project_export.cpp +msgid "Delete preset '%s'?" +msgstr "" + +#: editor/project_export.cpp +msgid "Presets" +msgstr "" + +#: editor/project_export.cpp editor/project_settings.cpp +msgid "Add.." +msgstr "Lisää..." + +#: editor/project_export.cpp +msgid "Resources" +msgstr "Resurssit" + +#: editor/project_export.cpp +msgid "Export all resources in the project" +msgstr "Vie kaikki projektin resurssit" + +#: editor/project_export.cpp +msgid "Export selected scenes (and dependencies)" +msgstr "Vie valitut Scenet (ja riippuvuudet)" + +#: editor/project_export.cpp +msgid "Export selected resources (and dependencies)" +msgstr "Vie valitut resurssit (ja riippuvuudet)" + +#: editor/project_export.cpp +msgid "Export Mode:" +msgstr "" + +#: editor/project_export.cpp +msgid "Resources to export:" +msgstr "Vietävät resurssit:" + +#: editor/project_export.cpp +msgid "" +"Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "" +"Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" +msgstr "" + +#: editor/project_export.cpp +msgid "Patches" +msgstr "" + +#: editor/project_export.cpp +msgid "Make Patch" +msgstr "" + +#: editor/project_export.cpp +msgid "Export templates for this platform are missing:" +msgstr "" + +#: editor/project_export.cpp +msgid "Export With Debug" +msgstr "Vie debugaten" + +#: editor/project_manager.cpp +msgid "Invalid project path, the path must exist!" +msgstr "Virheellinen projektin polku, polku täytyy olla olemassa!" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Invalid project path, project.godot must not exist." +msgstr "Virheellinen projektin polku, godot.cfg -tiedostoa ei saa olla." + +#: editor/project_manager.cpp +#, fuzzy +msgid "Invalid project path, project.godot must exist." +msgstr "" +"Virheellinen projektin polku, godot.cfg -tiedosto täytyy olla olemassa." + +#: editor/project_manager.cpp +msgid "Imported Project" +msgstr "Tuotu projekti" + +#: editor/project_manager.cpp +msgid "Invalid project path (changed anything?)." +msgstr "Virheellinen projektin polku (muuttuiko mikään?)." + +#: editor/project_manager.cpp +#, fuzzy +msgid "Couldn't create project.godot in project path." +msgstr "Ei voitu luoda godot.cfg -tiedostoa projektin polkuun." + +#: editor/project_manager.cpp +msgid "The following files failed extraction from package:" +msgstr "Seuraavien tiedostojen purku paketista epäonnistui:" + +#: editor/project_manager.cpp +msgid "Package Installed Successfully!" +msgstr "Paketti asennettu onnistuneesti!" + +#: editor/project_manager.cpp +msgid "Import Existing Project" +msgstr "Tuo olemassaoleva projekti" + +#: editor/project_manager.cpp +msgid "Project Path (Must Exist):" +msgstr "Projektin polku (täytyy olla olemassa):" + +#: editor/project_manager.cpp +msgid "Project Name:" +msgstr "Projektin nimi:" + +#: editor/project_manager.cpp +msgid "Create New Project" +msgstr "Luo uusi projekti" + +#: editor/project_manager.cpp +msgid "Project Path:" +msgstr "Projektin polku:" + +#: editor/project_manager.cpp +msgid "Install Project:" +msgstr "Asenna projekti:" + +#: editor/project_manager.cpp +msgid "Browse" +msgstr "Selaa" + +#: editor/project_manager.cpp +msgid "New Game Project" +msgstr "Uusi peliprojekti" + +#: editor/project_manager.cpp +msgid "That's a BINGO!" +msgstr "" + +#: editor/project_manager.cpp +msgid "Unnamed Project" +msgstr "Nimetön projekti" + +#: editor/project_manager.cpp +msgid "Are you sure to open more than one project?" +msgstr "Haluatko varmasti avata useamman kuin yhden projektin?" + +#: editor/project_manager.cpp +msgid "Are you sure to run more than one project?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Remove project from the list? (Folder contents will not be modified)" +msgstr "" + +#: editor/project_manager.cpp +msgid "" +"You are about the scan %s folders for existing Godot projects. Do you " +"confirm?" +msgstr "" + +#: editor/project_manager.cpp +msgid "Project Manager" +msgstr "Projektinhallinta" + +#: editor/project_manager.cpp +msgid "Project List" +msgstr "Projektiluettelo" + +#: editor/project_manager.cpp +msgid "Run" +msgstr "Aja" + +#: editor/project_manager.cpp +msgid "Scan" +msgstr "" + +#: editor/project_manager.cpp +msgid "Select a Folder to Scan" +msgstr "Valitse skannattava kansio" + +#: editor/project_manager.cpp +msgid "New Project" +msgstr "Uusi projekti" + +#: editor/project_manager.cpp +#, fuzzy +msgid "Templates" +msgstr "Poista malli" + +#: editor/project_manager.cpp +msgid "Exit" +msgstr "Poistu" + +#: editor/project_settings.cpp +msgid "Key " +msgstr "Näppäin... " + +#: editor/project_settings.cpp +msgid "Joy Button" +msgstr "Joystick-painike" + +#: editor/project_settings.cpp +msgid "Joy Axis" +msgstr "" + +#: editor/project_settings.cpp +msgid "Mouse Button" +msgstr "" + +#: editor/project_settings.cpp +msgid "Invalid action (anything goes but '/' or ':')." +msgstr "" + +#: editor/project_settings.cpp +msgid "Action '%s' already exists!" +msgstr "" + +#: editor/project_settings.cpp +msgid "Rename Input Action Event" +msgstr "" + +#: editor/project_settings.cpp +msgid "Add Input Action Event" +msgstr "" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +#: scene/gui/input_action.cpp +msgid "Meta+" +msgstr "" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +#: scene/gui/input_action.cpp +msgid "Shift+" +msgstr "" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +#: scene/gui/input_action.cpp +msgid "Alt+" +msgstr "" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +msgid "Control+" +msgstr "" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +msgid "Press a Key.." +msgstr "Paina näppäintä..." + +#: editor/project_settings.cpp +msgid "Mouse Button Index:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Left Button" +msgstr "Vasen painike" + +#: editor/project_settings.cpp +msgid "Right Button" +msgstr "Oikea painike" + +#: editor/project_settings.cpp +msgid "Middle Button" +msgstr "Keskipainike" + +#: editor/project_settings.cpp +msgid "Wheel Up Button" +msgstr "Rulla ylös painike" + +#: editor/project_settings.cpp +msgid "Wheel Down Button" +msgstr "Rulla alas painike" + +#: editor/project_settings.cpp +msgid "Button 6" +msgstr "Painike 6" + +#: editor/project_settings.cpp +msgid "Button 7" +msgstr "Painike 7" + +#: editor/project_settings.cpp +msgid "Button 8" +msgstr "Painike 8" + +#: editor/project_settings.cpp +msgid "Button 9" +msgstr "Painike 9" + +#: editor/project_settings.cpp +msgid "Joypad Axis Index:" +msgstr "" + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Axis" +msgstr "Akseli" + +#: editor/project_settings.cpp +msgid "Joypad Button Index:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Add Input Action" +msgstr "Lisää syöttötapahtuma" + +#: editor/project_settings.cpp +msgid "Erase Input Action Event" +msgstr "" + +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Lisää tyhjä" + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Device" +msgstr "Laite" + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Button" +msgstr "Painike" + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Left Button." +msgstr "Vasen painike." + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Right Button." +msgstr "Oikea painike." + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Middle Button." +msgstr "Keskimmäinen painike." + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Wheel Up." +msgstr "Rulla ylös." + +#: editor/project_settings.cpp scene/gui/input_action.cpp +msgid "Wheel Down." +msgstr "Rulla alas." + +#: editor/project_settings.cpp +msgid "Error saving settings." +msgstr "Virhe tallennettaessa asetuksia." + +#: editor/project_settings.cpp +msgid "Settings saved OK." +msgstr "Asetukset tallennettu onnistuneesti." + +#: editor/project_settings.cpp +msgid "Add Translation" +msgstr "Lisää käännös" + +#: editor/project_settings.cpp +msgid "Remove Translation" +msgstr "Poista käännös" + +#: editor/project_settings.cpp +msgid "Add Remapped Path" +msgstr "" + +#: editor/project_settings.cpp +msgid "Resource Remap Add Remap" +msgstr "" + +#: editor/project_settings.cpp +msgid "Change Resource Remap Language" +msgstr "" + +#: editor/project_settings.cpp +msgid "Remove Resource Remap" +msgstr "" + +#: editor/project_settings.cpp +msgid "Remove Resource Remap Option" +msgstr "" + +#: editor/project_settings.cpp +#, fuzzy +msgid "Project Settings (project.godot)" +msgstr "Projektin asetukset" + +#: editor/project_settings.cpp editor/settings_config_dialog.cpp +msgid "General" +msgstr "" + +#: editor/project_settings.cpp editor/property_editor.cpp +msgid "Property:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Del" +msgstr "" + +#: editor/project_settings.cpp +msgid "Copy To Platform.." +msgstr "" + +#: editor/project_settings.cpp +msgid "Input Map" +msgstr "" + +#: editor/project_settings.cpp +msgid "Action:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Device:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Index:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Localization" +msgstr "" + +#: editor/project_settings.cpp +msgid "Translations" +msgstr "" + +#: editor/project_settings.cpp +msgid "Translations:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Remaps" +msgstr "" + +#: editor/project_settings.cpp +msgid "Resources:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Remaps by Locale:" +msgstr "" + +#: editor/project_settings.cpp +msgid "Locale" +msgstr "" + +#: editor/project_settings.cpp +msgid "AutoLoad" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Viewport" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease In" +msgstr "" + +#: editor/property_editor.cpp +msgid "Ease Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Zero" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing In-Out" +msgstr "" + +#: editor/property_editor.cpp +msgid "Easing Out-In" +msgstr "" + +#: editor/property_editor.cpp +msgid "File.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Dir.." +msgstr "" + +#: editor/property_editor.cpp +msgid "Assign" +msgstr "" + +#: editor/property_editor.cpp +msgid "New Script" +msgstr "" + +#: editor/property_editor.cpp +msgid "Show in File System" +msgstr "" + +#: editor/property_editor.cpp +msgid "Error loading file: Not a resource!" +msgstr "" + +#: editor/property_editor.cpp +msgid "Pick a Node" +msgstr "Poimi Node" + +#: editor/property_editor.cpp +msgid "Bit %d, val %d." +msgstr "" + +#: editor/property_editor.cpp +msgid "On" +msgstr "" + +#: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp +msgid "Set" +msgstr "" + +#: editor/property_editor.cpp +msgid "Properties:" +msgstr "Ominaisuudet:" + +#: editor/property_editor.cpp +msgid "Sections:" +msgstr "" + +#: editor/property_selector.cpp +msgid "Select Property" +msgstr "Valitse ominaisuus" + +#: editor/property_selector.cpp +msgid "Select Method" +msgstr "Valitse metodi" + +#: editor/pvrtc_compress.cpp +msgid "Could not execute PVRTC tool:" +msgstr "" + +#: editor/pvrtc_compress.cpp +msgid "Can't load back converted image using PVRTC tool:" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent Node" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Reparent Location (Select new Parent):" +msgstr "" + +#: editor/reparent_dialog.cpp +msgid "Keep Global Transform" +msgstr "" + +#: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp +msgid "Reparent" +msgstr "" + +#: editor/resources_dock.cpp +msgid "Create New Resource" +msgstr "" + +#: editor/resources_dock.cpp +msgid "Open Resource" +msgstr "" + +#: editor/resources_dock.cpp +msgid "Save Resource" +msgstr "" + +#: editor/resources_dock.cpp +msgid "Resource Tools" +msgstr "" + +#: editor/resources_dock.cpp +msgid "Make Local" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Run Mode:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Current Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Main Scene Arguments:" +msgstr "" + +#: editor/run_settings_dialog.cpp +msgid "Scene Run Settings" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "No parent to instance the scenes at." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error loading scene from %s" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Ok" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "" +"Cannot instance the scene '%s' because the current scene exists within one " +"of its nodes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Instance Scene(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on the tree root." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Node In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Move Nodes In Parent" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Duplicate Node(s)" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)?" +msgstr "Poista Node(t)?" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done without a scene." +msgstr "Tätä toimintoa ei voi tehdä ilman Sceneä." + +#: editor/scene_tree_dock.cpp +msgid "Can not perform with the root node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "This operation can't be done on instanced scenes." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Save New Scene As.." +msgstr "Tallenna uusi scene nimellä..." + +#: editor/scene_tree_dock.cpp +msgid "Makes Sense!" +msgstr "Käy järkeen!" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes from a foreign scene!" +msgstr "Ei voida käyttää ulkopuolisen scenen nodeja!" + +#: editor/scene_tree_dock.cpp +msgid "Can't operate on nodes the current scene inherits from!" +msgstr "Ei voida käyttää nodeja, jotka periytyvät nykyisestä scenestä!" + +#: editor/scene_tree_dock.cpp +msgid "Remove Node(s)" +msgstr "Poista Node(t)" + +#: editor/scene_tree_dock.cpp +msgid "" +"Couldn't save new scene. Likely dependencies (instances) couldn't be " +"satisfied." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Error saving scene." +msgstr "Virhe tallennettaessa sceneä." + +#: editor/scene_tree_dock.cpp +msgid "Error duplicating scene to save it." +msgstr "" + +#: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Resurssit" + +#: editor/scene_tree_dock.cpp +msgid "Edit Groups" +msgstr "Muokkaa ryhmiä" + +#: editor/scene_tree_dock.cpp +msgid "Edit Connections" +msgstr "Muokkaa yhteyksiä" + +#: editor/scene_tree_dock.cpp +msgid "Delete Node(s)" +msgstr "Poista Node(t)" + +#: editor/scene_tree_dock.cpp +msgid "Add Child Node" +msgstr "Lisää lapsinode" + +#: editor/scene_tree_dock.cpp +msgid "Instance Child Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Change Type" +msgstr "Muuta tyyppiä" + +#: editor/scene_tree_dock.cpp +msgid "Attach Script" +msgstr "Liitä skripti" + +#: editor/scene_tree_dock.cpp +msgid "Clear Script" +msgstr "Tyhjennä skripti" + +#: editor/scene_tree_dock.cpp +msgid "Merge From Scene" +msgstr "Yhdistä scenestä" + +#: editor/scene_tree_dock.cpp +msgid "Save Branch as Scene" +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Copy Node Path" +msgstr "Kopioi Noden polku" + +#: editor/scene_tree_dock.cpp +msgid "Delete (No Confirm)" +msgstr "Poista (ei varmistusta)" + +#: editor/scene_tree_dock.cpp +msgid "Add/Create a New Node" +msgstr "Lisää/Luo uusi Node" + +#: editor/scene_tree_dock.cpp +msgid "" +"Instance a scene file as a Node. Creates an inherited scene if no root node " +"exists." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Attach a new or existing script for the selected node." +msgstr "" + +#: editor/scene_tree_dock.cpp +msgid "Clear a script for the selected node." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Spatial Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle CanvasItem Visible" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Debug-asetukset" + +#: editor/scene_tree_editor.cpp +msgid "Instance:" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Seuraava skripti" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Invalid node name, the following characters are not allowed:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Rename Node" +msgstr "Nimeä Node uudelleen" + +#: editor/scene_tree_editor.cpp +msgid "Scene Tree (Nodes):" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Editable Children" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Load As Placeholder" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Discard Instancing" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Open in Editor" +msgstr "Avaa editorissa" + +#: editor/scene_tree_editor.cpp +msgid "Clear Inheritance" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Clear Inheritance? (No Undo!)" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Clear!" +msgstr "Tyhjennä!" + +#: editor/scene_tree_editor.cpp +msgid "Select a Node" +msgstr "Valitse Node" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Ei voitu luoda skriptiä tiedostojärjestelmään." + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" +msgstr "Virhe ladattaessa skripti %s:stä" + +#: editor/script_create_dialog.cpp +msgid "Path is empty" +msgstr "Polku on tyhjä" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" +msgstr "Polku ei ole paikallinen" + +#: editor/script_create_dialog.cpp +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" +msgstr "Virheellinen laajennus" + +#: editor/script_create_dialog.cpp +msgid "Wrong extension chosen" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Invalid Path" +msgstr "Virheellinen polku." + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" +msgstr "Virheellinen luokan nimi" + +#: editor/script_create_dialog.cpp +msgid "Invalid inherited parent name or path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Script valid" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "N/A" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Create new script file" +msgstr "Luo uusi skripti" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Load existing script file" +msgstr "Lataa olemassaoleva skripti" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Inherits" +msgstr "Perii:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" +msgstr "Luokan nimi:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "Poista malli" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" +msgstr "Sisäänrakennettu skripti" + +#: editor/script_create_dialog.cpp +msgid "Attach Node Script" +msgstr "Liitä Noden skripti" + +#: editor/script_editor_debugger.cpp +msgid "Bytes:" +msgstr "Tavu(j)a:" + +#: editor/script_editor_debugger.cpp +msgid "Warning" +msgstr "Varoitus" + +#: editor/script_editor_debugger.cpp +msgid "Error:" +msgstr "Virhe:" + +#: editor/script_editor_debugger.cpp +msgid "Source:" +msgstr "Lähde:" + +#: editor/script_editor_debugger.cpp +msgid "Function:" +msgstr "Funktio:" + +#: editor/script_editor_debugger.cpp +msgid "Errors" +msgstr "Virheet" + +#: editor/script_editor_debugger.cpp +msgid "Child Process Connected" +msgstr "Lapsiprosessi yhdistetty" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Previous Instance" +msgstr "Tarkastele edellistä instanssia" + +#: editor/script_editor_debugger.cpp +msgid "Inspect Next Instance" +msgstr "Tarkastele seuraavaa instanssia" + +#: editor/script_editor_debugger.cpp +msgid "Stack Frames" +msgstr "Pinoa Framet" + +#: editor/script_editor_debugger.cpp +msgid "Variable" +msgstr "Muuttuja" + +#: editor/script_editor_debugger.cpp +msgid "Errors:" +msgstr "Virheet:" + +#: editor/script_editor_debugger.cpp +msgid "Stack Trace (if applicable):" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Inspector" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Scene Tree:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Remote Object Properties: " +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Profiler" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitor" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Value" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Monitors" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "List of Video Memory Usage by Resource:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Total:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Video Mem" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Resource Path" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Type" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Usage" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Misc" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Clicked Control Type:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Live Edit Root:" +msgstr "" + +#: editor/script_editor_debugger.cpp +msgid "Set From Tree" +msgstr "" + +#: editor/settings_config_dialog.cpp +msgid "Shortcuts" +msgstr "Pikakuvakkeet" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Light Radius" +msgstr "Muuta valon sädettä" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera FOV" +msgstr "Muuta kameran näkökenttää" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Camera Size" +msgstr "Muuta kameran kokoa" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Sphere Shape Radius" +msgstr "Muuta pallon sädettä" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Box Shape Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Radius" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Capsule Shape Height" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Ray Shape Length" +msgstr "Vaihda säteen muodon pituutta" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Notifier Extents" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Particles AABB" +msgstr "" + +#: editor/spatial_editor_gizmos.cpp +msgid "Change Probe Extents" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Invalid type argument to convert(), use TYPE_* constants." +msgstr "" + +#: modules/gdscript/gd_functions.cpp +#: modules/visual_script/visual_script_builtin_funcs.cpp +msgid "Not enough bytes for decoding bytes, or invalid format." +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "step argument is zero!" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Not a script with an instance" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Not based on a script" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Not based on a resource file" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Invalid instance dictionary format (missing @path)" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Invalid instance dictionary format (can't load script at @path)" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Invalid instance dictionary format (invalid script at @path)" +msgstr "" + +#: modules/gdscript/gd_functions.cpp +msgid "Invalid instance dictionary (invalid subclasses)" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"A node yielded without working memory, please read the docs on how to yield " +"properly!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Node yielded, but did not return a function state in the first working " +"memory." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "" +"Return value must be assigned to first element of node working memory! Fix " +"your node please." +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Node returned an invalid sequence output: " +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Found sequence bit but not the node in the stack, report bug!" +msgstr "" + +#: modules/visual_script/visual_script.cpp +msgid "Stack overflow with stack depth: " +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Functions:" +msgstr "Funktiot:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Variables:" +msgstr "Muuttujat:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name is not a valid identifier:" +msgstr "Nimi ei ole kelvollinen tunniste:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Name already in use by another func/var/signal:" +msgstr "Nimi on jo toisen funktion/muuttujan/signaalin käytössä:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Function" +msgstr "Nimeä funktio uudelleen" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Variable" +msgstr "Nimeä muuttuja uudelleen" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Rename Signal" +msgstr "Nimeä signaali uudelleen" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Function" +msgstr "Lisää funktio" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Variable" +msgstr "Lisää muuttuja" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Signal" +msgstr "Lisää signaali" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Function" +msgstr "Poista funktio" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Variable" +msgstr "Poista muuttuja" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Variable:" +msgstr "Muokataan muuttujaa:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Remove Signal" +msgstr "Poista signaali" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Editing Signal:" +msgstr "Muokataan signaalia:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change Expression" +msgstr "Vaihda lauseketta" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node" +msgstr "Lisää Node" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Meta to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Meta to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a simple reference to the node." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Meta to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Hold Ctrl to drop a Variable Setter." +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Preload Node" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Node(s) From Tree" +msgstr "Lisää Nodet puusta" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Getter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Add Setter Property" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Condition" +msgstr "Ehtolause" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Sequence" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Switch" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Iterator" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "While" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Return" +msgstr "Palauta" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Get" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Base Type:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Available Nodes:" +msgstr "Saatavilla olevat Nodet:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Select or create a function to edit graph" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Signal Arguments:" +msgstr "" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Edit Variable:" +msgstr "Muokkaa muuttujaa:" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Change" +msgstr "Muuta" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Delete Selected" +msgstr "Poista valitut" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Find Node Type" +msgstr "Etsi Noden tyyppi" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Copy Nodes" +msgstr "Kopioi Nodet" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Cut Nodes" +msgstr "Leikkaa Nodet" + +#: modules/visual_script/visual_script_editor.cpp +msgid "Paste Nodes" +msgstr "Liitä Nodet" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Input type not iterable: " +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid" +msgstr "" + +#: modules/visual_script/visual_script_flow_control.cpp +msgid "Iterator became invalid: " +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name." +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Base object is not a Node!" +msgstr "" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Path does not lead Node!" +msgstr "Polku ei vie Nodeen!" + +#: modules/visual_script/visual_script_func_nodes.cpp +msgid "Invalid index property name '%s' in node %s." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid argument of type: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid ": Invalid arguments: " +msgstr ": Virheelliset argumentit: " + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableGet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "VariableSet not found in script: " +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "Custom node has no _step() method, can't process graph." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "" +"Invalid return value from _step(), must be integer (seq out), or string " +"(error)." +msgstr "" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "just pressed" +msgstr "juuri painettu" + +#: modules/visual_script/visual_script_nodes.cpp +msgid "just released" +msgstr "juuri julkaistu" + +#: platform/javascript/export/export.cpp +msgid "Run in Browser" +msgstr "Suorita selaimessa" + +#: platform/javascript/export/export.cpp +msgid "Run exported HTML in the system's default browser." +msgstr "Suorita viety HTML järjestelmän oletusselaimessa." + +#: platform/javascript/export/export.cpp +msgid "Could not write file:\n" +msgstr "Ei voitu kirjoittaa tiedostoa:\n" + +#: platform/javascript/export/export.cpp +msgid "Could not read file:\n" +msgstr "Ei voitu lukea tiedostoa:\n" + +#: platform/javascript/export/export.cpp +msgid "Could not open template for export:\n" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "" +"Couldn't read the certificate file. Are the path and password both correct?" +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Error creating the signature object." +msgstr "Virhe luotaessa allekirjoitusoliota." + +#: platform/uwp/export/export.cpp +msgid "Error creating the package signature." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "" +"No export templates found.\n" +"Download and install export templates." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Custom debug package not found." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Custom release package not found." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid unique name." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid product GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid publisher GUID." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid background color." +msgstr "Virheellinen taustaväri." + +#: platform/uwp/export/export.cpp +msgid "Invalid Store Logo image dimensions (should be 50x50)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." +msgstr "" + +#: platform/uwp/export/export.cpp +msgid "Invalid splash screen image dimensions (should be 620x300)." +msgstr "" + +#: scene/2d/animated_sprite.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite to display frames." +msgstr "" + +#: scene/2d/canvas_modulate.cpp +msgid "" +"Only one visible CanvasModulate is allowed per scene (or set of instanced " +"scenes). The first created one will work, while the rest will be ignored." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "" +"CollisionPolygon2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_polygon_2d.cpp +msgid "An empty CollisionPolygon2D has no effect on collision." +msgstr "Tyhjällä CollisionPolygon2D:llä ei ole vaikutusta törmäyksessä." + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"CollisionShape2D only serves to provide a collision shape to a " +"CollisionObject2D derived node. Please only use it as a child of Area2D, " +"StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." +msgstr "" + +#: scene/2d/collision_shape_2d.cpp +msgid "" +"A shape must be provided for CollisionShape2D to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/2d/light_2d.cpp +msgid "" +"A texture with the shape of the light must be supplied to the 'texture' " +"property." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "" +"An occluder polygon must be set (or drawn) for this occluder to take effect." +msgstr "" + +#: scene/2d/light_occluder_2d.cpp +msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"A NavigationPolygon resource must be set or created for this node to work. " +"Please set a property or draw a polygon." +msgstr "" + +#: scene/2d/navigation_polygon.cpp +msgid "" +"NavigationPolygonInstance must be a child or grandchild to a Navigation2D " +"node. It only provides navigation data." +msgstr "" + +#: scene/2d/parallax_layer.cpp +msgid "" +"ParallaxLayer node only works when set as child of a ParallaxBackground node." +msgstr "" + +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" + +#: scene/2d/path_2d.cpp +msgid "PathFollow2D only works when set as a child of a Path2D node." +msgstr "" +"PathFollow2D toimii ainoastaan ollessaan asetettuna Path2D Node:n " +"lapsiolioksi." + +#: scene/2d/remote_transform_2d.cpp +msgid "Path property must point to a valid Node2D node to work." +msgstr "Polku täytyy olla määritetty toimivaan Node2D solmuun toimiakseen." + +#: scene/2d/sprite.cpp +msgid "" +"Path property must point to a valid Viewport node to work. Such Viewport " +"must be set to 'render target' mode." +msgstr "" + +#: scene/2d/sprite.cpp +msgid "" +"The Viewport set in the path property must be set as 'render target' in " +"order for this sprite to work." +msgstr "" + +#: scene/2d/visibility_notifier_2d.cpp +msgid "" +"VisibilityEnable2D works best when used with the edited scene root directly " +"as parent." +msgstr "" + +#: scene/3d/body_shape.cpp +msgid "" +"CollisionShape only serves to provide a collision shape to a CollisionObject " +"derived node. Please only use it as a child of Area, StaticBody, RigidBody, " +"KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/body_shape.cpp +msgid "" +"A shape must be provided for CollisionShape to function. Please create a " +"shape resource for it!" +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "" +"CollisionPolygon only serves to provide a collision shape to a " +"CollisionObject derived node. Please only use it as a child of Area, " +"StaticBody, RigidBody, KinematicBody, etc. to give them a shape." +msgstr "" + +#: scene/3d/collision_polygon.cpp +msgid "An empty CollisionPolygon has no effect on collision." +msgstr "Tyhjällä CollisionPolygon:illa ei ole vaikutusta törmäyksessä." + +#: scene/3d/navigation_mesh.cpp +msgid "A NavigationMesh resource must be set or created for this node to work." +msgstr "" + +#: scene/3d/navigation_mesh.cpp +msgid "" +"NavigationMeshInstance must be a child or grandchild to a Navigation node. " +"It only provides navigation data." +msgstr "" + +#: scene/3d/particles.cpp +msgid "" +"Nothing is visible because meshes have not been assigned to draw passes." +msgstr "" + +#: scene/3d/remote_transform.cpp +msgid "Path property must point to a valid Spatial node to work." +msgstr "" + +#: scene/3d/scenario_fx.cpp +msgid "" +"Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." +msgstr "" + +#: scene/3d/sprite_3d.cpp +msgid "" +"A SpriteFrames resource must be created or set in the 'Frames' property in " +"order for AnimatedSprite3D to display frames." +msgstr "" + +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Kääntötila" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp +msgid "Alert!" +msgstr "Huomio!" + +#: scene/gui/dialogs.cpp +msgid "Please Confirm..." +msgstr "Ole hyvä ja vahvista..." + +#: scene/gui/file_dialog.cpp +msgid "Open a File" +msgstr "Avaa tiedosto" + +#: scene/gui/file_dialog.cpp +msgid "Open File(s)" +msgstr "Avaa tiedosto(t)" + +#: scene/gui/file_dialog.cpp +msgid "Open a Directory" +msgstr "Avaa hakemisto" + +#: scene/gui/file_dialog.cpp +msgid "Open a File or Directory" +msgstr "Avaa tiedosto tai hakemisto" + +#: scene/gui/input_action.cpp +msgid "Ctrl+" +msgstr "Ctrl+" + +#: scene/gui/popup.cpp +msgid "" +"Popups will hide by default unless you call popup() or any of the popup*() " +"functions. Making them visible for editing is fine though, but they will " +"hide upon running." +msgstr "" +"Pop-upit piilotetaan oletusarvoisesti ellet kutsu popup() tai jotain muuta " +"popup*() -funktiota. Ne saadaan näkyville muokatessa, mutta eivät näy " +"suoritettaessa." + +#: scene/gui/scroll_container.cpp +msgid "" +"ScrollContainer is intended to work with a single child control.\n" +"Use a container as child (VBox,HBox,etc), or a Control and set the custom " +"minimum size manually." +msgstr "" +"ScrollContainer on tarkoitettu toimimaan yhdellä lapsikontrollilla.\n" +"Käytä containeria lapsena (VBox, HBox, jne), tai Control:ia ja aseta haluttu " +"minimikoko manuaalisesti." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + +#: scene/main/viewport.cpp +msgid "" +"This viewport is not set as render target. If you intend for it to display " +"its contents directly to the screen, make it a child of a Control so it can " +"obtain a size. Otherwise, make it a RenderTarget and assign its internal " +"texture to some node for display." +msgstr "" +"Tätä näyttöruutua ei ole asetettu renderöitäväksi. Jos haluat sen näyttävän " +"sisältöä suoraan näytölle, tee sitä Control:in lapsi, jotta se voi saada " +"koon. Muutoin tee siitä RenderTarget ja aseta sen sisäinen tekstuuri " +"johonkin Nodeen näkyväksi." + +#~ msgid "Node From Scene" +#~ msgstr "Node Scenestä" + +#~ msgid "Import assets to the project." +#~ msgstr "Tuo Assetit projektiin." + +#~ msgid "Export the project to many platforms." +#~ msgstr "Vie projekti usealle alustalle." + +#~ msgid "Tutorials" +#~ msgstr "Oppaat" + +#, fuzzy +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Avaa https://godotengine.org \"tutorials\"-alueelle." + +#~ msgid "Use Default Light" +#~ msgstr "Käytä oletusvaloa" + +#~ msgid "Valid chars:" +#~ msgstr "Kelvolliset merkit:" + +#~ msgid "Valid name" +#~ msgstr "Kelvollinen nimi" + +#~ msgid "Class name is invalid!" +#~ msgstr "Luokan nimi on virheellinen!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Kantaluokan nimi on virheellinen!" + +#~ msgid "Invalid path!" +#~ msgstr "Virheellinen polku!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Polun ominaisuuden täytyy osoittaa kelvolliseen Particles2D Nodeen " +#~ "toimiakseen." diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 8db0cf2555..bb60c74475 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -1,14 +1,15 @@ # French translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Brice <bbric@free.fr>, 2016. # Chenebel Dorian <LoubiTek54@gmail.com>, 2016-2017. # derderder77 <derderder77380@gmail.com>, 2016. # finkiki <specialpopol@gmx.fr>, 2016. +# Gilles Roudiere <gilles.roudiere@gmail.com>, 2017. # Hugo Locurcio <hugo.l@openmailbox.org>, 2016-2017. # Marc <marc.gilleron@gmail.com>, 2016-2017. +# Nathan Lovato <nathan.lovato.art@gmail.com>, 2017. # Nicolas Lehuen <nicolas@lehuen.com>, 2016. # Omicron <tritonic.dev@gmail.com>, 2016. # Onyx Steinheim <thevoxelmanonyx@gmail.com>, 2016. @@ -21,8 +22,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-02-28 20:39+0000\n" -"Last-Translator: Hugo Locurcio <hugo.l@openmailbox.org>\n" +"PO-Revision-Date: 2017-05-25 09:31+0000\n" +"Last-Translator: Nathan Lovato <nathan.lovato.art@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -30,7 +31,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 2.12-dev\n" +"X-Generator: Weblate 2.14.1\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -297,7 +298,7 @@ msgstr "Outils de piste" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "Activer la modification de pistes individuelles en cliquant dessus." +msgstr "Activer la modification de chaque clé en cliquant dessus." #: editor/animation_editor.cpp msgid "Anim. Optimizer" @@ -525,7 +526,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "Bas" +msgstr "Télécharger" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -559,7 +560,8 @@ msgid "Search:" msgstr "Rechercher :" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -605,7 +607,7 @@ msgstr "Support…" msgid "Official" msgstr "Officiel" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Communauté" @@ -650,7 +652,6 @@ msgid "No Matches" msgstr "Pas de correspondances" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "%d occurrence(s) remplacée(s)." @@ -751,6 +752,7 @@ msgstr "Ajouter" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Supprimer" @@ -860,6 +862,7 @@ msgstr "Ressource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Chemin" @@ -952,24 +955,24 @@ msgid "Delete" msgstr "Supprimer" #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Enregistrer la Disposition des Bus Audio Sous.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Emplacement de la Nouvelle Mise en Page.." #: editor/editor_audio_buses.cpp +#, fuzzy msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Ouvrir la Mise en Page des Bus Audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Tout ajouter" +msgstr "Ajouter un bus" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Charger" @@ -979,6 +982,7 @@ msgid "Save As" msgstr "Enregistrer sous" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Par défaut" @@ -1053,8 +1057,7 @@ msgid "Rearrange Autoloads" msgstr "Ré-organiser les AutoLoads" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Chemin :" @@ -1122,7 +1125,7 @@ msgstr "Empaquetage" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Fichier modèle introuvable :\n" #: editor/editor_export.cpp msgid "Added:" @@ -1242,11 +1245,11 @@ msgid "ScanSources" msgstr "Scanner les sources" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Ré-importation" +msgstr "Ré-importation des assets" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Chercher dans l'aide" @@ -1263,7 +1266,6 @@ msgid "Class:" msgstr "Classe :" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Hérite de :" @@ -1433,10 +1435,11 @@ msgid "There is no defined scene to run." msgstr "Il n'y a pas de scène définie pour être lancée." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Aucune scène principale n'a jamais été définie, en sélectionner une ?\n" "Vous pouvez la modifier ultérieurement dans les « Paramètres du projet » " @@ -1502,6 +1505,11 @@ msgid "Save Scene As.." msgstr "Enregistrer la scène sous…" #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "NÅ“ud" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" "Cette scène n'a jamais été enregistrée. L'enregistrer avant de la lancer ?" @@ -1559,9 +1567,12 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"La scène « %s » a été automatiquement importée, elle ne peut donc pas être " +"modifiée.\n" +"Pour y apporter des modification, une scène fille peut être créée." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Oups" @@ -1602,6 +1613,10 @@ msgstr "%d fichier(s) supplémentaire(s)" msgid "%d more file(s) or folder(s)" msgstr "%s fichier(s) ou dossier(s) supplémentaire(s)" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Mode sans distraction" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Scène" @@ -1619,9 +1634,8 @@ msgid "Previous tab" msgstr "Onglet precedent" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "Filtre rapide d'un fichier…" +msgstr "Filtrer des fichiers…" #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1655,7 +1669,7 @@ msgstr "Fermer la scène" msgid "Close Goto Prev. Scene" msgstr "Fermer, aller à la scène précédente" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Fichiers récents" @@ -1683,85 +1697,41 @@ msgid "Redo" msgstr "Refaire" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Lancer le script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Paramètres du projet" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Réinitialiser la scène" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Quitter vers la liste des projets" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Mode sans distraction" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Outils divers liés au projet ou à la scène." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Outils" +#, fuzzy +msgid "Project" +msgstr "Nouveau projet" + +#: editor/editor_node.cpp +msgid "Project Settings" +msgstr "Paramètres du projet" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exporter le projet vers diverses plate-formes." +msgid "Run Script" +msgstr "Lancer le script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exporter" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Lancer le projet." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Jouer" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Mettre en pause la scène" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Mettre en pause la scène" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Arrêter la scène." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Arrêter" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Lancer la scène actuellement en cours d'édition." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Lancer la scène" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Jouer une scène personnalisée" +msgid "Tools" +msgstr "Outils" #: editor/editor_node.cpp -#, fuzzy -msgid "Play Custom Scene" -msgstr "Jouer une scène personnalisée" +msgid "Quit to Project List" +msgstr "Quitter vers la liste des projets" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Options de débogage" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Débogage" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1776,9 +1746,8 @@ msgstr "" "connecter à l'adresse IP de cet ordinateur afin de procéder au débogage." #: editor/editor_node.cpp -#, fuzzy msgid "Small Deploy with Network FS" -msgstr "Petit déploiement avec le réseau FS" +msgstr "Petit déploiement avec le réseau" #: editor/editor_node.cpp msgid "" @@ -1853,9 +1822,10 @@ msgstr "" "Quand elle est utilisée à distance sur un périphérique, cette option est " "plus efficace avec le système de fichiers réseau." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Paramètres" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Modifier" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1870,17 +1840,73 @@ msgid "Toggle Fullscreen" msgstr "Basculer le mode plein écran" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Chargement des modèles d'exportation" +msgstr "Gérer les modèles d'exportation" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Aide" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Classes" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Fermer les documentations" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "À propos" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Alerte lorsqu'une ressource externe a été modifiée." +msgid "Play the project." +msgstr "Lancer le projet." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Jouer" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Mettre en pause la scène" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Mettre en pause la scène" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Arrêter la scène." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Arrêter" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Lancer la scène actuellement en cours d'édition." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Lancer la scène" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Jouer une scène personnalisée" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Jouer une scène personnalisée" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1963,6 +1989,14 @@ msgid "Thanks!" msgstr "Merci !" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importer des modèles depuis un fichier ZIP" @@ -1990,6 +2024,36 @@ msgstr "Ouvrir et exécuter un script" msgid "Load Errors" msgstr "Erreurs de chargement" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Ouvrir dans l'éditeur" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Ouvrir dans l'éditeur" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Ouvrir dans l'éditeur" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Bibliothèque d'exportation" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Ouvrir dans l'éditeur" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Ouvrir dans l'éditeur" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Extensions installées :" @@ -2110,28 +2174,24 @@ msgid "Import From Node:" msgstr "Importer à partir d'un nÅ“ud :" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "Recharger" +msgstr "Télécharger à nouveau" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Installer" +msgstr "Désinstaller" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Installer" +msgstr "(Installé)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "Bas" +msgstr "Télécharger" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Manquant)" #: editor/export_template_manager.cpp #, fuzzy @@ -2140,25 +2200,30 @@ msgstr "Actuel :" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Supprimer la version '%s' du modèle ?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." msgstr "Impossible d'ouvrir le ZIP de modèles d'exportation." #: editor/export_template_manager.cpp +#, fuzzy msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Le format de version.txt invalide dans les modèles." #: editor/export_template_manager.cpp +#, fuzzy msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Le format de version.txt invalide dans les modèles. Revision n'est pas un " +"identifiant valide." #: editor/export_template_manager.cpp +#, fuzzy msgid "No version.txt found inside templates." -msgstr "" +msgstr "Le fichier version.txt n'a pas été trouvé dans les modèles." #: editor/export_template_manager.cpp #, fuzzy @@ -2181,7 +2246,7 @@ msgstr "Chargement des modèles d'exportation" #: editor/export_template_manager.cpp #, fuzzy msgid "Current Version:" -msgstr "Scène actuelle" +msgstr "Version actuelle :" #: editor/export_template_manager.cpp #, fuzzy @@ -2216,7 +2281,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "Ne peux pas acceder à '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2249,7 +2314,11 @@ msgstr "Étendre au parent" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Réduire tout" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Montrer dans le gestionnaire de fichiers" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2280,10 +2349,6 @@ msgid "Info" msgstr "Information" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Montrer dans le gestionnaire de fichiers" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Ré-importer…" @@ -2297,7 +2362,7 @@ msgstr "Répertoire suivant" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Re-scanner le système de fichiers" +msgstr "Analyser à nouveau le système de fichiers" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" @@ -2305,7 +2370,9 @@ msgstr "Basculer l'état favori du dossier" #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." -msgstr "Instancie la/les scènes sélectionnées en tant qu'enfant du nÅ“ud." +msgstr "" +"Instancie la(les) scène(s) sélectionnée(s) en tant qu'enfant(s) du nÅ“ud " +"sélectionné." #: editor/filesystem_dock.cpp msgid "Move" @@ -2453,9 +2520,10 @@ msgid "No target font resource!" msgstr "Pas de ressource de police de destination !" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Extension de fichier non valide.\n" "Veuillez utiliser .fnt." @@ -2514,7 +2582,7 @@ msgstr "Impossible d'ouvrir le fichier en tant que fichier BMFont." #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp msgid "Error initializing FreeType." -msgstr "Erreur d'initialisation de Freetype." +msgstr "Erreur à l'initialisation de Freetype." #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp @@ -2640,7 +2708,7 @@ msgstr "Script invalide ou cassé de post-importation." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Error importing scene." -msgstr "Erreur d'importation de la scène." +msgstr "Erreur à l'importation de la scène." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import 3D Scene" @@ -2652,7 +2720,7 @@ msgstr "Scène source :" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Same as Target Scene" -msgstr "Le même que la scène de destination" +msgstr "Identique à la scène de destination" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Shared" @@ -2821,8 +2889,8 @@ msgid "" "NOTICE: Importing 2D textures is not mandatory. Just copy png/jpg files to " "the project." msgstr "" -"REMARQUE : Il n'est pas obligatoire d'importer les textures en 2D. Copiez " -"directement les fichiers PNG ou JPEG dans le projet." +"REMARQUE : L'import de textures 2D n'est pas obligatoire. Copiez directement " +"les fichiers PNG ou JPEG dans le projet." #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Crop empty space." @@ -2939,7 +3007,7 @@ msgstr "Compresser" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Ajouter au projet (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3207,7 +3275,7 @@ msgstr "Mélange 1 :" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "" +msgstr "Durée du fondu (s) :" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" @@ -3587,7 +3655,7 @@ msgstr "Tout ajouter" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "Ajout de %s..." #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" @@ -3617,7 +3685,7 @@ msgid "Change default type" msgstr "Changer la valeur par défaut" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3626,6 +3694,8 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" +"Glisser-déposer + Maj : Ajouter un nÅ“ud frère\n" +"Glisser-déposer + Alt : Modifier le type de nÅ“ud" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -3666,17 +3736,6 @@ msgstr "Créer un Poly3D" msgid "Set Handle" msgstr "Définir la poignée" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Ajouter/supprimer un point de rampe de couleur" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Modifier une rampe de couleurs" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Création de la bibliothèque de maillages" @@ -3709,9 +3768,33 @@ msgstr "Mettre à jour depuis la scène" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Ajouter une entrée" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Supprimer le chemin du point" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Charger une ressource" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Modifier la carte de courbes" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Ajouter/supprimer un point de rampe de couleur" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modifier une rampe de couleurs" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Objet %d" @@ -3814,7 +3897,7 @@ msgstr "Créer un corps statique de type Trimesh" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Convex Body" -msgstr "Créer un corps statique de type convexe" +msgstr "Créer corps convexe statique" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" @@ -3991,6 +4074,20 @@ msgid "Remove Poly And Point" msgstr "Supprimer le polygone et le point" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Effacer le masque d'émission" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Générer un AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Erreur de chargement de l'image :" @@ -4003,8 +4100,8 @@ msgid "Set Emission Mask" msgstr "Définir le masque d'émission" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Effacer le masque d'émission" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4014,6 +4111,27 @@ msgstr "Charger le masque d'émission" msgid "Generated Point Count:" msgstr "Compte de points générés :" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Temps moyen (seconde)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Définir le masque d'émission" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Créer depuis la scène" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Positions d'émission :" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "Le nÅ“ud ne contient pas de géométrie." @@ -4027,11 +4145,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Générer un AABB" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Les faces n'ont pas de surface !" @@ -4089,13 +4202,18 @@ msgstr "Remplissage d'émission :" msgid "Generate Visibility AABB" msgstr "Générer un AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Supprimer le point d'une courbe" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Temps moyen (seconde)" +msgid "Remove Out-Control from Curve" +msgstr "Supprimer le point d'une courbe" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Supprimer le point d'une courbe" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4153,6 +4271,16 @@ msgstr "Diviser le chemin" msgid "Remove Path Point" msgstr "Supprimer le chemin du point" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Supprimer le chemin du point" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Supprimer le chemin du point" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Créer une carte UV" @@ -4306,6 +4434,11 @@ msgid "Pitch" msgstr "Hauteur" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Effacer les os" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Erreur d'enregistrement du thème" @@ -4394,10 +4527,6 @@ msgstr "Trouver…" msgid "Find Next" msgstr "Trouver le suivant" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Débogage" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Sortir" @@ -4431,16 +4560,9 @@ msgid "Move Right" msgstr "Aller à droite" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Tutoriels" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Ouvre https://godotengine.org dans la section des tutoriels." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Classes" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Chercher dans la documentation de référence." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4448,7 +4570,7 @@ msgstr "Cherche dans la hiérarchie des classes." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "Cherche dans la documentation de référence." +msgstr "Chercher dans la documentation de référence." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." @@ -4499,6 +4621,23 @@ msgid "Pick Color" msgstr "Prélever une couleur" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Conversion des images" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4578,6 +4717,16 @@ msgid "Goto Previous Breakpoint" msgstr "Aller au point d'arrêt précédent" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Convertir vers…" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Convertir vers…" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "trouver précédente" @@ -4600,6 +4749,10 @@ msgstr "Aller à la ligne…" msgid "Contextual Help" msgstr "Aide contextuelle" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Modifier une constante scalaire" @@ -4817,36 +4970,106 @@ msgid "Animation Key Inserted." msgstr "Clé d'animation insérée." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Avancer" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "À l'envers" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Molette vers le bas." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Repeindre quand modifié" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Repeindre quand modifié" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Repeindre quand modifié" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vertex" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Aligner avec la vue" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Environnement" +msgid "Display Normal" +msgstr "Affichage normal" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Écouteur audio" +msgid "Display Wireframe" +msgstr "Affichage en fil de fer" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Affichage des surimpressions" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Dialogue XForm" +#, fuzzy +msgid "Display Unshaded" +msgstr "Affichage sans ombrage" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Pas de scène sélectionnée à instancier !" +#, fuzzy +msgid "View Environment" +msgstr "Environnement" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Instancier sur le cursuer" +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Impossible d'instancier la scène !" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "Écouteur audio" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Dialogue XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4905,6 +5128,26 @@ msgid "Align Selection With View" msgstr "Aligner la sélection avec la vue" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Sélectionner" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Déplacer" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Contrôle: Tourner" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Échelle :" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transformation" @@ -4917,14 +5160,6 @@ msgid "Transform Dialog.." msgstr "Dialogue de transformation…" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Utiliser la lumière par défaut" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Utiliser sRGB par défaut" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 vue" @@ -4949,22 +5184,6 @@ msgid "4 Viewports" msgstr "4 vues" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Affichage normal" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Affichage en fil de fer" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Affichage des surimpressions" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Affichage sans ombrage" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Afficher l'origine" @@ -4973,6 +5192,10 @@ msgid "View Grid" msgstr "Afficher la grille" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Paramètres" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Paramètres d'alignement" @@ -4993,16 +5216,8 @@ msgid "Viewport Settings" msgstr "Paramètres de la vue" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Normale de l'éclairage par défaut :" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Couleur de l'éclairage ambient :" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "Champ de vision de perspective (degrés) :" +msgstr "Champ visuel de la perspective (degrés) :" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" @@ -5432,12 +5647,12 @@ msgstr "Chemin de projet invalide, le chemin doit exister !" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Chemin de projet invalide, engine.cfg ne doit pas exister." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Chemin de projet invalide, engine.cfg doit exister." #: editor/project_manager.cpp @@ -5450,7 +5665,7 @@ msgstr "Chemin de projet non valide (avez-vous changé quelque chose ?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" "Impossible de créer le fichier engine.cfg dans le répertoire du projet." @@ -5679,6 +5894,11 @@ msgstr "Ajouter une action d'entrée" msgid "Erase Input Action Event" msgstr "Effacer l'événement d'action d'entrée" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Ajouter vide" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Périphérique" @@ -5745,8 +5965,8 @@ msgstr "" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Paramètres du projet" +msgid "Project Settings (project.godot)" +msgstr "Paramètres du projet (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5863,10 +6083,6 @@ msgid "Error loading file: Not a resource!" msgstr "Erreur de chargement du fichier : ce n'est pas une ressource !" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Impossible de charger l'image" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Sélectionner un nÅ“ud" @@ -6057,6 +6273,11 @@ msgid "Error duplicating scene to save it." msgstr "Erreur de duplication de la scène afin de l'enregistrer." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Ressources :" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Modifier les groupes" @@ -6086,9 +6307,8 @@ msgid "Attach Script" msgstr "Ajouter un script" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear Script" -msgstr "Créer un script" +msgstr "Supprimer le script" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -6138,10 +6358,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Afficher/cacher le CanvasItem" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Options de débogage" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instance :" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Script suivant" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Afficher/cacher le Spatial" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Nom de nÅ“ud invalide, les caractères suivants ne sont pas autorisés :" @@ -6186,78 +6455,94 @@ msgid "Select a Node" msgstr "Sélectionner un nÅ“ud" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Nom de classe parent invalide" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Impossible de créer le script dans le système de fichiers." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Caractères valides :" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Erreur de chargement de la scène depuis %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Nom de classe invalide" +msgid "Path is empty" +msgstr "Le chemin est vide" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Nom valide" +msgid "Path is not local" +msgstr "Le chemin n'est pas local" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid base path" +msgstr "Chemin de base invalide" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Le nom de classe est invalide !" +msgid "Invalid extension" +msgstr "Extension invalide" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Le nom de classe parent est invalide !" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Chemin invalide !" +#, fuzzy +msgid "Invalid Path" +msgstr "Chemin invalide." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Impossible de créer le script dans le système de fichiers." +msgid "Invalid class name" +msgstr "Nom de classe invalide" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Erreur de chargement de la scène depuis %s" +msgid "Invalid inherited parent name or path" +msgstr "Indice de nom de propriété invalide." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Le chemin est vide" +#, fuzzy +msgid "Script valid" +msgstr "Script" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Le chemin n'est pas local" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Chemin de base invalide" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Extension invalide" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Créer un script" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "Script suivant" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Hérite de :" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nom de classe :" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Supprimer l'item" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Script intégré" #: editor/script_create_dialog.cpp @@ -6419,7 +6704,7 @@ msgstr "Changer le rayon d'une forme en capsule" #: editor/spatial_editor_gizmos.cpp msgid "Change Capsule Shape Height" -msgstr "Changer la hauteur d'une forme en capsule" +msgstr "Changer la hauteur de la forme capsule" #: editor/spatial_editor_gizmos.cpp msgid "Change Ray Shape Length" @@ -6717,7 +7002,7 @@ msgstr "L'itérateur est devenu invalide" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid: " -msgstr "L'itérateur est devenu invalide " +msgstr "L'itérateur est devenu invalide: " #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name." @@ -6972,11 +7257,11 @@ msgstr "" "Le nÅ“ud ParallaxLayer ne fonctionne que lorsqu'il s'agit d'un enfant d'un " "nÅ“ud de type ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"La propriété Path doit pointer à un nÅ“ud de type Particles2D valide pour " -"fonctionner." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7063,12 +7348,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -7089,6 +7368,15 @@ msgstr "" "Une ressource de type SampleFrames doit être créée ou définie dans la " "propriété « Frames » afin qu'une AnimatedSprite3D fonctionne." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Mode d'exécution :" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alerte !" @@ -7135,6 +7423,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7153,9 +7447,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importer des ressources dans le projet." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Paramètres du projet (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exporter le projet vers diverses plate-formes." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Alerte lorsqu'une ressource externe a été modifiée." + +#~ msgid "Tutorials" +#~ msgstr "Tutoriels" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Ouvre https://godotengine.org dans la section des tutoriels." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Pas de scène sélectionnée à instancier !" + +#~ msgid "Instance at Cursor" +#~ msgstr "Instancier sur le cursuer" + +#~ msgid "Could not instance scene!" +#~ msgstr "Impossible d'instancier la scène !" + +#~ msgid "Use Default Light" +#~ msgstr "Utiliser la lumière par défaut" + +#~ msgid "Use Default sRGB" +#~ msgstr "Utiliser sRGB par défaut" + +#~ msgid "Default Light Normal:" +#~ msgstr "Normale de l'éclairage par défaut :" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Couleur de l'éclairage ambient :" + +#~ msgid "Couldn't load image" +#~ msgstr "Impossible de charger l'image" + +#~ msgid "Invalid parent class name" +#~ msgstr "Nom de classe parent invalide" + +#~ msgid "Valid chars:" +#~ msgstr "Caractères valides :" + +#~ msgid "Valid name" +#~ msgstr "Nom valide" + +#~ msgid "Class name is invalid!" +#~ msgstr "Le nom de classe est invalide !" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Le nom de classe parent est invalide !" + +#~ msgid "Invalid path!" +#~ msgstr "Chemin invalide !" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "La propriété Path doit pointer à un nÅ“ud de type Particles2D valide pour " +#~ "fonctionner." #~ msgid "Surface" #~ msgstr "Surface" @@ -7368,9 +7717,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Silence de fin :" -#~ msgid "Script" -#~ msgstr "Script" - #~ msgid "Script Export Mode:" #~ msgstr "Mode d'exportation des scripts :" @@ -7404,9 +7750,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "La BakedLightInstance ne contient pas de ressource BakedLight." -#~ msgid "Vertex" -#~ msgstr "Vertex" - #~ msgid "Fragment" #~ msgstr "Fragment" @@ -7442,9 +7785,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Impossible d'aller dans le sous-répertoire :" -#~ msgid "Help" -#~ msgstr "Aide" - #~ msgid "Imported Resources" #~ msgstr "Ressources importées" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 2d1b36d2ea..d6f3caa1e9 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -1,6 +1,5 @@ # Hungarian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Varga Dániel <danikah.danikah@gmail.com>, 2016. @@ -532,7 +531,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -578,7 +578,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -721,6 +721,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -826,6 +827,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -926,8 +928,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -937,6 +938,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1005,8 +1007,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1197,7 +1198,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1214,7 +1216,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1384,8 +1385,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1439,6 +1440,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1495,7 +1500,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1533,6 +1538,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1585,7 +1594,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1613,35 +1622,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1649,47 +1646,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1760,8 +1725,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1781,11 +1746,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1869,6 +1890,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1896,6 +1925,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2139,6 +2192,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2167,10 +2224,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2336,7 +2389,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2811,7 +2864,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3471,7 +3524,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3520,17 +3573,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3562,9 +3604,30 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Remove point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3834,6 +3897,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3846,7 +3922,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3857,20 +3933,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3925,12 +4014,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3988,6 +4081,14 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4141,6 +4242,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4228,10 +4333,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4265,15 +4366,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4328,6 +4421,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4407,6 +4516,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4429,6 +4546,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4646,35 +4767,95 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4734,71 +4915,67 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Select" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "1 Viewport" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "2 Viewports (Alt)" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports" +msgid "1 Viewport" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "3 Viewports (Alt)" +msgid "2 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "4 Viewports" +msgid "2 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" +msgid "3 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" +msgid "3 Viewports (Alt)" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" +msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4822,14 +4999,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5242,11 +5411,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5258,7 +5427,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5474,6 +5643,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5539,7 +5712,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5655,10 +5828,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5843,6 +6012,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5917,10 +6090,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5965,75 +6184,83 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Create new script file" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6685,8 +6912,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6754,12 +6983,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6775,6 +6998,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6817,6 +7048,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/id.po b/editor/translations/id.po index 2abf4090c8..15221690f2 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -1,6 +1,5 @@ # Indonesian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Abdul Aziz Muslim Alqudsy <abdul.aziz.muslim.alqudsy@gmail.com>, 2016. @@ -565,7 +564,8 @@ msgid "Search:" msgstr "Cari:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -611,7 +611,7 @@ msgstr "Dukungan.." msgid "Official" msgstr "Resmi" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Komunitas" @@ -758,6 +758,7 @@ msgstr "Tambah" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Hapus" @@ -868,6 +869,7 @@ msgstr "Resource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Path" @@ -977,8 +979,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -988,6 +989,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Bawaan" @@ -1059,8 +1061,7 @@ msgid "Rearrange Autoloads" msgstr "Mengatur kembali Autoload-autoload" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Path:" @@ -1255,7 +1256,8 @@ msgstr "Sumber Pemindaian" msgid "(Re)Importing Assets" msgstr "Mengimpor ulang" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Mencari Bantuan" @@ -1272,7 +1274,6 @@ msgid "Class:" msgstr "Kelas:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Turunan:" @@ -1444,10 +1445,11 @@ msgid "There is no defined scene to run." msgstr "Tidak ada definisi scene untuk dijalankan." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Tidak ada scene utama yang pernah didefinisikan, pilih satu?\n" "Anda dapat mengubahnya nanti di akhir dalam \"Project Settings\" dibawah " @@ -1512,6 +1514,10 @@ msgid "Save Scene As.." msgstr "Simpan Scene Sebagai.." #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Scene ini belum pernah disimpan. Simpan sebelum menjalankan?" @@ -1570,7 +1576,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Ugh" msgstr "Wadoo" @@ -1611,6 +1617,10 @@ msgstr "%d file lagi" msgid "%d more file(s) or folder(s)" msgstr "%d file atau folder lagi" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Mode Tanpa Gangguan" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Suasana" @@ -1663,7 +1673,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1691,35 +1701,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Mode Tanpa Gangguan" - -#: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1727,47 +1725,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1838,9 +1804,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Edit" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1861,11 +1828,67 @@ msgid "Manage Export Templates" msgstr "Memuat Ekspor Template-template." #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1949,6 +1972,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1976,6 +2007,34 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Buka sebuah Direktori" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Buka sebuah Direktori" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Editor Ketergantungan" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Editor Ketergantungan" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2224,6 +2283,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2252,10 +2315,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2424,7 +2483,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2900,7 +2959,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3562,7 +3621,7 @@ msgid "Change default type" msgstr "Ubah Tipe Nilai Array" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Oke" @@ -3611,17 +3670,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3653,9 +3701,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Tambahkan Sinyal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Hapus Sinyal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3926,6 +3997,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3938,7 +4022,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3949,20 +4033,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -4017,12 +4114,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4080,6 +4181,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Hapus Autoload" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4233,6 +4343,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4321,10 +4435,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4358,15 +4468,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4422,6 +4524,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4501,6 +4619,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Sambungkan Ke Node:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4523,6 +4650,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4740,35 +4871,100 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Maju" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Ke belakang" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Scroll kebawah." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Menyimpan perubahan-perubahan lokal.." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Ubah" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4828,23 +5024,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Semua pilihan" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4872,27 +5077,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4916,14 +5109,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5341,11 +5526,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5357,7 +5542,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5574,6 +5759,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Perangkat" @@ -5641,7 +5830,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5758,10 +5947,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Path ke Node:" @@ -5949,6 +6134,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Resource" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -6026,10 +6216,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Buka Cepat Script.." + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6074,77 +6311,91 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Tidak dapat membuat folder." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Error memuat font." #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "Path Tidak Sah." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Error memuat font." +msgid "Invalid inherited parent name or path" +msgstr "Nama properti index tidak sah." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Buat Subskribsi" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" -msgstr "" +#, fuzzy +msgid "Inherits" +msgstr "Turunan:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" +msgstr "Kelas:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Hapus Pilihan" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6851,11 +7102,11 @@ msgstr "" "Node ParallaxLayer hanya bekerja ketika diatur sebagai child dari sebuah " "node ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Properti path harus menunjuk ke sebuah node Particles2D yang sah agar " -"bekerja." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6945,12 +7196,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6973,6 +7218,14 @@ msgstr "" "Sebuah resource SpriteFrames harus diciptakan atau diatur didalam properti " "'Frames' agar AnimatedSprite3D menampilkan frame-frame." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Peringatan!" @@ -7018,6 +7271,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp #, fuzzy msgid "" @@ -7035,6 +7294,11 @@ msgstr "" #~ msgid "Node From Scene" #~ msgstr "Node Dari Scene" +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Properti path harus menunjuk ke sebuah node Particles2D yang sah agar " +#~ "bekerja." + #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " #~ "in order for SamplePlayer to play sound." diff --git a/editor/translations/it.po b/editor/translations/it.po index 08d04d296b..28ed2d5b0a 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -1,17 +1,17 @@ # Italian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Dario Bonfanti <bonfi.96@hotmail.it>, 2016-2017. +# Marco Melorio <m.melorio@icloud.com>, 2017. # RealAquilus <JamesHeller@live.it>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-01-29 19:58+0000\n" -"Last-Translator: RealAquilus <JamesHeller@live.it>\n" +"PO-Revision-Date: 2017-05-23 14:21+0000\n" +"Last-Translator: Dario Bonfanti <bonfi.96@hotmail.it>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.14.1-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -86,9 +86,8 @@ msgid "Anim Track Change Value Mode" msgstr "Traccia Anim Cambia Modalità Valore" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Traccia Anim Cambia Modalità Valore" +msgstr "Traccia Anim Cambia Modalità avvolgimento" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -377,7 +376,7 @@ msgstr "Costanti:" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "File" +msgstr " Files" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp @@ -513,7 +512,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "Giù" +msgstr "Scarica" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -547,7 +546,8 @@ msgid "Search:" msgstr "Cerca:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -593,7 +593,7 @@ msgstr "Supporta.." msgid "Official" msgstr "Ufficiale" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Comunità " @@ -638,7 +638,6 @@ msgid "No Matches" msgstr "Nessuna Corrispondenza" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "Rimpiazzate %d occorrenze." @@ -739,6 +738,7 @@ msgstr "Aggiungi" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Rimuovi" @@ -848,6 +848,7 @@ msgstr "Risorsa" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Percorso" @@ -937,23 +938,21 @@ msgstr "Elimina" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Salva Layout Bus Audio Come..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Posizione di Nuovo Layout..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Apri Layout Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Aggiungi %s" +msgstr "Aggiungi Bus" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Carica" @@ -963,6 +962,7 @@ msgid "Save As" msgstr "Salva Come" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Default" @@ -1037,8 +1037,7 @@ msgid "Rearrange Autoloads" msgstr "Riordina gli Autoload" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Percorso:" @@ -1106,7 +1105,7 @@ msgstr "Impacchettando" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "File template non trovato:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1226,11 +1225,11 @@ msgid "ScanSources" msgstr "ScansionaSorgenti" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Re-Importando" +msgstr "(Re)Importando gli Assets" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Cerca Aiuto" @@ -1247,7 +1246,6 @@ msgid "Class:" msgstr "Classe:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Eredita:" @@ -1417,10 +1415,11 @@ msgid "There is no defined scene to run." msgstr "Non c'è nessuna scena definita da eseguire." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Nessuna scena principale è mai stata definita, selezionarne una?\n" "Puoi cambiarla successivamente da \"Impostazioni Progetto\" sotto la " @@ -1485,6 +1484,11 @@ msgid "Save Scene As.." msgstr "Salva Scena Come.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Nodo" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Questa scena non è mai stata salvata. Salvare prima di eseguire?" @@ -1541,9 +1545,12 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"La scena '%s' é stata automaticamente importata, pertanto non puo essere " +"modificata.\n" +"Per effettuare cambiamenti, puo essere creata una nuova scena ereditata." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Ugh" @@ -1584,6 +1591,10 @@ msgstr "%d altri file" msgid "%d more file(s) or folder(s)" msgstr "% altri file o cartelle" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Modalità Senza Distrazioni" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Scena" @@ -1601,9 +1612,8 @@ msgid "Previous tab" msgstr "Scheda precedente" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "Filtro Files Rapido.." +msgstr "Filtra Files.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1637,7 +1647,7 @@ msgstr "Chiudi Scena" msgid "Close Goto Prev. Scene" msgstr "Vai a Scena Preced." -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Apri Recente" @@ -1665,84 +1675,41 @@ msgid "Redo" msgstr "Redo" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Esegui Script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Impostazioni Progetto" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Ripristina Scena" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Esci alla Lista Progetti" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Modalità Senza Distrazioni" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Strumenti di progetto o scena vari." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Strumenti" +#, fuzzy +msgid "Project" +msgstr "Nuovo Progetto" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Esporta il progetto a diverse piattaforme." +msgid "Project Settings" +msgstr "Impostazioni Progetto" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Esegui Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Esporta" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Esegui il progetto." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Play" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Metti in pausa la scena" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Pausa Scena" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Ferma la scena." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Stop" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Esegui la scena in modifica." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Esegui Scena" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Esegui scena personalizzata" +msgid "Tools" +msgstr "Strumenti" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Esegui Scena Personalizzata" +msgid "Quit to Project List" +msgstr "Esci alla Lista Progetti" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opzioni di Debug" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Debug" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1831,9 +1798,10 @@ msgstr "" "Quando usata remotamente su un dispositivo, essa è più efficiente con il " "filesystem in rete." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Impostazioni" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Modifica" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1848,17 +1816,73 @@ msgid "Toggle Fullscreen" msgstr "Abilita/Disabilita Fullscreen" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Caricamento Template d'Esportazione" +msgstr "Gestisci Template d'Esportazione" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Aiuto" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Classi" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Chiudi Documentazione" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "Riguardo a" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Avverti quando una risorsa esterna è stata modificata." +msgid "Play the project." +msgstr "Esegui il progetto." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Play" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Metti in pausa la scena" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausa Scena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Ferma la scena." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Stop" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Esegui la scena in modifica." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Esegui Scena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Esegui scena personalizzata" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Esegui Scena Personalizzata" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1941,6 +1965,14 @@ msgid "Thanks!" msgstr "Grazie!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importa templates Da File ZIP" @@ -1968,6 +2000,36 @@ msgstr "Apri e Esegui uno Script" msgid "Load Errors" msgstr "Carica Errori" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Apri nell Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Apri nell Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Apri nell Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Esporta Libreria" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Apri nell Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Apri nell Editor" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Plugins Installati:" @@ -2085,37 +2147,32 @@ msgid "Import From Node:" msgstr "Importa Da Nodo:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "Ricarica" +msgstr "Ri-Scarica" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "Installa" +msgstr "Disinstalla" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "Installa" +msgstr "(Installato)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "Giù" +msgstr "Scarica" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Mancante)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Corrente:" +msgstr "(Corrente)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Rimuovere versione '%s' del template?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2123,27 +2180,27 @@ msgstr "Impossibile aprire zip dei template d'esportazionie." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Formato di version.txt invalido nelle templates." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Formato di version.txt invalido nelle templates. Revision non é un " +"identificatore valido." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Non é stato trovato version.txt all'interno di templates." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Errore di salvataggio dell'atlas:" +msgstr "Errore di creazione del percorso per le template:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Caricamento Template d'Esportazione" +msgstr "Estrazione Templates d'Esportazione" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2154,34 +2211,28 @@ msgid "Loading Export Templates" msgstr "Caricamento Template d'Esportazione" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Scena Corrente" +msgstr "Versione Corrente:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Plugins Installati:" +msgstr "Versioni Installate:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "Installa Progetto:" +msgstr "Installa Da File" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Rimuovi Elemento" +msgstr "Rimuovi Template" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Eliminare i file selezionati?" +msgstr "Seleziona file template" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "Caricamento Template d'Esportazione" +msgstr "Gestore Template Esportazione" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2191,7 +2242,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "Impossibile navigare a '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2220,13 +2271,16 @@ msgid "No files selected!" msgstr "Nessun File selezionato!" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "Espandi a Genitore" +msgstr "Espandi tutto" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Comprimi tutto" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Mostra nel File Manager" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2257,10 +2311,6 @@ msgid "Info" msgstr "Info" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Mostra nel File Manager" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Re-Importa.." @@ -2338,23 +2388,20 @@ msgid "Saving.." msgstr "Salvataggio.." #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "File" +msgstr " Files" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Importa" +msgstr "Importa Come:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." msgstr "Preset.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" -msgstr "Re-Importa" +msgstr "Reimporta" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "No bit masks to import!" @@ -2428,9 +2475,10 @@ msgid "No target font resource!" msgstr "Nessuna risorsa font di destinazione!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Estensione file invalida.\n" "Si prega di usare .fnt." @@ -2913,8 +2961,8 @@ msgstr "Comprimi" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" -msgstr "Aggiungi a Progetto (engine.cfg)" +msgid "Add to Project (project.godot)" +msgstr "Aggiungi a Progetto (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" @@ -2953,9 +3001,8 @@ msgid "Change Animation Name:" msgstr "Cambia Nome Animazione:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Duplica Animazione" +msgstr "Eliminare Animazione?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3579,7 +3626,7 @@ msgid "Change default type" msgstr "Cambia tipo di default" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3630,17 +3677,6 @@ msgstr "Crea Poly3D" msgid "Set Handle" msgstr "Imposta Maniglia" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Aggiungi/Rimuovi Punto Rampa Colori" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Modifica Rampa Colori" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Creazione Libreria Mesh" @@ -3673,8 +3709,31 @@ msgstr "Aggiorna da Scena" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Aggiungi Input" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Rimuovi Punto Percorso" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Carica Risorsa" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" -msgstr "Modifica la Mappa Curve" +msgstr "Modifica Curva" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Aggiungi/Rimuovi Punto Rampa Colori" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modifica Rampa Colori" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -3713,19 +3772,16 @@ msgid "RMB: Erase Point." msgstr "RMB: Elimina Punto." #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Point from Line2D" -msgstr "Rimuovi Punto da Curva" +msgstr "Rimuovi Punto da Line2D" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" -msgstr "Aggiungi Punto a Curva" +msgstr "Aggiungi Punto a Line2D" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Move Point in Line2D" -msgstr "Sposta Punto in curva" +msgstr "Sposta Punto in Line2D" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3758,9 +3814,8 @@ msgid "Add Point (in empty space)" msgstr "Aggiungi Punto (in sapzio vuoto)" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Split Segment (in line)" -msgstr "Spezza Segmento (in curva)" +msgstr "Spezza Segmento (in linea)" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3951,6 +4006,20 @@ msgid "Remove Poly And Point" msgstr "Rimuovi Poligono e Punto" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Cancella Maschera Emissione" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Genera AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Errore di caricamento immagine:" @@ -3963,8 +4032,8 @@ msgid "Set Emission Mask" msgstr "Imposta Maschera Emissione" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Cancella Maschera Emissione" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3974,6 +4043,27 @@ msgstr "Carica Maschera Emissione" msgid "Generated Point Count:" msgstr "Conteggio Punti Generati:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Tempo Medio (sec)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Imposta Maschera Emissione" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Crea da Scena" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Punti Emissione:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "Il nodo non contiene geometria." @@ -3984,12 +4074,7 @@ msgstr "Il nodo non contiene geometria (facce)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Genera AABB" +msgstr "Un processor material di tipo 'ParticlesMaterial' é richiesto." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -4004,14 +4089,12 @@ msgid "Generate AABB" msgstr "Genera AABB" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Mesh" -msgstr "Crea Emitter Da Mesh" +msgstr "Crea Punti Emissione Da Mesh" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Node" -msgstr "Crea Emitter Da Nodo" +msgstr "Crea Punti Emissione Da Nodo" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" @@ -4022,40 +4105,42 @@ msgid "Create Emitter" msgstr "Crea Emitter" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "Posizioni di Emissione:" +msgstr "Punti Emissione:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "Superficie %d" +msgstr "Punti Superficie" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Punti superficie+Normali (Dirette)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" msgstr "Volume" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source: " -msgstr "Riempimento Emissione:" +msgstr "Sorgente Emissione: " #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Generate Visibility AABB" msgstr "Genera AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Rimuovi Punto da Curva" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Tempo Medio (sec)" +msgid "Remove Out-Control from Curve" +msgstr "Sposta Out-Control sulla Curva" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Rimuovi Punto da Curva" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4113,6 +4198,16 @@ msgstr "Dividi Percorso" msgid "Remove Path Point" msgstr "Rimuovi Punto Percorso" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Sposta Out-Control sulla Curva" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Sposta In-Control sulla Curva" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Crea UV Map" @@ -4266,6 +4361,11 @@ msgid "Pitch" msgstr "Pitch" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Elimina Ossa" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Errore durante il salvataggio del tema" @@ -4353,10 +4453,6 @@ msgstr "Trova.." msgid "Find Next" msgstr "Trova Successivo" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Debug" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Step Over" @@ -4390,16 +4486,9 @@ msgid "Move Right" msgstr "Sposta a Destra" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Tutorials" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Apri https://godotengine.org alla sezione tutorial." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Classi" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Cerca Riferimenti nella documentazione." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4418,9 +4507,8 @@ msgid "Go to next edited document." msgstr "Vai al documento successivo." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "Discreto" +msgstr "Scarta" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4458,6 +4546,23 @@ msgid "Pick Color" msgstr "Scegli Colore" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Convertendo Immagini" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4537,6 +4642,16 @@ msgid "Goto Previous Breakpoint" msgstr "Vai a Breakpoint Precedente" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Converti In.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Converti In.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Trova Precedente" @@ -4559,6 +4674,10 @@ msgstr "Vai a Linea.." msgid "Contextual Help" msgstr "Aiuto Contestuale" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Cambia Costante Scalare" @@ -4776,36 +4895,106 @@ msgid "Animation Key Inserted." msgstr "Key d'Animazione Inserito." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Vai Avanti" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "All'indietro" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Rotellina Giù." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Aggiorna Cambiamenti" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Aggiorna Cambiamenti" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Aggiorna Cambiamenti" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vertice" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Allinea a vista" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Ambientazione" +msgid "Display Normal" +msgstr "Mostra Normale" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Audio Listener" +msgid "Display Wireframe" +msgstr "Mostra Wireframe" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Mostra Overdraw" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Finestra di XForm" +#, fuzzy +msgid "Display Unshaded" +msgstr "Mostra senza Shader" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Nessuna scena da istanziare selezionata!" +#, fuzzy +msgid "View Environment" +msgstr "Ambientazione" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Istanzia a Cursore" +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Impossibile istanziare la scena!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "Audio Listener" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Finestra di XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4864,6 +5053,26 @@ msgid "Align Selection With View" msgstr "Allinea Selezione Con Vista" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Seleziona" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Sposta" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Ruota" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Scala:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transform" @@ -4876,14 +5085,6 @@ msgid "Transform Dialog.." msgstr "Finestra di Transform.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Usa Luce Default" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Usa sRGB Default" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 Vista" @@ -4908,22 +5109,6 @@ msgid "4 Viewports" msgstr "4 Viste" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Mostra Normale" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Mostra Wireframe" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Mostra Overdraw" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Mostra senza Shader" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Visualizza Origine" @@ -4932,6 +5117,10 @@ msgid "View Grid" msgstr "Visualizza Griglia" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Impostazioni" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Impostazioni Snap" @@ -4952,14 +5141,6 @@ msgid "Viewport Settings" msgstr "Impostazioni Viewport" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Normale Luce di Default:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Colore Luce Ambiente:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "FOV Prospettiva (deg.):" @@ -5298,24 +5479,20 @@ msgid "Error" msgstr "Errore" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Abilita" +msgstr "Eseguibile" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '" -msgstr "Elimina Input" +msgstr "Elimina patch '" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Eliminare i file selezionati?" +msgstr "Eliminare preset '%s'?" #: editor/project_export.cpp -#, fuzzy msgid "Presets" -msgstr "Preset.." +msgstr "Presets" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5326,63 +5503,54 @@ msgid "Resources" msgstr "Risorse" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "Esporta tutte le risorse nel progetto." +msgstr "Esporta tutte le risorse nel progetto" #: editor/project_export.cpp -#, fuzzy msgid "Export selected scenes (and dependencies)" -msgstr "Esporta le risorse selezionate (incluse le dipendenze)." +msgstr "Esporta le scene selezionate (incluse le dipendenze)" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" -msgstr "Esporta le risorse selezionate (incluse le dipendenze)." +msgstr "Esporta le risorse selezionate (incluse le dipendenze)" #: editor/project_export.cpp msgid "Export Mode:" msgstr "Modalità d'Esportazione:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "Risorse da Esportare:" +msgstr "Risorse da esportare:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" "Filtri per esportare file che non son risorse (separati con virgola, es.: *." -"json, *.txt):" +"json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" "Filtri per escludere dall'esportazione (separati con virgola, es.: *.json, *." -"txt):" +"txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "Corrispondenze:" +msgstr "Patches" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Percorso di destinazione:" +msgstr "Crea Patch" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Le export templates per questa piattaforma sono mancanti:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "Esporta Tile Set" +msgstr "Esporta Con Debug" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" @@ -5390,13 +5558,13 @@ msgstr "Percorso di progetto invalido, il percorso deve esistere!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." -msgstr "Percorso di progetto invalido, engine.cfg non deve esistere." +msgid "Invalid project path, project.godot must not exist." +msgstr "Percorso di progetto invalido, godot.cfg non esiste." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." -msgstr "Percorso di progetto invalido, engine.cfg deve esistere." +msgid "Invalid project path, project.godot must exist." +msgstr "Percorso di progetto invalido, godot.cfg deve esistere." #: editor/project_manager.cpp msgid "Imported Project" @@ -5408,8 +5576,8 @@ msgstr "Percorso di progetto invalido (cambiato qualcosa?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." -msgstr "Impossibile creare engine.cfg nel percorso di progetto." +msgid "Couldn't create project.godot in project path." +msgstr "Impossibile creare godot.cfg nel percorso di progetto." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" @@ -5506,7 +5674,7 @@ msgstr "Nuovo Progetto" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "Rimuovi Elemento" +msgstr "Rimuovi Template" #: editor/project_manager.cpp msgid "Exit" @@ -5608,18 +5776,16 @@ msgid "Button 9" msgstr "Pulsante 9" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Axis Index:" -msgstr "Indice Asse Joystick:" +msgstr "Indice Asse Joypad:" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Axis" msgstr "Asse" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Button Index:" -msgstr "Indice Pulsante Joystick:" +msgstr "Indice Pulsante Joypad:" #: editor/project_settings.cpp msgid "Add Input Action" @@ -5629,6 +5795,11 @@ msgstr "Aggiungi azione di input" msgid "Erase Input Action Event" msgstr "Elimina Evento di Azione Input" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Aggiungi vuoto" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Dispositivo" @@ -5695,8 +5866,8 @@ msgstr "Rimuovi Opzione di Remap Rimorse" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Impostazioni Progetto" +msgid "Project Settings (project.godot)" +msgstr "Impostazioni Progetto (godot.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5763,9 +5934,8 @@ msgid "AutoLoad" msgstr "AutoLoad" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 Vista" +msgstr "Scegli una Vista" #: editor/property_editor.cpp msgid "Ease In" @@ -5804,20 +5974,14 @@ msgid "New Script" msgstr "Nuovo Script" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "FileSystem" +msgstr "Mostra nel File System" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "Errore caricamento file: Non è una risorsa!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Impossibile caricare l'immagine" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "Scegli un Nodo" @@ -5963,7 +6127,7 @@ msgstr "Questa operazione non può essere eseguita senza una scena." #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Impossibile effettuare con il nodo di root." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6006,6 +6170,11 @@ msgid "Error duplicating scene to save it." msgstr "Errore duplicando la scena per salvarla." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Risorse:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Modifica Gruppi" @@ -6046,9 +6215,8 @@ msgid "Save Branch as Scene" msgstr "Salva Ramo come Scena" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "Copia Percorso" +msgstr "Copia Percorso Nodo" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -6083,10 +6251,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Abilita CanvasItem Visibile" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opzioni di Debug" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Istanza:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Script successivo" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Abilita Spatial Visibile" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome nodo invalido, i caratteri seguenti non sono consentiti:" @@ -6131,75 +6348,93 @@ msgid "Select a Node" msgstr "Scegli un Nodo" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Nome classe genitore invalido" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Impossibile creare script in filesystem." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Caratteri Validi:" +msgid "Error loading script from %s" +msgstr "Errore caricamento script da %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Nome classe invalido" +msgid "Path is empty" +msgstr "Percorso vuoto" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Nome valido" +msgid "Path is not local" +msgstr "Percorso non locale" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid base path" +msgstr "Percorso di base invalido" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Nome classe invalido!" +msgid "Invalid extension" +msgstr "Estensione Invalida" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Nome classe genitore invalido!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Percorso Invalido!" +#, fuzzy +msgid "Invalid Path" +msgstr "Percorso Invalido." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Impossibile creare script in filesystem." +msgid "Invalid class name" +msgstr "Nome classe invalido" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "Errore caricamento script da %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Nome proprietà indice invalido." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Percorso vuoto" +#, fuzzy +msgid "Script valid" +msgstr "Script" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Percorso non locale" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Percorso di base invalido" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Estensione Invalida" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "Crea nuovo script" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "Carica script esistente" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Eredita:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nome Classe:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Rimuovi Template" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Built-In Script" #: editor/script_create_dialog.cpp @@ -6710,35 +6945,30 @@ msgid "just released" msgstr "appena rilasciato" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "Sfoglia" +msgstr "Esegui nel Browser" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "Esegui HTML esportato all'interno del browser di sistema di default." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "Impossibile trovare tile:" +msgstr "Impossibile scrivere file:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "Impossibile trovare tile:" +msgstr "Impossibile leggere file:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "Impossibile creare cartella." +msgstr "Impossibile aprire template per l'esportazione:\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "" -"Impossibile leggere il file del certificatio. Il percorso e la pasword sono " +"Impossibile leggere il file del certificatio. Il percorso e la password sono " "entrambi corretti?" #: platform/uwp/export/export.cpp @@ -6918,11 +7148,11 @@ msgstr "" "Il nodo ParallaxLayer funziona solamente quando impostato come figlio di un " "nodo ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"La proprietà path deve puntare a un nodo Particles2D valido per poter " -"funzionare." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7011,12 +7241,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -7038,6 +7262,15 @@ msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " "'Frames' affinché AnimatedSprite3D mostri i frame." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Modalità esecuzione:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Attenzione!" @@ -7082,6 +7315,15 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer é fatto per funzionare con un solo controllo figlio.\n" +"Usa un container come figlio (VBox,HBox,etc), o un Control impostando la " +"dimensione minima manualmente." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7101,9 +7343,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importa asset nel progetto." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Impostazioni Progetto (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Esporta il progetto a diverse piattaforme." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Avverti quando una risorsa esterna è stata modificata." + +#~ msgid "Tutorials" +#~ msgstr "Tutorials" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Apri https://godotengine.org alla sezione tutorial." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Nessuna scena da istanziare selezionata!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Istanzia a Cursore" + +#~ msgid "Could not instance scene!" +#~ msgstr "Impossibile istanziare la scena!" + +#~ msgid "Use Default Light" +#~ msgstr "Usa Luce Default" + +#~ msgid "Use Default sRGB" +#~ msgstr "Usa sRGB Default" + +#~ msgid "Default Light Normal:" +#~ msgstr "Normale Luce di Default:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Colore Luce Ambiente:" + +#~ msgid "Couldn't load image" +#~ msgstr "Impossibile caricare l'immagine" + +#~ msgid "Invalid parent class name" +#~ msgstr "Nome classe genitore invalido" + +#~ msgid "Valid chars:" +#~ msgstr "Caratteri Validi:" + +#~ msgid "Valid name" +#~ msgstr "Nome valido" + +#~ msgid "Class name is invalid!" +#~ msgstr "Nome classe invalido!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Nome classe genitore invalido!" + +#~ msgid "Invalid path!" +#~ msgstr "Percorso Invalido!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "La proprietà path deve puntare a un nodo Particles2D valido per poter " +#~ "funzionare." #~ msgid "Surface" #~ msgstr "Superficie" @@ -7324,9 +7621,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Silenzio di coda:" -#~ msgid "Script" -#~ msgstr "Script" - #~ msgid "Script Export Mode:" #~ msgstr "Modalità Esportazione Script:" @@ -7360,9 +7654,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance non contiene una risorsa BakedLight." -#~ msgid "Vertex" -#~ msgstr "Vertice" - #~ msgid "Fragment" #~ msgstr "Frammento" @@ -7405,9 +7696,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Impossibile accedere alla subdirectory:" -#~ msgid "Help" -#~ msgstr "Aiuto" - #~ msgid "Imported Resources" #~ msgstr "Risorse Importate" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index beeaf264a2..8fa50e4512 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -1,24 +1,24 @@ # Japanese translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # akirakido <achts.y@gmail.com>, 2016. # hopping tappy (ãŸã£ã´ã•ã‚“) <hopping.tappy@gmail.com>, 2016. # Lexi Grafen <shfeedly@gmail.com>, 2017. +# Tohru Ike (rokujyouhitoma) <rokujyouhitomajp@gmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-01-25 08:56+0000\n" -"Last-Translator: Lexi Grafen <shfeedly@gmail.com>\n" +"PO-Revision-Date: 2017-06-10 13:13+0000\n" +"Last-Translator: Tohru Ike (rokujyouhitoma) <rokujyouhitomajp@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.15-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -42,7 +42,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "" +msgstr "値を変更" #: editor/animation_editor.cpp msgid "Anim Change Call" @@ -542,7 +542,8 @@ msgid "Search:" msgstr "検索:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -588,7 +589,7 @@ msgstr "サãƒãƒ¼ãƒˆ." msgid "Official" msgstr "å…¬å¼" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "コミュニティ" @@ -691,11 +692,11 @@ msgstr "スã‚ップ" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom In" -msgstr "" +msgstr "ズームイン" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom Out" -msgstr "" +msgstr "ズームアウト" #: editor/code_editor.cpp msgid "Reset Zoom" @@ -732,6 +733,7 @@ msgstr "è¿½åŠ " #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "削除" @@ -840,6 +842,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -940,8 +943,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -951,6 +953,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1019,8 +1022,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Path:" @@ -1211,7 +1213,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1228,7 +1231,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1400,11 +1402,15 @@ msgid "There is no defined scene to run." msgstr "実行ã™ã‚‹å®šç¾©æ¸ˆã¿ã®ã‚·ãƒ¼ãƒ³ã¯ã‚りã¾ã›ã‚“。" #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" +"é¸æŠžã—ãŸã‚·ãƒ¼ãƒ³ '%s' ã¯ã€ã‚·ãƒ¼ãƒ³ ファイルã§ã¯ã‚りã¾ã›ã‚“ã€æœ‰åйãªã‚‚ã®ã‚’é¸æŠžã—ã¦ã„" +"ã¾ã™ã‹ï¼Ÿ\n" +"'アプリケーション' カテゴリã®ä¸‹ã®'プãƒã‚¸ã‚§ã‚¯ãƒˆã®è¨å®š'ã§å¤‰æ›´ã§ãã¾ã™ã€‚" #: editor/editor_node.cpp msgid "" @@ -1463,6 +1469,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1519,7 +1529,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1557,6 +1567,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1610,7 +1624,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1638,35 +1652,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "終了ã—ã¦ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒªã‚¹ãƒˆã‚’é–‹ã" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1674,47 +1676,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "" +msgid "Quit to Project List" +msgstr "終了ã—ã¦ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒªã‚¹ãƒˆã‚’é–‹ã" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1785,8 +1755,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1806,11 +1776,68 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "é–‰ã˜ã‚‹" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1894,6 +1921,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1921,6 +1956,33 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "ディレクトリを開ã" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "ディレクトリを開ã" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "エディターを終了ã—ã¾ã™ã‹ï¼Ÿ" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2166,6 +2228,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2194,10 +2260,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2364,7 +2426,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2839,7 +2901,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3503,7 +3565,7 @@ msgid "Change default type" msgstr "é…列ã®å€¤ã®ç¨®é¡žã®å¤‰æ›´" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "決定" @@ -3552,17 +3614,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3594,9 +3645,31 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3867,6 +3940,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3879,7 +3965,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3890,20 +3976,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3958,12 +4057,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4021,6 +4124,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4174,6 +4286,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4263,10 +4379,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4300,15 +4412,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4364,6 +4468,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4443,6 +4563,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "ãƒŽãƒ¼ãƒ‰ã«æŽ¥ç¶šã—ã¾ã™ã€‚" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4465,6 +4594,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4682,35 +4815,97 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "後方" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "ホイール下" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4770,23 +4965,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "ã™ã¹ã¦é¸æŠž" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4814,27 +5018,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4858,14 +5050,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5279,11 +5463,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5295,7 +5479,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5512,6 +5696,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "デãƒã‚¤ã‚¹" @@ -5577,7 +5765,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5693,10 +5881,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "ノードã¸ã®ãƒ‘ス:" @@ -5884,6 +6068,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5959,10 +6147,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "フォルダを作æˆ" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6007,77 +6242,88 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "フォルダを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "フォントèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "無効ãªãƒ•ォント サイズã§ã™ã€‚" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -#, fuzzy -msgid "Error loading script from %s" -msgstr "フォントèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã€‚" +msgid "Invalid inherited parent name or path" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "フォルダを作æˆ" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Class Name" +msgstr "" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "é¸æŠžã—ã¦ã„ã‚‹ã‚‚ã®ã‚’削除" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6776,11 +7022,11 @@ msgstr "" "ParallaxLayer ノードã¯ã€ParallaxBackground ノードã®åã¨ã—ã¦è¨å®šã•れã¦ã„ã‚‹å ´åˆ" "ã®ã¿å‹•作ã—ã¾ã™ã€‚" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Path プãƒãƒ‘ティã¯ã€å‹•作ã™ã‚‹ã‚ˆã†ã«æœ‰åŠ¹ãª Particles2D ノードを示ã™å¿…è¦ãŒã‚りã¾" -"ã™ã€‚" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6869,12 +7115,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6898,6 +7138,14 @@ msgstr "" "SpriteFrames リソースを作æˆã¾ãŸã¯ AnimatedSprite3D フレームを表示ã™ã‚‹ãŸã‚ã«" "㯠'Frames' プãƒãƒ‘ティã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "è¦å‘Š!" @@ -6943,6 +7191,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6959,6 +7213,11 @@ msgstr "" #~ msgid "Node From Scene" #~ msgstr "シーンã‹ã‚‰ã®ãƒŽãƒ¼ãƒ‰" +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Path プãƒãƒ‘ティã¯ã€å‹•作ã™ã‚‹ã‚ˆã†ã«æœ‰åŠ¹ãª Particles2D ノードを示ã™å¿…è¦ãŒã‚り" +#~ "ã¾ã™ã€‚" + #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " #~ "in order for SamplePlayer to play sound." diff --git a/editor/translations/ko.po b/editor/translations/ko.po index 08b10d2f7a..ee409ab97f 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -1,6 +1,5 @@ # Korean translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # 박한얼 (volzhs) <volzhs@gmail.com>, 2016-2017. @@ -545,7 +544,8 @@ msgid "Search:" msgstr "검색:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -591,7 +591,7 @@ msgstr "ì§€ì›.." msgid "Official" msgstr "ê³µì‹" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "커뮤니티" @@ -737,6 +737,7 @@ msgstr "추가" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "ì‚ì œ" @@ -846,6 +847,7 @@ msgstr "리소스" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "경로" @@ -949,8 +951,7 @@ msgstr "" msgid "Add Bus" msgstr "%s 추가" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "로드" @@ -960,6 +961,7 @@ msgid "Save As" msgstr "다른 ì´ë¦„으로 ì €ìž¥" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Default" @@ -1030,8 +1032,7 @@ msgid "Rearrange Autoloads" msgstr "ìžë™ 로드 위치 변경" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "경로:" @@ -1223,7 +1224,8 @@ msgstr "소스 조사" msgid "(Re)Importing Assets" msgstr "다시 ê°€ì ¸ì˜¤ê¸°" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "ë„ì›€ë§ ê²€ìƒ‰" @@ -1240,7 +1242,6 @@ msgid "Class:" msgstr "í´ëž˜ìФ:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "ìƒì†:" @@ -1409,10 +1410,11 @@ msgid "There is no defined scene to run." msgstr "실행하기 위해 ì •ì˜ëœ ì”¬ì´ ì—†ìŠµë‹ˆë‹¤." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "ë©”ì¸ ì”¬ì´ ì§€ì •ë˜ì§€ 않았습니다. ì„ íƒí•˜ì‹œê² 습니까?\n" "ë‚˜ì¤‘ì— \"프로ì 트 ì„¤ì •\"ì˜ 'Application' í•목ì—서 ë³€ê²½í• ìˆ˜ 있습니다." @@ -1472,6 +1474,11 @@ msgid "Save Scene As.." msgstr "ì”¬ì„ ë‹¤ë¥¸ ì´ë¦„으로 ì €ìž¥.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "노드" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "ì´ ì”¬ì€ ì €ìž¥ë˜ì§€ 않았습니다. ì‹¤í–‰ì „ì— ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" @@ -1530,7 +1537,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "오우" @@ -1570,6 +1577,10 @@ msgstr "%dê°œ 추가파ì¼" msgid "%d more file(s) or folder(s)" msgstr "%dê°œ 추가 íŒŒì¼ ë˜ëŠ” í´ë”" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "초집중 모드" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "씬" @@ -1623,7 +1634,7 @@ msgstr "씬 닫기" msgid "Close Goto Prev. Scene" msgstr "ë‹«ê³ ì´ì „ 씬으로 ì´ë™" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "최근 ì—´ì—ˆë˜ í•목" @@ -1651,84 +1662,41 @@ msgid "Redo" msgstr "다시 실행" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "스í¬ë¦½íЏ 실행" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "프로ì 트 ì„¤ì •" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "씬 ë˜ëŒë¦¬ê¸°" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "ì¢…ë£Œí•˜ê³ í”„ë¡œì 트 목ë¡ìœ¼ë¡œ ëŒì•„가기" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "초집중 모드" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "프로ì 트 ë˜ëŠ” 씬 ê´€ë ¨ 여러가지 ë„구들." #: editor/editor_node.cpp -msgid "Tools" -msgstr "ë„구" +#, fuzzy +msgid "Project" +msgstr "새 프로ì 트" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "프로ì 트를 ë§Žì€ í”Œëž«í¼ìœ¼ë¡œ 내보내기." +msgid "Project Settings" +msgstr "프로ì 트 ì„¤ì •" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "스í¬ë¦½íЏ 실행" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "내보내기" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "프로ì 트 실행." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "재성" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "씬 ì¼ì‹œ ì •ì§€" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "씬 ì¼ì‹œ ì •ì§€" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "씬 ì •ì§€." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "ì •ì§€" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "편집 ì¤‘ì¸ ì”¬ 실행." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "씬 실행" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "다른 씬 실행" +msgid "Tools" +msgstr "ë„구" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "커스텀 씬 실행" +msgid "Quit to Project List" +msgstr "ì¢…ë£Œí•˜ê³ í”„ë¡œì 트 목ë¡ìœ¼ë¡œ ëŒì•„가기" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "디버그 옵션" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "디버그" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1818,9 +1786,10 @@ msgstr "" "ê¸°ê¸°ì— ì›ê²©ìœ¼ë¡œ 사용ë˜ëŠ” 경우, ë„¤íŠ¸ì›Œí¬ íŒŒì¼ ì‹œìŠ¤í…œê³¼ 함께하면 ë”ìš± 효과ì ìž…" "니다." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "ì„¤ì •" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "편집" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1840,12 +1809,69 @@ msgid "Manage Export Templates" msgstr "내보내기 템플릿 로딩 중" #: editor/editor_node.cpp +msgid "Help" +msgstr "ë„움ë§" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "í´ëž˜ìФ" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "문서 닫기" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "ì •ë³´" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "외부 리소스가 변경ë˜ì—ˆì„ 때 알림." +msgid "Play the project." +msgstr "프로ì 트 실행." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "재성" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "씬 ì¼ì‹œ ì •ì§€" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "씬 ì¼ì‹œ ì •ì§€" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "씬 ì •ì§€." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "ì •ì§€" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "편집 ì¤‘ì¸ ì”¬ 실행." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "씬 실행" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "다른 씬 실행" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "커스텀 씬 실행" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1928,6 +1954,14 @@ msgid "Thanks!" msgstr "ê°ì‚¬í•©ë‹ˆë‹¤!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "ZIP 파ì¼ë¡œë¶€í„° í…œí”Œë¦¿ì„ ê°€ì ¸ì˜¤ê¸°" @@ -1955,6 +1989,36 @@ msgstr "스í¬ë¦½íŠ¸ë¥¼ ì—´ê³ ì‹¤í–‰" msgid "Load Errors" msgstr "로드 ì—러" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "ì—디터ì—서 열기" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "ì—디터ì—서 열기" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "ì—디터ì—서 열기" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬ 내보내기" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "ì—디터ì—서 열기" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "ì—디터ì—서 열기" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "ì„¤ì¹˜ëœ í”ŒëŸ¬ê·¸ì¸:" @@ -2212,6 +2276,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—서 보기" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "ì¸ìŠ¤í„´ìŠ¤" @@ -2240,10 +2308,6 @@ msgid "Info" msgstr "ì •ë³´" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—서 보기" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "다시 ê°€ì ¸ì˜¤ê¸°.." @@ -2411,9 +2475,10 @@ msgid "No target font resource!" msgstr "í°íЏ 리소스 경로가 없습니다!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "ìœ íš¨í•˜ì§€ ì•Šì€ íŒŒì¼ í™•ìž¥ìž.\n" ".fnt 를 사용하세요." @@ -2895,7 +2960,7 @@ msgstr "ì••ì¶•" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "프로ì íŠ¸ì— ì¶”ê°€ (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3558,7 +3623,7 @@ msgid "Change default type" msgstr "기본 타입 변경" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "확ì¸" @@ -3609,17 +3674,6 @@ msgstr "í´ë¦¬ê³¤3D 만들기" msgid "Set Handle" msgstr "핸들 ì„¤ì •" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "ì¹¼ë¼ ëž¨í”„ í¬ì¸íЏ 추가/ì‚ì œ" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "ì¹¼ë¼ ëž¨í”„ ìˆ˜ì •" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "메쉬 ë¼ì´ë¸ŒëŸ¬ë¦¬ ìƒì„± 중" @@ -3652,9 +3706,33 @@ msgstr "씬으로부터 ê°±ì‹ í•˜ê¸°" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "ìž…ë ¥ 추가" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "경로 í¬ì¸íЏ ì‚ì œ" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "리소스 로드" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "커브맵 ìˆ˜ì •" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "ì¹¼ë¼ ëž¨í”„ í¬ì¸íЏ 추가/ì‚ì œ" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "ì¹¼ë¼ ëž¨í”„ ìˆ˜ì •" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "í•목 %d" @@ -3928,6 +4006,20 @@ msgid "Remove Poly And Point" msgstr "í´ë¦¬ê³¤ê³¼ í¬ì¸íЏ ì‚ì œ" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ì—미션 ë§ˆìŠ¤í¬ ì •ë¦¬" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "AABB ìƒì„±" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "ì´ë¯¸ì§€ 로드 ì—러:" @@ -3940,8 +4032,8 @@ msgid "Set Emission Mask" msgstr "ì—미션 ë§ˆìŠ¤í¬ ì„¤ì •" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ì—미션 ë§ˆìŠ¤í¬ ì •ë¦¬" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3951,6 +4043,27 @@ msgstr "ì—미션 ë§ˆìŠ¤í¬ ë¡œë“œ" msgid "Generated Point Count:" msgstr "ìƒì„±ëœ í¬ì¸íЏ 개수:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "í‰ê· 시간 (ì´ˆ)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "ì—미션 ë§ˆìŠ¤í¬ ì„¤ì •" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "씬으로부터 만들기" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "ì—미션 위치:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "노드가 지오미트리를 í¬í•¨í•˜ê³ 있지 않습니다." @@ -3964,11 +4077,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "AABB ìƒì„±" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "페ì´ìŠ¤ê°€ ì˜ì—ì„ ê°€ì§€ê³ ìžˆì§€ 않습니다!" @@ -4026,13 +4134,18 @@ msgstr "ì—미션 채움:" msgid "Generate Visibility AABB" msgstr "AABB ìƒì„±" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "커브ì—서 í¬ì¸íЏ ì‚ì œ" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "í‰ê· 시간 (ì´ˆ)" +msgid "Remove Out-Control from Curve" +msgstr "ì»¤ë¸Œì˜ ì•„ì›ƒ-컨트롤 ì´ë™" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "커브ì—서 í¬ì¸íЏ ì‚ì œ" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4090,6 +4203,16 @@ msgstr "경로 나누기" msgid "Remove Path Point" msgstr "경로 í¬ì¸íЏ ì‚ì œ" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "ì»¤ë¸Œì˜ ì•„ì›ƒ-컨트롤 ì´ë™" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "ì»¤ë¸Œì˜ ì¸-컨트롤 ì´ë™" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "UV ë§µ 만들기" @@ -4243,6 +4366,11 @@ msgid "Pitch" msgstr "피치" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Bones ì—†ì• ê¸°" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "테마 ì €ìž¥ 중 ì—러" @@ -4330,10 +4458,6 @@ msgstr "찾기.." msgid "Find Next" msgstr "ë‹¤ìŒ ì°¾ê¸°" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "디버그" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "한 ë‹¨ê³„ì‹ ì½”ë“œ 실행" @@ -4367,16 +4491,9 @@ msgid "Move Right" msgstr "오른쪽으로 ì´ë™" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "íŠœí† ë¦¬ì–¼" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "https://godotengine.orgì˜ íŠœí† ë¦¬ì–¼ ë¶€ë¶„ì„ ì—½ë‹ˆë‹¤." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "í´ëž˜ìФ" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "ë ˆí¼ëŸ°ìФ 문서 검색." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4433,6 +4550,23 @@ msgid "Pick Color" msgstr "ìƒ‰ìƒ ì„ íƒ" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "ì´ë¯¸ì§€ 변환 중" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4512,6 +4646,16 @@ msgid "Goto Previous Breakpoint" msgstr "ì´ì „ 중단ì 으로 ì´ë™" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "변환.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "변환.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "ì´ì „ 찾기" @@ -4534,6 +4678,10 @@ msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™.." msgid "Contextual Help" msgstr "ë„ì›€ë§ ë³´ê¸°" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Scalar ìƒìˆ˜ 변경" @@ -4751,36 +4899,106 @@ msgid "Animation Key Inserted." msgstr "ì• ë‹ˆë©”ì´ì…˜ 키가 삽입ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "앞으로 가기" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "뒤로" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "íœ ì•„ëž˜ë¡œ." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "변경사í•ë§Œ ê°±ì‹ " + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "변경사í•ë§Œ ê°±ì‹ " + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "변경사í•ë§Œ ê°±ì‹ " + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "버í…스" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "ë·°ì— ì •ë ¬" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "환경" +msgid "Display Normal" +msgstr "Normal 표시" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "오디오 리스너" +msgid "Display Wireframe" +msgstr "Wireframe 표시" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "기즈모" +msgid "Display Overdraw" +msgstr "Overdraw 표시" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "변환 다ì´ì–¼ë¡œê·¸" +#, fuzzy +msgid "Display Unshaded" +msgstr "Shadeless 표시" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "환경" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "기즈모" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "ì¸ìŠ¤í„´ìŠ¤í• ì”¬ì´ ì„ íƒë˜ì§€ 않았습니다!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "ì»¤ì„œì— ì¸ìŠ¤í„´ìŠ¤ 만들기" +msgid "Audio Listener" +msgstr "오디오 리스너" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "ì”¬ì„ ì¸ìŠ¤í„´ìŠ¤ í• ìˆ˜ 없습니다!" +msgid "XForm Dialog" +msgstr "변환 다ì´ì–¼ë¡œê·¸" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4839,6 +5057,26 @@ msgid "Align Selection With View" msgstr "ì„ íƒ í•ëª©ì„ ë·°ì— ì •ë ¬" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "ì„ íƒ" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "ì´ë™" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "컨트롤: íšŒì „" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "í¬ê¸°:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "변환" @@ -4851,14 +5089,6 @@ msgid "Transform Dialog.." msgstr "변환 다ì´ì–¼ë¡œê·¸.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "기본 Light 사용" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "기본 sRGB 사용" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1ê°œ ë·°í¬íЏ" @@ -4883,22 +5113,6 @@ msgid "4 Viewports" msgstr "4ê°œ ë·°í¬íЏ" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Normal 표시" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Wireframe 표시" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Overdraw 표시" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Shadeless 표시" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "ì›ì 보기" @@ -4907,6 +5121,10 @@ msgid "View Grid" msgstr "그리드 보기" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "ì„¤ì •" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "스냅 ì„¤ì •" @@ -4927,14 +5145,6 @@ msgid "Viewport Settings" msgstr "ë·°í¬íЏ ì„¤ì •" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "기본 ë¼ì´íЏ ë…¸ë§:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "환경 ê´‘ 색ìƒ:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "ì›ê·¼ 시야 (ë„):" @@ -5361,12 +5571,12 @@ msgstr "프로ì 트 경로가 ìœ íš¨í•˜ì§€ 않습니다. 경로가 반드시 ì¡ #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "프로ì 트 경로가 ìœ íš¨í•˜ì§€ 않습니다. engine.cfgê°€ 있으면 안ë©ë‹ˆë‹¤." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "프로ì 트 경로가 ìœ íš¨í•˜ì§€ 않습니다. engine.cfgê°€ 존재해야합니다." #: editor/project_manager.cpp @@ -5379,7 +5589,7 @@ msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ í”„ë¡œì 트 경로 (ë”ê°€ ë³€ê²½í•˜ì‹ ê±°ë¼ë„?) #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "프로ì 트 ê²½ë¡œì— engine.cfg를 ìƒì„±í• 수 없습니다." #: editor/project_manager.cpp @@ -5599,6 +5809,11 @@ msgstr "ìž…ë ¥ ì•¡ì…˜ 추가" msgid "Erase Input Action Event" msgstr "ìž…ë ¥ ì•¡ì…˜ ì´ë²¤íЏ ì‚ì œ" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "빈 í”„ë ˆìž„ 추가" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "기기" @@ -5665,8 +5880,8 @@ msgstr "리소스 리맵핑 옵션 ì œê±°" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "프로ì 트 ì„¤ì •" +msgid "Project Settings (project.godot)" +msgstr "프로ì 트 ì„¤ì • (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5783,10 +5998,6 @@ msgid "Error loading file: Not a resource!" msgstr "íŒŒì¼ ë¡œë“œ ì—러: 리소스가 아닙니다!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "ì´ë¯¸ì§€ë¥¼ ë¡œë“œí• ìˆ˜ ì—†ìŒ" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "노드 ì„ íƒ" @@ -5973,6 +6184,11 @@ msgid "Error duplicating scene to save it." msgstr "ì €ìž¥í•˜ê¸° 위해 ì”¬ì„ ë³µì œí•˜ëŠ” ì¤‘ì— ì—러가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "리소스:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "그룹 편집" @@ -6049,10 +6265,59 @@ msgid "Toggle CanvasItem Visible" msgstr "CanvasItem ë³´ì´ê¸° í† ê¸€" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "디버그 옵션" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "ì¸ìŠ¤í„´ìŠ¤:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "ë‹¤ìŒ ìŠ¤í¬ë¦½íЏ" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Spatial ë³´ì´ê¸° í† ê¸€" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ë…¸ë“œ ì´ë¦„입니다. 다ìŒì˜ 문ìžëŠ” 허용ë˜ì§€ 않습니다:" @@ -6097,75 +6362,93 @@ msgid "Select a Node" msgstr "노드 ì„ íƒ" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ ë¶€ëª¨ í´ëž˜ìŠ¤ëª…" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "íŒŒì¼ ì‹œìŠ¤í…œì— ìŠ¤í¬ë¦½íŠ¸ë¥¼ ìƒì„±í• 수 없습니다." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "ìœ ìš”í•œ 문ìž:" +msgid "Error loading script from %s" +msgstr "'%s' 스í¬ë¦½íЏ 로딩 중 ì—러" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ í´ëž˜ìŠ¤ëª…" +msgid "Path is empty" +msgstr "경로가 비어 있ìŒ" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "ìœ ìš”í•œ ì´ë¦„" +msgid "Path is not local" +msgstr "경로가 ë¡œì»¬ì´ ì•„ë‹˜" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "해당 ì—†ìŒ" +msgid "Invalid base path" +msgstr "기본 경로가 ìœ ìš”í•˜ì§€ 않ìŒ" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "í´ëž˜ìŠ¤ëª…ì´ ìœ íš¨í•˜ì§€ 않습니다!" +msgid "Invalid extension" +msgstr "확장ìžê°€ ìœ ìš”í•˜ì§€ 않ìŒ" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "부모 í´ëž˜ìŠ¤ëª…ì´ ìœ íš¨í•˜ì§€ 않습니다!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "경로가 ìœ íš¨í•˜ì§€ 않습니다!" +#, fuzzy +msgid "Invalid Path" +msgstr "ìœ íš¨í•˜ì§€ ì•Šì€ ê²½ë¡œ." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "íŒŒì¼ ì‹œìŠ¤í…œì— ìŠ¤í¬ë¦½íŠ¸ë¥¼ ìƒì„±í• 수 없습니다." +msgid "Invalid class name" +msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ í´ëž˜ìŠ¤ëª…" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "'%s' 스í¬ë¦½íЏ 로딩 중 ì—러" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ ì¸ë±ìФ ì†ì„±ëª…." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "경로가 비어 있ìŒ" +#, fuzzy +msgid "Script valid" +msgstr "스í¬ë¦½íЏ" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "경로가 ë¡œì»¬ì´ ì•„ë‹˜" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "기본 경로가 ìœ ìš”í•˜ì§€ 않ìŒ" +msgid "N/A" +msgstr "해당 ì—†ìŒ" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "확장ìžê°€ ìœ ìš”í•˜ì§€ 않ìŒ" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "새 스í¬ë¦½íЏ 만들기" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "기존 스í¬ë¦½íЏ 로드하기" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "ìƒì†:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "í´ëž˜ìŠ¤ëª…:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "ì•„ì´í…œ ì‚ì œ" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "내장 스í¬ë¦½íЏ" #: editor/script_create_dialog.cpp @@ -6846,9 +7129,11 @@ msgid "" msgstr "" "ParallaxLayer는 ParallaxBackground ë…¸ë“œì˜ ìžì‹ë…¸ë“œë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "Path ì†ì„±ì€ ìœ íš¨í•œ Particles2D 노드를 가리켜야 합니다." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6933,12 +7218,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "Path ì†ì„±ì€ ìœ íš¨í•œ Spatial 노드를 가리켜야 합니다." @@ -6956,6 +7235,15 @@ msgstr "" "AnimatedSprite3Dê°€ í”„ë ˆìž„ì„ ë³´ì—¬ì£¼ê¸° 위해서는 'Frames' ì†ì„±ì— SpriteFrames 리" "소스 만들거나 ì§€ì •í•´ì•¼ 합니다." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "실행 모드:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "ê²½ê³ !" @@ -7000,6 +7288,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7018,9 +7312,62 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "프로ì 트로 ì—ì…‹ ê°€ì ¸ì˜¤ê¸°." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "프로ì 트 ì„¤ì • (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "프로ì 트를 ë§Žì€ í”Œëž«í¼ìœ¼ë¡œ 내보내기." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "외부 리소스가 변경ë˜ì—ˆì„ 때 알림." + +#~ msgid "Tutorials" +#~ msgstr "íŠœí† ë¦¬ì–¼" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "https://godotengine.orgì˜ íŠœí† ë¦¬ì–¼ ë¶€ë¶„ì„ ì—½ë‹ˆë‹¤." + +#~ msgid "No scene selected to instance!" +#~ msgstr "ì¸ìŠ¤í„´ìŠ¤í• ì”¬ì´ ì„ íƒë˜ì§€ 않았습니다!" + +#~ msgid "Instance at Cursor" +#~ msgstr "ì»¤ì„œì— ì¸ìŠ¤í„´ìŠ¤ 만들기" + +#~ msgid "Could not instance scene!" +#~ msgstr "ì”¬ì„ ì¸ìŠ¤í„´ìŠ¤ í• ìˆ˜ 없습니다!" + +#~ msgid "Use Default Light" +#~ msgstr "기본 Light 사용" + +#~ msgid "Use Default sRGB" +#~ msgstr "기본 sRGB 사용" + +#~ msgid "Default Light Normal:" +#~ msgstr "기본 ë¼ì´íЏ ë…¸ë§:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "환경 ê´‘ 색ìƒ:" + +#~ msgid "Couldn't load image" +#~ msgstr "ì´ë¯¸ì§€ë¥¼ ë¡œë“œí• ìˆ˜ ì—†ìŒ" + +#~ msgid "Invalid parent class name" +#~ msgstr "ìœ ìš”í•˜ì§€ ì•Šì€ ë¶€ëª¨ í´ëž˜ìŠ¤ëª…" + +#~ msgid "Valid chars:" +#~ msgstr "ìœ ìš”í•œ 문ìž:" + +#~ msgid "Valid name" +#~ msgstr "ìœ ìš”í•œ ì´ë¦„" + +#~ msgid "Class name is invalid!" +#~ msgstr "í´ëž˜ìŠ¤ëª…ì´ ìœ íš¨í•˜ì§€ 않습니다!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "부모 í´ëž˜ìŠ¤ëª…ì´ ìœ íš¨í•˜ì§€ 않습니다!" + +#~ msgid "Invalid path!" +#~ msgstr "경로가 ìœ íš¨í•˜ì§€ 않습니다!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "Path ì†ì„±ì€ ìœ íš¨í•œ Particles2D 노드를 가리켜야 합니다." #~ msgid "Surface" #~ msgstr "출사면" @@ -7216,9 +7563,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "ëì˜ ë¬´ìŒ:" -#~ msgid "Script" -#~ msgstr "스í¬ë¦½íЏ" - #~ msgid "Script Export Mode:" #~ msgstr "스í¬ë¦½íЏ 내보내기 모드:" @@ -7252,9 +7596,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstanceê°€ BakedLight 리소스를 ê°€ì§€ê³ ìžˆì§€ 않습니다." -#~ msgid "Vertex" -#~ msgstr "버í…스" - #~ msgid "Fragment" #~ msgstr "프래그먼트" @@ -7290,9 +7631,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "하위 ë””ë ‰í† ë¦¬ë¡œ ì´ë™í• 수 없습니다:" -#~ msgid "Help" -#~ msgstr "ë„움ë§" - #~ msgid "Imported Resources" #~ msgstr "ê°€ì ¸ì˜¨ 리소스" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index 7ce577ebfa..3e522bbe49 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -1,6 +1,5 @@ # Norwegian BokmÃ¥l translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Anonymous <GentleSaucepan@protonmail.com>, 2017. @@ -9,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-04-06 17:20+0000\n" +"PO-Revision-Date: 2017-04-08 17:45+0000\n" "Last-Translator: Anonymous <GentleSaucepan@protonmail.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb/>\n" @@ -21,7 +20,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "AvslÃ¥tt" #: editor/animation_editor.cpp msgid "All Selection" @@ -29,11 +28,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "Move Add Key" -msgstr "" +msgstr "Flytt Legg til Nøkkel" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "" +msgstr "Anim Forandre Overgang" #: editor/animation_editor.cpp msgid "Anim Change Transform" @@ -41,39 +40,39 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "" +msgstr "Anim Forandre Verdi" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "" +msgstr "Anim Forandre Anrop" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "" +msgstr "Anim Legg til Spor" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "" +msgstr "Anim Dupliser Nøkler" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "" +msgstr "Flytt Anim Spor Opp" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "" +msgstr "Flytt Anim Spor Ned" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "" +msgstr "Fjern Anim Spor" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "" +msgstr "Sett Overganger til:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "" +msgstr "Anim Spor Endre navn" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" @@ -81,7 +80,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "" +msgstr "Anim Spor Forandre Verdi Modus" #: editor/animation_editor.cpp msgid "Anim Track Change Wrap Mode" @@ -89,47 +88,47 @@ msgstr "" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "" +msgstr "Forandre Node Kurve" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "" +msgstr "Forandre Utvalgskurve" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "" +msgstr "Anim Fjern Nøkler" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "" +msgstr "Dupliser Utvalg" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "" +msgstr "Dupliser Transponert" #: editor/animation_editor.cpp msgid "Remove Selection" -msgstr "" +msgstr "Fjern Utvalg" #: editor/animation_editor.cpp msgid "Continuous" -msgstr "" +msgstr "Kontinuerlig" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "" +msgstr "Diskret" #: editor/animation_editor.cpp msgid "Trigger" -msgstr "" +msgstr "Avtrekker" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "" +msgstr "Anim Legg til Nøkkel" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "" +msgstr "Anim Flytt Nøkler" #: editor/animation_editor.cpp msgid "Scale Selection" @@ -141,7 +140,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Goto Next Step" -msgstr "" +msgstr "GÃ¥ til Neste Steg" #: editor/animation_editor.cpp msgid "Goto Prev Step" @@ -366,8 +365,9 @@ msgid "Version:" msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Contents:" -msgstr "" +msgstr "Kontinuerlig" #: editor/asset_library_editor_plugin.cpp msgid "View Files" @@ -533,7 +533,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -579,7 +580,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -722,6 +723,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -827,6 +829,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -927,8 +930,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -938,6 +940,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1006,8 +1009,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1198,7 +1200,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1215,7 +1218,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1385,8 +1387,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1440,6 +1442,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1496,7 +1502,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1534,6 +1540,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1586,7 +1596,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1614,35 +1624,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1650,47 +1648,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1761,9 +1727,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Rediger" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1782,11 +1749,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1870,6 +1893,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1897,6 +1928,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2140,6 +2195,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2168,10 +2227,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2337,7 +2392,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2812,7 +2867,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3472,7 +3527,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3521,17 +3576,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3563,9 +3607,31 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Fjern Funksjon" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3835,6 +3901,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3847,7 +3926,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3858,20 +3937,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3926,12 +4018,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3989,6 +4085,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Fjern Funksjon" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4142,6 +4247,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4229,10 +4338,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4266,15 +4371,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4329,6 +4426,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4408,6 +4521,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4430,6 +4551,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4647,35 +4772,96 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Forandre" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4735,23 +4921,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Slett Valgte" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4779,27 +4974,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4823,14 +5006,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5243,11 +5418,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5259,7 +5434,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5475,6 +5650,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5540,7 +5719,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5656,10 +5835,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Lim inn Noder" @@ -5845,6 +6020,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5920,10 +6099,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5968,75 +6193,84 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +#, fuzzy +msgid "Invalid Path" +msgstr ": Ugyldige argumenter: " + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "Create new script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6693,8 +6927,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6762,12 +6998,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6783,6 +7013,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6825,6 +7063,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/nl.po b/editor/translations/nl.po index f0d54ebd9d..212397fd88 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -1,6 +1,5 @@ # Dutch translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Aram Nap <xyphex.aram@gmail.com>, 2017 @@ -8,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-04-06 20:13+0000\n" +"PO-Revision-Date: 2017-04-13 18:15+0000\n" "Last-Translator: Aram Nap <xyphex.aram@gmail.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/" "nl/>\n" @@ -16,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 2.13-dev\n" +"X-Generator: Weblate 2.14-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -542,7 +541,8 @@ msgid "Search:" msgstr "Zoeken:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -588,7 +588,7 @@ msgstr "Ondersteuning.." msgid "Official" msgstr "Officieel" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Gemeenschap" @@ -735,6 +735,7 @@ msgstr "Toevoegen" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Verwijderen" @@ -845,6 +846,7 @@ msgstr "Resource" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Pad" @@ -936,33 +938,33 @@ msgstr "Verwijder" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Sla Audio Bus Layout Op Als.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Locatie voor Nieuwe Layout.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Open Audio Bus Layout" #: editor/editor_audio_buses.cpp msgid "Add Bus" -msgstr "" +msgstr "Bus Toevoegen" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "Laden" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "Opslaan Als" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "Standaard" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -1032,8 +1034,7 @@ msgid "Rearrange Autoloads" msgstr "Herschik Autoloads" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Pad:" @@ -1103,7 +1104,7 @@ msgstr "Inpakken" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Template bestand niet gevonden:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1228,7 +1229,8 @@ msgstr "Scan Bronnen" msgid "(Re)Importing Assets" msgstr "Aan Het Herimporteren" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Zoek Hulp" @@ -1245,7 +1247,6 @@ msgid "Class:" msgstr "Klasse:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Erft:" @@ -1353,23 +1354,23 @@ msgstr "Mislukt om resource te laden." #: editor/editor_node.cpp msgid "Can't load MeshLibrary for merging!" -msgstr "" +msgstr "Kan MeshLibrary niet laden om te samenvoegen!" #: editor/editor_node.cpp msgid "Error saving MeshLibrary!" -msgstr "" +msgstr "Error bij het opslaan van MeshLibrary!" #: editor/editor_node.cpp msgid "Can't load TileSet for merging!" -msgstr "" +msgstr "Kan TileSet niet laden om te samenvoegen!" #: editor/editor_node.cpp msgid "Error saving TileSet!" -msgstr "" +msgstr "Error bij het opslaan van TileSet!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "" +msgstr "Error bij het opslaan van layout!" #: editor/editor_node.cpp msgid "Default editor layout overridden." @@ -1418,8 +1419,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1473,6 +1474,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1529,7 +1534,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1567,6 +1572,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1619,7 +1628,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1647,35 +1656,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1683,47 +1680,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1794,9 +1759,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Bewerken" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1815,11 +1781,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1903,6 +1925,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1930,6 +1960,34 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Open een Map" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Open een Map" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Afhankelijkheden Editor" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Afhankelijkheden Editor" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2176,6 +2234,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2204,10 +2266,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2376,7 +2434,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2851,7 +2909,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3512,7 +3570,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Oké" @@ -3561,17 +3619,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3603,9 +3650,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Signaal Toevoegen" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Verwijder Signaal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3876,6 +3946,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3888,7 +3971,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3899,20 +3982,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3967,12 +4063,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4030,6 +4130,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Verwijder Autoload" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4183,6 +4292,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4270,10 +4383,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4307,15 +4416,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4371,6 +4472,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4450,6 +4567,15 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Verbind Aan Node:" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4472,6 +4598,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4689,35 +4819,100 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Ga Verder" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Achterwaarts" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Scrollwiel Omlaag." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Lokale wijziging aan het opslaan.." + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Wijzig" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4777,23 +4972,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Alle Selectie" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4821,27 +5025,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4865,14 +5057,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5289,11 +5473,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5305,7 +5489,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5522,6 +5706,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Apparaat" @@ -5587,7 +5775,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5703,10 +5891,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Plak Nodes" @@ -5892,6 +6076,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Resource" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5967,10 +6156,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Omschrijving:" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6015,75 +6251,90 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Map kon niet gemaakt worden." #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "Ongeldig Pad." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Ongeldige index eigenschap naam." #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" -msgstr "" +#, fuzzy +msgid "Create new script file" +msgstr "Subscriptie Maken" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" -msgstr "" +#, fuzzy +msgid "Inherits" +msgstr "Erft:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" +msgstr "Klasse:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Verwijder Selectie" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6795,11 +7046,11 @@ msgstr "" "ParallaxLayer node werkt alleen wanneer het een kind is van een " "ParallaxBackground node." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Path eigenschap moet verwijzen naar een geldige Particles2D node om te " -"werken." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6885,12 +7136,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6911,6 +7156,14 @@ msgstr "" "Een SpriteFrames resource moet gemaakt of gegeven worden in de 'Frames' " "eigenschap om AnimatedSprite3D frames te laten tonen." +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alarm!" @@ -6956,6 +7209,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6971,6 +7230,11 @@ msgstr "" #~ msgid "Node From Scene" #~ msgstr "Node Uit Scene" +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Path eigenschap moet verwijzen naar een geldige Particles2D node om te " +#~ "werken." + #~ msgid "" #~ "A SampleLibrary resource must be created or set in the 'samples' property " #~ "in order for SamplePlayer to play sound." diff --git a/editor/translations/pl.po b/editor/translations/pl.po index ccee170c57..79dc614836 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -1,6 +1,5 @@ # Polish translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # 8-bit Pixel <dawdejw@gmail.com>, 2016. @@ -9,6 +8,7 @@ # Kajetan KuszczyÅ„ski <kajetanek99@gmail.com>, 2016. # Kamil Lewan <lewan.kamil@gmail.com>, 2016. # Karol Walasek <coreconviction@gmail.com>, 2016. +# Maksymilian Åšwiąć <maksymilian.swiac@gmail.com>, 2017. # Mietek SzczeÅ›niak <ravaging@go2.pl>, 2016. # Rafal Brozio <rafal.brozio@gmail.com>, 2016. # siatek papieros <sbigneu@gmail.com>, 2016. @@ -16,8 +16,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-12-29 16:37+0000\n" -"Last-Translator: 8-bit Pixel <dawdejw@gmail.com>\n" +"PO-Revision-Date: 2017-06-23 19:32+0000\n" +"Last-Translator: Daniel Lewan <vision360.daniel@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.15-dev\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -65,12 +65,14 @@ msgid "Anim Duplicate Keys" msgstr "Duplikuj klucze" #: editor/animation_editor.cpp +#, fuzzy msgid "Move Anim Track Up" -msgstr "" +msgstr "PrzesuÅ„ Å›cieżkÄ™ animacji w górÄ™" #: editor/animation_editor.cpp +#, fuzzy msgid "Move Anim Track Down" -msgstr "" +msgstr "PrzesuÅ„ Å›cieżkÄ™ animacji w dół" #: editor/animation_editor.cpp msgid "Remove Anim Track" @@ -104,7 +106,7 @@ msgstr "Edytuj krzywe" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "" +msgstr "Edytuj krzywÄ… selekcji" #: editor/animation_editor.cpp msgid "Anim Delete Keys" @@ -127,8 +129,9 @@ msgid "Continuous" msgstr "CiÄ…gÅ‚e" #: editor/animation_editor.cpp +#, fuzzy msgid "Discrete" -msgstr "Dyskretne" +msgstr "Oddzielne" #: editor/animation_editor.cpp msgid "Trigger" @@ -139,8 +142,9 @@ msgid "Anim Add Key" msgstr "Dodaj klucz animacji" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Move Keys" -msgstr "" +msgstr "Przemieść klucze" #: editor/animation_editor.cpp msgid "Scale Selection" @@ -148,7 +152,7 @@ msgstr "Skaluj zaznaczone" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "" +msgstr "Skaluj od kursora" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -213,16 +217,18 @@ msgid "Create" msgstr "Utwórz" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Create & Insert" -msgstr "" +msgstr "Utwórz i wstaw" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" msgstr "" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Insert Key" -msgstr "" +msgstr "Wstaw klatkÄ™ kluczowÄ…" #: editor/animation_editor.cpp msgid "Change Anim Len" @@ -241,8 +247,9 @@ msgid "Anim Insert" msgstr "Wstaw animacjÄ™" #: editor/animation_editor.cpp +#, fuzzy msgid "Anim Scale Keys" -msgstr "" +msgstr "Przeskaluj klatki kluczowe" #: editor/animation_editor.cpp msgid "Anim Add Call Track" @@ -265,8 +272,9 @@ msgid "Step (s):" msgstr "Krok:" #: editor/animation_editor.cpp +#, fuzzy msgid "Cursor step snap (in seconds)." -msgstr "Krok kursora (sekundy)." +msgstr "Krok kursora (w sekundach)." #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." @@ -310,7 +318,7 @@ msgstr "Maks. błąd kÄ…towy:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "Maksymalny kÄ…t do optymalizacji:" #: editor/animation_editor.cpp msgid "Optimize" @@ -318,7 +326,7 @@ msgstr "Zoptymalizuj" #: editor/animation_editor.cpp msgid "Select an AnimationPlayer from the Scene Tree to edit animations." -msgstr "" +msgstr "Zaznacz wÄ™zeÅ‚ AnimationPlayer w drzewie sceny aby edytować animacje." #: editor/animation_editor.cpp msgid "Key" @@ -330,7 +338,7 @@ msgstr "PrzejÅ›cie" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "" +msgstr "Współczynnik skali:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" @@ -338,11 +346,12 @@ msgstr "Z którego wÄ™zÅ‚a wywoÅ‚ać funkcjÄ™?" #: editor/animation_editor.cpp msgid "Remove invalid keys" -msgstr "UsuÅ„ wadliwe klucze" +msgstr "UsuÅ„ wadliwe klatki kluczowe" #: editor/animation_editor.cpp +#, fuzzy msgid "Remove unresolved and empty tracks" -msgstr "" +msgstr "UsuÅ„ nierozwiÄ…zane i puste Å›cieżki" #: editor/animation_editor.cpp msgid "Clean-up all animations" @@ -430,7 +439,7 @@ msgstr "Połącz.." #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Can't connect to host:" -msgstr "Podłączanie Do WÄ™zÅ‚a:" +msgstr "Podłącz do wÄ™zÅ‚a:" #: editor/asset_library_editor_plugin.cpp msgid "No response from host:" @@ -520,7 +529,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "Wczytaj błędy" +msgstr "Pobierz" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -554,7 +563,8 @@ msgid "Search:" msgstr "Szukaj:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -600,7 +610,7 @@ msgstr "Wsparcie.." msgid "Official" msgstr "Oficjalny" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "SpoÅ‚eczność" @@ -609,8 +619,9 @@ msgid "Testing" msgstr "Testowanie" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Assets ZIP File" -msgstr "" +msgstr "Plik ZIP assetów" #: editor/call_dialog.cpp msgid "Method List For '%s':" @@ -730,10 +741,13 @@ msgid "" "Target method not found! Specify a valid method or attach a script to target " "Node." msgstr "" +"Nie znaleziono wybranej metody! Podaj wÅ‚aÅ›ciwÄ… metodÄ™, lub dołącz skrypt do " +"wybranego wÄ™zÅ‚a." #: editor/connections_dialog.cpp +#, fuzzy msgid "Connect To Node:" -msgstr "Podłączanie Do WÄ™zÅ‚a:" +msgstr "Podłącz do wÄ™zÅ‚a:" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp @@ -744,6 +758,7 @@ msgstr "Dodaj" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "UsuÅ„" @@ -785,8 +800,9 @@ msgid "Connecting Signal:" msgstr "Połączony sygnaÅ‚:" #: editor/connections_dialog.cpp +#, fuzzy msgid "Create Subscription" -msgstr "Utwórz subskrypcje" +msgstr "Utwórz subskrypcjÄ™" #: editor/connections_dialog.cpp msgid "Connect.." @@ -829,16 +845,21 @@ msgid "Dependencies For:" msgstr "ZależnoÅ›ci:" #: editor/dependency_editor.cpp +#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" +"Scena '%s' jest obecnie edytowana.\n" +"Zmiany nie zajdÄ… do czasu przeÅ‚adowania." #: editor/dependency_editor.cpp msgid "" "Resource '%s' is in use.\n" "Changes will take effect when reloaded." msgstr "" +"Zasób '%s' jest w użyciu.\n" +"Zmiany zajdÄ… dopiero po jego przeÅ‚adowaniu." #: editor/dependency_editor.cpp msgid "Dependencies" @@ -850,6 +871,7 @@ msgstr "Zasoby" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Åšcieżka" @@ -896,11 +918,11 @@ msgstr "Scena nie zostaÅ‚a wczytana z powodu brakujÄ…cych zależnoÅ›ci:" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "Otwórz Pomimo" +msgstr "Otwórz pomimo" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "Jaka dziaÅ‚anie powinno zostać podjÄ™te?" +msgstr "Jakie dziaÅ‚anie powinno zostać podjÄ™te?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -938,23 +960,21 @@ msgstr "UsuÅ„" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Zapisz ukÅ‚ad magistrali audio jako..." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "Lokalizacja nowego ukÅ‚adu..." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Otwórz ukÅ‚ad magistrali audio" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Dodaj wszystko" +msgstr "Dodaj magistralÄ™" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Wczytaj" @@ -964,6 +984,7 @@ msgid "Save As" msgstr "Zapisz jako" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "DomyÅ›lny" @@ -997,8 +1018,9 @@ msgid "File does not exist." msgstr "Plik nie istnieje." #: editor/editor_autoload_settings.cpp +#, fuzzy msgid "Not in resource path." -msgstr "" +msgstr "Nie znaleziono w Å›cieżce zasobów." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -1006,7 +1028,7 @@ msgstr "Dodaj AutoLoad" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" -msgstr "Autoload '%s' już istnieje!" +msgstr "AutoLoad '%s' już istnieje!" #: editor/editor_autoload_settings.cpp msgid "Rename Autoload" @@ -1018,7 +1040,7 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "" +msgstr "Przemieść Autoload" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" @@ -1030,11 +1052,10 @@ msgstr "Włącz" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" -msgstr "" +msgstr "Przestaw Autoloady" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Åšcieżka:" @@ -1070,7 +1091,7 @@ msgstr "Aktualizacja sceny .." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "Wybierz Katalog" +msgstr "Wybierz katalog" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp @@ -1094,7 +1115,7 @@ msgstr "Wybierz" #: editor/editor_export.cpp msgid "Storing File:" -msgstr "Zapisywanie Pliku:" +msgstr "Zapisywanie pliku:" #: editor/editor_export.cpp msgid "Packing" @@ -1102,7 +1123,7 @@ msgstr "Pakowanie" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Nie znaleziono pliku szablonu:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1186,7 +1207,7 @@ msgstr "Przełącz tryby" #: editor/editor_file_dialog.cpp msgid "Focus Path" -msgstr "" +msgstr "Przejdź do wprowadzania Å›cieżki" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" @@ -1226,13 +1247,14 @@ msgstr "Przeszukaj źródÅ‚a" msgid "(Re)Importing Assets" msgstr "Prze-Importowanie" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Wyszukaj w Pomocy" #: editor/editor_help.cpp msgid "Class List:" -msgstr "List Klas:" +msgstr "List klas:" #: editor/editor_help.cpp msgid "Search Classes" @@ -1243,7 +1265,6 @@ msgid "Class:" msgstr "Klasa:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Dziedziczy:" @@ -1261,7 +1282,7 @@ msgstr "CzÅ‚onkowie:" #: editor/editor_help.cpp msgid "Public Methods:" -msgstr "Metody Publiczne:" +msgstr "Metody publiczne:" #: editor/editor_help.cpp msgid "GUI Theme Items:" @@ -1282,7 +1303,7 @@ msgstr "Krótki opis:" #: editor/editor_help.cpp msgid "Method Description:" -msgstr "Opis Metody:" +msgstr "Opis metody:" #: editor/editor_help.cpp msgid "Search Text" @@ -1367,19 +1388,19 @@ msgstr "Błąd podczas zapisywania TileSet!" #: editor/editor_node.cpp msgid "Error trying to save layout!" -msgstr "Błąd podczas zapisu layoutu!" +msgstr "Błąd podczas zapisu ukÅ‚adu!" #: editor/editor_node.cpp msgid "Default editor layout overridden." -msgstr "DomyÅ›lny layout edytora zostaÅ‚ nadpisany." +msgstr "DomyÅ›lny ukÅ‚ad edytora zostaÅ‚ nadpisany." #: editor/editor_node.cpp msgid "Layout name not found!" -msgstr "Nie znaleziono nazwy layoutu!" +msgstr "Nie znaleziono nazwy ukÅ‚adu!" #: editor/editor_node.cpp msgid "Restored default layout to base settings." -msgstr "Przywrócono domyÅ›lny layout do ustawieÅ„ bazowych." +msgstr "Przywrócono domyÅ›lny ukÅ‚ad do ustawieÅ„ bazowych." #: editor/editor_node.cpp msgid "Copy Params" @@ -1404,7 +1425,7 @@ msgstr "Skrypt wbudowany" #: editor/editor_node.cpp msgid "Make Sub-Resources Unique" -msgstr "" +msgstr "Utwórz unikalne pod-zasoby" #: editor/editor_node.cpp msgid "Open in Help" @@ -1415,10 +1436,11 @@ msgid "There is no defined scene to run." msgstr "Nie ma zdefiniowanej sceny do uruchomienia." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Nie zdefiniowano głównej sceny, chcesz jakÄ…Å› wybrać?\n" "Można to później zmienić w \"Ustawienia projektu\" w kategorii \"aplikacja\"." @@ -1480,6 +1502,11 @@ msgid "Save Scene As.." msgstr "Zapisz scenÄ™ jako.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "WÄ™zeÅ‚" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Ta scena nie zostaÅ‚a zapisana. Zapisać przed uruchomieniem?" @@ -1532,13 +1559,17 @@ msgid "Pick a Main Scene" msgstr "Wybierz głównÄ… scenÄ™" #: editor/editor_node.cpp +#, fuzzy msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Scena '%s' zostaÅ‚a automatycznie zaimportowana, i nie może być " +"zmodyfikowana.\n" +"Aby dokonać na niej zmian, można utworzyć nowÄ… odziedziczonÄ… scenÄ™." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp #, fuzzy msgid "Ugh" msgstr "Błąd" @@ -1562,11 +1593,11 @@ msgstr "Scena '%s' ma niespeÅ‚nione zależnoÅ›ci:" #: editor/editor_node.cpp msgid "Save Layout" -msgstr "Zapisz layout" +msgstr "Zapisz ukÅ‚ad" #: editor/editor_node.cpp msgid "Delete Layout" -msgstr "UsuÅ„ layout" +msgstr "UsuÅ„ ukÅ‚ad" #: editor/editor_node.cpp msgid "Switch Scene Tab" @@ -1580,6 +1611,10 @@ msgstr "PozostaÅ‚o %d plików" msgid "%d more file(s) or folder(s)" msgstr "PozostaÅ‚o %d plików lub folderów" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Tryb bez rozproszeÅ„" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Scena" @@ -1611,7 +1646,7 @@ msgstr "Nowa scena" #: editor/editor_node.cpp msgid "New Inherited Scene.." -msgstr "Nowa odziedziczona scena.." +msgstr "Nowa dziedziczÄ…ca scena.." #: editor/editor_node.cpp msgid "Open Scene.." @@ -1633,7 +1668,7 @@ msgstr "Zamknij scenÄ™" msgid "Close Goto Prev. Scene" msgstr "Zamknij i przejdź do poprzedniej sceny" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Ostatnio otwierane" @@ -1661,84 +1696,41 @@ msgid "Redo" msgstr "Ponów" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Uruchom skrypt" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Ustawienia projektu" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Resetuj scenÄ™" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Wyjdź do Listy Projektów" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Tryb bez rozproszeÅ„" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Tools" -msgstr "NarzÄ™dzia" +#, fuzzy +msgid "Project" +msgstr "Nowy projekt" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Eksportuj projekt na inne platformy." +msgid "Project Settings" +msgstr "Ustawienia projektu" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Uruchom skrypt" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Eksport" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Uruchom projekt." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Uruchom" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Zapauzuj scenÄ™" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Zapauzuj scenÄ™" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Zatrzymaj scene." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Stop" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Uruchom aktualnie edytowanÄ… scenÄ™." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Odtwórz Scene" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Uruchom niestandardowÄ… scenÄ™" +msgid "Tools" +msgstr "NarzÄ™dzia" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Uruchom niestandardowÄ… scenÄ™" +msgid "Quit to Project List" +msgstr "Wyjdź do Listy Projektów" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opcje debugowania" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Debug" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1754,7 +1746,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Small Deploy with Network FS" -msgstr "" +msgstr "Testuj z sieciowym systemem plików" #: editor/editor_node.cpp msgid "" @@ -1824,9 +1816,10 @@ msgstr "" "(dziaÅ‚ajÄ…ce instancje bÄ™dÄ… zrestartowane). Opcja ta dziaÅ‚a szybciej z " "użyciem sieciowych systemów plików." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Ustawienia" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Edycja" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1834,7 +1827,7 @@ msgstr "Ustawienia edytora" #: editor/editor_node.cpp msgid "Editor Layout" -msgstr "Layout edytora" +msgstr "UkÅ‚ad edytora" #: editor/editor_node.cpp #, fuzzy @@ -1844,15 +1837,72 @@ msgstr "PeÅ‚ny ekran" #: editor/editor_node.cpp editor/project_export.cpp #, fuzzy msgid "Manage Export Templates" -msgstr "Åadowanie szablonów eksportu" +msgstr "ZarzÄ…dzanie szablonami eksportu" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Pomoc" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Klasy" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Zamknij pliki pomocy" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "O programie" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Powiadomienie o zmianie stanu zasobu zewnÄ™trznego." +msgid "Play the project." +msgstr "Uruchom projekt." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Uruchom" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Zapauzuj scenÄ™" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Zapauzuj scenÄ™" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Zatrzymaj scene." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Stop" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Uruchom aktualnie edytowanÄ… scenÄ™." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Odtwórz Scene" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Wybierz scenę do uruchomienia" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Uruchom niestandardowÄ… scenÄ™" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1867,8 +1917,9 @@ msgid "Update Changes" msgstr "OdÅ›wież Zmiany" #: editor/editor_node.cpp +#, fuzzy msgid "Disable Update Spinner" -msgstr "" +msgstr "Wyłącz wiatraczek aktualizacji" #: editor/editor_node.cpp msgid "Inspector" @@ -1876,7 +1927,7 @@ msgstr "Inspektor" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." -msgstr "Utwórz nowy zasób wewnÄ…trz pamiÄ™ci i edytuj go." +msgstr "Utwórz nowy zasób w pamiÄ™ci i edytuj go." #: editor/editor_node.cpp msgid "Load an existing resource from disk and edit it." @@ -1920,7 +1971,7 @@ msgstr "Konsola" #: editor/editor_node.cpp editor/editor_reimport_dialog.cpp msgid "Re-Import" -msgstr "Prze-Importuj" +msgstr "Importuj ponownie" #: editor/editor_node.cpp editor/editor_plugin_settings.cpp msgid "Update" @@ -1935,6 +1986,14 @@ msgid "Thanks!" msgstr "DziÄ™ki!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Zaimportuj Szablony z pliku ZIP" @@ -1962,6 +2021,36 @@ msgstr "Otwórz i Uruchom Skrypt" msgid "Load Errors" msgstr "Wczytaj błędy" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Otwórz w edytorze" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Otwórz w edytorze" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Otwórz w edytorze" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Wyeksportuj biblioteke" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Otwórz w edytorze" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Otwórz w edytorze" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Zainstalowane wtyczki:" @@ -2029,7 +2118,7 @@ msgstr "Bieżąca scena musi być zapisana aby ponownie zaimportować." #: editor/editor_reimport_dialog.cpp msgid "Save & Re-Import" -msgstr "Zapisz i Prze-Importuj" +msgstr "Zapisz i importuj ponownie" #: editor/editor_reimport_dialog.cpp msgid "Re-Importing" @@ -2096,11 +2185,11 @@ msgstr "Instaluj" #: editor/export_template_manager.cpp msgid "Download" -msgstr "" +msgstr "Pobierz" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(Nie znaleziono)" #: editor/export_template_manager.cpp #, fuzzy @@ -2109,7 +2198,7 @@ msgstr "Bieżący:" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Usunąć wersjÄ™ '%s' szablonu?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2117,17 +2206,20 @@ msgstr "Nie można otworzyć pliku zip szablonów eksportu." #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "NieprawidÅ‚owy format pliku version.txt w szablonach." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"nieprawidÅ‚owy format pliku version.txt wewnÄ…trz szablonów. Zmiana nie jest " +"prawidÅ‚owym identyfikatorem." #: editor/export_template_manager.cpp +#, fuzzy msgid "No version.txt found inside templates." -msgstr "" +msgstr "Nie znaleziono pliku version.txt w szablonach." #: editor/export_template_manager.cpp #, fuzzy @@ -2135,9 +2227,8 @@ msgid "Error creating path for templates:\n" msgstr "Błąd podczas zapisywania atlasu:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Åadowanie szablonów eksportu" +msgstr "Wypakowywanie szablonów eksportu" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2145,7 +2236,7 @@ msgstr "Importowanie:" #: editor/export_template_manager.cpp msgid "Loading Export Templates" -msgstr "Åadowanie szablonów eksportu" +msgstr "Wczytywanie szablonów eksportu" #: editor/export_template_manager.cpp #, fuzzy @@ -2153,14 +2244,12 @@ msgid "Current Version:" msgstr "Aktualna scena" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "Zainstalowane wtyczki:" +msgstr "Zainstalowane szablony:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "Zainstaluj projekt:" +msgstr "Zainstaluj z pliku" #: editor/export_template_manager.cpp #, fuzzy @@ -2173,9 +2262,8 @@ msgid "Select template file" msgstr "Usunąć zaznaczone pliki?" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "Åadowanie szablonów eksportu" +msgstr "Menedżer szablonów eksportu" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2185,11 +2273,12 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "Nie można przejść do '" #: editor/filesystem_dock.cpp +#, fuzzy msgid "Same source and destination files, doing nothing." -msgstr "" +msgstr "Pliki źródÅ‚owe i docelowe sÄ… te same, nie podjÄ™to żadnej akcji." #: editor/filesystem_dock.cpp msgid "Same source and destination paths, doing nothing." @@ -2203,7 +2292,7 @@ msgstr "Nie możesz przenieść danego katalogu do jego wnÄ™trza." #: editor/filesystem_dock.cpp msgid "Can't operate on '..'" -msgstr "" +msgstr "Nie można operować na '..'" #: editor/filesystem_dock.cpp msgid "Pick New Name and Location For:" @@ -2215,11 +2304,15 @@ msgstr "Nie wybrano pliku!" #: editor/filesystem_dock.cpp msgid "Expand all" -msgstr "" +msgstr "RozwiÅ„ foldery" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "ZwiÅ„ foldery" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Pokaż w menadżerze plików" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2250,10 +2343,6 @@ msgid "Info" msgstr "Informacje" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Pokaż w menadżerze plików" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Importuj ponownie.." @@ -2298,7 +2387,7 @@ msgstr "Powierzchnia %d" #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Import Scene" -msgstr "Importuj Scene" +msgstr "Importuj ScenÄ™" #: editor/import/resource_importer_scene.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp @@ -2344,16 +2433,15 @@ msgstr "Importuj" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "Ustawienie predefiniowane.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" -msgstr "Prze-Importuj" +msgstr "Importuj ponownie" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "No bit masks to import!" -msgstr "" +msgstr "Brak mask bitowych do zaimportowania!" #: editor/io_plugins/editor_bitmask_import_plugin.cpp #: editor/io_plugins/editor_sample_import_plugin.cpp @@ -2415,39 +2503,40 @@ msgstr "BitMask" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "No source font file!" -msgstr "Brak pliku źródÅ‚owego czcionki!" +msgstr "Brak pliku źródÅ‚owego fontu!" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "No target font resource!" -msgstr "Brak docelowego zasobu czcionki!" +msgstr "Brak docelowego zasobu fontu!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Błędne rozszerzenie pliku.\n" "ProszÄ™ użyć .fnt." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Can't load/process source font." -msgstr "" +msgstr "Nie można wczytać/przetworzyć źródÅ‚owego fontu." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Couldn't save font." -msgstr "Nie udaÅ‚o siÄ™ zapisać czcionki." +msgstr "Nie udaÅ‚o siÄ™ zapisać fontu." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Source Font:" -msgstr "ŹródÅ‚o czcionki:" +msgstr "ŹródÅ‚o fontu:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Source Font Size:" -msgstr "Wielkość oryginalna czcionki:" +msgstr "Wielkość oryginalna fontu:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Dest Resource:" -msgstr "Wielkość docelowa czcionki:" +msgstr "Zasób docelowy:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "The quick brown fox jumps over the lazy dog." @@ -2466,17 +2555,17 @@ msgstr "Opcje:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Font Import" -msgstr "Import czcionki" +msgstr "Import fontu" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "This file is already a Godot font file, please supply a BMFont type file " "instead." -msgstr "" +msgstr "Ten plik jest już plikiem fontu Godot, proszÄ™ podać plik typu BMFont." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Failed opening as BMFont file." -msgstr "" +msgstr "Nie powiodÅ‚o siÄ™, otwarcie pliku jako BMFont." #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp @@ -2500,12 +2589,12 @@ msgstr "Niepoprawny rozmiar fonta." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Invalid font custom source." -msgstr "Nie rozpoznano typu czcionki." +msgstr "Nie rozpoznano typu fontu." #: editor/io_plugins/editor_font_import_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp msgid "Font" -msgstr "Czcionka" +msgstr "Font" #: editor/io_plugins/editor_mesh_import_plugin.cpp msgid "No meshes to import!" @@ -2554,7 +2643,7 @@ msgstr "Flagi" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Bake FPS:" -msgstr "" +msgstr "Wypal FPS:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Optimizer" @@ -2677,7 +2766,7 @@ msgstr "Nie można zaimportować pliku wewnÄ…trz siebie samego:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Couldn't localize path: %s (already local)" -msgstr "" +msgstr "Nie można zlokalizować Å›cieżki: %s (już jest lokalna)" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "3D Scene Animation" @@ -2769,7 +2858,7 @@ msgstr "Importuj tekstury dla 3D" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Import Textures" -msgstr "Zaimportuj Textury" +msgstr "Zaimportuj Tekstury" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "2D Texture" @@ -2825,7 +2914,7 @@ msgstr "Nie udaÅ‚o siÄ™ zapisać dużej tekstury:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Build Atlas For:" -msgstr "" +msgstr "Zbuduj Atlas dla:" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Loading Image:" @@ -2849,11 +2938,12 @@ msgstr "" #: editor/io_plugins/editor_texture_import_plugin.cpp msgid "Couldn't save atlas image:" -msgstr "" +msgstr "Nie można zapisać obrazu atlasu:" #: editor/io_plugins/editor_texture_import_plugin.cpp +#, fuzzy msgid "Couldn't save converted texture:" -msgstr "" +msgstr "Nie można zapisać zkonwertowanej tekstury:" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Invalid source!" @@ -2906,7 +2996,7 @@ msgstr "Skompresuj" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Dodaj do projektu (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -2995,7 +3085,7 @@ msgstr "BÅÄ„D: Brak animacji do skopiowania!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "ERROR: No animation resource on clipboard!" -msgstr "" +msgstr "BÅÄ„D: Brak zasobu animacji w schowku!" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pasted Animation" @@ -3015,7 +3105,7 @@ msgstr "Odtwórz zaznaczonÄ… animacjÄ™ od tyÅ‚u z aktualnej poz. (A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Play selected animation backwards from end. (Shift+A)" -msgstr "" +msgstr "Odtwarzaj zaznaczonÄ… animacjÄ™ od koÅ„ca. (Shift+A)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Stop animation playback. (S)" @@ -3043,11 +3133,11 @@ msgstr "Stwórz nowÄ… animacjÄ™." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load animation from disk." -msgstr "ZaÅ‚aduj animacjÄ™ z dysku." +msgstr "Wczytaj animacjÄ™ z dysku." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Load an animation from disk." -msgstr "ZaÅ‚aduj animacje z dysku." +msgstr "Wczytaj animacje z dysku." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save the current animation" @@ -3095,7 +3185,7 @@ msgstr "" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Next (Auto Queue):" -msgstr "" +msgstr "NastÄ™pny (automatyczna kolejka):" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Cross-Animation Blend Times" @@ -3141,7 +3231,7 @@ msgstr "Restart(y):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Random Restart (s):" -msgstr "" +msgstr "Losowy restart (s):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Start!" @@ -3150,7 +3240,7 @@ msgstr "Start!" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Amount:" -msgstr "" +msgstr "IloÅ›c:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" @@ -3194,15 +3284,15 @@ msgstr "ZmieÅ„ nazwÄ™" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is valid." -msgstr "" +msgstr "Drzewo animacji jest poprawne." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation tree is invalid." -msgstr "" +msgstr "Drzewo animacji jest wadliwe." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Animation Node" -msgstr "" +msgstr "WÄ™zeÅ‚ animacji" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" @@ -3242,7 +3332,7 @@ msgstr "Zaimportuj animacje.." #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Edit Node Filters" -msgstr "" +msgstr "Edytuj filtry wÄ™złów" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Filters.." @@ -3311,7 +3401,7 @@ msgstr "PodglÄ…d" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "Konfiguruj krokowanie" +msgstr "Konfiguruj przyciÄ…ganie" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -3396,6 +3486,8 @@ msgid "" "Show a list of all objects at the position clicked\n" "(same as Alt+RMB in select mode)." msgstr "" +"Pokaż listę obiektów w miejscu klikniÄ™cia\n" +"(tak samo jak Alt+RMB w trybie zaznaczania)." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Click to change object's rotation pivot." @@ -3437,7 +3529,7 @@ msgstr "Użyj przyciÄ…gania" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Show Grid" -msgstr "Pokaż kratownicÄ™" +msgstr "Pokaż siatkÄ™" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" @@ -3536,7 +3628,7 @@ msgstr "Ustaw Wartość" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap (Pixels):" -msgstr "" +msgstr "PrzyciÄ…ganie (piksele):" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3545,7 +3637,7 @@ msgstr "Dodaj wszystko" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Adding %s..." -msgstr "" +msgstr "Dodawanie %s..." #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Create Node" @@ -3553,19 +3645,20 @@ msgstr "Utwórz wÄ™zeÅ‚" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Error instancing scene from %s" -msgstr "" +msgstr "Błąd instancjacji sceny z %s" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "OK :(" msgstr "OK :(" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp +#, fuzzy msgid "No parent to instance a child at." -msgstr "" +msgstr "Brak elementu nadrzÄ™dnego do stworzenia instancji." #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "This operation requires a single selected node." -msgstr "" +msgstr "Ta operacja wymaga pojedynczego wybranego wÄ™zÅ‚a." #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -3573,7 +3666,7 @@ msgid "Change default type" msgstr "ZmieÅ„ Wartość DomyÅ›lnÄ…" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3582,6 +3675,8 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" +"PrzeciÄ…gnij i upuść + Shift: dodaj wÄ™zeÅ‚ równorzÄ™dny\n" +"PrzeciÄ…gnij i upuść + Alt: ZmieÅ„ typ wÄ™zÅ‚a" #: editor/plugins/collision_polygon_2d_editor_plugin.cpp #: editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -3612,7 +3707,7 @@ msgstr "" #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Create a new polygon from scratch." -msgstr "" +msgstr "Utwórz nowy wielokÄ…t." #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Poly3D" @@ -3622,20 +3717,9 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" -msgstr "" +msgstr "Tworzenie Mesh Library" #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Thumbnail.." @@ -3665,9 +3749,33 @@ msgstr "Aktualizuj ze sceny" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Dodaj WejÅ›cie" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "UsuÅ„ punkt Å›cieżki" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Wczytaj Zasób" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Zamknij krzywÄ…" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Dodaj/UsuÅ„ punkty w Color Ramp" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modyfikuj Color Ramp" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Element %d" @@ -3697,7 +3805,7 @@ msgstr "LMB: PrzesuÅ„ Punkt." #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp msgid "Ctrl+LMB: Split Segment." -msgstr "" +msgstr "Ctrl + LPM: PodziaÅ‚u segmentu." #: editor/plugins/light_occluder_2d_editor_plugin.cpp #: editor/plugins/navigation_polygon_editor_plugin.cpp @@ -3762,19 +3870,19 @@ msgstr "UsuÅ„ Punkt" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Mesh is empty!" -msgstr "" +msgstr "Siatka jest pusta!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Trimesh Body" -msgstr "" +msgstr "Stwórz Static Trimesh Body" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Static Convex Body" -msgstr "" +msgstr "Stwórz statycznych ciaÅ‚o wypukÅ‚e" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "This doesn't work on scene root!" -msgstr "" +msgstr "Nie dziaÅ‚a na głównym węźle sceny!" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Trimesh Shape" @@ -3918,15 +4026,15 @@ msgstr "" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Rotation:" -msgstr "" +msgstr "Obrót losowy:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Tilt:" -msgstr "" +msgstr "Losowe nachylenie:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "" +msgstr "Losowa skala:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" @@ -3941,6 +4049,20 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "UsuÅ„ maskÄ™ emisji" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Generuj AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Błąd wczytywania obrazu:" @@ -3950,44 +4072,60 @@ msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Set Emission Mask" -msgstr "" +msgstr "Ustaw maskÄ™ emisji" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" -msgstr "" +msgstr "Wczytaj maskÄ™ emisji" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Generated Point Count:" -msgstr "" +msgstr "Wygeneruj chmurÄ™ punktów:" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Åšredni Czas (sek)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Ustaw maskÄ™ emisji" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Utwórz ze sceny" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Punkty emisji:" #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." -msgstr "" +msgstr "WÄ™zeÅ‚ nie zawiera geometrii." #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry (faces)." -msgstr "" +msgstr "WÄ™zeÅ‚ nie zawiera geometrii (Å›ciany)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Generuj AABB" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" -msgstr "" +msgstr "Åšciana nie ma powierzchni!" #: editor/plugins/particles_editor_plugin.cpp msgid "No faces!" -msgstr "" +msgstr "Brak Å›cian!" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" @@ -3995,11 +4133,11 @@ msgstr "Generuj AABB" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Mesh" -msgstr "" +msgstr "Twórz punkty emisji z siatki" #: editor/plugins/particles_editor_plugin.cpp msgid "Create Emission Points From Node" -msgstr "" +msgstr "Twórz punkty emisji z wÄ™zÅ‚a" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" @@ -4011,7 +4149,7 @@ msgstr "Utwórz Emiter" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Points:" -msgstr "" +msgstr "Punkty emisji:" #: editor/plugins/particles_editor_plugin.cpp #, fuzzy @@ -4028,30 +4166,35 @@ msgstr "GÅ‚oÅ›ność" #: editor/plugins/particles_editor_plugin.cpp msgid "Emission Source: " -msgstr "" +msgstr "ŹródÅ‚a emisji: " #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Generate Visibility AABB" msgstr "Generuj AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "UsuÅ„ punkt z krzywej" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Åšredni Czas (sek)" +msgid "Remove Out-Control from Curve" +msgstr "UsuÅ„ punkt z krzywej" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" -msgstr "" +#, fuzzy +msgid "Remove In-Control from Curve" +msgstr "UsuÅ„ punkt z krzywej" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Add Point to Curve" -msgstr "" +msgstr "Dodaj punkt do krzywej" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move Point in Curve" -msgstr "" +msgstr "PrzenieÅ› punkt krzywej" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Move In-Control in Curve" @@ -4081,7 +4224,7 @@ msgstr "Punkt Krzywej #" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve Point Pos" -msgstr "" +msgstr "Ustaw pozycje punktu krzywej" #: editor/plugins/path_editor_plugin.cpp msgid "Set Curve In Pos" @@ -4099,6 +4242,16 @@ msgstr "Podziel ÅšcieżkÄ™" msgid "Remove Path Point" msgstr "UsuÅ„ punkt Å›cieżki" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "UsuÅ„ punkt Å›cieżki" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "UsuÅ„ punkt Å›cieżki" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Utwórz MapÄ™ UV" @@ -4154,11 +4307,11 @@ msgstr "Wyczyść UV" #: editor/plugins/polygon_2d_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap" -msgstr "" +msgstr "PrzyciÄ…gaj" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Enable Snap" -msgstr "" +msgstr "Włączyć przyciÄ…ganie" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Grid" @@ -4183,7 +4336,7 @@ msgstr "UsuÅ„ zasób" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "Resource clipboard is empty!" -msgstr "" +msgstr "Schowka zasobów jest pusty!" #: editor/plugins/resource_preloader_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -4200,7 +4353,7 @@ msgstr "Wklej" #: editor/plugins/rich_text_editor_plugin.cpp msgid "Parse BBCode" -msgstr "" +msgstr "Parsuj BBCode" #: editor/plugins/sample_editor_plugin.cpp msgid "Length:" @@ -4208,7 +4361,7 @@ msgstr "DÅ‚ugość:" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Open Sample File(s)" -msgstr "" +msgstr "Otwórz plik(i) sampli" #: editor/plugins/sample_library_editor_plugin.cpp msgid "ERROR: Couldn't load sample!" @@ -4216,15 +4369,15 @@ msgstr "" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Add Sample" -msgstr "" +msgstr "Dodaj sampel" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Rename Sample" -msgstr "" +msgstr "ZmieÅ„ nazwÄ™ sampla" #: editor/plugins/sample_library_editor_plugin.cpp msgid "Delete Sample" -msgstr "" +msgstr "UsuÅ„ sampel" #: editor/plugins/sample_library_editor_plugin.cpp msgid "16 Bits" @@ -4252,6 +4405,11 @@ msgid "Pitch" msgstr "Wysokość" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Wyczyść KoÅ›ci" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Błąd podczas zapisywania motywu" @@ -4297,15 +4455,15 @@ msgstr "Zapisz wszystko" #: editor/plugins/script_editor_plugin.cpp msgid "Soft Reload Script" -msgstr "" +msgstr "MiÄ™kkie przeÅ‚adowania skryptu" #: editor/plugins/script_editor_plugin.cpp msgid "History Prev" -msgstr "" +msgstr "Poprzedni plik" #: editor/plugins/script_editor_plugin.cpp msgid "History Next" -msgstr "" +msgstr "NastÄ™pny plik" #: editor/plugins/script_editor_plugin.cpp msgid "Reload Theme" @@ -4340,21 +4498,20 @@ msgstr "Znajdź.." msgid "Find Next" msgstr "Znajdź nastÄ™pny" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Debug" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +#, fuzzy msgid "Step Over" -msgstr "" +msgstr "Przekrocz" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +#, fuzzy msgid "Step Into" -msgstr "" +msgstr "Krok w" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp +#, fuzzy msgid "Break" -msgstr "" +msgstr "Przerwa" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Continue" @@ -4377,16 +4534,9 @@ msgid "Move Right" msgstr "PrzesuÅ„ w prawo" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Poradniki" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Otwórz https://godotengine.org na sekcji poradników." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Klasy" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Poszukaj w dokumentacji referencyjnej." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4394,7 +4544,7 @@ msgstr "Szukaj w hierarchii klas." #: editor/plugins/script_editor_plugin.cpp msgid "Search the reference documentation." -msgstr "" +msgstr "Poszukaj w dokumentacji referencyjnej." #: editor/plugins/script_editor_plugin.cpp msgid "Go to previous edited document." @@ -4418,6 +4568,8 @@ msgid "" "The following files are newer on disk.\n" "What action should be taken?:" msgstr "" +"NastÄ™pujÄ…ce pliki sÄ… nowsze na dysku.\n" +"Jakie dziaÅ‚ania należy podjąć?:" #: editor/plugins/script_editor_plugin.cpp msgid "Reload" @@ -4435,6 +4587,8 @@ msgstr "Debugger" msgid "" "Built-in scripts can only be edited when the scene they belong to is loaded" msgstr "" +"Wbudowany skrypty mogÄ… być edytowane tylko, po zaÅ‚adowaniu sceny do której " +"należą" #: editor/plugins/script_text_editor.cpp #, fuzzy @@ -4442,6 +4596,23 @@ msgid "Pick Color" msgstr "Kolor" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Konwersja obrazków" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4481,15 +4652,15 @@ msgstr "Ustaw komentarz" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" -msgstr "" +msgstr "Duplikuj liniÄ™" #: editor/plugins/script_text_editor.cpp msgid "Complete Symbol" -msgstr "" +msgstr "UzupeÅ‚nij symbol" #: editor/plugins/script_text_editor.cpp msgid "Trim Trailing Whitespace" -msgstr "" +msgstr "Przytnij koÅ„cowe spacje" #: editor/plugins/script_text_editor.cpp msgid "Convert Indent To Spaces" @@ -4501,7 +4672,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "" +msgstr "Automatyczne wciÄ™cie" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4521,6 +4692,16 @@ msgid "Goto Previous Breakpoint" msgstr "Przejdź do poprzedniej puÅ‚apki" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Konwertuje na.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Konwertuje na.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Znajdź poprzedni" @@ -4543,37 +4724,41 @@ msgstr "Przejdź do linii.." msgid "Contextual Help" msgstr "Pomoc kontekstowa" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" -msgstr "" +msgstr "ZmieÅ„ wartość staÅ‚ej skalarnej" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Constant" -msgstr "" +msgstr "ZmieÅ„ stałą Vec" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Constant" -msgstr "" +msgstr "ZmieÅ„ stałą RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Operator" -msgstr "" +msgstr "ZmieÅ„ operator skalara" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Operator" -msgstr "" +msgstr "ZmieÅ„ operator Vec" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Vec Scalar Operator" -msgstr "" +msgstr "ZmieÅ„ operator Vec Scalar" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change RGB Operator" -msgstr "" +msgstr "Zmień operator RGB" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Toggle Rot Only" -msgstr "" +msgstr "Przełącz tylko rotacje" #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Function" @@ -4669,11 +4854,11 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orthogonal" -msgstr "" +msgstr "Ortogonalny" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective" -msgstr "" +msgstr "Perspektywa" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Aborted." @@ -4697,31 +4882,31 @@ msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scaling to %s%%." -msgstr "" +msgstr "Skalowanie do %s%%." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." -msgstr "" +msgstr "Obracanie o %s stopni." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View." -msgstr "" +msgstr "Widok z doÅ‚u." #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom" -msgstr "" +msgstr "Dół" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View." -msgstr "" +msgstr "Widok z góry." #: editor/plugins/spatial_editor_plugin.cpp msgid "Top" -msgstr "" +msgstr "Góra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View." -msgstr "" +msgstr "Widok z tyÅ‚u." #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear" @@ -4729,7 +4914,7 @@ msgstr "TyÅ‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View." -msgstr "" +msgstr "Widok z przodu." #: editor/plugins/spatial_editor_plugin.cpp msgid "Front" @@ -4737,19 +4922,19 @@ msgstr "Przód" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View." -msgstr "" +msgstr "Widok z lewej." #: editor/plugins/spatial_editor_plugin.cpp msgid "Left" -msgstr "" +msgstr "Lewa" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View." -msgstr "" +msgstr "Widok z prawej." #: editor/plugins/spatial_editor_plugin.cpp msgid "Right" -msgstr "" +msgstr "Prawa" #: editor/plugins/spatial_editor_plugin.cpp msgid "Keying is disabled (no key inserted)." @@ -4760,38 +4945,108 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with view" +msgid "Freelook Left" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Freelook Right" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +#, fuzzy +msgid "Freelook Forward" +msgstr "Dalej" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Wstecz" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +#, fuzzy +msgid "Freelook Down" +msgstr "Kółko myszy w dół." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Objects Drawn" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +#, fuzzy +msgid "Material Changes" +msgstr "OdÅ›wież Zmiany" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "OdÅ›wież Zmiany" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "OdÅ›wież Zmiany" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "WierzchoÅ‚ek" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "Wyrównaj z widokiem" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "Widok normalny" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "Widok siatki" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +#, fuzzy +msgid "Display Unshaded" +msgstr "Widok bezcieniowy" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Åšrodowisko" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Uchwyty" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "Okno dialogowe XForm" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" msgstr "Tryb Przesuwania (W)" @@ -4801,35 +5056,35 @@ msgstr "Tryb Rotacji (E)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Mode (R)" -msgstr "" +msgstr "Tryb skalowania (R)" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom View" -msgstr "" +msgstr "Widok z doÅ‚u" #: editor/plugins/spatial_editor_plugin.cpp msgid "Top View" -msgstr "" +msgstr "Widok z góry" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear View" -msgstr "" +msgstr "Widok z tyÅ‚u" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front View" -msgstr "" +msgstr "Widok z przodu" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left View" -msgstr "" +msgstr "Widok z lewej" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right View" -msgstr "" +msgstr "Widok z prawej" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal view" -msgstr "" +msgstr "Przełącz widok perspektywiczny/ortogonalny" #: editor/plugins/spatial_editor_plugin.cpp msgid "Insert Animation Key" @@ -4837,123 +5092,115 @@ msgstr "Wstaw klucz animacji" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "Wycentruj na pozycji poczÄ…tkowej" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "Wycentruj na zaznaczeniu" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Selection With View" -msgstr "" +msgstr "Dopasuj zaznaczenie do widoku" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" +#, fuzzy +msgid "Tool Select" +msgstr "Zaznacz" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" -msgstr "" +#, fuzzy +msgid "Tool Move" +msgstr "PrzenieÅ›" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." -msgstr "" +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Obróć" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "" +#, fuzzy +msgid "Tool Scale" +msgstr "Skala:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" +msgstr "PrzeksztaÅ‚canie" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "Koordynaty lokalne" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Użyj domyÅ›lnie sRGB" +msgid "Transform Dialog.." +msgstr "Okno transformowania.." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "" +msgstr "1 widok" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "" +msgstr "2 widoki" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "" +msgstr "2 widoki (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "" +msgstr "3 widoki" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "" +msgstr "3 widoki (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "" +msgstr "4 widoki" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "" +msgstr "Pokaż pozycjÄ™ poczÄ…tkowÄ…" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "" +msgstr "Pokaż siatkÄ™" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Ustawienia" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "" +msgstr "Ustawienia przyciÄ…gania" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "" +msgstr "PrzeksztaÅ‚cenie przyciÄ…gania:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "" +msgstr "Obrót przyciÄ…gania (stopnie):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "" +msgstr "Skala przyciÄ…gania (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" +msgstr "Ustawienia widoku" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" -msgstr "" +msgstr "Pole widzenia w perspektywie (stopnie):" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Near:" -msgstr "" +msgstr "Widok Z-Blisko:" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Z-Far:" -msgstr "" +msgstr "Widok Z-Daleko:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" @@ -4969,7 +5216,7 @@ msgstr "Obrót (stopnie):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale (ratio):" -msgstr "" +msgstr "Skala (proporcja):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" @@ -4985,19 +5232,19 @@ msgstr "" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "ERROR: Couldn't load frame resource!" -msgstr "" +msgstr "Błąd: Nie można zaÅ‚adować zasobu klatki!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Frame" -msgstr "" +msgstr "Dodaj klatkÄ™" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Resource clipboard is empty or not a texture!" -msgstr "" +msgstr "Schowek zasobów jest pusty lub nie zawiera tekstury!" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Paste Frame" -msgstr "" +msgstr "Wklej klatkÄ™" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Add Empty" @@ -5005,7 +5252,7 @@ msgstr "Dodaj pusty" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "" +msgstr "ZmieÅ„ pÄ™tle animacji" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation FPS" @@ -5025,7 +5272,7 @@ msgstr "PrÄ™dkość (FPS):" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Animation Frames" -msgstr "" +msgstr "Klatki animacji" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Insert Empty (Before)" @@ -5037,19 +5284,19 @@ msgstr "Dodaj pusty (później)" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Up" -msgstr "" +msgstr "Góra" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Down" -msgstr "" +msgstr "Dół" #: editor/plugins/style_box_editor_plugin.cpp msgid "StyleBox Preview:" -msgstr "" +msgstr "PodglÄ…d StyleBox:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Snap Mode:" -msgstr "" +msgstr "Tryb przyciÄ…gania:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "<None>" @@ -5057,19 +5304,19 @@ msgstr "<żaden>" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "" +msgstr "PrzyciÄ…gaj do pikseli" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "" +msgstr "PrzyciÄ…gaj do siatki" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" -msgstr "" +msgstr "Tnij automatycznie" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Offset:" -msgstr "" +msgstr "PrzesuniÄ™cie:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Step:" @@ -5077,7 +5324,7 @@ msgstr "Krok:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Separation:" -msgstr "" +msgstr "Separacja:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region" @@ -5085,7 +5332,7 @@ msgstr "" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Texture Region Editor" -msgstr "" +msgstr "Edytor regionu tekstury" #: editor/plugins/theme_editor_plugin.cpp msgid "Can't save theme to file:" @@ -5111,11 +5358,11 @@ msgstr "Zapisz motyw" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Class Items" -msgstr "" +msgstr "Dodaj klasÄ™ elementów" #: editor/plugins/theme_editor_plugin.cpp msgid "Remove Class Items" -msgstr "" +msgstr "UsuÅ„ klasÄ™ elementów" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" @@ -5123,7 +5370,7 @@ msgstr "Utwórz pusty szablon" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" -msgstr "" +msgstr "Utworzyć pusty szablon edytora" #: editor/plugins/theme_editor_plugin.cpp msgid "CheckBox Radio1" @@ -5138,8 +5385,9 @@ msgid "Item" msgstr "Element" #: editor/plugins/theme_editor_plugin.cpp +#, fuzzy msgid "Check Item" -msgstr "" +msgstr "Sprawdź element" #: editor/plugins/theme_editor_plugin.cpp msgid "Checked Item" @@ -5196,7 +5444,7 @@ msgstr "Kolor" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Paint TileMap" -msgstr "" +msgstr "Maluj TileMap" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "Duplicate" @@ -5204,35 +5452,35 @@ msgstr "Duplikuj" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase TileMap" -msgstr "" +msgstr "Wyczyść TileMap" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Erase selection" -msgstr "" +msgstr "UsuÅ„ zaznaczenie" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Find tile" -msgstr "" +msgstr "Znajdź tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Transpose" -msgstr "" +msgstr "Transpozycja" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror X" -msgstr "" +msgstr "Odbij X" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Mirror Y" -msgstr "" +msgstr "Odbij Y" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Bucket" -msgstr "" +msgstr "Wiadro" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Pick Tile" -msgstr "" +msgstr "Wybierz tile" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Select" @@ -5256,7 +5504,7 @@ msgstr "Obróć o 270 stopni" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Could not find tile:" -msgstr "" +msgstr "Nie mogÅ‚em znaleźć tile:" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Item name or ID:" @@ -5299,7 +5547,7 @@ msgstr "Usunąć zaznaczone pliki?" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "Profile eksportu" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5316,7 +5564,7 @@ msgstr "Eksportuj wszystkie zasoby w projekcie." #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "Eksportuj wybrane sceny (i zależnoÅ›ci)" #: editor/project_export.cpp #, fuzzy @@ -5336,11 +5584,15 @@ msgstr "Zasoby do eksportu:" msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" +"Filtry do eksportowania plików nie bÄ™dÄ…cych zasobami (oddzielone " +"przecinkami, np. *.json, *.txt)" #: editor/project_export.cpp msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "" +"Filtry do wykluczenia plików z projektu (rozdzielone przecinkami, np. *." +"json, *.txt)" #: editor/project_export.cpp #, fuzzy @@ -5354,7 +5606,7 @@ msgstr "Åšcieżka docelowa:" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Brakuje eksportu szablonów dla tej platformy:" #: editor/project_export.cpp #, fuzzy @@ -5367,12 +5619,12 @@ msgstr "Niepoprawna Å›cieżka projektu, Å›cieżka musi istnieć!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Niepoprawna Å›cieżka projektu, engine.cfg nie może istnieć." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Niepoprawna Å›cieżka projektu, engine.cfg musi istnieć." #: editor/project_manager.cpp @@ -5385,12 +5637,12 @@ msgstr "Niepoprawna Å›cieżka projektu (zmienić cokolwiek?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "Nie można byÅ‚o utworzyć engine.cfg w Å›cieżce projektu." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" -msgstr "" +msgstr "Nie powiodÅ‚o się wypakowanie z pakietu nastÄ™pujÄ…cych plików:" #: editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -5430,7 +5682,7 @@ msgstr "Nowy projekt gry" #: editor/project_manager.cpp msgid "That's a BINGO!" -msgstr "" +msgstr "To BINGO!" #: editor/project_manager.cpp msgid "Unnamed Project" @@ -5446,13 +5698,15 @@ msgstr "Czy jesteÅ› pewny że chcesz uruchomić wiÄ™cej niż jeden projekt?" #: editor/project_manager.cpp msgid "Remove project from the list? (Folder contents will not be modified)" -msgstr "" +msgstr "Usunąć projekt z listy? (Zawartość folderu nie zostanie zmodyfikowana)" #: editor/project_manager.cpp msgid "" "You are about the scan %s folders for existing Godot projects. Do you " "confirm?" msgstr "" +"Masz zamiar przeskanować %s folderów w poszukiwaniu projektów Godot. " +"Potwierdzasz?" #: editor/project_manager.cpp msgid "Project Manager" @@ -5513,11 +5767,11 @@ msgstr "Akcja %s już istnieje!" #: editor/project_settings.cpp msgid "Rename Input Action Event" -msgstr "" +msgstr "ZmieÅ„ nazwÄ™ zdarzenia akcji wejÅ›cia" #: editor/project_settings.cpp msgid "Add Input Action Event" -msgstr "" +msgstr "Dodaj zdarzenie akcji wejÅ›cia" #: editor/project_settings.cpp editor/settings_config_dialog.cpp #: scene/gui/input_action.cpp @@ -5536,7 +5790,7 @@ msgstr "Alt+" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "Control+" -msgstr "" +msgstr "Control+" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "Press a Key.." @@ -5544,7 +5798,7 @@ msgstr "NaciÅ›nij klawisz.." #: editor/project_settings.cpp msgid "Mouse Button Index:" -msgstr "" +msgstr "Indeks przycisku myszy:" #: editor/project_settings.cpp msgid "Left Button" @@ -5560,11 +5814,11 @@ msgstr "Åšrodkowy guzik" #: editor/project_settings.cpp msgid "Wheel Up Button" -msgstr "" +msgstr "Kółko myszy w górÄ™" #: editor/project_settings.cpp msgid "Wheel Down Button" -msgstr "" +msgstr "Kółko myszy w dół" #: editor/project_settings.cpp msgid "Button 6" @@ -5598,11 +5852,16 @@ msgstr "Przycisk joysticka" #: editor/project_settings.cpp msgid "Add Input Action" -msgstr "" +msgstr "Dodawanie akcji WejÅ›cia" #: editor/project_settings.cpp msgid "Erase Input Action Event" -msgstr "" +msgstr "Wyczyść zdarzenie akcji wejÅ›cia" + +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Dodaj pusty" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" @@ -5642,15 +5901,15 @@ msgstr "Ustawienia zapisane pomyÅ›lnie." #: editor/project_settings.cpp msgid "Add Translation" -msgstr "" +msgstr "Dodaj tÅ‚umaczenie" #: editor/project_settings.cpp msgid "Remove Translation" -msgstr "" +msgstr "UsuÅ„ tÅ‚umaczenie" #: editor/project_settings.cpp msgid "Add Remapped Path" -msgstr "" +msgstr "Dodaj zmapowanÄ… Å›cieżkÄ™" #: editor/project_settings.cpp msgid "Resource Remap Add Remap" @@ -5658,20 +5917,20 @@ msgstr "" #: editor/project_settings.cpp msgid "Change Resource Remap Language" -msgstr "" +msgstr "ZmieÅ„ jÄ™zyk mapowania zasobu" #: editor/project_settings.cpp msgid "Remove Resource Remap" -msgstr "" +msgstr "UsuÅ„ mapowanie zasobu" #: editor/project_settings.cpp msgid "Remove Resource Remap Option" -msgstr "" +msgstr "UsuÅ„ opcjÄ™ mapowania zasobu" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Ustawienia projektu" +msgid "Project Settings (project.godot)" +msgstr "Ustawienia projektu (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5691,7 +5950,7 @@ msgstr "Kopiuj na platformÄ™..." #: editor/project_settings.cpp msgid "Input Map" -msgstr "" +msgstr "Mapowanie wejÅ›cia" #: editor/project_settings.cpp msgid "Action:" @@ -5719,7 +5978,7 @@ msgstr "TÅ‚umaczenia:" #: editor/project_settings.cpp msgid "Remaps" -msgstr "" +msgstr "Mapowanie zasobów" #: editor/project_settings.cpp msgid "Resources:" @@ -5727,19 +5986,20 @@ msgstr "Zasoby:" #: editor/project_settings.cpp msgid "Remaps by Locale:" -msgstr "" +msgstr "Mapowanie w zależnoÅ›ci od lokalizacji:" #: editor/project_settings.cpp msgid "Locale" -msgstr "" +msgstr "Lokalizacja" #: editor/project_settings.cpp +#, fuzzy msgid "AutoLoad" -msgstr "" +msgstr "AutoÅ‚adowanie" #: editor/property_editor.cpp msgid "Pick a Viewport" -msgstr "" +msgstr "Wybierz Viewport" #: editor/property_editor.cpp msgid "Ease In" @@ -5771,12 +6031,11 @@ msgstr "Katalog.." #: editor/property_editor.cpp msgid "Assign" -msgstr "" +msgstr "Przypisz" #: editor/property_editor.cpp -#, fuzzy msgid "New Script" -msgstr "NastÄ™pny skrypt" +msgstr "Nowy skrypt" #: editor/property_editor.cpp #, fuzzy @@ -5788,10 +6047,6 @@ msgid "Error loading file: Not a resource!" msgstr "Błąd wczytania pliku: Brak zasobu!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Nie można wczytać obrazu" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Wybierz wÄ™zeÅ‚" @@ -5802,7 +6057,7 @@ msgstr "" #: editor/property_editor.cpp msgid "On" -msgstr "" +msgstr "Włącz" #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Set" @@ -5814,7 +6069,7 @@ msgstr "WÅ‚aÅ›ciwoÅ›ci:" #: editor/property_editor.cpp msgid "Sections:" -msgstr "" +msgstr "Kategorie:" #: editor/property_selector.cpp #, fuzzy @@ -5828,23 +6083,24 @@ msgstr "Tryb zaznaczenia" #: editor/pvrtc_compress.cpp msgid "Could not execute PVRTC tool:" -msgstr "" +msgstr "Nie można wykonać narzÄ™dzia PVRTC:" #: editor/pvrtc_compress.cpp msgid "Can't load back converted image using PVRTC tool:" msgstr "" +"Nie można zaÅ‚adować przekonwertowanego obrazka używajÄ…c narzÄ™dzia PVRTC:" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent Node" -msgstr "" +msgstr "ZmieÅ„ nadrzÄ™dny wÄ™zeÅ‚" #: editor/reparent_dialog.cpp msgid "Reparent Location (Select new Parent):" -msgstr "" +msgstr "Wybierz nowego rodzica dla wÄ™zÅ‚a:" #: editor/reparent_dialog.cpp msgid "Keep Global Transform" -msgstr "" +msgstr "Zachowaj globalnÄ… transformacjÄ™" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" @@ -5867,12 +6123,13 @@ msgid "Resource Tools" msgstr "NarzÄ™dzia zasobów" #: editor/resources_dock.cpp +#, fuzzy msgid "Make Local" -msgstr "" +msgstr "UczyÅ„ lokalnym" #: editor/run_settings_dialog.cpp msgid "Run Mode:" -msgstr "" +msgstr "Tryb uruchamiania:" #: editor/run_settings_dialog.cpp msgid "Current Scene" @@ -5892,7 +6149,7 @@ msgstr "Ustawienia uruchomienia sceny" #: editor/scene_tree_dock.cpp msgid "No parent to instance the scenes at." -msgstr "" +msgstr "Brak elementu nadrzÄ™dnego do stworzenia instancji sceny." #: editor/scene_tree_dock.cpp msgid "Error loading scene from %s" @@ -5959,7 +6216,7 @@ msgstr "" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" -msgstr "" +msgstr "Nie można dziaÅ‚ać na wÄ™zÅ‚ach z których dziedziczy obecna scena!" #: editor/scene_tree_dock.cpp msgid "Remove Node(s)" @@ -5983,6 +6240,11 @@ msgid "Error duplicating scene to save it." msgstr "Błąd duplikowania sceny przy zapisywaniu." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Zasoby:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Edytuj grupy" @@ -5995,12 +6257,13 @@ msgid "Delete Node(s)" msgstr "UsuÅ„ wÄ™zeÅ‚ (wÄ™zÅ‚y)" #: editor/scene_tree_dock.cpp +#, fuzzy msgid "Add Child Node" -msgstr "Dodaj dziecko wÄ™zÅ‚a" +msgstr "Dodaj wÄ™zeÅ‚" #: editor/scene_tree_dock.cpp msgid "Instance Child Scene" -msgstr "Instancjonuj dziecko sceny" +msgstr "Dodaj instancje sceny" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -6012,9 +6275,8 @@ msgid "Attach Script" msgstr "Dodaj skrypt" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Clear Script" -msgstr "Utwórz Skrypt" +msgstr "UsuÅ„ skrypt" #: editor/scene_tree_dock.cpp msgid "Merge From Scene" @@ -6042,6 +6304,8 @@ msgid "" "Instance a scene file as a Node. Creates an inherited scene if no root node " "exists." msgstr "" +"Stwórz instancję sceny jako wÄ™zeÅ‚. Tworzy dziedziczÄ…cÄ… scenÄ™ jeÅ›li wÄ™zeÅ‚ " +"główny nie istnieje." #: editor/scene_tree_dock.cpp #, fuzzy @@ -6062,10 +6326,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Przełącz widoczność CanvasItem" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opcje debugowania" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instancja:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "NastÄ™pny skrypt" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Przełącz widoczność Spatial" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "NieprawidÅ‚owa nazwa wÄ™zÅ‚a, nastÄ™pujÄ…ce znaki sÄ… niedozwolone:" @@ -6083,7 +6396,7 @@ msgstr "Edytowalne dzieci" #: editor/scene_tree_editor.cpp msgid "Load As Placeholder" -msgstr "ZaÅ‚aduj jako zastÄ™pczy" +msgstr "Wczytaj jako zastÄ™pczy" #: editor/scene_tree_editor.cpp #, fuzzy @@ -6111,78 +6424,94 @@ msgid "Select a Node" msgstr "Wybierz wÄ™zeÅ‚" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "NieprawidÅ‚owa nazwa klasy bazowej" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Nie można byÅ‚o utworzyć skryptu w systemie plików." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Poprawne znaki:" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Błąd przy Å‚adowaniu sceny z %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Niepoprawna nazwa klasy" +msgid "Path is empty" +msgstr "Åšcieżka jest pusta" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Poprawna nazwa" +msgid "Path is not local" +msgstr "Åšcieżka nie jest lokalna" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid base path" +msgstr "Niepoprawna Å›cieżka bazowa" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Nazwa klasy jest niepoprawna!" +msgid "Invalid extension" +msgstr "Niepoprawne rozszerzenie" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Nazwa klasy nadrzÄ™dnej jest niepoprawna!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Niepoprawna Å›cieżka!" +#, fuzzy +msgid "Invalid Path" +msgstr "NiewÅ‚aÅ›ciwa Å›cieżka." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Nie można byÅ‚o utworzyć skryptu w systemie plików." +msgid "Invalid class name" +msgstr "Niepoprawna nazwa klasy" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Błąd przy Å‚adowaniu sceny z %s" +msgid "Invalid inherited parent name or path" +msgstr "NieprawidÅ‚owa nazwa klasy bazowej" #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Åšcieżka jest pusta" +#, fuzzy +msgid "Script valid" +msgstr "Skrypt" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Åšcieżka nie jest lokalna" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Niepoprawna Å›cieżka bazowa" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Niepoprawne rozszerzenie" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Utwórz Skrypt" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "NastÄ™pny skrypt" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Dziedziczy:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nazwa klasy:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "UsuÅ„ element" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Wbudowany skrypt" #: editor/script_create_dialog.cpp @@ -6760,9 +7089,8 @@ msgid "Invalid publisher GUID." msgstr "Niepoprawna Å›cieżka bazowa" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid background color." -msgstr "Nie rozpoznano typu czcionki." +msgstr "Kolor tÅ‚a nieprawidÅ‚owy." #: platform/uwp/export/export.cpp msgid "Invalid Store Logo image dimensions (should be 50x50)." @@ -6791,6 +7119,7 @@ msgstr "" #: platform/uwp/export/export.cpp msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "" +"NieprawidÅ‚owe wymiary obrazka ekranu powitalnego (powinno być 620x300)." #: scene/2d/animated_sprite.cpp msgid "" @@ -6849,12 +7178,10 @@ msgstr "" "Tekstura z ksztaÅ‚tem promieni Å›wiatÅ‚a musi być dodana do pola Tekstura." #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "" -"Poligon zasÅ‚aniajÄ…cy musi być ustawiony (lub narysowany) aby Occluder " -"zadziaÅ‚aÅ‚." +"Occluder polygon musi być ustawiony (lub narysowany) aby Occluder zadziaÅ‚aÅ‚." #: scene/2d/light_occluder_2d.cpp msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" @@ -6883,10 +7210,11 @@ msgstr "" "WÄ™zeÅ‚ typu ParallaxLayer zadziaÅ‚a, jeÅ›li bÄ™dzie dzieckiem wÄ™zÅ‚a " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Å»eby zadziaÅ‚aÅ‚o, pole Path musi wskazywać na istniejÄ…cy wÄ™zeÅ‚ Particles2D." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6972,12 +7300,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -6999,6 +7321,15 @@ msgstr "" "Zasób SpriteFrames musi być ustawiony jako wartość wÅ‚aÅ›ciwoÅ›ci 'Frames' żeby " "AnimatedSprite3D wyÅ›wietlaÅ‚ klatki." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Tryb uruchamiania:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alarm!" @@ -7043,6 +7374,16 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer jest zaprojektowany do dziaÅ‚ania z jednym dzieckiem klasy " +"Control.\n" +"Użyj kontenera jako dziecko (VBox,HBox,etc), lub wÄ™zÅ‚a klasy Control i ustaw " +"rÄ™cznie minimalny rozmiar." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7062,9 +7403,61 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importuj zasoby do projektu." +#~ msgid "Export the project to many platforms." +#~ msgstr "Eksportuj projekt na inne platformy." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Powiadomienie o zmianie stanu zasobu zewnÄ™trznego." + +#~ msgid "Tutorials" +#~ msgstr "Poradniki" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Otwórz https://godotengine.org na sekcji poradników." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Nie wybrano sceny do instancjonowania!" + #, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Ustawienia projektu (engine.cfg)" +#~ msgid "Instance at Cursor" +#~ msgstr "Instancja w miejscu kursora" + +#~ msgid "Could not instance scene!" +#~ msgstr "Nie można stworzyć instancji sceny!" + +#~ msgid "Use Default Light" +#~ msgstr "Użyj domyÅ›lnego Å›wiatÅ‚a" + +#~ msgid "Use Default sRGB" +#~ msgstr "Użyj domyÅ›lnie sRGB" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Kolor Å›wiatÅ‚a otoczenia:" + +#~ msgid "Couldn't load image" +#~ msgstr "Nie można wczytać obrazu" + +#~ msgid "Invalid parent class name" +#~ msgstr "NieprawidÅ‚owa nazwa klasy bazowej" + +#~ msgid "Valid chars:" +#~ msgstr "Poprawne znaki:" + +#~ msgid "Valid name" +#~ msgstr "Poprawna nazwa" + +#~ msgid "Class name is invalid!" +#~ msgstr "Nazwa klasy jest niepoprawna!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Nazwa klasy nadrzÄ™dnej jest niepoprawna!" + +#~ msgid "Invalid path!" +#~ msgstr "Niepoprawna Å›cieżka!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Å»eby zadziaÅ‚aÅ‚o, pole Path musi wskazywać na istniejÄ…cy wÄ™zeÅ‚ Particles2D." #~ msgid "Surface" #~ msgstr "Powierzchnia" @@ -7210,9 +7603,6 @@ msgstr "" #~ msgid "Trim" #~ msgstr "Przytnij" -#~ msgid "Script" -#~ msgstr "Skrypt" - #~ msgid "Script Export Mode:" #~ msgstr "Tryb eksportu skryptów:" @@ -7243,9 +7633,6 @@ msgstr "" #~ msgid "Export Preset:" #~ msgstr "Szablon eksportu:" -#~ msgid "Vertex" -#~ msgstr "WierzchoÅ‚ek" - #~ msgid "Global" #~ msgstr "Globalne" @@ -7271,6 +7658,3 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Nie można iść do podkatalogu:" - -#~ msgid "Help" -#~ msgstr "Pomoc" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 4629c24f45..905c263061 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -1,6 +1,5 @@ # Pirate translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017. @@ -532,7 +531,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -578,7 +578,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -721,6 +721,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -826,6 +827,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -926,8 +928,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -937,6 +938,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1005,8 +1007,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1197,7 +1198,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1214,7 +1216,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1384,8 +1385,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1439,6 +1440,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1495,7 +1500,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1533,6 +1538,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1585,7 +1594,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1613,35 +1622,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1649,47 +1646,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1760,9 +1725,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Edit" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1781,11 +1747,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1869,6 +1891,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1896,6 +1926,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2141,6 +2195,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2169,10 +2227,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2338,7 +2392,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2813,7 +2867,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3473,7 +3527,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3522,17 +3576,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3564,9 +3607,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Add Signal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Discharge ye' Signal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3836,6 +3902,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3848,7 +3927,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3859,20 +3938,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3927,12 +4019,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3990,6 +4086,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Discharge ye' Function" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4143,6 +4248,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4230,10 +4339,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4267,15 +4372,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4330,6 +4427,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4409,6 +4522,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4431,6 +4552,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4648,35 +4773,96 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Change" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4736,23 +4922,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Yar, Blow th' Selected Down!" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4780,27 +4975,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4824,14 +5007,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5244,11 +5419,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5260,7 +5435,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5477,6 +5652,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5542,7 +5721,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5658,10 +5837,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Paste yer Node" @@ -5847,6 +6022,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5922,10 +6101,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5970,75 +6195,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr ": Evil arguments: " #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Yer index property name be thrown overboard!" + +#: editor/script_create_dialog.cpp +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Create new script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Discharge ye' Variable" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6714,8 +6950,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6783,12 +7021,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6804,6 +7036,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6846,6 +7086,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 25055a0b7b..b812b6f8ef 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -1,6 +1,5 @@ # Portuguese (Brazil) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Allyson Souza <allyson_as@outlook.com>, 2017. @@ -550,7 +549,8 @@ msgid "Search:" msgstr "Pesquisar:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -596,7 +596,7 @@ msgstr "Suportado..." msgid "Official" msgstr "Oficial" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Comunidade" @@ -740,6 +740,7 @@ msgstr "Adicionar" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Remover" @@ -849,6 +850,7 @@ msgstr "Recurso" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Caminho" @@ -953,8 +955,7 @@ msgstr "" msgid "Add Bus" msgstr "Adicionar Todos" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Carregar" @@ -964,6 +965,7 @@ msgid "Save As" msgstr "Salvar Como" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Padrão" @@ -1035,8 +1037,7 @@ msgid "Rearrange Autoloads" msgstr "Reordenar Autoloads" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Caminho:" @@ -1228,7 +1229,8 @@ msgstr "BuscarFontes" msgid "(Re)Importing Assets" msgstr "Re-Importando" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Pesquisar Ajuda" @@ -1245,7 +1247,6 @@ msgid "Class:" msgstr "Classe:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Herda de:" @@ -1416,10 +1417,11 @@ msgid "There is no defined scene to run." msgstr "Não há cena definida para rodar." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "A cena principal não foi definida, selecionar uma?\n" "Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria " @@ -1482,6 +1484,11 @@ msgid "Save Scene As.." msgstr "Salvar Cena Como..." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Nó" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Esta cena nunca foi salva. Salvar antes de rodar?" @@ -1540,7 +1547,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Ugh" @@ -1580,6 +1587,10 @@ msgstr "Mais %d arquivo(s)" msgid "%d more file(s) or folder(s)" msgstr "Mais %d arquivo(s) ou pasta(s)" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Modo Sem Distrações" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Cena" @@ -1633,7 +1644,7 @@ msgstr "Fechar Cena" msgid "Close Goto Prev. Scene" msgstr "Ir a Cena Fechada Anterior" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Abrir Recente" @@ -1661,84 +1672,41 @@ msgid "Redo" msgstr "Refazer" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "Rodar Script" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Configurações do Projeto" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Reverter Cena" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Sair para a Lista de Projetos" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Modo Sem Distrações" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Ferramentas diversas atuantes no projeto ou cena." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Ferramentas" +#, fuzzy +msgid "Project" +msgstr "Novo Projeto" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Exportar o projeto para diversas plataformas." +msgid "Project Settings" +msgstr "Configurações do Projeto" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "Rodar Script" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Exportar" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Roda o projeto." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Tocar" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Pausar a cena" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Pausa a cena" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Para a cena." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Parar" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "Roda a cena editada." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Rodar Cena" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Rodar outra cena" +msgid "Tools" +msgstr "Ferramentas" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Rodar outra cena" +msgid "Quit to Project List" +msgstr "Sair para a Lista de Projetos" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Opções de depuração" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Depurar" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1827,9 +1795,10 @@ msgstr "" "Quando usado remotamente em um dispositivo, isso é mais eficiente com o " "sistema de arquivos via rede." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Configurações" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Editar" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1850,12 +1819,69 @@ msgid "Manage Export Templates" msgstr "Carregando Modelos de Exportação" #: editor/editor_node.cpp +msgid "Help" +msgstr "Ajuda" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Classes" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Fechar Docs" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "Sobre" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Alerta quando um recurso externo foi alterado." +msgid "Play the project." +msgstr "Roda o projeto." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Tocar" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Pausar a cena" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Pausa a cena" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Para a cena." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Parar" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "Roda a cena editada." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Rodar Cena" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Rodar outra cena" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Rodar outra cena" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1938,6 +1964,14 @@ msgid "Thanks!" msgstr "Obrigado!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Importar Modelos de um Arquivo ZIP" @@ -1965,6 +1999,36 @@ msgstr "Abrir e Rodar um Script" msgid "Load Errors" msgstr "Erros de Carregamento" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Abrir no Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Abrir no Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Abrir no Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Exportar Biblioteca" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Abrir no Editor" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Abrir no Editor" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Plugins Instalados:" @@ -2224,6 +2288,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Mostrar no Gerenciador de Arquivos" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "Instanciar" @@ -2252,10 +2320,6 @@ msgid "Info" msgstr "Informação" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Mostrar no Gerenciador de Arquivos" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Re-importar..." @@ -2422,9 +2486,10 @@ msgid "No target font resource!" msgstr "Falta recurso de fonte destino!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Extensão de arquivo inválida.\n" "Por favor use .fnt." @@ -2909,7 +2974,7 @@ msgstr "Comprimir" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Adicionar ao Projeto (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3583,7 +3648,7 @@ msgid "Change default type" msgstr "Alterar Valor Padrão" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3632,17 +3697,6 @@ msgstr "Criar PolÃgono 3D" msgid "Set Handle" msgstr "Definir Manipulador" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Adicionar/Remover Ponto na Curva de Cor" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Modificar Curva de Cores" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Criando MeshLibrary" @@ -3675,9 +3729,33 @@ msgstr "Atualizar a partir de Cena" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Adicionar Entrada" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Remover Ponto do Caminho" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Carregar Recurso" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "Modificar Curve Map" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Adicionar/Remover Ponto na Curva de Cor" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Modificar Curva de Cores" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Item %d" @@ -3952,6 +4030,20 @@ msgid "Remove Poly And Point" msgstr "Remover PolÃgono e Ponto" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Limpar Máscara de Emissão" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Gerar AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Erro ao carregar imagem:" @@ -3964,8 +4056,8 @@ msgid "Set Emission Mask" msgstr "Definir Máscara de Emissão" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Limpar Máscara de Emissão" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3975,6 +4067,27 @@ msgstr "Carregar Máscara de Emissão" msgid "Generated Point Count:" msgstr "Gerar Contagem de Pontos:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Tempo Médio (seg)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Definir Máscara de Emissão" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Criar a partir de Cena" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Posições de Emissão:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "O nó não contém geometria." @@ -3988,11 +4101,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Gerar AABB" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "As faces não têm área!" @@ -4050,13 +4158,18 @@ msgstr "Preenchimento de Emissão:" msgid "Generate Visibility AABB" msgstr "Gerar AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Remover Ponto da Curva" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Tempo Médio (seg)" +msgid "Remove Out-Control from Curve" +msgstr "Mover Controle de SaÃda na Curva" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Remover Ponto da Curva" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4114,6 +4227,16 @@ msgstr "Dividir Caminho" msgid "Remove Path Point" msgstr "Remover Ponto do Caminho" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Mover Controle de SaÃda na Curva" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Mover Controle de Entrada na Curva" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Criar Mapa UV" @@ -4267,6 +4390,11 @@ msgid "Pitch" msgstr "Pitch" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Limpar Ossos" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Erro ao salvar tema" @@ -4355,10 +4483,6 @@ msgstr "Localizar..." msgid "Find Next" msgstr "Localizar próximo" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Depurar" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Passo por cima" @@ -4392,16 +4516,9 @@ msgid "Move Right" msgstr "Mover para Direita" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Tutoriais" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Abre https://godotengine.org na seção tutoriais." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Classes" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "Pesquise a documentação de referência." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4461,6 +4578,23 @@ msgid "Pick Color" msgstr "Cor" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Convertendo Imagens" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4540,6 +4674,16 @@ msgid "Goto Previous Breakpoint" msgstr "Ir ao Ponto de Interrupção Anterior" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Converter Para..." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Converter Para..." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Encontrar Anterior" @@ -4562,6 +4706,10 @@ msgstr "Ir para linha..." msgid "Contextual Help" msgstr "Ajuda Contextual" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Alterar Constante Escalar" @@ -4779,36 +4927,106 @@ msgid "Animation Key Inserted." msgstr "Chave de Animação Inserida." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Avançar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Para trás" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Roda para Baixo." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "Atualizar nas Mudanças" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Atualizar nas Mudanças" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "Atualizar nas Mudanças" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "Vértice" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Alinhar com Visão" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Ambiente" +msgid "Display Normal" +msgstr "Exibição Normal" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Ouvinte de Ãudio" +msgid "Display Wireframe" +msgstr "Exibição Wireframe" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos" +msgid "Display Overdraw" +msgstr "Exibição Overdraw" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "Diálogo XForm" +#, fuzzy +msgid "Display Unshaded" +msgstr "Exibição Shadeless" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Ambiente" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Nenhuma cena selecionada para instanciar!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Instanciar no Cursor" +msgid "Audio Listener" +msgstr "Ouvinte de Ãudio" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Não foi possÃvel instanciar cena!" +msgid "XForm Dialog" +msgstr "Diálogo XForm" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4868,6 +5086,26 @@ msgid "Align Selection With View" msgstr "Alinhar Seleção com Visualização" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Selecionar" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Mover" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Rotaciona" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Escala:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Transformação" @@ -4880,14 +5118,6 @@ msgid "Transform Dialog.." msgstr "Diálogo Transformação..." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Usar Luz Padrão" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Usar sRGB Padrão" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 Viewport" @@ -4912,22 +5142,6 @@ msgid "4 Viewports" msgstr "4 Viewports" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Exibição Normal" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Exibição Wireframe" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Exibição Overdraw" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Exibição Shadeless" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Ver Origem" @@ -4936,6 +5150,10 @@ msgid "View Grid" msgstr "Ver Grade" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Configurações" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Configurações do Snap" @@ -4956,14 +5174,6 @@ msgid "Viewport Settings" msgstr "Configurações da Viewport" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Luz Normal Padrão:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Cor de Luz Ambiente:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "FOV Perspectiva (deg.):" @@ -5395,12 +5605,12 @@ msgstr "Caminho de projeto inválido, o caminho deve existir!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Caminho de projeto inválido, engine.cfg não deve existir." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Caminho de projeto inválido, engine.cfg deve existir." #: editor/project_manager.cpp @@ -5413,7 +5623,7 @@ msgstr "Caminho de projeto inválido (mudou alguma coisa?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "Não se pôde criar engine.cfg no caminho do projeto." #: editor/project_manager.cpp @@ -5635,6 +5845,11 @@ msgstr "Adicionar Ação de Entrada" msgid "Erase Input Action Event" msgstr "Apagar Evento Ação de Entrada" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Adicionar Vazio" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Dispositivo" @@ -5701,8 +5916,8 @@ msgstr "Remover Opção de Remapeamento de Recurso" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Configurações do Projeto" +msgid "Project Settings (project.godot)" +msgstr "Configurações do Projeto (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5820,10 +6035,6 @@ msgid "Error loading file: Not a resource!" msgstr "Erro ao carregar arquivo: Não é um recurso!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Não pôde carregar a imagem" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Selecione um Nó" @@ -6016,6 +6227,11 @@ msgid "Error duplicating scene to save it." msgstr "Erro duplicando cena ao salvar." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Recursos:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Editar Grupos" @@ -6097,10 +6313,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Alternar CanvasItem VisÃvel" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Opções de depuração" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Instância:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Próximo Script" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Alternar Spatial VisÃvel" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Nome de nó Inválido, os seguintes caracteres não são permitidos:" @@ -6145,78 +6410,94 @@ msgid "Select a Node" msgstr "Selecione um Nó" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Nome de classe pai inválido" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Não foi possÃvel criar o script no sistema de arquivos." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Caracteres válidos:" +#, fuzzy +msgid "Error loading script from %s" +msgstr "Erro ao carregar cena de %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Nome de classe inválido" +msgid "Path is empty" +msgstr "O caminho está vazio" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Nome Válido" +msgid "Path is not local" +msgstr "O caminho não é local" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/D" +msgid "Invalid base path" +msgstr "Caminho base inválido" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "O nome da classe é inválido!" +msgid "Invalid extension" +msgstr "Extensão inválida" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "O nome da classe pai é inválido!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Caminho inválido!" +#, fuzzy +msgid "Invalid Path" +msgstr "Caminho inválido." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Não foi possÃvel criar o script no sistema de arquivos." +msgid "Invalid class name" +msgstr "Nome de classe inválido" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "Erro ao carregar cena de %s" +msgid "Invalid inherited parent name or path" +msgstr "Nome da propriedade de Ãndice inválido." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "O caminho está vazio" +#, fuzzy +msgid "Script valid" +msgstr "Script" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "O caminho não é local" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Caminho base inválido" +msgid "N/A" +msgstr "N/D" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Extensão inválida" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Criar Script" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "Próximo Script" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Herda de:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Nome da Classe:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Remover Item" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Script Embutido" #: editor/script_create_dialog.cpp @@ -6913,9 +7194,11 @@ msgstr "" "O nó ParallaxLayer apenas funciona quando definido como filho de um nó " "ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "A propriedade Caminho deve apontar a um nó Particles2D para funcionar." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -7003,12 +7286,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp #, fuzzy msgid "Path property must point to a valid Spatial node to work." @@ -7029,6 +7306,15 @@ msgstr "" "Um recurso do tipo SpriteFrames deve ser criado ou definido na propriedade " "\"Frames\" para que o nó AnimatedSprite mostre quadros." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Modo de InÃcio:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Alerta!" @@ -7074,6 +7360,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7092,9 +7384,63 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Importar assets ao projeto." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Configurações do Projeto (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Exportar o projeto para diversas plataformas." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Alerta quando um recurso externo foi alterado." + +#~ msgid "Tutorials" +#~ msgstr "Tutoriais" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Abre https://godotengine.org na seção tutoriais." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Nenhuma cena selecionada para instanciar!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Instanciar no Cursor" + +#~ msgid "Could not instance scene!" +#~ msgstr "Não foi possÃvel instanciar cena!" + +#~ msgid "Use Default Light" +#~ msgstr "Usar Luz Padrão" + +#~ msgid "Use Default sRGB" +#~ msgstr "Usar sRGB Padrão" + +#~ msgid "Default Light Normal:" +#~ msgstr "Luz Normal Padrão:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Cor de Luz Ambiente:" + +#~ msgid "Couldn't load image" +#~ msgstr "Não pôde carregar a imagem" + +#~ msgid "Invalid parent class name" +#~ msgstr "Nome de classe pai inválido" + +#~ msgid "Valid chars:" +#~ msgstr "Caracteres válidos:" + +#~ msgid "Valid name" +#~ msgstr "Nome Válido" + +#~ msgid "Class name is invalid!" +#~ msgstr "O nome da classe é inválido!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "O nome da classe pai é inválido!" + +#~ msgid "Invalid path!" +#~ msgstr "Caminho inválido!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "A propriedade Caminho deve apontar a um nó Particles2D para funcionar." #~ msgid "Surface" #~ msgstr "SuperfÃcie" @@ -7298,9 +7644,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Silêncio no Fim:" -#~ msgid "Script" -#~ msgstr "Script" - #~ msgid "Script Export Mode:" #~ msgstr "Modo de Exportação de Scripts:" @@ -7334,9 +7677,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance não contém um recurso BakedLight ." -#~ msgid "Vertex" -#~ msgstr "Vértice" - #~ msgid "Fragment" #~ msgstr "Fragmento" @@ -7365,9 +7705,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Não é possÃvel ir ao subdiretório:" -#~ msgid "Help" -#~ msgstr "Ajuda" - #~ msgid "Imported Resources" #~ msgstr "Recursos Importados" diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po index fa4629c5c1..738eea37a9 100644 --- a/editor/translations/pt_PT.po +++ b/editor/translations/pt_PT.po @@ -1,6 +1,5 @@ # Portuguese (Portugal) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # António Sarmento <antonio.luis.sarmento@gmail.com>, 2016. @@ -532,7 +531,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -578,7 +578,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -721,6 +721,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -826,6 +827,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -926,8 +928,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -937,6 +938,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1005,8 +1007,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1197,7 +1198,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1214,7 +1216,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1384,8 +1385,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1439,6 +1440,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1495,7 +1500,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1533,6 +1538,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1585,7 +1594,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1613,35 +1622,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1649,47 +1646,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1760,9 +1725,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Editar" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1781,11 +1747,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1869,6 +1891,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1896,6 +1926,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2140,6 +2194,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2168,10 +2226,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2337,7 +2391,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2812,7 +2866,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3472,7 +3526,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3521,17 +3575,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3563,9 +3606,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Adicionar Sinal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Remover Sinal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3835,6 +3901,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3847,7 +3926,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3858,20 +3937,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3926,12 +4018,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3989,6 +4085,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Remover Função" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4142,6 +4247,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4230,10 +4339,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4267,15 +4372,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4330,6 +4427,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4409,6 +4522,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4431,6 +4552,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4648,35 +4773,96 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Alterar" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4736,23 +4922,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "Apagar Seleccionados" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4780,27 +4975,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4824,14 +5007,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5244,11 +5419,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5260,7 +5435,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5477,6 +5652,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5542,7 +5721,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5658,10 +5837,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5847,6 +6022,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5921,10 +6100,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5969,75 +6194,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr ": Argumentos inválidos: " #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Nome de Ãndice propriedade inválido." + +#: editor/script_create_dialog.cpp +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Create new script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Remover Variável" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6702,8 +6938,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6771,12 +7009,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6792,6 +7024,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6834,6 +7074,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 0c4a29fb63..3acaa82736 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -1,9 +1,9 @@ # Russian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # DimOkGamer <dimokgamer@gmail.com>, 2016-2017. +# ijet <my-ijet@mail.ru>, 2017. # Maxim Kim <habamax@gmail.com>, 2016. # Maxim toby3d Lebedev <mail@toby3d.ru>, 2016. # @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-01-09 02:56+0000\n" -"Last-Translator: DimOkGamer <dimokgamer@gmail.com>\n" +"PO-Revision-Date: 2017-05-10 20:34+0000\n" +"Last-Translator: DimOkGamer <salnikov.mine@yandex.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -21,11 +21,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 2.11-dev\n" +"X-Generator: Weblate 2.14-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "Отключить" +msgstr "Отключено" #: editor/animation_editor.cpp msgid "All Selection" @@ -37,72 +37,71 @@ msgstr "Подвинут ключ" #: editor/animation_editor.cpp msgid "Anim Change Transition" -msgstr "Изменён переход анимации" +msgstr "Изменить переход" #: editor/animation_editor.cpp msgid "Anim Change Transform" -msgstr "Изменено преобразование анимации" +msgstr "Изменить положение" #: editor/animation_editor.cpp msgid "Anim Change Value" -msgstr "Изменено значение анимации" +msgstr "Изменить значение" #: editor/animation_editor.cpp msgid "Anim Change Call" -msgstr "Изменён вызов анимации" +msgstr "Изменить вызов анимации" #: editor/animation_editor.cpp msgid "Anim Add Track" -msgstr "Добавлен новый трек" +msgstr "Добавить новую дорожку" #: editor/animation_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Дублированы ключи анимации" +msgstr "Дублировать ключи" #: editor/animation_editor.cpp msgid "Move Anim Track Up" -msgstr "Трек передвинут вверх" +msgstr "Передвинуть дорожку вверх" #: editor/animation_editor.cpp msgid "Move Anim Track Down" -msgstr "Трек передвинут вниз" +msgstr "Передвинуть дорожку вниз" #: editor/animation_editor.cpp msgid "Remove Anim Track" -msgstr "Трек удалён" +msgstr "Удалить дорожку" #: editor/animation_editor.cpp msgid "Set Transitions to:" -msgstr "УÑтановлен переход на:" +msgstr "УÑтановить переход на:" #: editor/animation_editor.cpp msgid "Anim Track Rename" -msgstr "ТрÑк переименован" +msgstr "Переименовать дорожку" #: editor/animation_editor.cpp msgid "Anim Track Change Interpolation" -msgstr "Изменена интреполÑциÑ" +msgstr "Изменить интреполÑцию" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" -msgstr "Изменён режим значений" +msgstr "Изменить режим значений" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "Изменён режим значений" +msgstr "Изменить режим цикла" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°" +msgstr "Редактировать кривую узла" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "Выбор кривой изменён" +msgstr "Редактировать выбранную кривую" #: editor/animation_editor.cpp msgid "Anim Delete Keys" -msgstr "Ключ удалён" +msgstr "Удалить ключи" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Duplicate Selection" @@ -110,7 +109,7 @@ msgstr "Дублировать выделенное" #: editor/animation_editor.cpp msgid "Duplicate Transposed" -msgstr "Дублировать перемещённый" +msgstr "Дублировать и перемеÑтить" #: editor/animation_editor.cpp msgid "Remove Selection" @@ -130,19 +129,19 @@ msgstr "Триггер" #: editor/animation_editor.cpp msgid "Anim Add Key" -msgstr "Ключ добавлен" +msgstr "Добавить ключ" #: editor/animation_editor.cpp msgid "Anim Move Keys" -msgstr "Ключ передвинут" +msgstr "ПеремеÑтить ключи" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "МаÑштаб выбранного промежутка" +msgstr "МаÑштабировать выбранное" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "МаÑштаб отноÑительно курÑора" +msgstr "МаÑштабировать от курÑора" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -208,39 +207,39 @@ msgstr "Создать" #: editor/animation_editor.cpp msgid "Anim Create & Insert" -msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ñоздать и вÑтавить" +msgstr "Создать и Ð’Ñтавить" #: editor/animation_editor.cpp msgid "Anim Insert Track & Key" -msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð²Ñтавка дорожки и ключа" +msgstr "Ð’Ñтавить Дорожку и Ключ" #: editor/animation_editor.cpp msgid "Anim Insert Key" -msgstr "Ð’Ñтавка ключа анимации" +msgstr "Ð’Ñтавить ключ" #: editor/animation_editor.cpp msgid "Change Anim Len" -msgstr "Изменена длинна анимации" +msgstr "Изменить длину анимации" #: editor/animation_editor.cpp msgid "Change Anim Loop" -msgstr "Изменено зацикливание анимации" +msgstr "Изменить зацикливание анимации" #: editor/animation_editor.cpp msgid "Anim Create Typed Value Key" -msgstr "Создан ключ Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñ‹Ð¼ значением" +msgstr "Создать ключ Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñ‹Ð¼ значением" #: editor/animation_editor.cpp msgid "Anim Insert" -msgstr "Ð’Ñтавка на анимацию" +msgstr "Ð’Ñтавить" #: editor/animation_editor.cpp msgid "Anim Scale Keys" -msgstr "МаÑштабирование ключей анимации" +msgstr "МаÑштабировать ключи" #: editor/animation_editor.cpp msgid "Anim Add Call Track" -msgstr "Добавлен ключ вызова в анимацию" +msgstr "Добавить дорожку вызова" #: editor/animation_editor.cpp msgid "Animation zoom." @@ -272,15 +271,15 @@ msgstr "Добавить новые дорожки." #: editor/animation_editor.cpp msgid "Move current track up." -msgstr "Подвинуть текущую дорожку вверх." +msgstr "Передвинуть текущую дорожку вверх." #: editor/animation_editor.cpp msgid "Move current track down." -msgstr "Подвинуть текущую дорожку вниз." +msgstr "Передвинуть текущую дорожку вниз." #: editor/animation_editor.cpp msgid "Remove selected track." -msgstr "Удалить текущую дорожку." +msgstr "Удалить выделенную дорожку." #: editor/animation_editor.cpp msgid "Track tools" @@ -288,7 +287,7 @@ msgstr "ИнÑтрументы дорожек" #: editor/animation_editor.cpp msgid "Enable editing of individual keys by clicking them." -msgstr "Включить индивидуальное редактирование ключей, ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿Ð¾ ним." +msgstr "Включить редактирование ключей, ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿Ð¾ ним." #: editor/animation_editor.cpp msgid "Anim. Optimizer" @@ -304,7 +303,7 @@ msgstr "МакÑ. Угловые погрешноÑти:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "МакÑимальный оптимизируемы угол:" +msgstr "МакÑимальный оптимизируемый угол:" #: editor/animation_editor.cpp msgid "Optimize" @@ -328,7 +327,7 @@ msgstr "КоÑффициент маÑштабированиÑ:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" -msgstr "Вызвать функции в каком узле?" +msgstr "Из какого узла вызвать функцию?" #: editor/animation_editor.cpp msgid "Remove invalid keys" @@ -378,7 +377,7 @@ msgstr "КонÑтанты:" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "Файл" +msgstr " Файлы" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp @@ -514,7 +513,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "Вниз" +msgstr "Загрузка" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -548,7 +547,8 @@ msgid "Search:" msgstr "ПоиÑк:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -576,7 +576,7 @@ msgstr "Сортировать:" #: editor/asset_library_editor_plugin.cpp msgid "Reverse" -msgstr "Обратный" +msgstr "Обратно" #: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp msgid "Category:" @@ -592,11 +592,11 @@ msgstr "Поддержка.." #: editor/asset_library_editor_plugin.cpp msgid "Official" -msgstr "Официально" +msgstr "Официальные" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" -msgstr "СообщеÑтво" +msgstr "ОбщеÑтвенные" #: editor/asset_library_editor_plugin.cpp msgid "Testing" @@ -608,7 +608,7 @@ msgstr "ZIP файл аÑÑетов" #: editor/call_dialog.cpp msgid "Method List For '%s':" -msgstr "СпиÑок ÑпоÑоб Ð´Ð»Ñ '%s':" +msgstr "СпиÑок методов Ð´Ð»Ñ '%s':" #: editor/call_dialog.cpp modules/visual_script/visual_script_editor.cpp msgid "Call" @@ -639,7 +639,6 @@ msgid "No Matches" msgstr "Ðет Ñовпадений" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "Заменено %d Ñовпадений." @@ -677,7 +676,7 @@ msgstr "Ðе найдено!" #: editor/code_editor.cpp msgid "Replace By" -msgstr "Заменить чем" +msgstr "Заменить на" #: editor/code_editor.cpp msgid "Case Sensitive" @@ -740,6 +739,7 @@ msgstr "Добавить" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Удалить" @@ -849,6 +849,7 @@ msgstr "РеÑурÑ" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Путь" @@ -937,23 +938,21 @@ msgstr "Удалить" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "Сохранить раÑкладку звуковой шины как.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "МеÑтоположение новой раÑкладки.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "Открыть раÑкладку звуковой шины" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "Добавить %s" +msgstr "Добавить" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Загрузить" @@ -963,6 +962,7 @@ msgid "Save As" msgstr "Сохранить как" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "По-умолчанию" @@ -1006,7 +1006,7 @@ msgstr "Ðе в пути реÑурÑов." #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" -msgstr "Добавлена автозагрузка" +msgstr "Добавить автозагрузку" #: editor/editor_autoload_settings.cpp msgid "Autoload '%s' already exists!" @@ -1018,15 +1018,15 @@ msgstr "Переименовать автозагрузку" #: editor/editor_autoload_settings.cpp msgid "Toggle AutoLoad Globals" -msgstr "Переключена автозагрузка глобальных Ñкриптов" +msgstr "Переключить автозагрузку глобальных Ñкриптов" #: editor/editor_autoload_settings.cpp msgid "Move Autoload" -msgstr "Передвинута автозагрузка" +msgstr "ПеремеÑтить автозагрузку" #: editor/editor_autoload_settings.cpp msgid "Remove Autoload" -msgstr "Удалена автозагрузка" +msgstr "Удалить автозагрузку" #: editor/editor_autoload_settings.cpp msgid "Enable" @@ -1037,8 +1037,7 @@ msgid "Rearrange Autoloads" msgstr "ПереÑтановка автозагрузок" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Путь:" @@ -1106,7 +1105,7 @@ msgstr "Упаковывание" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "Файл шаблона не найден:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1223,16 +1222,16 @@ msgstr "Ðужно иÑпользовать доÑтупное раÑширенР#: editor/editor_file_system.cpp msgid "ScanSources" -msgstr "ПроÑканировать иÑходники" +msgstr "Сканировать иÑходники" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "Переимпортировать" +msgstr "(Ре)Импортировать" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" -msgstr "ПоиÑк внутри клаÑÑов" +msgstr "Помощь (ПоиÑк)" #: editor/editor_help.cpp msgid "Class List:" @@ -1247,7 +1246,6 @@ msgid "Class:" msgstr "КлаÑÑ:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "ÐаÑледует:" @@ -1417,10 +1415,11 @@ msgid "There is no defined scene to run." msgstr "Ðет определённой Ñцены, чтобы работать." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Ðе назначена Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñцена. Хотите выбрать?\n" "Позже вы можете указать её в параметре \"main_scene\" раÑположенном\n" @@ -1483,6 +1482,11 @@ msgid "Save Scene As.." msgstr "Сохранить Ñцену как.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Узел" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Ðта Ñцена никогда не была Ñохранена. Сохранить перед запуÑком?" @@ -1539,9 +1543,12 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"Сцена '%s' автоматичеÑки импортирована, поÑтому модифицирована быть не " +"может.\n" +"Чтобы её изменить нужно Ñоздать новую унаÑледованную Ñцену." #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "ЯÑно" @@ -1582,6 +1589,10 @@ msgstr "Ещё %d файла(ов)" msgid "%d more file(s) or folder(s)" msgstr "Ещё %d файла(ов) или папка(ок)" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Свободный режим" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Сцена" @@ -1599,9 +1610,8 @@ msgid "Previous tab" msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "БыÑтро отÑортировать файлы.." +msgstr "ОтÑортировать файлы.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1635,7 +1645,7 @@ msgstr "Закрыть Ñцену" msgid "Close Goto Prev. Scene" msgstr "Закрыть и перейти к предыдущей Ñцене" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "Открыть поÑледнее" @@ -1663,84 +1673,41 @@ msgid "Redo" msgstr "Повторить" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "ЗапуÑтить Ñкрипт" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Параметры проекта" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "ВоÑÑтановить Ñцену" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Выйти в ÑпиÑок проектов" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Свободный режим" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Прочие инÑтрументы." #: editor/editor_node.cpp -msgid "Tools" -msgstr "ИнÑтрументы" +#, fuzzy +msgid "Project" +msgstr "Ðовый проект" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "ÐкÑпортировать проект на многие платформы." +msgid "Project Settings" +msgstr "Параметры проекта" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "ЗапуÑтить Ñкрипт" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "ÐкÑпорт" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "ЗапуÑтить проект." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "ВоÑпроизвеÑти" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "ПриоÑтановить Ñцену" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "ПриоÑтановить Ñцену" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "ОÑтановить Ñцену." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "ОÑтановить" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "ЗапуÑтить текущую Ñцену." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "ЗапуÑтить Ñцену" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "ЗапуÑтить выборочную Ñцену" +msgid "Tools" +msgstr "ИнÑтрументы" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "ЗапуÑтить произвольную Ñцену" +msgid "Quit to Project List" +msgstr "Выйти в ÑпиÑок проектов" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Параметры отладки" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Отладка" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1829,9 +1796,10 @@ msgstr "" "При удалённом иÑпользовании на уÑтройÑтве, Ñто работает более Ñффективно Ñ " "Ñетевой файловой ÑиÑтемой." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "ÐаÑтройки" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Редактировать" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1846,17 +1814,73 @@ msgid "Toggle Fullscreen" msgstr "Переключить полноÑкранный режим" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "Загрузка шаблонов ÑкÑпорта" +msgstr "Управление шаблонами ÑкÑпорта" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "Справка" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "КлаÑÑÑ‹" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Закрыть документацию" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "О движке" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "ОповещениÑ, когда внешний реÑÑƒÑ€Ñ Ð±Ñ‹Ð» изменён." +msgid "Play the project." +msgstr "ЗапуÑтить проект." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "ВоÑпроизвеÑти" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "ПриоÑтановить Ñцену" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "ПриоÑтановить Ñцену" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "ОÑтановить Ñцену." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "ОÑтановить" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "ЗапуÑтить текущую Ñцену." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "ЗапуÑтить Ñцену" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "ЗапуÑтить выборочную Ñцену" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "ЗапуÑтить произвольную Ñцену" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1924,7 +1948,7 @@ msgstr "Вывод" #: editor/editor_node.cpp editor/editor_reimport_dialog.cpp msgid "Re-Import" -msgstr "Импортировать Ñнова" +msgstr "Переимпортировать" #: editor/editor_node.cpp editor/editor_plugin_settings.cpp msgid "Update" @@ -1939,6 +1963,14 @@ msgid "Thanks!" msgstr "СпаÑибо!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Импортировать шаблоны из ZIP файла" @@ -1966,6 +1998,36 @@ msgstr "Открыть и запуÑтить Ñкрипт" msgid "Load Errors" msgstr "Ошибки загрузки" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Открыть в редакторе" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Открыть в редакторе" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Открыть в редакторе" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "ÐкÑпортировать библиотеку" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Открыть в редакторе" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Открыть в редакторе" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "УÑтановленные плагины:" @@ -2083,37 +2145,32 @@ msgid "Import From Node:" msgstr "Импортировать из Узла:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" msgstr "Перезагрузить" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "УÑтановить" +msgstr "Удалить" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "УÑтановить" +msgstr "(УÑтановлено)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "Вниз" +msgstr "Загрузка" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(ОтÑутÑтвует)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "Выбранный:" +msgstr "(Текущий)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "Удалить верÑию шаблона '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2121,27 +2178,27 @@ msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ архив шаблонов ÑкÑпР#: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "Ðеверный формат version.txt файла внутри шаблонов." #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." msgstr "" +"Ðеверный формат version.txt файла внутри шаблонов. Идентификатор ревизии не " +"верен." #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "Ðе найден version.txt файл в шаблонах." #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ð»Ð°Ñа:" +msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð²:\n" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "Загрузка шаблонов ÑкÑпорта" +msgstr "РаÑпаковка шаблонов ÑкÑпорта" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2152,34 +2209,28 @@ msgid "Loading Export Templates" msgstr "Загрузка шаблонов ÑкÑпорта" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñцена" +msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "УÑтановленные плагины:" +msgstr "УÑтановленные верÑии:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "УÑтановить проект:" +msgstr "УÑтановить из файла" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "Удалить Ñлемент" +msgstr "Удалить шаблон" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "Удалить выбранные файлы?" +msgstr "Выбрать файл шаблона" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "Загрузка шаблонов ÑкÑпорта" +msgstr "Менеджер шаблонов ÑкÑпорта" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2189,7 +2240,7 @@ msgstr "" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "Ðе удалоÑÑŒ перейти к '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2216,13 +2267,16 @@ msgid "No files selected!" msgstr "Файлы не выбраны!" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "РаÑÑ‚Ñнуть до размера родителей" +msgstr "Развернуть вÑе" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "Свернуть вÑе" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "ПроÑмотреть в проводнике" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2253,10 +2307,6 @@ msgid "Info" msgstr "ИнформациÑ" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "ПроÑмотреть в проводнике" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Переимпортировать.." @@ -2270,7 +2320,7 @@ msgstr "Следующий каталог" #: editor/filesystem_dock.cpp msgid "Re-Scan Filesystem" -msgstr "Повторное Ñканирование файловой ÑиÑтемы" +msgstr "ПереÑканировать файловую ÑиÑтему" #: editor/filesystem_dock.cpp msgid "Toggle folder status as Favorite" @@ -2278,7 +2328,7 @@ msgstr "Переключить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð°Ð¿ÐºÐ¸ как избранной #: editor/filesystem_dock.cpp msgid "Instance the selected scene(s) as child of the selected node." -msgstr "Добавить выбранную Ñцену(Ñцены), как потомка выбранного узла." +msgstr "Добавить выбранную Ñцену(Ñ‹), в качеÑтве потомка выбранного узла." #: editor/filesystem_dock.cpp msgid "Move" @@ -2334,23 +2384,20 @@ msgid "Saving.." msgstr "Сохранение.." #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "Файл" +msgstr " Файлы" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "Импорт" +msgstr "Импортировать как:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." msgstr "ПредуÑтановка.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" -msgstr "Импортировать Ñнова" +msgstr "Переимпортировать" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "No bit masks to import!" @@ -2423,9 +2470,10 @@ msgid "No target font resource!" msgstr "Ðет целевого реÑурÑа шрифта!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "ÐедопуÑтимое раÑширение файла.\n" "ПожалуйÑта, иÑпользуйте .fnt." @@ -2466,7 +2514,7 @@ msgstr "Проверка:" #: editor/io_plugins/editor_sample_import_plugin.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Options:" -msgstr "Параметры:" +msgstr "Опции:" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Font Import" @@ -2477,7 +2525,7 @@ msgid "" "This file is already a Godot font file, please supply a BMFont type file " "instead." msgstr "" -"Ðто уже файл шрифта Godot, пожалуйÑта иÑпользуйте BitMapFont за меÑто него." +"Ðто итак файл шрифта Godot, пожалуйÑта иÑпользуйте BitMapFont вмеÑто него." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Failed opening as BMFont file." @@ -2505,7 +2553,7 @@ msgstr "ÐедопуÑтимый размер шрифта." #: editor/io_plugins/editor_font_import_plugin.cpp msgid "Invalid font custom source." -msgstr "ÐедопуÑтимый шрифт пользовательÑкого иÑточника." +msgstr "Ðеверный пользовательÑкий иÑточник Ð´Ð»Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð°." #: editor/io_plugins/editor_font_import_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -2547,7 +2595,7 @@ msgstr "Ðудио ÑÑмпл" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "New Clip" -msgstr "Ðовый клип" +msgstr "ÐÐ¾Ð²Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ°" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Animation Options" @@ -2579,7 +2627,7 @@ msgstr "МакÑ. угол" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Clips" -msgstr "Клипы" +msgstr "Дорожки" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Start(s)" @@ -2608,7 +2656,7 @@ msgstr "Ðе могу загрузить Ñкрипт поÑÑ‚-процеÑÑа. #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Invalid/broken script for post-import." -msgstr "Поврежденный/Ñломанный Ñценарий Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚-импорта." +msgstr "Ðекорректный/поврежденный Ñценарий Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚-импорта." #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Error importing scene." @@ -2624,11 +2672,11 @@ msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñцена:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Same as Target Scene" -msgstr "Та же, что и у Ñцены" +msgstr "Та же, что и у целевой Ñцены" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Shared" -msgstr "Раздельно" +msgstr "Общий" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Target Texture Folder:" @@ -2640,7 +2688,7 @@ msgstr "Скрипт поÑÑ‚-процеÑÑа:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Custom Root Node Type:" -msgstr "ÐаÑтраиваемый тип корневого узла:" +msgstr "ПользовательÑкий тип корневого узла:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Auto" @@ -2656,7 +2704,7 @@ msgstr "ОтÑутÑтвуют Ñледующие файлы:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Import Anyway" -msgstr "Импорт в любом Ñлучае" +msgstr "Импортировать в любом Ñлучае" #: editor/io_plugins/editor_scene_import_plugin.cpp scene/gui/dialogs.cpp msgid "Cancel" @@ -2911,8 +2959,8 @@ msgstr "Сжимать" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" -msgstr "Добавить в проект (engine.cfg)" +msgid "Add to Project (project.godot)" +msgstr "Добавить к проекту (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" @@ -2951,9 +2999,8 @@ msgid "Change Animation Name:" msgstr "Изменить Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "Дублировать анимацию" +msgstr "Удалить анимацию?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3579,7 +3626,7 @@ msgid "Change default type" msgstr "Изменить тип по умолчанию" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Ок" @@ -3630,17 +3677,6 @@ msgstr "Создан Poly3D" msgid "Set Handle" msgstr "УÑтановить обработчик" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Добавить/Удалить точку Color Ramp" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Изменена Color Ramp" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Создание библиотеки полиÑеток" @@ -3673,8 +3709,31 @@ msgstr "Обновить из Ñцены" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "Добавить вход" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Удалить точку пути" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Загрузить реÑурÑ" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" -msgstr "Изменена карта кривой" +msgstr "Изменить кривую" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Добавить/Удалить точку Color Ramp" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Изменена Color Ramp" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -3713,19 +3772,16 @@ msgid "RMB: Erase Point." msgstr "ПКМ: Удалить точку." #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Point from Line2D" -msgstr "Удалена точка Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹" +msgstr "Удалить точку Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" msgstr "Добавить точку к кривой" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Move Point in Line2D" -msgstr "Точка кривой передвинута" +msgstr "Двигать точку в кривой" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3737,7 +3793,7 @@ msgstr "Выбрать точки" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Shift+Drag: Select Control Points" -msgstr "Shift+Тащить: Выбрать точки управлениÑ" +msgstr "Shift+Drag: Выбрать точки управлениÑ" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3758,7 +3814,6 @@ msgid "Add Point (in empty space)" msgstr "Добавить точку (в пуÑтом проÑтранÑтрве)" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Split Segment (in line)" msgstr "Разделить Ñегмент (в кривой)" @@ -3949,6 +4004,20 @@ msgid "Remove Poly And Point" msgstr "Удалить полигон и точку" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "МаÑка выброÑа очищена" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "Генерировать AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Ошибка при загрузке изображениÑ:" @@ -3961,8 +4030,8 @@ msgid "Set Emission Mask" msgstr "УÑтановлена маÑка выброÑа" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "МаÑка выброÑа очищена" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3972,6 +4041,27 @@ msgstr "МаÑка выброÑа загружена" msgid "Generated Point Count:" msgstr "КоличеÑтво Ñоздаваемых точек:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Среднее Ð²Ñ€ÐµÐ¼Ñ (Ñек.)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "УÑтановлена маÑка выброÑа" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Создать из Ñцены" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Точек излучениÑ:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "Узел не Ñодержит геометрии." @@ -3982,12 +4072,7 @@ msgstr "Узел не Ñодержит геометрии (грани)." #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "Сгенерировать AABB" +msgstr "ТребуетÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» типа 'ParticlesMaterial'." #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -3999,15 +4084,13 @@ msgstr "Ðет граней!" #: editor/plugins/particles_editor_plugin.cpp msgid "Generate AABB" -msgstr "Сгенерировать AABB" +msgstr "Генерировать AABB" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Mesh" msgstr "Создать излучатель из полиÑетки" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Node" msgstr "Создать излучатель из узла" @@ -4020,40 +4103,42 @@ msgid "Create Emitter" msgstr "Создать излучатель" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "КоличеÑтво выброÑов:" +msgstr "Точек излучениÑ:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "ПоверхноÑтей %d" +msgstr "Точки поверхноÑти" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "Точки поверхноÑти + Ðормаль(ÐаправленнаÑ)" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" msgstr "Объём" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source: " -msgstr "Заполнение излучателÑ:" +msgstr "ИÑточник излучениÑ: " #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Generate Visibility AABB" -msgstr "Сгенерировать AABB" +msgstr "Генерировать AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Удалена точка Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Среднее Ð²Ñ€ÐµÐ¼Ñ (Ñек.)" +msgid "Remove Out-Control from Curve" +msgstr "Передвинут выходной луч у кривой" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Удалена точка Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4111,6 +4196,16 @@ msgstr "Разделить путь" msgid "Remove Path Point" msgstr "Удалить точку пути" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Передвинут выходной луч у кривой" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "Передвинут входной луч у кривой" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "Создать UV карту" @@ -4264,6 +4359,11 @@ msgid "Pitch" msgstr "Ð’Ñ‹Ñота" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "ОчиÑтить коÑти" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Ошибка во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ñ‹" @@ -4351,10 +4451,6 @@ msgstr "Ðайти.." msgid "Find Next" msgstr "Ðайти Ñледующее" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Отладка" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Шаг через" @@ -4388,16 +4484,9 @@ msgid "Move Right" msgstr "Двигать вправо" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Уроки" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "Открыть https://godotengine.org Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¾Ð¼ уроков." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "КлаÑÑÑ‹" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "ПоиÑк Ñправочной документации." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4416,9 +4505,8 @@ msgid "Go to next edited document." msgstr "Перейти к Ñледующему редактируемому документу." #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "ДиÑкретнаÑ" +msgstr "СброÑ" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4456,6 +4544,23 @@ msgid "Pick Color" msgstr "Выбрать цвет" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Преобразование изображений" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4515,7 +4620,7 @@ msgstr "" #: editor/plugins/script_text_editor.cpp msgid "Auto Indent" -msgstr "ÐвтоотÑтуп" +msgstr "Ðвто отÑтуп" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -4535,6 +4640,16 @@ msgid "Goto Previous Breakpoint" msgstr "Перейти к предыдущей точке оÑтановки" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Конвертировать в.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Конвертировать в.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Ðайти предыдущее" @@ -4557,6 +4672,10 @@ msgstr "Перейти к Ñтроке.." msgid "Contextual Help" msgstr "КонтекÑÑ‚Ð½Ð°Ñ Ñправка" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Изменена чиÑÐ»Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñтанта" @@ -4774,36 +4893,106 @@ msgid "Animation Key Inserted." msgstr "Ключ анимации вÑтавлен." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "Вперёд" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Ð’ обратном направлении" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "КолёÑико вниз." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "ОбновлÑть при изменениÑÑ…" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "ОбновлÑть при изменениÑÑ…" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "ОбновлÑть при изменениÑÑ…" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "ВертекÑ" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "СовмеÑтить Ñ Ð²Ð¸Ð´Ð¾Ð¼" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Окружение" +msgid "Display Normal" +msgstr "Режим нормалей" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "ПроÑлушиватель звука" +msgid "Display Wireframe" +msgstr "Режим Ñетки" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Вещицы" +msgid "Display Overdraw" +msgstr "Режим проÑвечиваниÑ" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "XForm диалоговое окно" +#, fuzzy +msgid "Display Unshaded" +msgstr "Режим без теней" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Ðе выбрана Ñцена!" +#, fuzzy +msgid "View Environment" +msgstr "Окружение" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "ÐкземплÑÑ€ на курÑор" +#, fuzzy +msgid "View Gizmos" +msgstr "Вещицы" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Ðе возможно добавить Ñцену!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "ПроÑлушиватель звука" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "XForm диалоговое окно" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4862,6 +5051,26 @@ msgid "Align Selection With View" msgstr "СовмеÑтить выбранное Ñ Ð²Ð¸Ð´Ð¾Ð¼" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Выделение" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "ПеремеÑтить" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Поворот" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "МаÑштаб:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Преобразование" @@ -4874,14 +5083,6 @@ msgid "Transform Dialog.." msgstr "Окно преобразованиÑ.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "ИÑпользовать Ñтандартный Ñвет" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "ИÑпользовать sRGB" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 Окно" @@ -4906,22 +5107,6 @@ msgid "4 Viewports" msgstr "4 Окна" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "Режим нормалей" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Режим Ñетки" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Режим проÑвечиваниÑ" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Режим без теней" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "Отображать начало координат" @@ -4930,6 +5115,10 @@ msgid "View Grid" msgstr "Отображать Ñетку" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "ÐаÑтройки" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Параметры привÑзки" @@ -4950,14 +5139,6 @@ msgid "Viewport Settings" msgstr "ÐаÑтройки окна проÑмотра" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Образец Ñтандартного оÑвещениÑ:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Цвет окружающего Ñвета:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "FOV перÑпективы (градуÑÑ‹):" @@ -5132,7 +5313,7 @@ msgstr "Удалить Ñлемент клаÑÑа" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Template" -msgstr "Создать пуÑтой образец" +msgstr "Создать пуÑтой шаблон" #: editor/plugins/theme_editor_plugin.cpp msgid "Create Empty Editor Template" @@ -5296,24 +5477,20 @@ msgid "Error" msgstr "Ошибка" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "Включить" +msgstr "Ðктивный" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '" -msgstr "Удалить вход" +msgstr "Удалить заплатку '" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "Удалить выбранные файлы?" +msgstr "Удалить '%s'?" #: editor/project_export.cpp -#, fuzzy msgid "Presets" -msgstr "ПредуÑтановка.." +msgstr "ПредуÑтановки" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5324,61 +5501,52 @@ msgid "Resources" msgstr "РеÑурÑÑ‹" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "ÐкÑпортировать вÑе реÑурÑÑ‹ проекта." +msgstr "ÐкÑпортировать вÑе реÑурÑÑ‹ проекта" #: editor/project_export.cpp -#, fuzzy msgid "Export selected scenes (and dependencies)" -msgstr "ÐкÑпортировать выбранные реÑурÑÑ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)." +msgstr "ÐкÑпортировать выбранные Ñцены (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" -msgstr "ÐкÑпортировать выбранные реÑурÑÑ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)." +msgstr "ÐкÑпортировать выбранные реÑурÑÑ‹ (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑти)" #: editor/project_export.cpp msgid "Export Mode:" msgstr "Режим ÑкÑпортированиÑ:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" msgstr "РеÑурÑÑ‹ Ð´Ð»Ñ ÑкÑпорта:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "" "Фильтр Ð´Ð»Ñ ÑкÑпорта не реÑурÑных файлов (через запÑтую, например: *.json, *." -"txt):" +"txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" -msgstr "Фильтр Ð´Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (через запÑтую, например: *.json, *.txt):" +msgstr "Фильтр Ð´Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (через запÑтую, например: *.json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "СовпадениÑ:" +msgstr "Латки" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "Целевой путь:" +msgstr "Создать латку" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "Шаблоны ÑкÑпорта Ð´Ð»Ñ Ñтой платформы отÑутÑтвуют:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "ÐкÑпортировать набор тайлов" +msgstr "ÐкÑпорт в режиме отладки" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" @@ -5386,13 +5554,13 @@ msgstr "Ðеверный путь к проекту, путь должен ÑÑƒÑ #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." -msgstr "ÐедопуÑтимый путь к проекту, engine.cfg не должен ÑущеÑтвовать." +msgid "Invalid project path, project.godot must not exist." +msgstr "ÐедопуÑтимый путь, не должен приÑутÑтвовать godot.cfg." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." -msgstr "ÐедопуÑтимый путь к проекту, engine.cfg должен ÑущеÑтвовать." +msgid "Invalid project path, project.godot must exist." +msgstr "ÐедопуÑтимый путь, должен приÑутÑтвовать godot.cfg." #: editor/project_manager.cpp msgid "Imported Project" @@ -5404,8 +5572,8 @@ msgstr "Ðеверный путь к проекту (Что-то изменилР#: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." -msgstr "Ðе могу Ñоздать engine.cfg в папке проекта." +msgid "Couldn't create project.godot in project path." +msgstr "Ðе удалоÑÑŒ Ñоздать godot.cfg в папке проекта." #: editor/project_manager.cpp msgid "The following files failed extraction from package:" @@ -5502,7 +5670,7 @@ msgstr "Ðовый проект" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "Удалить Ñлемент" +msgstr "Удалить шаблон" #: editor/project_manager.cpp msgid "Exit" @@ -5604,7 +5772,6 @@ msgid "Button 9" msgstr "Кнопка 9" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Axis Index:" msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ð¾Ñи джойÑтика:" @@ -5613,7 +5780,6 @@ msgid "Axis" msgstr "ОÑÑŒ" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Button Index:" msgstr "Ð˜Ð½Ð´ÐµÐºÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ джойÑтика:" @@ -5625,6 +5791,11 @@ msgstr "Добавить дейÑтвие" msgid "Erase Input Action Event" msgstr "Удалить дейÑтвие" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "Добавить пуÑтоту" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "УÑтройÑтво" @@ -5691,8 +5862,8 @@ msgstr "Удалён параметр реÑурÑа перенаправленР#: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Параметры проекта" +msgid "Project Settings (project.godot)" +msgstr "ÐаÑтройки проекта (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5759,17 +5930,16 @@ msgid "AutoLoad" msgstr "Ðвтозагрузка" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 Окно" +msgstr "Выберите Viewport" #: editor/property_editor.cpp msgid "Ease In" -msgstr "Легко в" +msgstr "Переход Ð’" #: editor/property_editor.cpp msgid "Ease Out" -msgstr "Легко из" +msgstr "Переход ИЗ" #: editor/property_editor.cpp msgid "Zero" @@ -5777,11 +5947,11 @@ msgstr "Ðоль" #: editor/property_editor.cpp msgid "Easing In-Out" -msgstr "Легко в-из" +msgstr "Переход Ð’-ИЗ" #: editor/property_editor.cpp msgid "Easing Out-In" -msgstr "Легко из-в" +msgstr "Переход ИЗ-Ð’" #: editor/property_editor.cpp msgid "File.." @@ -5800,22 +5970,16 @@ msgid "New Script" msgstr "Ðовый Ñкрипт" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" +msgstr "Показать в файловой ÑиÑтеме" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "Ошибка загрузки файла: Ðто не реÑурÑ!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Ðевозможно загрузить изображение" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" -msgstr "Выбрать узел" +msgstr "Выберите узел" #: editor/property_editor.cpp msgid "Bit %d, val %d." @@ -5827,7 +5991,7 @@ msgstr "Вкл" #: editor/property_editor.cpp modules/visual_script/visual_script_editor.cpp msgid "Set" -msgstr "Задан" +msgstr "Задать" #: editor/property_editor.cpp msgid "Properties:" @@ -5961,7 +6125,7 @@ msgstr "Ðта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть выполнена бе #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "Ðевозможно выполнить Ñ ÐºÐ¾Ñ€Ð½ÐµÐ¼." #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6004,6 +6168,11 @@ msgid "Error duplicating scene to save it." msgstr "Ошибка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñцены, при её Ñохранении." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "РеÑурÑÑ‹:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Редактировать группы" @@ -6044,7 +6213,6 @@ msgid "Save Branch as Scene" msgstr "Сохранить ветку, как Ñцену" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" msgstr "Копировать путь" @@ -6081,10 +6249,59 @@ msgid "Toggle CanvasItem Visible" msgstr "Переключена видимоÑть CanvasItem" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Параметры отладки" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "ÐкземплÑÑ€:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Следующий Ñкрипт" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Переключена видимоÑть Spatial" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Ðекорректное Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°, Ñледующие Ñимволы недопуÑтимы:" @@ -6129,75 +6346,93 @@ msgid "Select a Node" msgstr "Выбрать узел" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð²Ñ‹ÑˆÐµÑтоÑщего клаÑÑа" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Ðе удалоÑÑŒ Ñоздать Ñкрипт в файловой ÑиÑтеме." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "ДопуÑтимые Ñимволы:" +msgid "Error loading script from %s" +msgstr "Ошибка при загрузке Ñкрипта из %s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа" +msgid "Path is empty" +msgstr "Ðе указан путь" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "ДопуÑтимое имÑ" +msgid "Path is not local" +msgstr "Путь не локальный" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "Ð/Д" +msgid "Invalid base path" +msgstr "ÐедопуÑтимый базовый путь" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным!" +msgid "Invalid extension" +msgstr "ÐедопуÑтимое раÑширение" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Ð˜Ð¼Ñ Ð²Ñ‹ÑˆÐµÑтоÑщего клаÑÑа ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "ÐедопуÑтимый путь!" +#, fuzzy +msgid "Invalid Path" +msgstr "ÐедопуÑтимый путь." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Ðе удалоÑÑŒ Ñоздать Ñкрипт в файловой ÑиÑтеме." +msgid "Invalid class name" +msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "Ошибка при загрузке Ñкрипта из %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Ðеверный Ð¸Ð½Ð´ÐµÐºÑ ÑвойÑтва имени." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Ðе указан путь" +#, fuzzy +msgid "Script valid" +msgstr "Скрипт" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Путь не локальный" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "ÐедопуÑтимый базовый путь" +msgid "N/A" +msgstr "Ð/Д" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "ÐедопуÑтимое раÑширение" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "Создать новый Ñкрипт" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "Загрузить ÑущеÑтвующий Ñкрипт" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "ÐаÑледует:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Ð˜Ð¼Ñ ÐšÐ»Ð°ÑÑа:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Удалить шаблон" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Ð’Ñтроенный Скрипт" #: editor/script_create_dialog.cpp @@ -6705,31 +6940,26 @@ msgid "just released" msgstr "проÑто отпущена" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "Обзор" +msgstr "ЗапуÑтить в браузере" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "ЗапуÑтить HTML в Ñтандартном браузере ÑиÑтемы." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "Ðевозможно найти тайл:" +msgstr "Ðе удалоÑÑŒ запиÑать файл:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "Ðевозможно найти тайл:" +msgstr "Ðе удалоÑÑŒ прочитать файл:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "Ðевозможно Ñоздать папку." +msgstr "Ðе удалоÑÑŒ открыть шаблон Ð´Ð»Ñ ÑкÑпорта:\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "Ðе могу прочитать файл Ñертификата. Уверены, что путь и пароль верны?" @@ -6894,11 +7124,11 @@ msgstr "" "Узел ParallaxLayer работает только при уÑтановке его в качеÑтве дочернего " "узла ParallaxBackground." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы ÑвойÑтво Path должно указывать на дейÑтвующий узел " -"Particles2D." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6986,12 +7216,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "СвойÑтво Path должно указывать на дейÑтвительный Spatial узел." @@ -7011,6 +7235,15 @@ msgstr "" "Чтобы AnimatedSprite3D отображал кадры, пожалуйÑта уÑтановите или Ñоздайте " "реÑÑƒÑ€Ñ SpriteFrames в параметре 'Frames'." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Режим запуÑка:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Внимание!" @@ -7045,9 +7278,8 @@ msgid "" "functions. Making them visible for editing is fine though, but they will " "hide upon running." msgstr "" -"Ð’Ñплывающие окна будут ÑкрыватьÑÑ Ð¿Ð¾-умолчанию, еÑли Ð’Ñ‹ не вызовете popup() " -"или любой из popup*(). Ð”ÐµÐ»Ð°Ñ Ð¸Ñ… доÑтупными Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¼Ñ‹Ñль, " -"Ñ…Ð¾Ñ‚Ñ Ð¾Ð½Ð¸ будут прÑтатьÑÑ Ð¿Ñ€Ð¸ запуÑке." +"ПоÑле запуÑка вÑплывающие окна по-умолчанию Ñкрыты, Ð´Ð»Ñ Ð¸Ñ… Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ " +"иÑпользуйте функцию popup() или любую из popup_*()." #: scene/gui/scroll_container.cpp msgid "" @@ -7055,6 +7287,17 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer предназначен Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð¾Ð´Ð½Ð¸Ð¼ дочерним Ñлементом " +"управлениÑ.\n" +"ИÑпользуйте дочерний контейнер (VBox, HBox и Ñ‚.д.), или Control и " +"уÑтановите\n" +"минимальный размер вручную." + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -7075,9 +7318,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Импортировать аÑÑеты в проект." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "ÐаÑтройки проекта (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "ÐкÑпортировать проект на многие платформы." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "ОповещениÑ, когда внешний реÑÑƒÑ€Ñ Ð±Ñ‹Ð» изменён." + +#~ msgid "Tutorials" +#~ msgstr "Уроки" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "Открыть https://godotengine.org Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¾Ð¼ уроков." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Ðе выбрана Ñцена!" + +#~ msgid "Instance at Cursor" +#~ msgstr "ÐкземплÑÑ€ на курÑор" + +#~ msgid "Could not instance scene!" +#~ msgstr "Ðе возможно добавить Ñцену!" + +#~ msgid "Use Default Light" +#~ msgstr "ИÑпользовать Ñтандартный Ñвет" + +#~ msgid "Use Default sRGB" +#~ msgstr "ИÑпользовать sRGB" + +#~ msgid "Default Light Normal:" +#~ msgstr "Образец Ñтандартного оÑвещениÑ:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Цвет окружающего Ñвета:" + +#~ msgid "Couldn't load image" +#~ msgstr "Ðевозможно загрузить изображение" + +#~ msgid "Invalid parent class name" +#~ msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð²Ñ‹ÑˆÐµÑтоÑщего клаÑÑа" + +#~ msgid "Valid chars:" +#~ msgstr "ДопуÑтимые Ñимволы:" + +#~ msgid "Valid name" +#~ msgstr "ДопуÑтимое имÑ" + +#~ msgid "Class name is invalid!" +#~ msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð°ÑÑа ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Ð˜Ð¼Ñ Ð²Ñ‹ÑˆÐµÑтоÑщего клаÑÑа ÑвлÑетÑÑ Ð½ÐµÐ´ÐµÐ¹Ñтвительным!" + +#~ msgid "Invalid path!" +#~ msgstr "ÐедопуÑтимый путь!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы ÑвойÑтво Path должно указывать на дейÑтвующий узел " +#~ "Particles2D." #~ msgid "Surface" #~ msgstr "ПоверхноÑть" @@ -7298,9 +7596,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "Удаление тишины:" -#~ msgid "Script" -#~ msgstr "Скрипт" - #~ msgid "Script Export Mode:" #~ msgstr "Режим ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñкриптов:" @@ -7334,9 +7629,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance не Ñодержит BakedLight реÑурÑ." -#~ msgid "Vertex" -#~ msgstr "ВертекÑ" - #~ msgid "Fragment" #~ msgstr "Фрагмент" @@ -7379,9 +7671,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "Ðевозможно перейти в подпапку:" -#~ msgid "Help" -#~ msgstr "Справка" - #~ msgid "Imported Resources" #~ msgstr "Импортированные реÑурÑÑ‹" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index b0bee6aa6f..0b30bc80f4 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -1,6 +1,5 @@ # Slovak translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # J08nY <johnenter@gmail.com>, 2016. @@ -535,7 +534,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -581,7 +581,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Komunita" @@ -724,6 +724,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -829,6 +830,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -929,8 +931,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -940,6 +941,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1008,8 +1010,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Cesta:" @@ -1200,7 +1201,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1217,7 +1219,6 @@ msgid "Class:" msgstr "Trieda:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1388,8 +1389,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1443,6 +1444,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1499,7 +1504,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1537,6 +1542,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1590,7 +1599,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1618,35 +1627,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1654,47 +1651,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1765,8 +1730,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1786,11 +1751,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1874,6 +1895,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1901,6 +1930,32 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Otvorit prieÄinok" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Otvorit prieÄinok" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2145,6 +2200,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2173,10 +2232,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2343,7 +2398,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2818,7 +2873,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3478,7 +3533,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3527,17 +3582,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3569,9 +3613,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Signály:" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3841,6 +3908,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3853,7 +3933,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3864,20 +3944,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3932,12 +4025,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3995,6 +4092,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4148,6 +4254,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4236,10 +4346,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4273,15 +4379,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4336,6 +4434,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4415,6 +4529,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4437,6 +4559,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4654,35 +4780,95 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4744,23 +4930,32 @@ msgid "Align Selection With View" msgstr "VÅ¡etky vybrané" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "VÅ¡etky vybrané" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4788,27 +4983,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4832,14 +5015,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5253,11 +5428,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5269,7 +5444,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5486,6 +5661,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Zariadenie" @@ -5551,7 +5730,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5668,10 +5847,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "VložiÅ¥" @@ -5857,6 +6032,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5933,10 +6112,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Popis:" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5981,77 +6207,87 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "Popis:" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "Popis:" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Class Name" +msgstr "Trieda:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Template" +msgstr "VÅ¡etky vybrané" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6717,8 +6953,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6786,12 +7024,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6807,6 +7039,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6849,6 +7089,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/sl.po b/editor/translations/sl.po index ea634658ce..e50f907b65 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -1,6 +1,5 @@ # Slovenian translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # matevž lapajne <sivar.lapajne@gmail.com>, 2016. @@ -533,7 +532,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -579,7 +579,7 @@ msgstr "" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -722,6 +722,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -827,6 +828,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -927,8 +929,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -938,6 +939,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1006,8 +1008,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1198,7 +1199,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1215,7 +1217,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1385,8 +1386,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1440,6 +1441,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1496,7 +1501,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1534,6 +1539,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1586,7 +1595,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1614,35 +1623,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1650,47 +1647,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1761,9 +1726,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Uredi" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1782,11 +1748,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1870,6 +1892,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1897,6 +1927,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2141,6 +2195,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2169,10 +2227,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2338,7 +2392,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2813,7 +2867,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3473,7 +3527,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3522,17 +3576,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3564,9 +3607,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "Dodaj Signal" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Odstrani Signal" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3836,6 +3902,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3848,7 +3927,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3859,20 +3938,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3927,12 +4019,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3990,6 +4086,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "Odstrani Funkcijo" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4143,6 +4248,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4231,10 +4340,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4268,15 +4373,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4331,6 +4428,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4410,6 +4523,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4432,6 +4553,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4649,35 +4774,96 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "Spremeni" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4737,23 +4923,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "IzbriÅ¡i Izbrano" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4781,27 +4976,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4825,14 +5008,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5245,11 +5420,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5261,7 +5436,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5478,6 +5653,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5543,7 +5722,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5659,10 +5838,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5848,6 +6023,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5922,10 +6101,56 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Open script" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5970,75 +6195,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr ": Neveljavni argumenti: " #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Neveljaven indeks lastnosti imena." + +#: editor/script_create_dialog.cpp +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Create new script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Odstrani Spremenljivko" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6714,8 +6950,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6783,12 +7021,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6804,6 +7036,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6846,6 +7086,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/th.po b/editor/translations/th.po index b31532f3bf..9e140b2375 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -1,35 +1,35 @@ # Thai translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # -# Poommetee Ketson <poommetee@protonmail.com>, 2017. +# Kaveeta Vivatchai <goodytong@gmail.com>, 2017. +# Poommetee Ketson (Noshyaar) <poommetee@protonmail.com>, 2017. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2017-04-03 00:59+0000\n" -"Last-Translator: Poommetee Ketson <poommetee@protonmail.com>\n" +"PO-Revision-Date: 2017-05-08 10:38+0000\n" +"Last-Translator: Noshyaar <poommetee@protonmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" "Language: th\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.13-dev\n" +"X-Generator: Weblate 2.14-dev\n" #: editor/animation_editor.cpp -#, fuzzy msgid "Disabled" msgstr "ปิดใช้งาน" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "เลืà¸à¸à¸—ั้งหมด" #: editor/animation_editor.cpp +#, fuzzy msgid "Move Add Key" -msgstr "" +msgstr "เลื่à¸à¸™à¸«à¸£à¸·à¸à¹€à¸žà¸´à¹ˆà¸¡à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Anim Change Transition" @@ -76,18 +76,16 @@ msgid "Anim Track Rename" msgstr "เปลี่ยนชื่à¸à¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Interpolation" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¸—่าà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Anim Track Change Value Mode" msgstr "เปลี่ยนโหมดà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "เปลี่ยนโหมดà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "เปลี่ยนโหมดวนซ้ำà¹à¸—ร็à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -103,12 +101,11 @@ msgstr "ลบคีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "ทำซ้ำที่เลืà¸à¸" +msgstr "ทำซ้ำในà¹à¸—ร็à¸à¹€à¸”ิม" #: editor/animation_editor.cpp -#, fuzzy msgid "Duplicate Transposed" -msgstr "ทำซ้ำเคลื่à¸à¸™" +msgstr "ทำซ้ำในà¹à¸—ร็à¸à¸—ี่เลืà¸à¸" #: editor/animation_editor.cpp msgid "Remove Selection" @@ -116,15 +113,15 @@ msgstr "ลบที่เลืà¸à¸" #: editor/animation_editor.cpp msgid "Continuous" -msgstr "ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡" +msgstr "ผันà¹à¸›à¸£" #: editor/animation_editor.cpp msgid "Discrete" -msgstr "ไม่ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡" +msgstr "ค้าง" #: editor/animation_editor.cpp msgid "Trigger" -msgstr "" +msgstr "ไม่ค้าง" #: editor/animation_editor.cpp msgid "Anim Add Key" @@ -136,11 +133,11 @@ msgstr "ย้ายคีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Scale Selection" -msgstr "" +msgstr "ปรับà¸à¸±à¸•ราส่วนเวลาคีย์ที่เลืà¸à¸" #: editor/animation_editor.cpp msgid "Scale From Cursor" -msgstr "" +msgstr "ปรับà¸à¸±à¸•ราส่วนเวลาตามเคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œ" #: editor/animation_editor.cpp msgid "Goto Next Step" @@ -187,14 +184,12 @@ msgid "Clean-Up Animation" msgstr "เà¸à¹‡à¸šà¸à¸§à¸²à¸”à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp -#, fuzzy msgid "Create NEW track for %s and insert key?" msgstr "เพิ่มà¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆà¸ªà¸³à¸«à¸£à¸±à¸š %s à¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸„ีย์?" #: editor/animation_editor.cpp -#, fuzzy msgid "Create %d NEW tracks and insert keys?" -msgstr "เพิ่มà¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆ %d à¹à¸—ร็à¸à¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸„ีย์?" +msgstr "เพิ่ม %d à¹à¸—ร็à¸à¹ƒà¸«à¸¡à¹ˆà¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸„ีย์?" #: editor/animation_editor.cpp editor/create_dialog.cpp #: editor/editor_audio_buses.cpp @@ -248,20 +243,19 @@ msgstr "ซูมà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/animation_editor.cpp msgid "Length (s):" -msgstr "ความยาว (วิ):" +msgstr "ความยาว (วินาที):" #: editor/animation_editor.cpp -#, fuzzy msgid "Animation length (in seconds)." msgstr "ความยาวà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (วินาที)" #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "ช่วง (วิ):" +msgstr "ช่วง (วินาที):" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." -msgstr "" +msgstr "เลื่à¸à¸™à¹€à¸„à¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œà¹ƒà¸™à¸Šà¹ˆà¸§à¸‡ (วินาที)" #: editor/animation_editor.cpp msgid "Enable/Disable looping in animation." @@ -297,16 +291,15 @@ msgstr "ตัวเพิ่มประสิทธิภาพà¹à¸à¸™à¸´à¹€ #: editor/animation_editor.cpp msgid "Max. Linear Error:" -msgstr "ผิดพลาดเชิงเส้นมาà¸à¸—ี่สุด:" +msgstr "คลาดเคลื่à¸à¸™à¹€à¸Šà¸´à¸‡à¹€à¸ªà¹‰à¸™à¸¡à¸²à¸à¸—ี่สุด:" #: editor/animation_editor.cpp -#, fuzzy msgid "Max. Angular Error:" -msgstr "ผิดพลาดเชิงมุมมาà¸à¸—ี่สุด:" +msgstr "คลาดเคลื่à¸à¸™à¹€à¸Šà¸´à¸‡à¸¡à¸¸à¸¡à¸¡à¸²à¸à¸—ี่สุด:" #: editor/animation_editor.cpp msgid "Max Optimizable Angle:" -msgstr "" +msgstr "ปรับà¹à¸à¹‰à¹€à¸Šà¸´à¸‡à¸¡à¸¸à¸¡à¸¡à¸²à¸à¸—ี่สุด:" #: editor/animation_editor.cpp msgid "Optimize" @@ -326,7 +319,7 @@ msgstr "ทรานสิชัน" #: editor/animation_editor.cpp msgid "Scale Ratio:" -msgstr "à¸à¸±à¸•ราส่วนขนาด:" +msgstr "à¸à¸±à¸•ราส่วนเวลา:" #: editor/animation_editor.cpp msgid "Call Functions in Which Node?" @@ -353,19 +346,16 @@ msgid "Clean-Up" msgstr "เà¸à¹‡à¸šà¸à¸§à¸²à¸”" #: editor/array_property_edit.cpp -#, fuzzy msgid "Resize Array" msgstr "ปรับขนาดà¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" #: editor/array_property_edit.cpp -#, fuzzy msgid "Change Array Value Type" -msgstr "à¹à¸à¹‰à¹„ขชนิดตัวà¹à¸›à¸£à¹ƒà¸™à¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" +msgstr "เปลี่ยนประเภทตัวà¹à¸›à¸£à¹ƒà¸™à¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" #: editor/array_property_edit.cpp -#, fuzzy msgid "Change Array Value" -msgstr "à¹à¸à¹‰à¹„ขค่าในà¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" +msgstr "เปลี่ยนค่าในà¸à¸²à¸£à¹Œà¹€à¸£à¸¢à¹Œ" #: editor/asset_library_editor_plugin.cpp msgid "Free" @@ -383,12 +373,11 @@ msgstr "ค่าคงที่:" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "View Files" -msgstr "ไฟล์" +msgstr " ไฟล์" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Description:" msgstr "รายละเà¸à¸µà¸¢à¸”:" @@ -430,7 +419,7 @@ msgstr "เชื่à¸à¸¡à¹‚ยง.." #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Can't connect to host:" -msgstr "เชื่à¸à¸¡à¹‚ยงà¸à¸±à¸šà¹‚หนด:" +msgstr "เชื่à¸à¸¡à¹„ปยังโหนด:" #: editor/asset_library_editor_plugin.cpp msgid "No response from host:" @@ -520,7 +509,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "ลง" +msgstr "ดาวน์โหลด" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -543,7 +532,6 @@ msgid "last" msgstr "" #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "All" msgstr "ทั้งหมด" @@ -551,12 +539,12 @@ msgstr "ทั้งหมด" #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp editor/settings_config_dialog.cpp -#, fuzzy msgid "Search:" msgstr "ค้นหา:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -571,7 +559,6 @@ msgstr "ค้นหา" #: editor/io_plugins/editor_texture_import_plugin.cpp #: editor/io_plugins/editor_translation_import_plugin.cpp #: editor/project_manager.cpp -#, fuzzy msgid "Import" msgstr "นำเข้า" @@ -580,7 +567,6 @@ msgid "Plugins" msgstr "ปลั๊à¸à¸à¸´à¸™" #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "Sort:" msgstr "เรียงตาม:" @@ -589,41 +575,34 @@ msgid "Reverse" msgstr "ย้à¸à¸™à¸à¸¥à¸±à¸š" #: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp -#, fuzzy msgid "Category:" -msgstr "ประเภท:" +msgstr "หมวดหมู่:" #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "Site:" msgstr "ไซต์:" #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "Support.." -msgstr "à¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™" +msgstr "à¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™.." #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "Official" -msgstr "ผู้ผลิต" +msgstr "ผู้พัฒนา" -#: editor/asset_library_editor_plugin.cpp -#, fuzzy +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "ชุมชน" #: editor/asset_library_editor_plugin.cpp -#, fuzzy msgid "Testing" msgstr "ทดสà¸à¸š" #: editor/asset_library_editor_plugin.cpp msgid "Assets ZIP File" -msgstr "" +msgstr "ไฟล์ ZIP" #: editor/call_dialog.cpp -#, fuzzy msgid "Method List For '%s':" msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”ขà¸à¸‡ '%s':" @@ -632,112 +611,90 @@ msgid "Call" msgstr "เรียà¸" #: editor/call_dialog.cpp -#, fuzzy msgid "Method List:" msgstr "รายชื่à¸à¹€à¸¡à¸—็à¸à¸”:" #: editor/call_dialog.cpp -#, fuzzy msgid "Arguments:" msgstr "ตัวà¹à¸›à¸£:" #: editor/call_dialog.cpp -#, fuzzy msgid "Return:" msgstr "คืนค่า:" #: editor/code_editor.cpp -#, fuzzy msgid "Go to Line" msgstr "ไปยังบรรทัด" #: editor/code_editor.cpp -#, fuzzy msgid "Line Number:" msgstr "บรรทัดที่:" #: editor/code_editor.cpp -#, fuzzy msgid "No Matches" msgstr "ไม่พบ" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "à¹à¸—นที่à¹à¸¥à¹‰à¸§ %d ครั้ง" #: editor/code_editor.cpp -#, fuzzy msgid "Replace" msgstr "à¹à¸—นที่" #: editor/code_editor.cpp -#, fuzzy msgid "Replace All" msgstr "à¹à¸—นที่ทั้งหมด" #: editor/code_editor.cpp -#, fuzzy msgid "Match Case" -msgstr "ตรงตามตัวพิมพ์ใหà¸à¹ˆ-เล็à¸" +msgstr "ตรงตามà¸à¸±à¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ" #: editor/code_editor.cpp -#, fuzzy msgid "Whole Words" msgstr "ทั้งคำ" #: editor/code_editor.cpp -#, fuzzy msgid "Selection Only" -msgstr "เฉพาะที่เลืà¸à¸à¹„ว้" +msgstr "เฉพาะที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¸·à¸à¸" #: editor/code_editor.cpp editor/editor_help.cpp -#, fuzzy msgid "Find" msgstr "ค้นหา" #: editor/code_editor.cpp -#, fuzzy msgid "Next" msgstr "ต่à¸à¹„ป" #: editor/code_editor.cpp -#, fuzzy msgid "Not found!" msgstr "ไม่พบ!" #: editor/code_editor.cpp -#, fuzzy msgid "Replace By" msgstr "à¹à¸—นที่ด้วย" #: editor/code_editor.cpp -#, fuzzy msgid "Case Sensitive" -msgstr "ตรงตามตัวพิมพ์ใหà¸à¹ˆ-เล็à¸" +msgstr "ตรงตามà¸à¸±à¸à¸©à¸£à¸žà¸´à¸¡à¸žà¹Œà¹€à¸¥à¹‡à¸-ใหà¸à¹ˆ" #: editor/code_editor.cpp -#, fuzzy msgid "Backwards" msgstr "ย้à¸à¸™à¸à¸¥à¸±à¸š" #: editor/code_editor.cpp -#, fuzzy msgid "Prompt On Replace" msgstr "เตืà¸à¸™à¸à¹ˆà¸à¸™à¹à¸—นที่" #: editor/code_editor.cpp -#, fuzzy msgid "Skip" msgstr "ข้าม" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom In" msgstr "ขยาย" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Zoom Out" msgstr "ย่à¸" @@ -750,12 +707,10 @@ msgid "Line:" msgstr "บรรทัด:" #: editor/code_editor.cpp -#, fuzzy msgid "Col:" msgstr "คà¸à¸¥à¸±à¸¡à¸™à¹Œ:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Method in target Node must be specified!" msgstr "ต้à¸à¸‡à¸£à¸°à¸šà¸¸à¹€à¸¡à¸—็à¸à¸”ในโหนดปลายทาง!" @@ -766,162 +721,137 @@ msgid "" msgstr "ไม่พบเมท็à¸à¸”ปลายทาง! ระบุเมท็à¸à¸”ให้ถูà¸à¸•้à¸à¸‡à¸«à¸£à¸·à¸à¹€à¸žà¸´à¹ˆà¸¡à¸ªà¸„ริปต์ในโหนดปลายทาง" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect To Node:" -msgstr "เชื่à¸à¸¡à¹‚ยงà¸à¸±à¸šà¹‚หนด:" +msgstr "เชื่à¸à¸¡à¹„ปยังโหนด:" #: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings.cpp -#, fuzzy msgid "Add" msgstr "เพิ่ม" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp -#, fuzzy +#: editor/project_settings.cpp msgid "Remove" msgstr "ลบ" #: editor/connections_dialog.cpp -#, fuzzy msgid "Add Extra Call Argument:" msgstr "เพิ่มตัวà¹à¸›à¸£:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Extra Call Arguments:" msgstr "ตัวà¹à¸›à¸£à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Path to Node:" msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¹‚หนด:" #: editor/connections_dialog.cpp -#, fuzzy msgid "Make Function" -msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ" +msgstr "สร้างฟังà¸à¹Œà¸Šà¸±à¸™" #: editor/connections_dialog.cpp -#, fuzzy msgid "Deferred" msgstr "เรียà¸à¸ ายหลัง" #: editor/connections_dialog.cpp -#, fuzzy msgid "Oneshot" msgstr "ครั้งเดียว" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect" -msgstr "เชื่à¸à¸¡à¹‚ยง" +msgstr "เชื่à¸à¸¡" #: editor/connections_dialog.cpp msgid "Connect '%s' to '%s'" -msgstr "เชื่à¸à¸¡à¹‚ยง '%s' à¸à¸±à¸š '%s'" +msgstr "เชื่à¸à¸¡ '%s' à¸à¸±à¸š '%s'" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connecting Signal:" msgstr "เชื่à¸à¸¡à¹‚ยงสัà¸à¸à¸²à¸“:" #: editor/connections_dialog.cpp msgid "Create Subscription" -msgstr "" +msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" #: editor/connections_dialog.cpp -#, fuzzy msgid "Connect.." msgstr "เชื่à¸à¸¡à¹‚ยง.." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp -#, fuzzy msgid "Disconnect" -msgstr "ลบ" +msgstr "ลบà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸à¸¡à¹‚ยง" #: editor/connections_dialog.cpp editor/node_dock.cpp -#, fuzzy msgid "Signals" msgstr "สัà¸à¸à¸²à¸“" #: editor/create_dialog.cpp -#, fuzzy msgid "Create New" msgstr "สร้างใหม่" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp -#, fuzzy msgid "Favorites:" msgstr "ที่ชื่นชà¸à¸š:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp -#, fuzzy msgid "Recent:" msgstr "ล่าสุด:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp -#, fuzzy msgid "Matches:" msgstr "พบ:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Search Replacement For:" -msgstr "หาตัวà¹à¸—นสำหรับ:" +msgstr "หาตัวà¹à¸—นขà¸à¸‡:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependencies For:" msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸‚à¸à¸‡:" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" -"ฉาภ'%s' à¸à¸³à¸¥à¸±à¸‡à¹€à¸›à¸´à¸”à¹à¸à¹‰à¹„ขà¸à¸¢à¸¹à¹ˆ\n" +"ฉาภ'%s' à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¹€à¸›à¸´à¸”à¹à¸à¹‰à¹„ข\n" "à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ส่งผลจนà¸à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดใหม่" #: editor/dependency_editor.cpp -#, fuzzy msgid "" "Resource '%s' is in use.\n" "Changes will take effect when reloaded." msgstr "" -"รีซà¸à¸£à¹Œà¸ª '%s' à¸à¸¢à¸¹à¹ˆà¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™\n" +"รีซà¸à¸£à¹Œà¸ª '%s' à¸à¸³à¸¥à¸±à¸‡à¸–ูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™\n" "à¸à¸²à¸£à¹à¸à¹‰à¹„ขจะไม่ส่งผลจนà¸à¸§à¹ˆà¸²à¸ˆà¸°à¹‚หลดใหม่" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependencies" msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡" #: editor/dependency_editor.cpp -#, fuzzy msgid "Resource" msgstr "รีซà¸à¸£à¹Œà¸ª" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp -#, fuzzy +#: editor/script_create_dialog.cpp msgid "Path" msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡" #: editor/dependency_editor.cpp -#, fuzzy msgid "Dependencies:" msgstr "à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Fix Broken" msgstr "ซ่à¸à¸¡à¹à¸‹à¸¡" @@ -955,7 +885,6 @@ msgid "Error loading:" msgstr "ผิดพลาดขณะโหลด:" #: editor/dependency_editor.cpp -#, fuzzy msgid "Scene failed to load due to missing dependencies:" msgstr "โหลดฉาà¸à¹„ม่ได้เนื่à¸à¸‡à¸ˆà¸²à¸à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢:" @@ -992,36 +921,32 @@ msgid "Orphan Resource Explorer" msgstr "ตัวจัดà¸à¸²à¸£à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸—ี่ไม่มีเจ้าขà¸à¸‡" #: editor/dependency_editor.cpp -#, fuzzy msgid "Delete selected files?" msgstr "ลบไฟล์ที่เลืà¸à¸?" #: editor/dependency_editor.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/project_export.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Delete" msgstr "ลบ" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ขà¸à¸‡ Audio Bus เป็น.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸‚à¸à¸‡à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์ใหม่.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "เปิดเลย์เà¸à¸²à¸•์ขà¸à¸‡ Audio Bus" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "เพิ่ม %s" +msgstr "เพิ่ม Bus" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "โหลด" @@ -1031,31 +956,27 @@ msgid "Save As" msgstr "บันทึà¸à¹€à¸›à¹‡à¸™" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "ค่าเริ่มต้น" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Invalid name." msgstr "ชื่à¸à¸œà¸´à¸”พลาด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Valid characters:" msgstr "ตัวà¸à¸±à¸à¸©à¸£à¸—ี่ใช้ได้:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Invalid name. Must not collide with an existing engine class name." msgstr "ชื่à¸à¸œà¸´à¸”พลาด ต้à¸à¸‡à¹„ม่ใช้ชื่à¸à¹€à¸”ียวà¸à¸±à¸šà¸„ลาสขà¸à¸‡à¹‚ปรà¹à¸à¸£à¸¡" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Invalid name. Must not collide with an existing buit-in type name." msgstr "ชื่à¸à¸œà¸´à¸”พลาด ต้à¸à¸‡à¹„ม่ใช้ชื่à¸à¹€à¸”ียวà¸à¸±à¸šà¸Šà¸™à¸´à¸”ตัวà¹à¸›à¸£" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Invalid name. Must not collide with an existing global constant name." msgstr "ชื่à¸à¸œà¸´à¸”พลาด ต้à¸à¸‡à¹„ม่ใช้ชื่à¸à¹€à¸”ียวà¸à¸±à¸šà¸„่าคงที่" @@ -1064,42 +985,34 @@ msgid "Invalid Path." msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸œà¸´à¸”พลาด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "File does not exist." msgstr "ไม่พบไฟล์" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Not in resource path." msgstr "ไม่à¸à¸¢à¸¹à¹ˆà¹ƒà¸™à¹‚ฟลเดà¸à¸£à¹Œà¸£à¸µà¸‹à¸à¸£à¹Œà¸ª" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Add AutoLoad" msgstr "เพิ่มà¸à¸à¹‚ต้โหลด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Autoload '%s' already exists!" msgstr "มีà¸à¸à¹‚ต้โหลด '%s' à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§!" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Rename Autoload" -msgstr "à¹à¸à¹‰à¹„ขชื่à¸à¸à¸à¹‚ต้โหลด" +msgstr "เปลี่ยนชื่à¸à¸à¸à¹‚ต้โหลด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Toggle AutoLoad Globals" -msgstr "เปิดปิดà¸à¸à¹‚ต้โหลด" +msgstr "เปิด/ปิดซิงเà¸à¸´à¸¥à¸•ัน" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Move Autoload" -msgstr "ย้ายà¸à¸à¹‚ต้โหลด" +msgstr "เลื่à¸à¸™à¸à¸à¹‚ต้โหลด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Remove Autoload" msgstr "ลบà¸à¸à¹‚ต้โหลด" @@ -1108,19 +1021,15 @@ msgid "Enable" msgstr "เปิด" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Rearrange Autoloads" msgstr "จัดลำดับà¸à¸à¹‚ต้โหลด" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡:" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Node Name:" msgstr "ชื่à¸à¹‚หนด:" @@ -1131,16 +1040,14 @@ msgid "Name" msgstr "ชื่à¸" #: editor/editor_autoload_settings.cpp -#, fuzzy msgid "Singleton" -msgstr "สคริปต์เดี่ยว" +msgstr "ซิงเà¸à¸´à¸¥à¸•ัน" #: editor/editor_autoload_settings.cpp msgid "List:" msgstr "รายชื่à¸:" #: editor/editor_data.cpp -#, fuzzy msgid "Updating Scene" msgstr "à¸à¸±à¸žà¹€à¸”ทฉาà¸" @@ -1149,18 +1056,15 @@ msgid "Storing local changes.." msgstr "เà¸à¹‡à¸šà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ ายใน.." #: editor/editor_data.cpp -#, fuzzy msgid "Updating scene.." msgstr "à¸à¸±à¸žà¹€à¸”ทฉาà¸.." #: editor/editor_dir_dialog.cpp -#, fuzzy msgid "Choose a Directory" msgstr "เลืà¸à¸à¹‚ฟลเดà¸à¸£à¹Œ" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Create Folder" msgstr "สร้างโฟลเดà¸à¸£à¹Œ" @@ -1172,7 +1076,6 @@ msgstr "ชื่à¸:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Could not create folder." msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œ" @@ -1190,7 +1093,7 @@ msgstr "à¸à¸³à¸¥à¸±à¸‡à¸£à¸§à¸šà¸£à¸§à¸¡" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸š:\n" #: editor/editor_export.cpp msgid "Added:" @@ -1209,7 +1112,6 @@ msgid "Could not save atlas subtexture:" msgstr "บันทึภtexture ย่à¸à¸¢à¸‚à¸à¸‡ atlas ไม่ได้:" #: editor/editor_export.cpp -#, fuzzy msgid "Exporting for %s" msgstr "ส่งà¸à¸à¸à¸ªà¸³à¸«à¸£à¸±à¸š %s" @@ -1218,17 +1120,14 @@ msgid "Setting Up.." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸•ั้งค่า.." #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "File Exists, Overwrite?" -msgstr "มีไฟล์นี้à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ เขียนทับ?" +msgstr "มีไฟล์นี้à¸à¸¢à¸¹à¹ˆà¹à¸¥à¹‰à¸§ จะเขียนทับหรืà¸à¹„ม่?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "All Recognized" msgstr "ทุà¸à¸™à¸²à¸¡à¸ªà¸¸à¸à¸¥à¸—ี่รู้จัà¸" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "All Files (*)" msgstr "ทุà¸à¹„ฟล์ (*)" @@ -1261,39 +1160,35 @@ msgid "Go Up" msgstr "ขึ้นบน" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Refresh" msgstr "รีเฟรช" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Toggle Hidden Files" -msgstr "เปิด/ปิด ไฟล์ที่ซ่à¸à¸™" +msgstr "เปิด/ปิดไฟล์ที่ซ่à¸à¸™" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Toggle Favorite" -msgstr "เลืà¸à¸/ลบ ที่ชื่นชà¸à¸š" +msgstr "เลืà¸à¸/ลบโฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸š" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Toggle Mode" msgstr "สลับโหมด" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Focus Path" -msgstr "" +msgstr "à¹à¸à¹‰à¹„ขตำà¹à¸«à¸™à¹ˆà¸‡" #: editor/editor_file_dialog.cpp msgid "Move Favorite Up" -msgstr "เลื่à¸à¸™à¸—ี่ชื่นชà¸à¸šà¸‚ึ้น" +msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸‚ึ้น" #: editor/editor_file_dialog.cpp msgid "Move Favorite Down" -msgstr "เลื่à¸à¸™à¸—ี่ชื่นชà¸à¸šà¸¥à¸‡" +msgstr "เลื่à¸à¸™à¹‚ฟลเดà¸à¸£à¹Œà¸—ี่ชà¸à¸šà¸¥à¸‡" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Directories & Files:" msgstr "ไฟล์à¹à¸¥à¸°à¹‚ฟลเดà¸à¸£à¹Œ:" @@ -1307,12 +1202,10 @@ msgid "File:" msgstr "ไฟล์:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Filter:" msgstr "ตัวà¸à¸£à¸à¸‡:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Must use a valid extension." msgstr "นามสà¸à¸¸à¸¥à¹„ฟล์ไม่ถูà¸à¸•้à¸à¸‡" @@ -1321,11 +1214,11 @@ msgid "ScanSources" msgstr "" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" msgstr "นำเข้าà¸à¸µà¸à¸„รั้ง" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "ค้นหาในคู่มืà¸" @@ -1342,7 +1235,6 @@ msgid "Class:" msgstr "คลาส:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "สืบทà¸à¸”จาà¸:" @@ -1355,9 +1247,8 @@ msgid "Brief Description:" msgstr "รายละเà¸à¸µà¸¢à¸”:" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Members:" -msgstr "สมาชิà¸:" +msgstr "ตัวà¹à¸›à¸£:" #: editor/editor_help.cpp msgid "Public Methods:" @@ -1366,10 +1257,9 @@ msgstr "เมท็à¸à¸”:" #: editor/editor_help.cpp #, fuzzy msgid "GUI Theme Items:" -msgstr "ธีม:" +msgstr "ธีมหน้าต่าง:" #: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Signals:" msgstr "สัà¸à¸à¸²à¸“:" @@ -1378,31 +1268,27 @@ msgid "Constants:" msgstr "ค่าคงที่:" #: editor/editor_help.cpp -#, fuzzy msgid "Property Description:" msgstr "รายละเà¸à¸µà¸¢à¸”ตัวà¹à¸›à¸£:" #: editor/editor_help.cpp -#, fuzzy msgid "Method Description:" msgstr "รายละเà¸à¸µà¸¢à¸”เมท็à¸à¸”:" #: editor/editor_help.cpp -#, fuzzy msgid "Search Text" msgstr "ค้นหาคำ" #: editor/editor_log.cpp msgid " Output:" -msgstr " เà¸à¸²à¸—์พุต:" +msgstr " ข้à¸à¸„วาม:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/rich_text_editor_plugin.cpp editor/property_editor.cpp #: editor/script_editor_debugger.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp -#, fuzzy msgid "Clear" -msgstr "ลบทั้งหมด" +msgstr "ลบ" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/resources_dock.cpp @@ -1444,10 +1330,9 @@ msgid "Creating Thumbnail" msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡à¸£à¸¹à¸›à¸•ัวà¸à¸¢à¹ˆà¸²à¸‡" #: editor/editor_node.cpp -#, fuzzy msgid "" "Couldn't save scene. Likely dependencies (instances) couldn't be satisfied." -msgstr "บันทึà¸à¸‰à¸²à¸à¹„ม่ได้" +msgstr "บันทึà¸à¸‰à¸²à¸à¹„ม่ได้ à¸à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¹„ม่สมบูรณ์" #: editor/editor_node.cpp msgid "Failed to load resource." @@ -1470,32 +1355,26 @@ msgid "Error saving TileSet!" msgstr "ผิดพลาดขณะบันทึภTileSet!" #: editor/editor_node.cpp -#, fuzzy msgid "Error trying to save layout!" msgstr "ผิดพลาดขณะบันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์!" #: editor/editor_node.cpp -#, fuzzy msgid "Default editor layout overridden." msgstr "à¹à¸—นที่เลย์เà¸à¸²à¸•์เริ่มต้น" #: editor/editor_node.cpp -#, fuzzy msgid "Layout name not found!" msgstr "ไม่พบชื่à¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์!" #: editor/editor_node.cpp -#, fuzzy msgid "Restored default layout to base settings." -msgstr "คืนà¸à¸¥à¸±à¸šà¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์เป็นค่าเริ่มต้น" +msgstr "คืนเลย์เà¸à¸²à¸•์เป็นค่าเริ่มต้น" #: editor/editor_node.cpp -#, fuzzy msgid "Copy Params" msgstr "คัดลà¸à¸à¸•ัวà¹à¸›à¸£" #: editor/editor_node.cpp -#, fuzzy msgid "Paste Params" msgstr "วางตัวà¹à¸›à¸£" @@ -1508,7 +1387,6 @@ msgid "Copy Resource" msgstr "คัดลà¸à¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ª" #: editor/editor_node.cpp -#, fuzzy msgid "Make Built-In" msgstr "à¸à¸±à¸‡" @@ -1521,18 +1399,18 @@ msgid "Open in Help" msgstr "เปิดในคู่มืà¸" #: editor/editor_node.cpp -#, fuzzy msgid "There is no defined scene to run." msgstr "ไม่ได้à¸à¸³à¸«à¸™à¸”ฉาà¸à¹€à¸£à¸´à¹ˆà¸¡à¸•้น" #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" -"ยังไม่ได้à¸à¸³à¸«à¸™à¸”ฉาà¸à¹€à¸£à¸´à¹ˆà¸¡à¸•้น à¸à¸³à¸«à¸™à¸”ตà¸à¸™à¸™à¸µà¹‰?\n" -"สามารถเปลี่ยนได้ภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" หัวข้à¸à¸¢à¹ˆà¸à¸¢ 'application'" +"ยังไม่ได้à¸à¸³à¸«à¸™à¸”ฉาà¸à¹€à¸£à¸´à¹ˆà¸¡à¸•้น à¸à¸³à¸«à¸™à¸”ตà¸à¸™à¸™à¸µà¹‰à¸«à¸£à¸·à¸à¹„ม่?\n" +"สามารถà¹à¸à¹‰à¹„ขภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" ใต้หัวข้ภ'application'" #: editor/editor_node.cpp msgid "" @@ -1540,8 +1418,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"ไม่มีฉาภ'%s' ที่เลืà¸à¸à¹„ว้ เลืà¸à¸à¹ƒà¸«à¸¡à¹ˆà¸•à¸à¸™à¸™à¸µà¹‰?\n" -"สามารถเปลี่ยนได้ภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" หัวข้à¸à¸¢à¹ˆà¸à¸¢ 'application'" +"ไม่มีฉาภ'%s' ที่เลืà¸à¸à¹„ว้ เลืà¸à¸à¹ƒà¸«à¸¡à¹ˆà¸•à¸à¸™à¸™à¸µà¹‰à¸«à¸£à¸·à¸à¹„ม่?\n" +"สามารถà¹à¸à¹‰à¹„ขภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" ใต้หัวข้ภ'application'" #: editor/editor_node.cpp msgid "" @@ -1549,8 +1427,8 @@ msgid "" "You can change it later in \"Project Settings\" under the 'application' " "category." msgstr "" -"'%s' ไม่ใช่ไฟล์ฉาภเลืà¸à¸à¹ƒà¸«à¸¡à¹ˆà¸•à¸à¸™à¸™à¸µà¹‰?\n" -"สามารถเปลี่ยนได้ภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" หัวข้à¸à¸¢à¹ˆà¸à¸¢ 'application'" +"'%s' ไม่ใช่ไฟล์ฉาภเลืà¸à¸à¹ƒà¸«à¸¡à¹ˆà¸•à¸à¸™à¸™à¸µà¹‰à¸«à¸£à¸·à¸à¹„ม่?\n" +"สามารถà¹à¸à¹‰à¹„ขภายหลังที่ \"ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์\" ใต้หัวข้ภ'application'" #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." @@ -1558,7 +1436,7 @@ msgstr "ฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¸¢à¸±à¸‡à¹„ม่ได้บันท #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "ไม่สามารถเริ่มขั้นตà¸à¸™à¸¢à¹ˆà¸à¸¢!" #: editor/editor_node.cpp msgid "Open Scene" @@ -1569,12 +1447,10 @@ msgid "Open Base Scene" msgstr "เปิดไฟล์ฉาà¸à¸—ี่ใช้สืบทà¸à¸”" #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open Scene.." msgstr "เปิดไฟล์ฉาà¸à¸”่วน.." #: editor/editor_node.cpp -#, fuzzy msgid "Quick Open Script.." msgstr "เปิดไฟล์สคริปต์ด่วน.." @@ -1591,6 +1467,11 @@ msgid "Save Scene As.." msgstr "บันทึà¸à¸‰à¸²à¸à¹€à¸›à¹‡à¸™.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "โหนด" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "ฉาà¸à¸™à¸µà¹‰à¸¢à¸±à¸‡à¹„ม่ได้บันทึภบันทึà¸à¸à¹ˆà¸à¸™à¹€à¸£à¸´à¹ˆà¸¡?" @@ -1607,7 +1488,6 @@ msgid "Quit" msgstr "à¸à¸à¸" #: editor/editor_node.cpp -#, fuzzy msgid "Exit the editor?" msgstr "à¸à¸à¸à¹‚ปรà¹à¸à¸£à¸¡?" @@ -1620,12 +1500,10 @@ msgid "Can't reload a scene that was never saved." msgstr "ฉาà¸à¸¢à¸±à¸‡à¹„ม่ได้บันทึภไม่สามารถโหลดใหม่ได้" #: editor/editor_node.cpp -#, fuzzy msgid "Revert" msgstr "คืนà¸à¸¥à¸±à¸š" #: editor/editor_node.cpp -#, fuzzy msgid "This action cannot be undone. Revert anyway?" msgstr "à¸à¸²à¸£à¸„ืนà¸à¸¥à¸±à¸šà¹„ม่สามารถยà¸à¹€à¸¥à¸´à¸à¹„ด้ คืนà¸à¸¥à¸±à¸š?" @@ -1650,11 +1528,13 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"ฉาภ'%s' ถูà¸à¸™à¸³à¹€à¸‚้าโดยà¸à¸±à¸•โนมัติจึงไม่สามารถถูà¸à¹à¸à¹‰à¹„ข\n" +"สามารถสืบทà¸à¸”ไปยังฉาà¸à¹ƒà¸«à¸¡à¹ˆà¹€à¸žà¸·à¹ˆà¸à¸—ำà¸à¸²à¸£à¹à¸à¹‰à¹„ข" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" -msgstr "เà¸à¹ˆà¸à¸°" +msgstr "เà¸à¸à¸°" #: editor/editor_node.cpp msgid "" @@ -1673,12 +1553,10 @@ msgid "Scene '%s' has broken dependencies:" msgstr "ฉาภ'%s' มีà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¸ªà¸¹à¸à¸«à¸²à¸¢:" #: editor/editor_node.cpp -#, fuzzy msgid "Save Layout" msgstr "บันทึà¸à¹€à¸¥à¸¢à¹Œà¹€à¸à¸²à¸•์" #: editor/editor_node.cpp -#, fuzzy msgid "Delete Layout" msgstr "ลบเลย์เà¸à¸²à¸•์" @@ -1687,17 +1565,18 @@ msgid "Switch Scene Tab" msgstr "สลับฉาà¸" #: editor/editor_node.cpp -#, fuzzy msgid "%d more file(s)" msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์" #: editor/editor_node.cpp -#, fuzzy msgid "%d more file(s) or folder(s)" msgstr "à¹à¸¥à¸°à¸à¸µà¸ %d ไฟล์หรืà¸à¹‚ฟลเดà¸à¸£à¹Œ" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp -#, fuzzy msgid "Scene" msgstr "ฉาà¸" @@ -1706,19 +1585,16 @@ msgid "Go to previously opened scene." msgstr "ไปยังฉาà¸à¸—ี่เพิ่งเปิด" #: editor/editor_node.cpp -#, fuzzy msgid "Next tab" msgstr "à¹à¸—็บต่à¸à¹„ป" #: editor/editor_node.cpp -#, fuzzy msgid "Previous tab" msgstr "à¹à¸—็บà¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "à¸à¸£à¸à¸‡à¹„ฟล์ด่วน.." +msgstr "คัดà¸à¸£à¸à¸‡à¹„ฟล์.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1752,7 +1628,7 @@ msgstr "ปิดไฟล์ฉาà¸" msgid "Close Goto Prev. Scene" msgstr "ปิดไปยังฉาà¸à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "เปิดไฟล์ล่าสุด" @@ -1762,105 +1638,59 @@ msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™.." #: editor/editor_node.cpp msgid "MeshLibrary.." -msgstr "M" +msgstr "MeshLibrary.." #: editor/editor_node.cpp msgid "TileSet.." -msgstr "" +msgstr "TileSet.." #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp -#, fuzzy msgid "Undo" msgstr "เลิà¸à¸—ำ" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp -#, fuzzy msgid "Redo" msgstr "ทำซ้ำ" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "รันสคริปต์" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "คืนà¸à¸¥à¸±à¸šà¸‰à¸²à¸" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "ปิดà¹à¸¥à¸°à¸à¸¥à¸±à¸šà¸ªà¸¹à¹ˆà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¹‚ปรเจà¸à¸•์" +msgid "Miscellaneous project or scene-wide tools." +msgstr "โปรเจà¸à¸•์à¹à¸¥à¸°à¹€à¸„รื่à¸à¸‡à¸¡à¸·à¸à¸à¸·à¹ˆà¸™ ๆ" #: editor/editor_node.cpp #, fuzzy -msgid "Distraction Free Mode" -msgstr "โหมดไร้สิ่งรบà¸à¸§à¸™" - -#: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." -msgstr "" +msgid "Project" +msgstr "โปรเจà¸à¸•์ใหม่" #: editor/editor_node.cpp -msgid "Tools" -msgstr "เครื่à¸à¸‡à¸¡à¸·à¸" +msgid "Project Settings" +msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์ไปยังà¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¸•่าง ๆ" +msgid "Run Script" +msgstr "รันสคริปต์" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "ส่งà¸à¸à¸" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "เล่นโปรเจà¸à¸•์" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "เล่น" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "หยุดชั่วคราว" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "หยุดชั่วคราว" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "หยุด" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "หยุด" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "เล่นฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "เล่น" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "เลืà¸à¸à¹€à¸¥à¹ˆà¸™à¸‰à¸²à¸" +msgid "Tools" +msgstr "เครื่à¸à¸‡à¸¡à¸·à¸" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "เลืà¸à¸à¹€à¸¥à¹ˆà¸™à¸‰à¸²à¸" +msgid "Quit to Project List" +msgstr "ปิดà¹à¸¥à¸°à¸à¸¥à¸±à¸šà¸ªà¸¹à¹ˆà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸à¹‚ปรเจà¸à¸•์" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "ตัวเลืà¸à¸à¸”ีบัค" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "ดีบัค" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1885,10 +1715,9 @@ msgid "" "On Android, deploy will use the USB cable for faster performance. This " "option speeds up testing for games with a large footprint." msgstr "" -"ถ้าเปิดตัวเลืà¸à¸à¸™à¸µà¹‰ โปรà¹à¸à¸£à¸¡à¸—ี่ส่งà¸à¸à¸à¸ˆà¸°à¸¡à¸µà¸‚นาดเล็à¸\n" -"ระบบไฟล์จะà¸à¸¢à¸¹à¹ˆà¸šà¸™à¹€à¸„รืà¸à¸‚่าย\n" -"บน Android à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¸ˆà¸°à¹ƒà¸Šà¹‰ USB เพื่à¸à¸›à¸£à¸°à¸ªà¸´à¸—ธิภาพที่ดีà¸à¸§à¹ˆà¸² " -"ตัวเลืà¸à¸à¸™à¸µà¹‰à¸ˆà¸°à¸Šà¹ˆà¸§à¸¢à¹ƒà¸™à¸à¸²à¸£à¸—ดสà¸à¸šà¹€à¸à¸¡à¸—ี่มีขนาดใหà¸à¹ˆ" +"ถ้าเปิดตัวเลืà¸à¸à¸™à¸µà¹‰ ตัวเà¸à¸¡à¸—ี่ส่งà¸à¸à¸à¸ˆà¸°à¸¡à¸µà¸‚นาดà¹à¸„่พà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ด้\n" +"ตัวเà¸à¸¡à¸ˆà¸°à¹„ด้รับระบบไฟล์จาà¸à¹‚ปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ขผ่านเครืà¸à¸‚่าย\n" +"à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸à¸šà¸™ Android จะใช้สาย USB เพื่à¸à¹ƒà¸«à¹‰à¹€à¸£à¹‡à¸§à¸‚ึ้น ตัวเลืà¸à¸à¸™à¸µà¹‰à¸ˆà¸°à¸Šà¹ˆà¸§à¸¢à¹ƒà¸™à¸à¸²à¸£à¸—ดสà¸à¸šà¹€à¸à¸¡à¸—ี่มีขนาดใหà¸à¹ˆ" #: editor/editor_node.cpp msgid "Visible Collision Shapes" @@ -1925,7 +1754,6 @@ msgstr "" "เมื่à¸à¹ƒà¸Šà¹‰à¸à¸±à¸šà¸à¸¸à¸›à¸à¸£à¸“์à¹à¸šà¸šà¸£à¸µà¹‚มท จะดีà¸à¸§à¹ˆà¸²à¸–้าเปิดระบบไฟล์เครืà¸à¸‚่ายด้วย" #: editor/editor_node.cpp -#, fuzzy msgid "Sync Script Changes" msgstr "ซิงค์à¸à¸²à¸£à¹à¸à¹‰à¹„ขสคริปต์" @@ -1939,9 +1767,10 @@ msgstr "" "เมื่à¸à¹€à¸›à¸´à¸”ตัวเลืà¸à¸à¸™à¸µà¹‰ สคริปต์ที่บันทึà¸à¸ˆà¸°à¹‚หลดในเà¸à¸¡à¸—ันที\n" "ถ้าใช้à¸à¸±à¸šà¸à¸¸à¸›à¸à¸£à¸“์รีโมท จะดีà¸à¸§à¹ˆà¸²à¸–้าเปิดระบบไฟล์เครืà¸à¸‚่ายด้วย" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "ตัวเลืà¸à¸" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "à¹à¸à¹‰à¹„ข" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1956,21 +1785,75 @@ msgid "Toggle Fullscreen" msgstr "สลับเต็มจà¸" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลดà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "คลาส" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy +msgid "Online Docs" +msgstr "ปิดคู่มืà¸" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "เตืà¸à¸™à¹€à¸¡à¸·à¹ˆà¸à¸¡à¸µà¸à¸²à¸£à¹à¸à¹‰à¹„ขรีซà¸à¸£à¹Œà¸ªà¸ ายนà¸à¸" +msgid "Play the project." +msgstr "เล่นโปรเจà¸à¸•์" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "เล่น" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "หยุดชั่วคราว" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "หยุดชั่วคราว" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "หยุด" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "หยุด" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "เล่นฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "เล่น" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "เลืà¸à¸à¹€à¸¥à¹ˆà¸™à¸‰à¸²à¸" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "เลืà¸à¸à¹€à¸¥à¹ˆà¸™à¸‰à¸²à¸" #: editor/editor_node.cpp -#, fuzzy msgid "Spins when the editor window repaints!" msgstr "หมุนเมื่à¸à¸¡à¸µà¸à¸²à¸£à¸§à¸²à¸”หน้าต่างโปรà¹à¸à¸£à¸¡à¹ƒà¸«à¸¡à¹ˆ!" @@ -1988,7 +1871,7 @@ msgstr "ปิดà¸à¸²à¸£à¸à¸±à¸žà¹€à¸”ทตัวหมุน" #: editor/editor_node.cpp msgid "Inspector" -msgstr "ตัวตรวจสà¸à¸š" +msgstr "คุณสมบัติ" #: editor/editor_node.cpp msgid "Create a new resource in memory and edit it." @@ -2031,7 +1914,6 @@ msgid "Node" msgstr "โหนด" #: editor/editor_node.cpp -#, fuzzy msgid "Output" msgstr "เà¸à¸²à¸—์พุต" @@ -2052,6 +1934,14 @@ msgid "Thanks!" msgstr "ขà¸à¸šà¸„ุณ!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "นำเข้าà¹à¸¡à¹ˆà¹à¸šà¸šà¸ˆà¸²à¸à¹„ฟล์ ZIP" @@ -2060,7 +1950,6 @@ msgid "Export Project" msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์" #: editor/editor_node.cpp -#, fuzzy msgid "Export Library" msgstr "ส่งà¸à¸à¸à¹„ลบรารี" @@ -2080,6 +1969,36 @@ msgstr "เปิดà¹à¸¥à¸°à¸£à¸±à¸™à¸ªà¸„ริปต์" msgid "Load Errors" msgstr "โหลดผิดพลาด" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "ส่งà¸à¸à¸à¹„ลบรารี" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "เปิดในโปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ข" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "ปลั๊à¸à¸à¸´à¸™à¸—ี่ติดตั้งà¹à¸¥à¹‰à¸§:" @@ -2170,7 +2089,7 @@ msgstr "สร้างà¸à¸´à¸™à¸ªà¹à¸•นซ์ขà¸à¸‡à¸ªà¸„ริปต์ #: editor/editor_run_script.cpp msgid "Did you forget the 'tool' keyword?" -msgstr "ลืมคีย์เวิร์ด 'tool' หรืà¸à¹€à¸›à¸¥à¹ˆà¸²?" +msgstr "ลืมคีย์เวิร์ด 'tool' หรืà¸à¹„ม่?" #: editor/editor_run_script.cpp msgid "Couldn't run script:" @@ -2178,7 +2097,7 @@ msgstr "รันสคริปต์ไม่ได้:" #: editor/editor_run_script.cpp msgid "Did you forget the '_run' method?" -msgstr "ลืมใส่เมท็à¸à¸” '_run' หรืà¸à¹€à¸›à¸¥à¹ˆà¸²?" +msgstr "ลืมใส่เมท็à¸à¸” '_run' หรืà¸à¹„ม่?" #: editor/editor_settings.cpp msgid "Default (Same as Editor)" @@ -2197,37 +2116,32 @@ msgid "Import From Node:" msgstr "นำเข้าจาà¸à¹‚หนด:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "โหลดใหม่" +msgstr "ดาวน์โหลดà¸à¸µà¸à¸„รั้ง" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "ติดตั้ง" +msgstr "ถà¸à¸™à¸à¸²à¸£à¸•ิดตั้ง" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "ติดตั้ง" +msgstr "(ติดตั้งà¹à¸¥à¹‰à¸§)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "ลง" +msgstr "ดาวน์โหลด" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(ไม่พบ)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "ปัจจุบัน:" +msgstr "(ปัจจุบัน)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸šà¸£à¸¸à¹ˆà¸™ '%s'?" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2235,22 +2149,22 @@ msgstr "เปิดไฟล์ zip à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸à¹„มà #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "รูปà¹à¸šà¸šà¸‚à¸à¸‡ version.txt ในà¹à¸¡à¹ˆà¹à¸šà¸šà¹„ม่ถูà¸à¸•้à¸à¸‡" #: editor/export_template_manager.cpp +#, fuzzy msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." -msgstr "" +msgstr "รูปà¹à¸šà¸šà¸‚à¸à¸‡ version.txt ในà¹à¸¡à¹ˆà¹à¸šà¸šà¹„ม่ถูà¸à¸•้à¸à¸‡" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "ไม่พบ version.txt ในà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "ผิดพลาดขณะบันทึภatlas:" +msgstr "ผิดพลาดขณะสร้างตำà¹à¸«à¸™à¹ˆà¸‡à¹à¸¡à¹ˆà¹à¸šà¸š:\n" #: editor/export_template_manager.cpp #, fuzzy @@ -2266,34 +2180,28 @@ msgid "Loading Export Templates" msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลดà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "ฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™" +msgstr "รุ่นปัจจุบัน:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "ปลั๊à¸à¸à¸´à¸™à¸—ี่ติดตั้งà¹à¸¥à¹‰à¸§:" +msgstr "รุ่นที่ติดตั้งà¹à¸¥à¹‰à¸§:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "ติดตั้งโปรเจà¸à¸•์:" +msgstr "ติดตั้งไฟล์à¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "ลบไà¸à¹€à¸—ม" +msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "ลบไฟล์ที่เลืà¸à¸?" +msgstr "เลืà¸à¸à¹„ฟล์à¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "à¸à¸³à¸¥à¸±à¸‡à¹‚หลดà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" +msgstr "จัดà¸à¸²à¸£à¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2301,7 +2209,7 @@ msgstr "เปิดไฟล์ file_type_cache.cch เพื่à¸à¹€à¸‚ีย #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "ไม่สามารถไปยัง '" #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2329,11 +2237,15 @@ msgstr "ไม่ได้เลืà¸à¸à¹„ฟล์ไว้!" #: editor/filesystem_dock.cpp msgid "Expand all" -msgstr "" +msgstr "ขยายโฟลเดà¸à¸£à¹Œ" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "ยุบโฟลเดà¸à¸£à¹Œ" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2364,10 +2276,6 @@ msgid "Info" msgstr "ข้à¸à¸¡à¸¹à¸¥" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "à¹à¸ªà¸”งในตัวจัดà¸à¸²à¸£à¹„ฟล์" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "นำเข้าà¸à¸µà¸à¸„รั้ง.." @@ -2445,23 +2353,20 @@ msgid "Saving.." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸šà¸±à¸™à¸—ึà¸.." #: editor/import_dock.cpp -#, fuzzy msgid " Files" -msgstr "ไฟล์" +msgstr " ไฟล์" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "นำเข้า" +msgstr "นำเข้าเป็น:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." -msgstr "" +msgstr "à¹à¸šà¸š.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" -msgstr "นำเข้าà¸à¸µà¸à¸„รั้ง" +msgstr "นำเข้าใหม่" #: editor/io_plugins/editor_bitmask_import_plugin.cpp msgid "No bit masks to import!" @@ -2534,9 +2439,10 @@ msgid "No target font resource!" msgstr "ไม่ได้เลืà¸à¸à¸§à¹ˆà¸²à¸ˆà¸°à¸™à¸³à¹€à¸‚้ามาเป็นไฟล์ฟà¸à¸™à¸•์ชื่à¸à¸à¸°à¹„ร!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "นามสà¸à¸¸à¸¥à¹„ม่ถูà¸à¸•้à¸à¸‡\n" "à¸à¸£à¸¸à¸“าใช้ .fnt" @@ -2597,7 +2503,6 @@ msgstr "ผิดพลาดขณะเริ่มต้น FreeType" #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Unknown font format." msgstr "ไม่ทราบประเภทขà¸à¸‡à¸Ÿà¸à¸™à¸•์" @@ -2608,7 +2513,6 @@ msgstr "ผิดพลาดขณะโหลดฟà¸à¸™à¸•์" #: editor/io_plugins/editor_font_import_plugin.cpp #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Invalid font size." msgstr "ขนาดฟà¸à¸™à¸•์ผิดพลาด" @@ -2750,7 +2654,7 @@ msgstr "สคริปต์หลังประมวลผล:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Custom Root Node Type:" -msgstr "ชนิดโหนดราà¸à¸à¸³à¸«à¸™à¸”เà¸à¸‡:" +msgstr "ประเภทโหนดราà¸à¸à¸³à¸«à¸™à¸”เà¸à¸‡:" #: editor/io_plugins/editor_scene_import_plugin.cpp msgid "Auto" @@ -3017,8 +2921,8 @@ msgstr "บีบà¸à¸±à¸”" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" -msgstr "เพิ่มเข้าโปรเจà¸à¸•์ (engine.cfg)" +msgid "Add to Project (project.godot)" +msgstr "เพิ่มเข้าโปรเจà¸à¸•์ (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" @@ -3057,9 +2961,8 @@ msgid "Change Animation Name:" msgstr "เปลี่ยนชื่à¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "ทำซ้ำà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" +msgstr "ลบà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™?" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3146,7 +3049,7 @@ msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™ (วินาที)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "" +msgstr "ปรับà¸à¸±à¸•ราส่วนเวลาทุà¸à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™à¸‚à¸à¸‡à¹‚หนด" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Create new animation in player." @@ -3224,7 +3127,7 @@ msgstr "ชื่à¸à¹ƒà¸«à¸¡à¹ˆ:" #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/multimesh_editor_plugin.cpp msgid "Scale:" -msgstr "" +msgstr "à¸à¸±à¸•ราส่วน:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Fade In (s):" @@ -3236,15 +3139,16 @@ msgstr "เฟดà¸à¸à¸ (วิ):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend" -msgstr "" +msgstr "ผสม" #: editor/plugins/animation_tree_editor_plugin.cpp +#, fuzzy msgid "Mix" -msgstr "" +msgstr "ร่วม" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Auto Restart:" -msgstr "" +msgstr "เริ่มใหม่à¸à¸±à¸•โนมัติ:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Restart (s):" @@ -3265,19 +3169,19 @@ msgstr "จำนวน:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend:" -msgstr "" +msgstr "ผสม:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 0:" -msgstr "" +msgstr "ผสม 0:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend 1:" -msgstr "" +msgstr "ผสม 1:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "" +msgstr "ระยะเวลาเฟด (วินาที):" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Current:" @@ -3285,7 +3189,7 @@ msgstr "ปัจจุบัน:" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Add Input" -msgstr "" +msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Clear Auto-Advance" @@ -3297,7 +3201,7 @@ msgstr "" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Delete Input" -msgstr "" +msgstr "ลบà¸à¸´à¸™à¸žà¸¸à¸•" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Rename" @@ -3317,31 +3221,31 @@ msgstr "โหนดà¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "OneShot Node" -msgstr "" +msgstr "โหนด OneShot" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Mix Node" -msgstr "" +msgstr "โหนด Mix" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend2 Node" -msgstr "" +msgstr "โหนด Blend2" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend3 Node" -msgstr "" +msgstr "โหนด Blend3" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Blend4 Node" -msgstr "" +msgstr "โหนด Blend4" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeScale Node" -msgstr "" +msgstr "โหนดà¸à¸±à¸•ราส่วนเวลา" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "" +msgstr "โหนด TimeSeek" #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Transition Node" @@ -3473,7 +3377,7 @@ msgstr "วางท่าทาง" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Select Mode" -msgstr "เลืà¸à¸à¹‚หมด" +msgstr "โหมดเลืà¸à¸" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Drag: Rotate" @@ -3488,7 +3392,6 @@ msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)." msgstr "à¸à¸” 'v' เพื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸ˆà¸¸à¸”หมุน 'Shift+v' เพื่à¸à¸¥à¸²à¸à¸ˆà¸¸à¸”หมุน" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+RMB: Depth list selection" msgstr "Alt+คลิà¸à¸‚วา: เลืà¸à¸à¸—ี่ซ้à¸à¸™à¸à¸±à¸™" @@ -3518,12 +3421,10 @@ msgid "Pan Mode" msgstr "โหมดมุมมà¸à¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Lock the selected object in place (can't be moved)." msgstr "ล็à¸à¸„ไม่ให้วัตถุที่เลืà¸à¸à¸¢à¹‰à¸²à¸¢à¸•ำà¹à¸«à¸™à¹ˆà¸‡" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Unlock the selected object (can be moved)." msgstr "ปลดล็à¸à¸„วัตถุที่เลืà¸à¸" @@ -3572,7 +3473,7 @@ msgstr "ใช้ Snap พิà¸à¹€à¸‹à¸¥" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Expand to Parent" -msgstr "" +msgstr "ขยายให้เต็มโหนดà¹à¸¡à¹ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton.." @@ -3684,7 +3585,7 @@ msgid "Change default type" msgstr "เปลี่ยนประเภท" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "ตà¸à¸¥à¸‡" @@ -3735,19 +3636,6 @@ msgstr "à¹à¸à¹‰à¹„ขรูปหลายเหลี่ยม 3D" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#, fuzzy -msgid "Add/Remove Color Ramp Point" -msgstr "เพิ่ม/ลบตำà¹à¸«à¸™à¹ˆà¸‡à¸ªà¸µ" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -#, fuzzy -msgid "Modify Color Ramp" -msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹„ล่สี" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "à¸à¸³à¸¥à¸±à¸‡à¸ªà¸£à¹‰à¸²à¸‡ Mesh Library" @@ -3780,7 +3668,30 @@ msgstr "à¸à¸±à¸žà¹€à¸”ตจาà¸à¸‰à¸²à¸" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "เพิ่มà¸à¸´à¸™à¸žà¸¸à¸•" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "ลบจุด" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "โหลดรีซà¸à¸£à¹Œà¸ª" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" +msgstr "à¹à¸à¹‰à¹„ขเส้นโค้ง" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "เพิ่ม/ลบตำà¹à¸«à¸™à¹ˆà¸‡à¸ªà¸µ" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¹„ล่สี" #: editor/plugins/item_list_editor_plugin.cpp @@ -3820,19 +3731,16 @@ msgid "RMB: Erase Point." msgstr "คลิà¸à¸‚วา: ลบจุด" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Point from Line2D" -msgstr "ลบจุดในเส้นโค้ง" +msgstr "ลบจุดจาà¸à¹€à¸ªà¹‰à¸™" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" -msgstr "เพิ่มจุดในเส้นโค้ง" +msgstr "เพิ่มจุดในเส้น" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Move Point in Line2D" -msgstr "ย้ายจุดในเส้นโค้ง" +msgstr "ย้ายจุดในเส้น" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3844,7 +3752,7 @@ msgstr "เลืà¸à¸à¸ˆà¸¸à¸”" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp msgid "Shift+Drag: Select Control Points" -msgstr "Shift+ลาà¸: เลืà¸à¸à¸ˆà¸¸à¸”ควบคุม" +msgstr "Shift+ลาà¸: เลืà¸à¸à¹€à¸ªà¹‰à¸™à¸ªà¸±à¸¡à¸œà¸±à¸ª" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3865,9 +3773,8 @@ msgid "Add Point (in empty space)" msgstr "เพิ่มจุด (ในที่ว่าง)" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Split Segment (in line)" -msgstr "à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™ (ในเส้นโค้ง)" +msgstr "à¹à¸¢à¸à¸ªà¹ˆà¸§à¸™ (ในเส้น)" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -4056,6 +3963,20 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "สร้าง AABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "ผิดพลาดขณะโหลดรูป:" @@ -4068,8 +3989,8 @@ msgid "Set Emission Mask" msgstr "à¸à¸³à¸«à¸™à¸” Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "ลบ Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -4079,6 +4000,27 @@ msgstr "โหลด Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "เวลาเฉลี่ย (วินาที)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "à¸à¸³à¸«à¸™à¸” Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "สร้างจาà¸à¸‰à¸²à¸" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "à¸à¸³à¸«à¸™à¸” Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "โหนดไม่มี geometry" @@ -4092,11 +4034,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "สร้าง AABB" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "หน้าไม่มีพื้นที่!" @@ -4125,14 +4062,12 @@ msgid "Create Emitter" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "à¸à¸³à¸«à¸™à¸” Mask à¸à¸²à¸£à¸›à¸¥à¹ˆà¸à¸¢" +msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "%d พื้นผิว" +msgstr "" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" @@ -4151,13 +4086,18 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "สร้าง AABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "ลบจุดในเส้นโค้ง" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "เวลาเฉลี่ย (วินาที)" +msgid "Remove Out-Control from Curve" +msgstr "ลบจุดในเส้นโค้ง" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "ลบจุดในเส้นโค้ง" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4179,7 +4119,7 @@ msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp msgid "Select Control Points (Shift+Drag)" -msgstr "เลืà¸à¸à¸ˆà¸¸à¸”ควบคุม (Shift+ลาà¸)" +msgstr "เลืà¸à¸à¹€à¸ªà¹‰à¸™à¸ªà¸±à¸¡à¸œà¸±à¸ª (Shift+ลาà¸)" #: editor/plugins/path_2d_editor_plugin.cpp #: editor/plugins/path_editor_plugin.cpp @@ -4215,6 +4155,16 @@ msgstr "ตัดเส้น" msgid "Remove Path Point" msgstr "ลบจุด" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "ลบจุด" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "ลบจุด" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "สร้าง UV Map" @@ -4368,6 +4318,11 @@ msgid "Pitch" msgstr "เสียงสูงต่ำ" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "ลบà¸à¸£à¸°à¸”ูà¸" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "ผิดพลาดขณะบันทึà¸à¸˜à¸µà¸¡" @@ -4455,17 +4410,13 @@ msgstr "ค้นหา.." msgid "Find Next" msgstr "ค้นหาต่à¸à¹„ป" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "ดีบัค" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" -msgstr "" +msgstr "บรรทัดต่à¸à¹„ป" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Into" -msgstr "" +msgstr "คำสั่งต่à¸à¹„ป" #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Break" @@ -4492,16 +4443,9 @@ msgid "Move Right" msgstr "ย้ายไปขวา" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "สà¸à¸™à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "เปิด https://godotengine.org ไปยังหน้าสà¸à¸™à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "คลาส" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "ค้นหาคู่มืà¸" #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4520,9 +4464,8 @@ msgid "Go to next edited document." msgstr "ไปเà¸à¸à¸ªà¸²à¸£à¸–ัดไป" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "ไม่ต่à¸à¹€à¸™à¸·à¹ˆà¸à¸‡" +msgstr "ละทิ้ง" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4554,11 +4497,27 @@ msgid "" msgstr "สคริปต์à¸à¸±à¸‡à¸ˆà¸°à¹à¸à¹‰à¹„ขได้ต่à¸à¹€à¸¡à¸·à¹ˆà¸à¸‰à¸²à¸à¸—ี่à¸à¸±à¸‡à¸ªà¸„ริปต์นั้นถูà¸à¹€à¸›à¸´à¸”à¸à¸¢à¸¹à¹ˆ" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Pick Color" msgstr "เลืà¸à¸à¸ªà¸µ" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "à¸à¸³à¸¥à¸±à¸‡à¹à¸›à¸¥à¸‡à¸£à¸¹à¸›" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4593,9 +4552,8 @@ msgid "Indent Right" msgstr "ย่à¸à¸«à¸™à¹‰à¸²à¸‚วา" #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Toggle Comment" -msgstr "เปิดปิด ความคิดเห็น" +msgstr "เปิด/ปิด ความคิดเห็น" #: editor/plugins/script_text_editor.cpp msgid "Clone Down" @@ -4623,21 +4581,30 @@ msgstr "ย่à¸à¸«à¸™à¹‰à¸²à¸à¸±à¸•โนมัติ" #: editor/plugins/script_text_editor.cpp #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Toggle Breakpoint" -msgstr "เปิดปิดจุดพัà¸" +msgstr "เปิด/ปิด จุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡" #: editor/plugins/script_text_editor.cpp msgid "Remove All Breakpoints" -msgstr "ลบจุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡à¸—ั้งหมด" +msgstr "ลบจุดพัà¸à¸—ั้งหมด" #: editor/plugins/script_text_editor.cpp msgid "Goto Next Breakpoint" -msgstr "ไปจุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡à¸•่à¸à¹„ป" +msgstr "ไปจุดพัà¸à¸•่à¸à¹„ป" #: editor/plugins/script_text_editor.cpp msgid "Goto Previous Breakpoint" -msgstr "ไปจุดพัà¸à¹‚ปรà¹à¸à¸£à¸¡à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" +msgstr "ไปจุดพัà¸à¸à¹ˆà¸à¸™à¸«à¸™à¹‰à¸²" + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "à¹à¸›à¸¥à¸‡à¹€à¸›à¹‡à¸™.." #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -4660,6 +4627,10 @@ msgstr "ไปยังบรรทัด.." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" +msgstr "ค้นหาคำที่เลืà¸à¸à¹ƒà¸™à¸„ู่มืà¸" + +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" msgstr "" #: editor/plugins/shader_graph_editor_plugin.cpp @@ -4735,7 +4706,6 @@ msgid "Change Comment" msgstr "เปลี่ยนข้à¸à¸„ิดเห็น" #: editor/plugins/shader_graph_editor_plugin.cpp -#, fuzzy msgid "Add/Remove to Color Ramp" msgstr "เพิ่ม/ลบในà¸à¸²à¸£à¹„ล่สี" @@ -4880,36 +4850,107 @@ msgid "Animation Key Inserted." msgstr "à¹à¸—รà¸à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Align with view" +msgid "Freelook Left" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "สภาพà¹à¸§à¸”ล้à¸à¸¡" +msgid "Freelook Right" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "ตัวรับเสียง" +#, fuzzy +msgid "Freelook Forward" +msgstr "ไปหน้า" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +#, fuzzy +msgid "Freelook Backwards" +msgstr "ย้à¸à¸™à¸à¸¥à¸±à¸š" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +#, fuzzy +msgid "Freelook Down" +msgstr "ล้à¸à¹€à¸¡à¸²à¸ªà¹Œà¸¥à¸‡" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "à¸à¸±à¸žà¹€à¸”ทเมื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "à¸à¸±à¸žà¹€à¸”ทเมื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "à¸à¸±à¸žà¹€à¸”ทเมื่à¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +#, fuzzy +msgid "Vertices" +msgstr "คุณสมบัติ:" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Align with view" +msgstr "ย้ายมาที่à¸à¸¥à¹‰à¸à¸‡" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Normal" +msgstr "à¹à¸ªà¸”งปà¸à¸•ิ" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Display Wireframe" +msgstr "à¹à¸ªà¸”งโครงร่าง" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Display Overdraw" +msgstr "à¹à¸ªà¸”งà¸à¸²à¸£à¸§à¸²à¸”ซ้ำซ้à¸à¸™" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Display Unshaded" +msgstr "à¹à¸ªà¸”งà¹à¸šà¸šà¹„ร้เงา" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "สภาพà¹à¸§à¸”ล้à¸à¸¡" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "เครื่à¸à¸‡à¸¡à¸·à¸à¹€à¸„ลื่à¸à¸™à¸¢à¹‰à¸²à¸¢ 3D" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์ฉาà¸à¹„ม่ได้!" +msgid "Audio Listener" +msgstr "ตัวรับเสียง" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4957,34 +4998,46 @@ msgstr "à¹à¸—รà¸à¸„ีย์à¹à¸à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Origin" -msgstr "" +msgstr "มà¸à¸‡à¹„ปที่จุดà¸à¸³à¹€à¸™à¸´à¸”" #: editor/plugins/spatial_editor_plugin.cpp msgid "Focus Selection" -msgstr "" +msgstr "มà¸à¸‡à¸§à¸±à¸•ถุที่เลืà¸à¸" #: editor/plugins/spatial_editor_plugin.cpp msgid "Align Selection With View" -msgstr "" +msgstr "ย้ายวัตถุที่เลืà¸à¸à¸¡à¸²à¸—ี่à¸à¸¥à¹‰à¸à¸‡" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" -msgstr "" +#, fuzzy +msgid "Tool Select" +msgstr "เลืà¸à¸" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" -msgstr "พิà¸à¸±à¸”ภายใน" +#, fuzzy +msgid "Tool Move" +msgstr "ย้าย" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." -msgstr "" +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: หมุน" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "" +#, fuzzy +msgid "Tool Scale" +msgstr "à¸à¸±à¸•ราส่วน:" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform" +msgstr "เคลื่à¸à¸™à¸¢à¹‰à¸²à¸¢" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" +msgstr "พิà¸à¸±à¸”ภายใน" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -5012,22 +5065,6 @@ msgid "4 Viewports" msgstr "4 มุมมà¸à¸‡" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "à¹à¸ªà¸”งปà¸à¸•ิ" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "à¹à¸ªà¸”งเส้นà¸à¸£à¸à¸š" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "à¹à¸ªà¸”งà¹à¸šà¸šà¹„ร้เงา" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "à¹à¸ªà¸”งจุดà¸à¸³à¹€à¸™à¸´à¸”" @@ -5036,6 +5073,10 @@ msgid "View Grid" msgstr "à¹à¸ªà¸”งเส้นตาราง" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "ตัวเลืà¸à¸" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "ตั้งค่า Snap" @@ -5056,15 +5097,6 @@ msgid "Viewport Settings" msgstr "ตั้งค่ามุมมà¸à¸‡" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy -msgid "Ambient Light Color:" -msgstr "สีขà¸à¸‡à¹à¸ªà¸‡à¹‚ดยรà¸à¸š:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "FOV เพà¸à¸£à¹Œà¸ªà¹€à¸›à¸à¸—ีฟ (à¸à¸‡à¸¨à¸²):" @@ -5242,7 +5274,6 @@ msgid "Create Empty Template" msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Create Empty Editor Template" msgstr "สร้างà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸›à¸¥à¹ˆà¸²" @@ -5404,23 +5435,22 @@ msgid "Error" msgstr "ผิดพลาด" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" -msgstr "เปิด" +msgstr "รันได้" #: editor/project_export.cpp #, fuzzy msgid "Delete patch '" -msgstr "ลบเลย์เà¸à¸²à¸•์" +msgstr "ลบ '" #: editor/project_export.cpp #, fuzzy msgid "Delete preset '%s'?" -msgstr "ลบไฟล์ที่เลืà¸à¸?" +msgstr "ลบ '%s'?" #: editor/project_export.cpp msgid "Presets" -msgstr "" +msgstr "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5428,60 +5458,53 @@ msgstr "เพิ่ม.." #: editor/project_export.cpp msgid "Resources" -msgstr "" +msgstr "รีซà¸à¸£à¹Œà¸ª" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" -msgstr "นำเข้าไฟล์มายังโปรเจà¸à¸•์" +msgstr "ส่งà¸à¸à¸à¸—ุà¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¹ƒà¸™à¹‚ปรเจà¸à¸•์" #: editor/project_export.cpp msgid "Export selected scenes (and dependencies)" -msgstr "" +msgstr "ส่งà¸à¸à¸à¸‰à¸²à¸à¸—ี่เลืà¸à¸ (รวมถึงà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡)" #: editor/project_export.cpp msgid "Export selected resources (and dependencies)" -msgstr "" +msgstr "ส่งà¸à¸à¸à¸£à¸µà¸‹à¸à¸£à¹Œà¸ªà¸—ี่เลืà¸à¸ (รวมถึงà¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡)" #: editor/project_export.cpp msgid "Export Mode:" -msgstr "" +msgstr "วิธีà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸à¸à¸:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "รีซà¸à¸£à¹Œà¸ª:" +msgstr "รีซà¸à¸£à¹Œà¸ªà¸—ี่จะส่งà¸à¸à¸:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" -msgstr "ตัวà¸à¸£à¸à¸‡à¹„ฟล์ที่จะส่งà¸à¸à¸à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม (คั่นด้วยจุลภาค ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™: *.json, *.txt):" +msgstr "ตัวà¸à¸£à¸à¸‡à¹„ฟล์ที่จะส่งà¸à¸à¸à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•ิม (คั่นด้วยจุลภาค ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™: *.json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" -msgstr "ตัวà¸à¸£à¸à¸‡à¹„ฟล์ที่จะไม่ส่งà¸à¸à¸ (เช่น *.json, *.txt):" +msgstr "ตัวà¸à¸£à¸à¸‡à¹„ฟล์ที่จะไม่ส่งà¸à¸à¸ (คั่นด้วยจุลภาค ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™: *.json, *.txt)" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "พบ:" +msgstr "à¹à¸žà¸•ช์" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆ:" +msgstr "สร้างà¹à¸žà¸•ช์" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "ไม่พบà¹à¸¡à¹ˆà¹à¸šà¸šà¸ªà¹ˆà¸‡à¸à¸à¸à¸ªà¸³à¸«à¸£à¸±à¸šà¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¸™à¸µà¹‰:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "ส่งà¸à¸à¸ Tile Set" +msgstr "ส่งà¸à¸à¸à¸žà¸£à¹‰à¸à¸¡à¸•ัวดีบัค" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" @@ -5489,13 +5512,13 @@ msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์ผิดพลาด ต๠#: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." -msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์ผิดพลาด ต้à¸à¸‡à¹„ม่มี engine.cfg" +msgid "Invalid project path, project.godot must not exist." +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์ผิดพลาด ต้à¸à¸‡à¹„ม่มี godot.cfg" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." -msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์ผิดพลาด ต้à¸à¸‡à¸¡à¸µ engine.cfg" +msgid "Invalid project path, project.godot must exist." +msgstr "ที่à¸à¸¢à¸¹à¹ˆà¹‚ปรเจà¸à¸•์ผิดพลาด ต้à¸à¸‡à¸¡à¸µ godot.cfg" #: editor/project_manager.cpp msgid "Imported Project" @@ -5503,16 +5526,17 @@ msgstr "นำเข้าโปรเจà¸à¸•์à¹à¸¥à¹‰à¸§" #: editor/project_manager.cpp msgid "Invalid project path (changed anything?)." -msgstr "" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¹‚ปรเจà¸à¸•์ผิดพลาด (ได้à¹à¸à¹‰à¹„ขà¸à¸°à¹„รไปหรืà¸à¹„ม่?)" #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." -msgstr "สร้างไฟล์ engine.cfg ไม่ได้" +msgid "Couldn't create project.godot in project path." +msgstr "สร้างไฟล์ godot.cfg ไม่ได้" #: editor/project_manager.cpp +#, fuzzy msgid "The following files failed extraction from package:" -msgstr "" +msgstr "ผิดพลาดขณะà¹à¸¢à¸à¹„ฟล์ต่à¸à¹„ปนี้จาà¸à¹à¸žà¸„เà¸à¸ˆ:" #: editor/project_manager.cpp msgid "Package Installed Successfully!" @@ -5548,11 +5572,11 @@ msgstr "เลืà¸à¸" #: editor/project_manager.cpp msgid "New Game Project" -msgstr "" +msgstr "โปรเจà¸à¸•์ใหม่" #: editor/project_manager.cpp msgid "That's a BINGO!" -msgstr "" +msgstr "บิงโà¸!" #: editor/project_manager.cpp msgid "Unnamed Project" @@ -5603,7 +5627,7 @@ msgstr "โปรเจà¸à¸•์ใหม่" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "ลบไà¸à¹€à¸—ม" +msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" #: editor/project_manager.cpp msgid "Exit" @@ -5627,7 +5651,7 @@ msgstr "ปุ่มเมาส์" #: editor/project_settings.cpp msgid "Invalid action (anything goes but '/' or ':')." -msgstr "ชื่à¸à¸à¸²à¸£à¸à¸£à¸°à¸—ำผิดพลาด (à¸à¸°à¹„รà¸à¹‡à¹„ด้ยà¸à¹€à¸§à¹‰à¸™ '/' à¹à¸¥à¸° ':')" +msgstr "ใช้ชื่à¸à¸™à¸µà¹‰à¹„ม่ได้ (มี '/' หรืภ':')" #: editor/project_settings.cpp msgid "Action '%s' already exists!" @@ -5643,7 +5667,6 @@ msgstr "เพิ่มà¸à¸²à¸£à¸à¸£à¸°à¸—ำ" #: editor/project_settings.cpp editor/settings_config_dialog.cpp #: scene/gui/input_action.cpp -#, fuzzy msgid "Meta+" msgstr "Meta+" @@ -5654,7 +5677,6 @@ msgstr "Shift+" #: editor/project_settings.cpp editor/settings_config_dialog.cpp #: scene/gui/input_action.cpp -#, fuzzy msgid "Alt+" msgstr "Alt+" @@ -5707,17 +5729,14 @@ msgid "Button 9" msgstr "ปุ่ม 9" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Axis Index:" msgstr "คันบังคับจà¸à¸¢:" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Axis" msgstr "à¹à¸à¸™" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Button Index:" msgstr "ปุ่มจà¸à¸¢:" @@ -5729,8 +5748,12 @@ msgstr "เพิ่มà¸à¸²à¸£à¸à¸£à¸°à¸—ำ" msgid "Erase Input Action Event" msgstr "ลบà¸à¸²à¸£à¸à¸£à¸°à¸—ำ" -#: editor/project_settings.cpp scene/gui/input_action.cpp +#: editor/project_settings.cpp #, fuzzy +msgid "Add Event" +msgstr "เพิ่มà¹à¸šà¸šà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" + +#: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "à¸à¸¸à¸›à¸à¸£à¸“์" @@ -5739,27 +5762,22 @@ msgid "Button" msgstr "ปุ่ม" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Left Button." msgstr "ปุ่มเมาส์ซ้าย" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Right Button." msgstr "ปุ่มเมาส์ขวา" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Middle Button." msgstr "ปุ่มเมาส์à¸à¸¥à¸²à¸‡" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Wheel Up." msgstr "ล้à¸à¹€à¸¡à¸²à¸ªà¹Œà¸‚ึ้น" #: editor/project_settings.cpp scene/gui/input_action.cpp -#, fuzzy msgid "Wheel Down." msgstr "ล้à¸à¹€à¸¡à¸²à¸ªà¹Œà¸¥à¸‡" @@ -5785,7 +5803,7 @@ msgstr "เพิ่มตำà¹à¸«à¸™à¹ˆà¸‡à¹à¸—นที่" #: editor/project_settings.cpp msgid "Resource Remap Add Remap" -msgstr "" +msgstr "เพิ่มà¸à¸²à¸£à¹à¸—นที่" #: editor/project_settings.cpp msgid "Change Resource Remap Language" @@ -5801,8 +5819,8 @@ msgstr "ลบà¸à¸²à¸£à¹à¸—นที่" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์" +msgid "Project Settings (project.godot)" +msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์ (godot.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5869,9 +5887,8 @@ msgid "AutoLoad" msgstr "à¸à¸à¹‚ต้โหลด" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1 มุมมà¸à¸‡" +msgstr "เลืà¸à¸ Viewport" #: editor/property_editor.cpp msgid "Ease In" @@ -5910,20 +5927,14 @@ msgid "New Script" msgstr "สคริปต์ใหม่" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "ระบบไฟล์" +msgstr "เปิดในตัวจัดà¸à¸²à¸£à¹„ฟล์" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "ผิดพลาดขณะโหลดไฟล์: ไม่ใช่รีซà¸à¸£à¹Œà¸ª!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "โหลดภาพไม่ได้" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "เลืà¸à¸à¹‚หนด" @@ -5945,7 +5956,7 @@ msgstr "คุณสมบัติ:" #: editor/property_editor.cpp msgid "Sections:" -msgstr "ส่วน:" +msgstr "หัวข้à¸:" #: editor/property_selector.cpp msgid "Select Property" @@ -6047,11 +6058,11 @@ msgstr "ทำà¸à¸±à¸šà¹‚หนดราà¸à¹„ม่ได้" #: editor/scene_tree_dock.cpp msgid "Move Node In Parent" -msgstr "" +msgstr "ย้ายโหนดในโหนดà¹à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp msgid "Move Nodes In Parent" -msgstr "" +msgstr "ย้ายโหนดในโหนดà¹à¸¡à¹ˆ" #: editor/scene_tree_dock.cpp msgid "Duplicate Node(s)" @@ -6067,7 +6078,7 @@ msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "ไม่สามารถทำได้โดยที่ไม่มีโหนดราà¸" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -6108,6 +6119,11 @@ msgid "Error duplicating scene to save it." msgstr "ผิดพลาดขณะทำซ้ำฉาà¸à¹€à¸žà¸·à¹ˆà¸à¸šà¸±à¸™à¸—ึà¸" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "รีซà¸à¸£à¹Œà¸ª:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "à¹à¸à¹‰à¹„ขà¸à¸¥à¸¸à¹ˆà¸¡" @@ -6148,9 +6164,8 @@ msgid "Save Branch as Scene" msgstr "บันทึà¸à¸à¸´à¹ˆà¸‡à¹€à¸›à¹‡à¸™à¸‰à¸²à¸" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "คัดลà¸à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡" +msgstr "คัดลà¸à¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¹‚หนด" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -6183,10 +6198,59 @@ msgid "Toggle CanvasItem Visible" msgstr "ซ่à¸à¸™/à¹à¸ªà¸”งโหนด CanvasItem" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "ตัวเลืà¸à¸à¸”ีบัค" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "สคริปต์ต่à¸à¹„ป" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "ซ่à¸à¸™/à¹à¸ªà¸”งโหนด Spatial" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "ชื่à¸à¹‚หนดไม่ถูà¸à¸•้à¸à¸‡ ใช้ตัวà¸à¸±à¸à¸©à¸£à¸•่à¸à¹„ปนี้ไม่ได้:" @@ -6231,75 +6295,93 @@ msgid "Select a Node" msgstr "เลืà¸à¸à¹‚หนด" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "ชื่à¸à¸„ลาสà¹à¸¡à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "สร้างสคริปต์ในระบบไฟล์ไม่ได้" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "à¸à¸±à¸à¸‚ระที่ใช้ได้:" +msgid "Error loading script from %s" +msgstr "ผิดพลาดขณะโหลดสคริปต์จาภ%s" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡" +msgid "Path is empty" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "ชื่à¸à¸—ี่ใช้ได้" +msgid "Path is not local" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¹„ม่ใช่ภายใน" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡!" +msgid "Invalid extension" +msgstr "นามสà¸à¸¸à¸¥à¹„ม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "ชื่à¸à¸„ลาสà¹à¸¡à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡!" +#, fuzzy +msgid "Invalid Path" +msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸œà¸´à¸”พลาด" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "สร้างสคริปต์ในระบบไฟล์ไม่ได้" +msgid "Invalid class name" +msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "ผิดพลาดขณะโหลดสคริปต์จาภ%s" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "ไม่พบคุณสมบัติ" #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²" +#, fuzzy +msgid "Script valid" +msgstr "สคริปต์" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¹„ม่ใช่ภายใน" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "นามสà¸à¸¸à¸¥à¹„ม่ถูà¸à¸•้à¸à¸‡" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "สร้างสคริปต์ใหม่" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "โหลดสคริปต์ที่มีà¸à¸¢à¸¹à¹ˆà¹€à¸”ิม" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "สืบทà¸à¸”จาà¸:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "ชื่à¸à¸„ลาส:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "ลบà¹à¸¡à¹ˆà¹à¸šà¸š" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "à¸à¸±à¸‡à¸ªà¸„ริปต์" #: editor/script_create_dialog.cpp @@ -6328,7 +6410,7 @@ msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" #: editor/script_editor_debugger.cpp msgid "Errors" -msgstr "ผิดพลาด" +msgstr "ข้à¸à¸œà¸´à¸”พลาด" #: editor/script_editor_debugger.cpp msgid "Child Process Connected" @@ -6352,7 +6434,7 @@ msgstr "ตัวà¹à¸›à¸£" #: editor/script_editor_debugger.cpp msgid "Errors:" -msgstr "ผิดพลาด:" +msgstr "ข้à¸à¸œà¸´à¸”พลาด:" #: editor/script_editor_debugger.cpp msgid "Stack Trace (if applicable):" @@ -6360,7 +6442,7 @@ msgstr "สà¹à¸•ค (ถ้ามี):" #: editor/script_editor_debugger.cpp msgid "Remote Inspector" -msgstr "ตรวจสà¸à¸šà¸£à¸µà¹‚มท" +msgstr "คุณสมบัติ" #: editor/script_editor_debugger.cpp msgid "Live Scene Tree:" @@ -6368,7 +6450,7 @@ msgstr "ผังฉาà¸à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™:" #: editor/script_editor_debugger.cpp msgid "Remote Object Properties: " -msgstr "คุณสมบัติวัตถุรีโมท: " +msgstr "คุณสมบัติ: " #: editor/script_editor_debugger.cpp msgid "Profiler" @@ -6376,7 +6458,7 @@ msgstr "ประสิทธิภาพ" #: editor/script_editor_debugger.cpp msgid "Monitor" -msgstr "สังเà¸à¸•à¸à¸²à¸£à¸“์" +msgstr "ข้à¸à¸¡à¸¹à¸¥" #: editor/script_editor_debugger.cpp msgid "Value" @@ -6424,10 +6506,9 @@ msgstr "ประเภทขà¸à¸‡à¸„à¸à¸™à¹‚ทรลที่คลิà¸:" #: editor/script_editor_debugger.cpp msgid "Live Edit Root:" -msgstr "" +msgstr "ราà¸à¸œà¸±à¸‡à¸‰à¸²à¸:" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Set From Tree" msgstr "à¸à¸³à¸«à¸™à¸”จาà¸à¸œà¸±à¸‡" @@ -6468,68 +6549,56 @@ msgid "Change Ray Shape Length" msgstr "ปรับความยาวรังสี" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Notifier Extents" -msgstr "ปรับขนาด Notifier" +msgstr "à¹à¸à¹‰à¹„ขขนาด Notifier" #: editor/spatial_editor_gizmos.cpp msgid "Change Particles AABB" msgstr "" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Change Probe Extents" -msgstr "ปรับขนาด Probe" +msgstr "à¹à¸à¹‰à¹„ขขนาด Probe" #: modules/gdscript/gd_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "ตัวà¹à¸›à¸£à¹ƒà¸™ convert() ผิดพลาด ใช้ค่าคงที่ TYPE_* เท่านั้น" #: modules/gdscript/gd_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp -#, fuzzy msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "ไบต์ไม่ครบหรืà¸à¸œà¸´à¸”รูปà¹à¸šà¸š ไม่สามารถà¹à¸›à¸¥à¸‡à¸„่าได้" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "step argument is zero!" msgstr "ตัวà¹à¸›à¸£ step เป็นศูนย์!" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Not a script with an instance" msgstr "ไม่ใช่สคริปต์ที่มีà¸à¸´à¸™à¸ªà¹à¸•นซ์" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Not based on a script" msgstr "ไม่ได้มีต้นà¸à¸³à¹€à¸™à¸´à¸”จาà¸à¸ªà¸„ริปต์" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Not based on a resource file" msgstr "ไม่ได้มีต้นà¸à¸³à¹€à¸™à¸´à¸”มาจาà¸à¹„ฟล์รีซà¸à¸£à¹Œà¸ª" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Invalid instance dictionary format (missing @path)" msgstr "รูปà¹à¸šà¸šà¸”ิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸à¸´à¸™à¸ªà¹à¸•นซ์ไม่ถูà¸à¸•้à¸à¸‡ (ไม่มี @path)" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Invalid instance dictionary format (can't load script at @path)" msgstr "รูปà¹à¸šà¸šà¸”ิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸à¸´à¸™à¸ªà¹à¸•นซ์ไม่ถูà¸à¸•้à¸à¸‡ (โหลดสคริปต์ที่ @path ไม่ได้)" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Invalid instance dictionary format (invalid script at @path)" msgstr "รูปà¹à¸šà¸šà¸”ิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸à¸´à¸™à¸ªà¹à¸•นซ์ไม่ถูà¸à¸•้à¸à¸‡ (สคริปต์ที่ @path ผิดพลาด)" #: modules/gdscript/gd_functions.cpp -#, fuzzy msgid "Invalid instance dictionary (invalid subclasses)" msgstr "ดิà¸à¸Šà¸±à¸™à¸™à¸²à¸£à¸µà¸—ี่เà¸à¹‡à¸šà¸à¸´à¸™à¸ªà¹à¸•นซ์ผิดพลาด (คลาสย่à¸à¸¢à¸œà¸´à¸”พลาด)" @@ -6556,17 +6625,14 @@ msgid "" msgstr "ค่าที่คืนจะต้à¸à¸‡à¸à¸³à¸«à¸™à¸”ในหน่วยความจำทำงานà¹à¸£à¸! à¸à¸£à¸¸à¸“าà¹à¸à¹‰à¹„ขโหนด" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output: " msgstr "โหนดคืนค่าผิดลำดับ: " #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Found sequence bit but not the node in the stack, report bug!" msgstr "พบบิตลำดับà¹à¸•่ไม่พบโหนดในสà¹à¸•ค à¸à¸£à¸¸à¸“ารายงานข้à¸à¸œà¸´à¸”พลาด!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth: " msgstr "สà¹à¸•คล้น ความสูงสà¹à¸•ค: " @@ -6575,72 +6641,58 @@ msgid "Functions:" msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Variables:" msgstr "ตัวà¹à¸›à¸£:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Name is not a valid identifier:" msgstr "ไม่สามารถใช้ชื่à¸à¸™à¸µà¹‰à¹„ด้:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Name already in use by another func/var/signal:" msgstr "มีฟังà¸à¹Œà¸Šà¸±à¸™/ตัวà¹à¸›à¸£/สัà¸à¸à¸²à¸“à¸à¸·à¹ˆà¸™à¹ƒà¸Šà¹‰à¸Šà¸·à¹ˆà¸à¸™à¸µà¹‰à¹à¸¥à¹‰à¸§:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Rename Function" msgstr "เปลี่ยนชื่à¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Rename Variable" msgstr "เปลี่ยนชื่à¸à¸•ัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Rename Signal" msgstr "เปลี่ยนชื่à¸à¸ªà¸±à¸à¸à¸²à¸“" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Function" msgstr "เพิ่มฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Variable" msgstr "เพิ่มตัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Signal" msgstr "เพิ่มสัà¸à¸à¸²à¸“" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Function" msgstr "ลบฟังà¸à¹Œà¸Šà¸±à¸™" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Variable" msgstr "ลบตัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Editing Variable:" msgstr "à¹à¸à¹‰à¹„ขตัวà¹à¸›à¸£:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Remove Signal" msgstr "ลบสัà¸à¸à¸²à¸“" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Editing Signal:" msgstr "à¹à¸à¹‰à¹„ขสัà¸à¸à¸²à¸“:" @@ -6662,7 +6714,6 @@ msgid "Hold Ctrl to drop a Getter. Hold Shift to drop a generic signature." msgstr "à¸à¸” Ctrl ค้างเพื่à¸à¸§à¸²à¸‡ Getter à¸à¸” Shift ค้างเพื่à¸à¸§à¸²à¸‡ generic signature" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Hold Meta to drop a simple reference to the node." msgstr "à¸à¸”ปุ่ม Meta เพื่à¸à¸§à¸²à¸‡à¸à¸²à¸£à¸à¹‰à¸²à¸‡à¸à¸´à¸‡à¹„ปยังโหนดà¸à¸¢à¹ˆà¸²à¸‡à¸‡à¹ˆà¸²à¸¢" @@ -6679,7 +6730,6 @@ msgid "Hold Ctrl to drop a Variable Setter." msgstr "à¸à¸” Ctrl ค้างเพื่à¸à¸§à¸²à¸‡ Setter ขà¸à¸‡à¸•ัวà¹à¸›à¸£" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Add Preload Node" msgstr "เพิ่มโหนด Preload" @@ -6708,12 +6758,10 @@ msgid "Switch" msgstr "ทางเลืà¸à¸" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Iterator" msgstr "ตัววนซ้ำ" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "While" msgstr "ทำซ้ำถ้าเงื่à¸à¸™à¹„ขเป็นจริง" @@ -6731,7 +6779,6 @@ msgid "Base Type:" msgstr "ชนิด:" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Available Nodes:" msgstr "โหนดที่มีให้ใช้:" @@ -6740,7 +6787,6 @@ msgid "Select or create a function to edit graph" msgstr "เลืà¸à¸à¸«à¸£à¸·à¸à¸ªà¸£à¹‰à¸²à¸‡à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹€à¸žà¸·à¹ˆà¸à¹à¸à¹‰à¹„ขà¸à¸£à¸²à¸Ÿ" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Edit Signal Arguments:" msgstr "à¹à¸à¹‰à¹„ขตัวà¹à¸›à¸£à¸ªà¸±à¸à¸à¸²à¸“:" @@ -6757,9 +6803,8 @@ msgid "Delete Selected" msgstr "ลบสิ่งที่เลืà¸à¸" #: modules/visual_script/visual_script_editor.cpp -#, fuzzy msgid "Find Node Type" -msgstr "หาชนิดขà¸à¸‡à¹‚หนด" +msgstr "หาประเภทขà¸à¸‡à¹‚หนด" #: modules/visual_script/visual_script_editor.cpp msgid "Copy Nodes" @@ -6774,9 +6819,8 @@ msgid "Paste Nodes" msgstr "วางโหนด" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable: " -msgstr "ชนิดตัวà¹à¸›à¸£à¸™à¸µà¹‰à¹ƒà¸Šà¹‰à¸§à¸™à¸‹à¹‰à¸³à¹„ม่ได้: " +msgstr "ตัวà¹à¸›à¸£à¸›à¸£à¸°à¹€à¸ ทนี้ใช้วนซ้ำไม่ได้: " #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" @@ -6805,12 +6849,10 @@ msgid "Invalid index property name '%s' in node %s." msgstr "ไม่พบคุณสมบัติ '%s' ในโหนด %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid ": Invalid argument of type: " -msgstr ": ชนิดตัวà¹à¸›à¸£à¹„ม่ถูà¸à¸•้à¸à¸‡: " +msgstr ": ประเภทตัวà¹à¸›à¸£à¹„ม่ถูà¸à¸•้à¸à¸‡: " #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid ": Invalid arguments: " msgstr ": ตัวà¹à¸›à¸£à¹„ม่ถูà¸à¸•้à¸à¸‡: " @@ -6827,48 +6869,40 @@ msgid "Custom node has no _step() method, can't process graph." msgstr "โหนดà¸à¸³à¸«à¸™à¸”เà¸à¸‡à¹„ม่มีเมท็à¸à¸” _step() ไม่สามารถประมวลผลà¸à¸£à¸²à¸Ÿà¹„ด้" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "" "Invalid return value from _step(), must be integer (seq out), or string " "(error)." msgstr "ค่าคืนจาภ_step() ผิดพลาด ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¸ˆà¸³à¸™à¸§à¸™à¹€à¸•็ม (ลำดับ) หรืà¸à¸ªà¸•ริง (ข้à¸à¸œà¸´à¸”พลาด)" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "just pressed" msgstr "เพิ่งà¸à¸”" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "just released" msgstr "เพิ่งปล่à¸à¸¢" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "เลืà¸à¸" +msgstr "รันในเบราเซà¸à¸£à¹Œ" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "รันไฟล์ HTML ที่ส่งà¸à¸à¸à¹ƒà¸™à¹€à¸šà¸£à¸²à¹€à¸‹à¸à¸£à¹Œ" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "ไม่พบ tile:" +msgstr "เขียนไฟล์ไม่ได้:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "ไม่พบ tile:" +msgstr "à¸à¹ˆà¸²à¸™à¹„ฟล์ไม่ได้:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "ไม่สามารถสร้างโฟลเดà¸à¸£à¹Œ" +msgstr "เปิดà¹à¸¡à¹ˆà¹à¸šà¸šà¹€à¸žà¸·à¹ˆà¸à¸ªà¹ˆà¸‡à¸à¸à¸à¹„ม่ได้:\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "ไม่สามารถà¸à¹ˆà¸²à¸™à¹„ฟล์ใบรับรà¸à¸‡à¹„ด้ ตำà¹à¸«à¸™à¹ˆà¸‡à¹„ฟล์à¹à¸¥à¸°à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸–ูà¸à¸•้à¸à¸‡à¸«à¸£à¸·à¸à¹„ม่?" @@ -6882,7 +6916,6 @@ msgid "Error creating the package signature." msgstr "ผิดพลาดขณะสร้าง signature ขà¸à¸‡à¹à¸žà¸„เà¸à¸ˆ" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "No export templates found.\n" "Download and install export templates." @@ -6911,54 +6944,44 @@ msgid "Invalid publisher GUID." msgstr "GUID ขà¸à¸‡à¸œà¸¹à¹‰à¸ˆà¸±à¸”จำหน่ายไม่ถูà¸à¸•้à¸à¸‡" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid background color." msgstr "สีพื้นหลังผิดพลาด" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid Store Logo image dimensions (should be 50x50)." msgstr "ขนาดรูปโลโà¸à¹‰ Store ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 50x50)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid square 44x44 logo image dimensions (should be 44x44)." msgstr "ขนาดโลโà¸à¹‰à¸ˆà¸±à¸•ุรัส 44x44 ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 44x44)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid square 71x71 logo image dimensions (should be 71x71)." msgstr "ขนาดโลโà¸à¹‰à¸ˆà¸±à¸•ุรัส 71x71 ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 71x71)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid square 150x150 logo image dimensions (should be 150x150)." msgstr "ขนาดโลโà¸à¹‰à¸ˆà¸±à¸•ุรัส 150x150 ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 150x150)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid square 310x310 logo image dimensions (should be 310x310)." msgstr "ขนาดโลโà¸à¹‰à¸ˆà¸±à¸•ุรัส 310x310 ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 310x310)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid wide 310x150 logo image dimensions (should be 310x150)." msgstr "ขนาดโลโà¸à¹‰à¸à¸§à¹‰à¸²à¸‡ 310x150 ผิดพลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 310x150)" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Invalid splash screen image dimensions (should be 620x300)." msgstr "ขนาดรูปหน้าจà¸à¹€à¸£à¸´à¹ˆà¸¡à¹‚ปรà¹à¸à¸£à¸¡à¸œà¸´à¸”พลาด (ต้à¸à¸‡à¹€à¸›à¹‡à¸™ 620x300)" #: scene/2d/animated_sprite.cpp -#, fuzzy msgid "" "A SpriteFrames resource must be created or set in the 'Frames' property in " "order for AnimatedSprite to display frames." msgstr "ต้à¸à¸‡à¸¡à¸µ SpriteFrames ใน 'Frames' เพื่à¸à¹ƒà¸«à¹‰ AnimatedSprite à¹à¸ªà¸”งผลได้" #: scene/2d/canvas_modulate.cpp -#, fuzzy msgid "" "Only one visible CanvasModulate is allowed per scene (or set of instanced " "scenes). The first created one will work, while the rest will be ignored." @@ -6967,59 +6990,51 @@ msgstr "" "โหนดà¹à¸£à¸à¹€à¸—่านั้นที่จะทำงานได้ปà¸à¸•ิ ที่เหลืà¸à¸ˆà¸°à¹„ม่ทำงาน" #: scene/2d/collision_polygon_2d.cpp -#, fuzzy msgid "" "CollisionPolygon2D only serves to provide a collision shape to a " "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionPolygon2D ใช้ประโยชน์เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject2D " -"จึงควรใช้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ฯลฯ " +"CollisionPolygon2D ใช้เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject2D " +"จึงควรให้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ฯลฯ " "เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/2d/collision_polygon_2d.cpp -#, fuzzy msgid "An empty CollisionPolygon2D has no effect on collision." msgstr "CollisionPolygon2D ที่ว่างเปล่าจะไม่มีผลทางà¸à¸²à¸¢à¸ าพ" #: scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "" "CollisionShape2D only serves to provide a collision shape to a " "CollisionObject2D derived node. Please only use it as a child of Area2D, " "StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape." msgstr "" -"CollisionShape2D ใช้ประโยชน์เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject2D " -"จึงควรใช้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ฯลฯ " +"CollisionShape2D ใช้เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject2D " +"จึงควรให้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area2D, StaticBody2D, RigidBody2D, KinematicBody2D ฯลฯ " "เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "" "A shape must be provided for CollisionShape2D to function. Please create a " "shape resource for it!" -msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape2D ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง" +msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape2D ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!" #: scene/2d/light_2d.cpp -#, fuzzy msgid "" "A texture with the shape of the light must be supplied to the 'texture' " "property." msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸£à¹ˆà¸²à¸‡à¸‚à¸à¸‡à¹à¸ªà¸‡à¸à¸¢à¸¹à¹ˆà¹ƒà¸™ 'texture'" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "" "An occluder polygon must be set (or drawn) for this occluder to take effect." msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸«à¸¥à¸²à¸¢à¹€à¸«à¸¥à¸µà¹ˆà¸¢à¸¡à¹€à¸žà¸·à¹ˆà¸à¹ƒà¸«à¹‰à¸•ัวบังà¹à¸ªà¸‡à¸™à¸µà¹‰à¸—ำงานได้" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "The occluder polygon for this occluder is empty. Please draw a polygon!" msgstr "รูปหลายเหลี่ยมขà¸à¸‡à¸•ัวบังà¹à¸ªà¸‡à¸™à¸µà¹‰à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸² à¸à¸£à¸¸à¸“าวาดรูปหลายเหลี่ยม!" #: scene/2d/navigation_polygon.cpp -#, fuzzy msgid "" "A NavigationPolygon resource must be set or created for this node to work. " "Please set a property or draw a polygon." @@ -7027,7 +7042,6 @@ msgstr "" "ต้à¸à¸‡à¸¡à¸µ NavigationPolygon เพื่à¸à¹ƒà¸«à¹‰à¹‚หนดนี้ทำงานได้ à¸à¸£à¸¸à¸“าà¹à¸à¹‰à¹„ขคุณสมบัติหรืà¸à¸§à¸²à¸”รูปหลายเหลี่ยม" #: scene/2d/navigation_polygon.cpp -#, fuzzy msgid "" "NavigationPolygonInstance must be a child or grandchild to a Navigation2D " "node. It only provides navigation data." @@ -7036,28 +7050,25 @@ msgstr "" "เนื่à¸à¸‡à¸ˆà¸²à¸à¹‚หนดนี้ใช้เà¸à¹‡à¸šà¸‚้à¸à¸¡à¸¹à¸¥à¸à¸²à¸£à¸™à¸³à¸—างเท่านั้น" #: scene/2d/parallax_layer.cpp -#, fuzzy msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "ParallaxLayer จะทำงานได้ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸à¸‚à¸à¸‡à¹‚หนด ParallaxBackground" -#: scene/2d/particles_2d.cpp -#, fuzzy -msgid "Path property must point to a valid Particles2D node to work." -msgstr "ต้à¸à¸‡à¹à¸à¹‰à¹„ข Path ให้ชี้ไปยังโหนด Particles2D จึงจะทำงานได้" +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp -#, fuzzy msgid "PathFollow2D only works when set as a child of a Path2D node." msgstr "PathFollow2D จะทำงานได้ต้à¸à¸‡à¹€à¸›à¹‡à¸™à¹‚หนดลูà¸à¸‚à¸à¸‡à¹‚หนด Path2D" #: scene/2d/remote_transform_2d.cpp -#, fuzzy msgid "Path property must point to a valid Node2D node to work." msgstr "ต้à¸à¸‡à¹à¸à¹‰à¹„ข Path ให้ชี้ไปยังโหนด Node2D จึงจะทำงานได้" #: scene/2d/sprite.cpp -#, fuzzy msgid "" "Path property must point to a valid Viewport node to work. Such Viewport " "must be set to 'render target' mode." @@ -7066,60 +7077,50 @@ msgstr "" "'render target'" #: scene/2d/sprite.cpp -#, fuzzy msgid "" "The Viewport set in the path property must be set as 'render target' in " "order for this sprite to work." msgstr "Viewport ใน path จะต้à¸à¸‡à¸›à¸£à¸±à¸šà¹‚หมดเป็น 'render target' จึงจะทำงานได้" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "" "VisibilityEnable2D works best when used with the edited scene root directly " "as parent." msgstr "VisibilityEnable2D ควรจะเป็นโหนดลูà¸à¸‚à¸à¸‡à¹‚หนดหลัà¸à¹ƒà¸™à¸‰à¸²à¸à¸™à¸µà¹‰" #: scene/3d/body_shape.cpp -#, fuzzy msgid "" "CollisionShape only serves to provide a collision shape to a CollisionObject " "derived node. Please only use it as a child of Area, StaticBody, RigidBody, " "KinematicBody, etc. to give them a shape." msgstr "" -"CollisionShape ใช้ประโยชน์เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject " -"จึงควรใช้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area, StaticBody, RigidBody, KinematicBody ฯลฯ " -"เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" +"CollisionShape ใช้เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject จึงควรให้เป็นโหนดลูà¸à¸‚à¸à¸‡ " +"Area, StaticBody, RigidBody, KinematicBody ฯลฯ เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/3d/body_shape.cpp -#, fuzzy msgid "" "A shape must be provided for CollisionShape to function. Please create a " "shape resource for it!" -msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง" +msgstr "ต้à¸à¸‡à¸¡à¸µà¸£à¸¹à¸›à¸—รงเพื่à¸à¹ƒà¸«à¹‰ CollisionShape ทำงานได้ à¸à¸£à¸¸à¸“าสร้างรูปทรง!" #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "" "CollisionPolygon only serves to provide a collision shape to a " "CollisionObject derived node. Please only use it as a child of Area, " "StaticBody, RigidBody, KinematicBody, etc. to give them a shape." msgstr "" -"CollisionPolygon ใช้ประโยชน์เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject " -"จึงควรใช้เป็นโหนดลูà¸à¸‚à¸à¸‡ Area, StaticBody, RigidBody, KinematicBody ฯลฯ " -"เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" +"CollisionPolygon ใช้เป็นรูปทรงสำหรับโหนดà¸à¸¥à¸¸à¹ˆà¸¡ CollisionObject จึงควรให้เป็นโหนดลูà¸à¸‚à¸à¸‡ " +"Area, StaticBody, RigidBody, KinematicBody ฯลฯ เพื่à¸à¹ƒà¸«à¹‰à¸¡à¸µà¸£à¸¹à¸›à¸—รง" #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "An empty CollisionPolygon has no effect on collision." msgstr "CollisionPolygon ที่ว่างเปล่าจะไม่มีผลทางà¸à¸²à¸¢à¸ าพ" #: scene/3d/navigation_mesh.cpp -#, fuzzy msgid "A NavigationMesh resource must be set or created for this node to work." msgstr "ต้à¸à¸‡à¸¡à¸µ NavigationMesh เพื่à¸à¹ƒà¸«à¹‰à¹‚หนดนี้ทำงานได้" #: scene/3d/navigation_mesh.cpp -#, fuzzy msgid "" "NavigationMeshInstance must be a child or grandchild to a Navigation node. " "It only provides navigation data." @@ -7132,37 +7133,35 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp -#, fuzzy msgid "Path property must point to a valid Spatial node to work." msgstr "ต้à¸à¸‡à¹à¸à¹‰à¹„ข Path ให้ชี้ไปยังโหนด Spatial จึงจะทำงานได้" #: scene/3d/scenario_fx.cpp -#, fuzzy msgid "" "Only one WorldEnvironment is allowed per scene (or set of instanced scenes)." msgstr "จะมี WorldEnvironment ได้เพียงโหนดเดียวในฉาภ(หรืà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸‚à¸à¸‡à¸‰à¸²à¸à¸—ี่เป็นà¸à¸´à¸™à¸ªà¹à¸•นซ์)" #: scene/3d/sprite_3d.cpp -#, fuzzy msgid "" "A SpriteFrames resource must be created or set in the 'Frames' property in " "order for AnimatedSprite3D to display frames." msgstr "ต้à¸à¸‡à¸¡à¸µ SpriteFrames ใน 'Frames' เพื่à¸à¹ƒà¸«à¹‰ AnimatedSprite3D à¹à¸ªà¸”งผลได้" -#: scene/gui/dialogs.cpp +#: scene/gui/color_picker.cpp #, fuzzy +msgid "RAW Mode" +msgstr "โหมดหมุน" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + +#: scene/gui/dialogs.cpp msgid "Alert!" -msgstr "ประà¸à¸²à¸¨!" +msgstr "à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™!" #: scene/gui/dialogs.cpp -#, fuzzy msgid "Please Confirm..." msgstr "à¸à¸£à¸¸à¸“ายืนยัน..." @@ -7175,22 +7174,18 @@ msgid "Open File(s)" msgstr "เปิดไฟล์" #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Open a Directory" msgstr "เปิดโฟลเดà¸à¸£à¹Œ" #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Open a File or Directory" msgstr "เปิดไฟล์หรืà¸à¹‚ฟลเดà¸à¸£à¹Œ" #: scene/gui/input_action.cpp -#, fuzzy msgid "Ctrl+" msgstr "Ctrl+" #: scene/gui/popup.cpp -#, fuzzy msgid "" "Popups will hide by default unless you call popup() or any of the popup*() " "functions. Making them visible for editing is fine though, but they will " @@ -7205,9 +7200,17 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer ทำงานได้เมื่à¸à¸¡à¸µà¹‚หนดลูà¸à¹€à¸žà¸µà¸¢à¸‡à¸«à¸™à¸¶à¹ˆà¸‡à¹‚หนดเท่านั้น\n" +"ใช้ container เป็นโหนดลูภ(VBox,HBox,ฯลฯ) หรืà¸à¹‚หนดà¸à¸¥à¸¸à¹ˆà¸¡ Control " +"à¹à¸¥à¸°à¸›à¸£à¸±à¸šà¸‚นาดเล็à¸à¸ªà¸¸à¸”ด้วยตนเà¸à¸‡" + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "" "This viewport is not set as render target. If you intend for it to display " "its contents directly to the screen, make it a child of a Control so it can " @@ -7224,9 +7227,53 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "นำเข้าไฟล์มายังโปรเจà¸à¸•์" -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "ตัวเลืà¸à¸à¹‚ปรเจà¸à¸•์ (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "ส่งà¸à¸à¸à¹‚ปรเจà¸à¸•์ไปยังà¹à¸žà¸¥à¸•ฟà¸à¸£à¹Œà¸¡à¸•่าง ๆ" + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "เตืà¸à¸™à¹€à¸¡à¸·à¹ˆà¸à¸¡à¸µà¸à¸²à¸£à¹à¸à¹‰à¹„ขรีซà¸à¸£à¹Œà¸ªà¸ ายนà¸à¸" + +#~ msgid "Tutorials" +#~ msgstr "คู่มืà¸" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "เปิดคู่มืà¸à¸ˆà¸²à¸ https://godotengine.org" + +#~ msgid "No scene selected to instance!" +#~ msgstr "ไม่ได้เลืà¸à¸à¸‰à¸²à¸à¸—ี่จะà¸à¸´à¸™à¸ªà¹à¸•นซ์!" + +#~ msgid "Instance at Cursor" +#~ msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์ที่เคà¸à¸£à¹Œà¹€à¸‹à¸à¸£à¹Œ" + +#~ msgid "Could not instance scene!" +#~ msgstr "à¸à¸´à¸™à¸ªà¹à¸•นซ์ฉาà¸à¹„ม่ได้!" + +#~ msgid "Ambient Light Color:" +#~ msgstr "สีขà¸à¸‡à¹à¸ªà¸‡à¹‚ดยรà¸à¸š:" + +#~ msgid "Couldn't load image" +#~ msgstr "โหลดภาพไม่ได้" + +#~ msgid "Invalid parent class name" +#~ msgstr "ชื่à¸à¸„ลาสà¹à¸¡à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡" + +#~ msgid "Valid chars:" +#~ msgstr "à¸à¸±à¸à¸‚ระที่ใช้ได้:" + +#~ msgid "Valid name" +#~ msgstr "ชื่à¸à¸—ี่ใช้ได้" + +#~ msgid "Class name is invalid!" +#~ msgstr "ชื่à¸à¸„ลาสไม่ถูà¸à¸•้à¸à¸‡!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "ชื่à¸à¸„ลาสà¹à¸¡à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡!" + +#~ msgid "Invalid path!" +#~ msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¸—ี่à¸à¸¢à¸¹à¹ˆà¹„ม่ถูà¸à¸•้à¸à¸‡!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "ต้à¸à¸‡à¹à¸à¹‰à¹„ข Path ให้ชี้ไปยังโหนด Particles2D จึงจะทำงานได้" #~ msgid "Surface" #~ msgstr "พื้นผิว" @@ -7402,9 +7449,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "ส่วนที่เงียบตรงปลาย:" -#~ msgid "Script" -#~ msgstr "สคริปต์" - #~ msgid "Script Export Mode:" #~ msgstr "โหมดส่งà¸à¸à¸à¸ªà¸„ริปต์:" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index b4d8975649..b041ed0901 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -1,6 +1,5 @@ # Turkish translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Aprın Çor Tigin <kabusturk38@gmail.com>, 2016-2017. @@ -549,7 +548,8 @@ msgid "Search:" msgstr "Ara:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -595,7 +595,7 @@ msgstr "Destek..." msgid "Official" msgstr "Resmi" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "Topluluk" @@ -741,6 +741,7 @@ msgstr "Ekle" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "Kaldır" @@ -850,6 +851,7 @@ msgstr "Kaynak" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "Yol" @@ -953,8 +955,7 @@ msgstr "" msgid "Add Bus" msgstr "Ekle %s" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "Yükle" @@ -964,6 +965,7 @@ msgid "Save As" msgstr "BaÅŸkaca Kaydet" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "Önyüklü" @@ -1032,8 +1034,7 @@ msgid "Rearrange Autoloads" msgstr "KendindenYüklenme'leri Yeniden Sırala" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "Dizeç yolu:" @@ -1225,7 +1226,8 @@ msgstr "KaynaklarıTara" msgid "(Re)Importing Assets" msgstr "Yeniden-İçe Aktarım" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "Yardım Ara" @@ -1242,7 +1244,6 @@ msgid "Class:" msgstr "Bölüt:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "Kalıtçılar:" @@ -1410,10 +1411,11 @@ msgid "There is no defined scene to run." msgstr "Çalıştırmak için herhangi bir sahne seçilmedi." #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "Hiçbir ana sahne tanımlanmadı, birini seçiniz?\n" "Daha sonra \"uygulama\" kategorisinin altındaki \"Tasarı Ayarları\" ndan " @@ -1476,6 +1478,11 @@ msgid "Save Scene As.." msgstr "Sahneyi BaÅŸkaca Kaydet.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "Düğüm" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "Sahne hiç kaydedilmedi. Çalıştırmadan önce kaydedilsin mi?" @@ -1534,7 +1541,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "Öff" @@ -1575,6 +1582,10 @@ msgstr "%d daha çok dizeç(ler)" msgid "%d more file(s) or folder(s)" msgstr "%d daha çok dizeç(ler) veya dizin(ler)" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "Dikkat Dağıtmayan Biçim" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "Sahne" @@ -1628,7 +1639,7 @@ msgstr "Sahneyi Kapat" msgid "Close Goto Prev. Scene" msgstr "Önc. Sahneye Git sekmesini Kapat" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "En Sonuncuyu Aç" @@ -1656,84 +1667,41 @@ msgid "Redo" msgstr "Geri" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "BetiÄŸi Çalıştır" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "Tasarı Ayarları" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "Sahneyi Eski Durumuna Çevir" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "Tasarı Dizelgesine Git" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "Dikkat Dağıtmayan Biçim" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "Türlü tasarı ya da sahne geniÅŸliÄŸinde araçlar." #: editor/editor_node.cpp -msgid "Tools" -msgstr "Araçlar" +#, fuzzy +msgid "Project" +msgstr "Yeni Tasarı" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "Tasarıyı pek çok ortama aktarın." +msgid "Project Settings" +msgstr "Tasarı Ayarları" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "BetiÄŸi Çalıştır" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "Dışa Aktar" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "Tasarıyı oynat." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "Oynat" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "Sahneyi duraklat" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "Sahneyi Duraklat" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "Sahneyi durdur." - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "Durdur" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "DüzenlenmiÅŸ sahneyi oynat." - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "Sahneyi Oynat" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "Özel sahneyi oynat" +msgid "Tools" +msgstr "Araçlar" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "Özel Sahneyi Oynat" +msgid "Quit to Project List" +msgstr "Tasarı Dizelgesine Git" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "Sorun ayıklama seçenekleri" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "Kusur Ayıkla" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1822,9 +1790,10 @@ msgstr "" "Bir cihazda uzaktan kullanıldığında, aÄŸ dizeç düzeni ile bu iÅŸlem daha " "verimli olur." -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "Ayarlar" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "Düzenle" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1844,12 +1813,69 @@ msgid "Manage Export Templates" msgstr "Dışa Aktarım Kalıpları Yükleniyor" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "Bölütler" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "Belgeleri Kapat" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "İliÅŸkin" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "Dış kaynaklar deÄŸiÅŸince uyarır." +msgid "Play the project." +msgstr "Tasarıyı oynat." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "Oynat" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "Sahneyi duraklat" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "Sahneyi Duraklat" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "Sahneyi durdur." + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "Durdur" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "DüzenlenmiÅŸ sahneyi oynat." + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "Sahneyi Oynat" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "Özel sahneyi oynat" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "Özel Sahneyi Oynat" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1932,6 +1958,14 @@ msgid "Thanks!" msgstr "SaÄŸ olun!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "Kalıpları ZIP Dizecinden İçe Aktar" @@ -1959,6 +1993,36 @@ msgstr "Aç & Bir Betik Çalıştır" msgid "Load Errors" msgstr "Sorunları Yükle" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "Düzenleyicide Aç" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "Düzenleyicide Aç" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "Düzenleyicide Aç" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "Betikevini Dışa Aktar" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "Düzenleyicide Aç" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "Düzenleyicide Aç" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "Yüklü Eklentiler:" @@ -2218,6 +2282,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "Dizeç Yöneticisinde Göster" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "Örnek" @@ -2246,10 +2314,6 @@ msgid "Info" msgstr "Bilgi" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "Dizeç Yöneticisinde Göster" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "Yeniden İçe Aktar.." @@ -2418,9 +2482,10 @@ msgid "No target font resource!" msgstr "Amaçlanan yazı türü kaynağı yok!" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "Geçersiz dizeç uzantısı.\n" "Lütfen .fnt uzantısını kullanın." @@ -2902,7 +2967,7 @@ msgstr "Sıkıştır" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "Tasarıya Ekle (engine.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3567,7 +3632,7 @@ msgid "Change default type" msgstr "Önyüklü tipi deÄŸiÅŸtir" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "Tamam" @@ -3618,17 +3683,6 @@ msgstr "Çoklu3B OluÅŸtur" msgid "Set Handle" msgstr "Tutamacı Ayarla" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "Renk YokuÅŸu Noktası Ekle / Kaldır" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "Renk YokuÅŸunu DeÄŸiÅŸtir" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "Örüntü Betikevi OluÅŸtur" @@ -3661,9 +3715,33 @@ msgstr "Sahneden Güncelle" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "GiriÅŸ Ekle" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "Yol Noktasını Kaldır" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "Kaynak Yükle" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy msgid "Modify Curve" msgstr "EÄŸri Haritasını DeÄŸiÅŸtir" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "Renk YokuÅŸu Noktası Ekle / Kaldır" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "Renk YokuÅŸunu DeÄŸiÅŸtir" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "Öğe%d" @@ -3937,6 +4015,20 @@ msgid "Remove Poly And Point" msgstr "Çokluyu ve Noktayı Kaldır" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "Yayma Örtecini Temizle" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "AABB Üret" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "Bediz yüklenirken sorun oluÅŸtu:" @@ -3949,8 +4041,8 @@ msgid "Set Emission Mask" msgstr "Yayma Örtecini Ayarla" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "Yayma Örtecini Temizle" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3960,6 +4052,27 @@ msgstr "Yayma Örtecini Yükle" msgid "Generated Point Count:" msgstr "Üretilen Nokta Say:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "Ortalama Zaman (sn)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "Yayma Örtecini Ayarla" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "Sahneden OluÅŸtur" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "Yayma Konumları:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "Düğüm uzambilgisi içermiyor." @@ -3973,11 +4086,6 @@ msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "AABB Üret" - -#: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" msgstr "Yüzler alan içermez!" @@ -4035,13 +4143,18 @@ msgstr "Yayma Dolumu:" msgid "Generate Visibility AABB" msgstr "AABB Üret" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "Noktayı EÄŸriden Kaldır" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "Ortalama Zaman (sn)" +msgid "Remove Out-Control from Curve" +msgstr "EÄŸriye Denetimsiz Taşı" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "Noktayı EÄŸriden Kaldır" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4099,6 +4212,16 @@ msgstr "Yolu Ayır" msgid "Remove Path Point" msgstr "Yol Noktasını Kaldır" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "EÄŸriye Denetimsiz Taşı" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "EÄŸriye Denetimli Taşı" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "UV Haritası OluÅŸtur" @@ -4252,6 +4375,11 @@ msgid "Pitch" msgstr "Perde" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "Kemikleri Temizle" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "Kalıp kaydedilirken sorun oluÅŸtu" @@ -4339,10 +4467,6 @@ msgstr "Bul.." msgid "Find Next" msgstr "Sonraki Bul" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "Kusur Ayıkla" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "Adımla" @@ -4376,16 +4500,9 @@ msgid "Move Right" msgstr "SaÄŸa Taşı" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "Öğreticiler" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "https://godotengine.org baÄŸlantısını öğreticiler bölümünde aç." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "Bölütler" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "BaÅŸvuru belgelerinde arama yap." #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4444,6 +4561,23 @@ msgid "Pick Color" msgstr "Renk Seç" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "Bedizleri Dönüştürüyor" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4523,6 +4657,16 @@ msgid "Goto Previous Breakpoint" msgstr "Önceki Kesme Noktasına Git" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "Åžuna Dönüştür.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "Åžuna Dönüştür.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "Öncekini Bul" @@ -4545,6 +4689,10 @@ msgstr "Dizeye Git.." msgid "Contextual Help" msgstr "BaÄŸlamsal Yardım" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "Basamaklı Sabiti DeÄŸiÅŸtir" @@ -4762,36 +4910,106 @@ msgid "Animation Key Inserted." msgstr "Canlandırma Açarı Eklendi." #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "İleri Git" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "Terse doÄŸru" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "Tekerlek AÅŸağı." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "DeÄŸiÅŸiklikleri güncelle" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "DeÄŸiÅŸiklikleri güncelle" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "DeÄŸiÅŸiklikleri güncelle" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "BaÅŸucu" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "Görünüme Ayarla" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "Çevre" +msgid "Display Normal" +msgstr "OlaÄŸanı Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "Ses Dinleyici" +msgid "Display Wireframe" +msgstr "Telkafes Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Zımbırtılar" +msgid "Display Overdraw" +msgstr "Abartı Görüntüle" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "XForm İletiÅŸim Kutusu" +#, fuzzy +msgid "Display Unshaded" +msgstr "Gölgesiz Görüntüle" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Environment" +msgstr "Çevre" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "View Gizmos" +msgstr "Zımbırtılar" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "Örnek vermek için hiçbir sahne seçilmedi!" +msgid "View Information" +msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "Göstergede Örnekle" +msgid "Audio Listener" +msgstr "Ses Dinleyici" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "Sahne Örneklenemedi!" +msgid "XForm Dialog" +msgstr "XForm İletiÅŸim Kutusu" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4850,6 +5068,26 @@ msgid "Align Selection With View" msgstr "Seçimi Görünüme Ayarla" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "Seç" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "Taşı" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl: Döndür" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "Ölçekle:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "Dönüşüm" @@ -4862,14 +5100,6 @@ msgid "Transform Dialog.." msgstr "Dönüştürme İletiÅŸim Kutusu.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "Önyüklü Işık Kullan" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "Önyüklü sRGB'yi Kullan" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1 Görünüm" @@ -4894,22 +5124,6 @@ msgid "4 Viewports" msgstr "4 Görünüm" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "OlaÄŸanı Görüntüle" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "Telkafes Görüntüle" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "Abartı Görüntüle" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "Gölgesiz Görüntüle" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "BaÅŸlatım Görünümü" @@ -4918,6 +5132,10 @@ msgid "View Grid" msgstr "Izgara Görünümü" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "Ayarlar" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "Yapışma Ayarları" @@ -4938,14 +5156,6 @@ msgid "Viewport Settings" msgstr "Görüntüleme Ayarları" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "Önyüklü Işığın OlaÄŸanı:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "Ortam Işığı Rengi:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "Perspektif FOV (düzey):" @@ -5376,12 +5586,12 @@ msgstr "Geçersiz tasarı yolu, yolun var olması gerekir!" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "Geçersiz tasarı yolu, engine.cfg var olmaması gerekir." #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "Geçersiz tasarı yolu, engine.cfg var olması gerekir." #: editor/project_manager.cpp @@ -5394,7 +5604,7 @@ msgstr "Geçersiz tasarı yolu (bir ÅŸey deÄŸiÅŸti mi?)." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "engine.cfg tasarı yolunda oluÅŸturulamadı." #: editor/project_manager.cpp @@ -5616,6 +5826,11 @@ msgstr "GiriÅŸ Eylemi Ekle" msgid "Erase Input Action Event" msgstr "GiriÅŸ Eylemi Olayını Sil" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "BoÅŸ Ekle" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "Aygıt" @@ -5682,8 +5897,8 @@ msgstr "Kaynak Yeniden EÅŸle SeçeneÄŸini Kaldır" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "Tasarı Ayarları" +msgid "Project Settings (project.godot)" +msgstr "Tasarı Ayarları (engine.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5800,10 +6015,6 @@ msgid "Error loading file: Not a resource!" msgstr "Dizeç yüklenirken sorun oluÅŸtu: Bir kaynak deÄŸil!" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "Bediz yüklenemedi" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "Bir Düğüm Seç" @@ -5992,6 +6203,11 @@ msgid "Error duplicating scene to save it." msgstr "Kaydetmek için sahne ikilenirken sorun oluÅŸtu." #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "Kaynaklar:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "Öbekleri Düzenle" @@ -6069,10 +6285,59 @@ msgid "Toggle CanvasItem Visible" msgstr "CanvasItem'ı Görünür Duruma Getir" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "Sorun ayıklama seçenekleri" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "Örnek:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "Sonraki betik" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "Uzaysal Görünürlüğü Aç / Kapat" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "Geçersiz düğüm adı, aÅŸağıdaki damgalara izin verilmiyor:" @@ -6117,75 +6382,93 @@ msgid "Select a Node" msgstr "Bir Düğüm Seç" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "Geçersiz ata bölüt adı" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "Dizeç düzeninde betik oluÅŸturulamadı." #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "Geçerli damgalar:" +msgid "Error loading script from %s" +msgstr "Yazı tipi %s yüklerken sorun oluÅŸtu" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "Geçersiz bölüt adı" +msgid "Path is empty" +msgstr "Yol boÅŸ" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "Uygun ad" +msgid "Path is not local" +msgstr "Yol yerel deÄŸil" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "Uygulanamaz" +msgid "Invalid base path" +msgstr "Geçersiz üst yol" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "Bölüt adı geçersiz!" +msgid "Invalid extension" +msgstr "Geçersiz uzantı" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "Ata bölüt adı geçersiz!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "Geçersiz yol!" +#, fuzzy +msgid "Invalid Path" +msgstr "Gecersiz Yol." #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "Dizeç düzeninde betik oluÅŸturulamadı." +msgid "Invalid class name" +msgstr "Geçersiz bölüt adı" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "Yazı tipi %s yüklerken sorun oluÅŸtu" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "Geçersiz dizin özelliÄŸi adı." #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "Yol boÅŸ" +#, fuzzy +msgid "Script valid" +msgstr "Betik" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "Yol yerel deÄŸil" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "Geçersiz üst yol" +msgid "N/A" +msgstr "Uygulanamaz" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "Geçersiz uzantı" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "Yeni Betik OluÅŸtur" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "Var olan betiÄŸi yükle" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "Kalıtçılar:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "Bölüt Adı:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "Öğeyi Kaldır" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "Gömme Betik" #: editor/script_create_dialog.cpp @@ -6882,11 +7165,11 @@ msgstr "" "ParallaxLayer, yalnızca ParallaxBackground düğümünün çocuÄŸu olduÄŸu zaman " "çalışır." -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" -"Yol niteliÄŸi çalışması için geçerli bir Particles2D düğümünü iÅŸaret " -"etmelidir." #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6974,12 +7257,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -7000,6 +7277,15 @@ msgstr "" "AnimatedSprite3D 'nin çerçeveleri görüntülemek için bir SpriteFrames kaynağı " "oluÅŸturulmalı veya 'Çerçeveler' niteliÄŸinde ayarlanmalıdır." +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "Çalışma Biçimi:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "Uyarı!" @@ -7045,6 +7331,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -7063,9 +7355,64 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "Varlıkları tasarının içine aktar." -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "Tasarı Ayarları (engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "Tasarıyı pek çok ortama aktarın." + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "Dış kaynaklar deÄŸiÅŸince uyarır." + +#~ msgid "Tutorials" +#~ msgstr "Öğreticiler" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "https://godotengine.org baÄŸlantısını öğreticiler bölümünde aç." + +#~ msgid "No scene selected to instance!" +#~ msgstr "Örnek vermek için hiçbir sahne seçilmedi!" + +#~ msgid "Instance at Cursor" +#~ msgstr "Göstergede Örnekle" + +#~ msgid "Could not instance scene!" +#~ msgstr "Sahne Örneklenemedi!" + +#~ msgid "Use Default Light" +#~ msgstr "Önyüklü Işık Kullan" + +#~ msgid "Use Default sRGB" +#~ msgstr "Önyüklü sRGB'yi Kullan" + +#~ msgid "Default Light Normal:" +#~ msgstr "Önyüklü Işığın OlaÄŸanı:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "Ortam Işığı Rengi:" + +#~ msgid "Couldn't load image" +#~ msgstr "Bediz yüklenemedi" + +#~ msgid "Invalid parent class name" +#~ msgstr "Geçersiz ata bölüt adı" + +#~ msgid "Valid chars:" +#~ msgstr "Geçerli damgalar:" + +#~ msgid "Valid name" +#~ msgstr "Uygun ad" + +#~ msgid "Class name is invalid!" +#~ msgstr "Bölüt adı geçersiz!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "Ata bölüt adı geçersiz!" + +#~ msgid "Invalid path!" +#~ msgstr "Geçersiz yol!" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "" +#~ "Yol niteliÄŸi çalışması için geçerli bir Particles2D düğümünü iÅŸaret " +#~ "etmelidir." #~ msgid "Surface" #~ msgstr "Yüzey" @@ -7286,9 +7633,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "SessizliÄŸi İzliyor:" -#~ msgid "Script" -#~ msgstr "Betik" - #~ msgid "Script Export Mode:" #~ msgstr "Betik Dışa Aktarım Biçimi:" @@ -7322,9 +7666,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance, bir BakedLight kaynağı içermez." -#~ msgid "Vertex" -#~ msgstr "BaÅŸucu" - #~ msgid "Fragment" #~ msgstr "Bölümlenme" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index ef3e3b30ca..a154df0565 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -1,6 +1,5 @@ # Urdu (Pakistan) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Muhammad Ali <ali@codeonion.com>, 2016. @@ -533,7 +532,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -579,7 +579,7 @@ msgstr ".سپورٹ" msgid "Official" msgstr "" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "کمیونٹی" @@ -722,6 +722,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "" @@ -827,6 +828,7 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "" @@ -927,8 +929,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -938,6 +939,7 @@ msgid "Save As" msgstr "" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "" @@ -1007,8 +1009,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "" @@ -1201,7 +1202,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1218,7 +1220,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1389,8 +1390,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1444,6 +1445,10 @@ msgid "Save Scene As.." msgstr "" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1501,7 +1506,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1539,6 +1544,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "" @@ -1591,7 +1600,7 @@ msgstr "" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "" @@ -1619,35 +1628,23 @@ msgid "Redo" msgstr "" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Tools" +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp @@ -1655,47 +1652,15 @@ msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Tools" msgstr "" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1766,8 +1731,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1787,11 +1752,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1875,6 +1896,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1902,6 +1931,30 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the next Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2146,6 +2199,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2174,10 +2231,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2343,7 +2396,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2818,7 +2871,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3479,7 +3532,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3528,17 +3581,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3570,9 +3612,31 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3842,6 +3906,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3854,7 +3931,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3865,20 +3942,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3933,12 +4023,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3996,6 +4090,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4149,6 +4252,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4237,10 +4344,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4274,15 +4377,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4337,6 +4432,22 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert Case" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4416,6 +4527,14 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +msgid "Convert To Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Convert To Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4438,6 +4557,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4655,35 +4778,95 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Material Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4745,23 +4928,32 @@ msgid "Align Selection With View" msgstr ".تمام کا انتخاب" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr ".تمام کا انتخاب" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4789,27 +4981,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4833,14 +5013,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5253,11 +5425,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5269,7 +5441,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5486,6 +5658,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5551,7 +5727,7 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " +msgid "Project Settings (project.godot)" msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp @@ -5668,10 +5844,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5856,6 +6028,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5932,10 +6108,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "سب سکریپشن بنائیں" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5980,77 +6203,86 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +msgid "Error - Could not create script in filesystem." msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid Path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "سب سکریپشن بنائیں" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "سب سکریپشن بنائیں" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" +msgstr "" + +#: editor/script_create_dialog.cpp +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr ".تمام کا انتخاب" + +#: editor/script_create_dialog.cpp +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6708,8 +6940,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6777,12 +7011,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6798,6 +7026,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6840,6 +7076,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index f3afcab79d..bddb77c731 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -1,10 +1,10 @@ # Chinese (China) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # 纯æ´çš„å蛋 <tqj.zyy@gmail.com>, 2016. # 夿œˆè“风 <trlanfeng@foxmail.com>, 2016. +# å´äº®å¼Ÿ <wu@liangdi.me>, 2017. # ageazrael <ageazrael@gmail.com>, 2016. # Bruce Guo <guoboism@hotmail.com>, 2016. # Geequlim <geequlim@gmail.com>, 2016-2017. @@ -17,16 +17,15 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2017-03-07 06:32+0000\n" -"Last-Translator: Youmu <konpaku.w@gmail.com>\n" -"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/godot-" -"engine/godot/zh_CN/>\n" +"PO-Revision-Date: 2017-06-22 20:49+0800\n" +"Last-Translator: Geequlim <geequlim@gmail.com>\n" +"Language-Team: æ±‰è¯ <geequlim@gmail.com>\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.12\n" +"X-Generator: Gtranslator 2.91.7\n" #: editor/animation_editor.cpp msgid "Disabled" @@ -93,9 +92,8 @@ msgid "Anim Track Change Value Mode" msgstr "轨é“修改为值模å¼" #: editor/animation_editor.cpp -#, fuzzy msgid "Anim Track Change Wrap Mode" -msgstr "轨é“修改为值模å¼" +msgstr "轨é“修改为包装模å¼" #: editor/animation_editor.cpp msgid "Edit Node Curve" @@ -519,7 +517,7 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp #, fuzzy msgid "Download Error" -msgstr "å‘下" +msgstr "下载" #: editor/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -553,7 +551,8 @@ msgid "Search:" msgstr "æœç´¢:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -599,7 +598,7 @@ msgstr "支æŒ.." msgid "Official" msgstr "官方" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "社区" @@ -644,7 +643,6 @@ msgid "No Matches" msgstr "æ— åŒ¹é…项" #: editor/code_editor.cpp -#, fuzzy msgid "Replaced %d occurrence(s)." msgstr "替æ¢äº†%d项。" @@ -743,6 +741,7 @@ msgstr "æ·»åŠ " #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "移除" @@ -848,6 +847,7 @@ msgstr "资æº" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "路径" @@ -934,23 +934,21 @@ msgstr "åˆ é™¤" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." -msgstr "" +msgstr "将音频Bus布局ä¿å˜ä¸º.." #: editor/editor_audio_buses.cpp msgid "Location for New Layout.." -msgstr "" +msgstr "新布局的ä½ç½®.." #: editor/editor_audio_buses.cpp msgid "Open Audio Bus Layout" -msgstr "" +msgstr "打开音频Bus布局" #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Add Bus" -msgstr "æ·»åŠ (Add) %s" +msgstr "æ·»åŠ Bus" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "åŠ è½½" @@ -960,6 +958,7 @@ msgid "Save As" msgstr "å¦å˜ä¸º" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "默认" @@ -1028,8 +1027,7 @@ msgid "Rearrange Autoloads" msgstr "釿ޒåºAutoload" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "路径:" @@ -1097,7 +1095,7 @@ msgstr "打包ä¸" #: editor/editor_export.cpp platform/javascript/export/export.cpp msgid "Template file not found:\n" -msgstr "" +msgstr "找ä¸åˆ°æ¨¡æ¿æ–‡ä»¶:" #: editor/editor_export.cpp msgid "Added:" @@ -1217,11 +1215,11 @@ msgid "ScanSources" msgstr "æ‰«ææºæ–‡ä»¶" #: editor/editor_file_system.cpp -#, fuzzy msgid "(Re)Importing Assets" -msgstr "釿–°å¯¼å…¥" +msgstr "导入(釿–°)资æº" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "æœç´¢å¸®åŠ©" @@ -1238,7 +1236,6 @@ msgid "Class:" msgstr "ç±»:" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "基类:" @@ -1406,10 +1403,11 @@ msgid "There is no defined scene to run." msgstr "æ²¡æœ‰è®¾ç½®è¦æ‰§è¡Œçš„场景。" #: editor/editor_node.cpp +#, fuzzy msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" "尚未定义主场景。\n" "请在项目设置的application分类下设置选择主场景。" @@ -1469,6 +1467,11 @@ msgid "Save Scene As.." msgstr "场景å¦å˜ä¸º.." #: editor/editor_node.cpp +#, fuzzy +msgid "No" +msgstr "节点" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "æ¤åœºæ™¯å°šæœªä¿å˜ï¼Œè¦åœ¨è¿è¡Œä¹‹å‰ä¿å˜å®ƒå—?" @@ -1525,9 +1528,11 @@ msgid "" "Scene '%s' was automatically imported, so it can't be modified.\n" "To make changes to it, a new inherited scene can be created." msgstr "" +"自动导入的场景'ï¼…s'æ— æ³•ä¿®æ”¹ã€‚\n" +"è¦è¿›è¡Œæ›´æ”¹ï¼Œå¯ä»¥åˆ›å»ºä¸€ä¸ªæ–°çš„场景继承自它。" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "é¢" @@ -1566,6 +1571,10 @@ msgstr "更多的%d个文件" msgid "%d more file(s) or folder(s)" msgstr "更多的%d个文件或目录" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "æ— å¹²æ‰°æ¨¡å¼" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "场景" @@ -1583,9 +1592,8 @@ msgid "Previous tab" msgstr "上一个目录" #: editor/editor_node.cpp -#, fuzzy msgid "Filter Files.." -msgstr "快速ç›é€‰æ–‡ä»¶.." +msgstr "ç›é€‰æ–‡ä»¶.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1619,7 +1627,7 @@ msgstr "å…³é—场景" msgid "Close Goto Prev. Scene" msgstr "å…³é—å¹¶å‰å¾€ä¸Šä¸€ä¸ªåœºæ™¯" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "最近打开" @@ -1647,84 +1655,41 @@ msgid "Redo" msgstr "é‡åš" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "è¿è¡Œè„šæœ¬" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "项目设置" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "æ¢å¤åœºæ™¯" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "退出到项目列表" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" -msgstr "æ— å¹²æ‰°æ¨¡å¼" - -#: editor/editor_node.cpp msgid "Miscellaneous project or scene-wide tools." msgstr "其他工程或全场景工具。" #: editor/editor_node.cpp -msgid "Tools" -msgstr "工具" +#, fuzzy +msgid "Project" +msgstr "新建" #: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "导出项目到多个平å°ã€‚" +msgid "Project Settings" +msgstr "项目设置" + +#: editor/editor_node.cpp +msgid "Run Script" +msgstr "è¿è¡Œè„šæœ¬" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "导出" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "è¿è¡Œæ¤é¡¹ç›®ï¼ˆF5)。" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "æ’æ”¾" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "æš‚åœè¿è¡Œåœºæ™¯" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "æš‚åœè¿è¡Œåœºæ™¯" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "åœæ¢è¿è¡Œåœºæ™¯ã€‚" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "åœæ¢" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "打开并è¿è¡Œåœºæ™¯ã€‚" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "è¿è¡Œåœºæ™¯" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯" +msgid "Tools" +msgstr "工具" #: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯" +msgid "Quit to Project List" +msgstr "退出到项目列表" -#: editor/editor_node.cpp -msgid "Debug options" -msgstr "调试选项" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" +msgstr "调试" #: editor/editor_node.cpp msgid "Deploy with Remote Debug" @@ -1803,9 +1768,10 @@ msgstr "" "开坿¤é¡¹åŽï¼Œæ‰€æœ‰è„šæœ¬åœ¨ä¿å˜æ—¶éƒ½ä¼šè¢«æ£åœ¨è¿è¡Œçš„æ¸¸æˆé‡æ–°åŠ è½½ã€‚\n" "当使用远程设备调试时,使用网络文件系统能有效æé«˜ç¼–辑效率。" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "设置" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "编辑" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1820,17 +1786,73 @@ msgid "Toggle Fullscreen" msgstr "免屿¨¡å¼" #: editor/editor_node.cpp editor/project_export.cpp -#, fuzzy msgid "Manage Export Templates" -msgstr "æ£åœ¨åŠ è½½å¯¼å‡ºæ¨¡æ¿" +msgstr "管ç†å¯¼å‡ºæ¨¡æ¿" + +#: editor/editor_node.cpp +msgid "Help" +msgstr "帮助" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "类型" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "关闿–‡æ¡£" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" #: editor/editor_node.cpp msgid "About" msgstr "关于" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." -msgstr "å¤–éƒ¨èµ„æºæ”¹å˜åŽå¼¹å‡ºæç¤ºã€‚" +msgid "Play the project." +msgstr "è¿è¡Œæ¤é¡¹ç›®ï¼ˆF5)。" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "æ’æ”¾" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "æš‚åœè¿è¡Œåœºæ™¯" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "æš‚åœè¿è¡Œåœºæ™¯" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "åœæ¢è¿è¡Œåœºæ™¯ã€‚" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "åœæ¢" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "打开并è¿è¡Œåœºæ™¯ã€‚" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "è¿è¡Œåœºæ™¯" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "è¿è¡Œè‡ªå®šä¹‰åœºæ™¯" #: editor/editor_node.cpp msgid "Spins when the editor window repaints!" @@ -1913,6 +1935,14 @@ msgid "Thanks!" msgstr "谢谢ï¼" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "从ZIP文件ä¸å¯¼å…¥æ¨¡æ¿" @@ -1940,6 +1970,36 @@ msgstr "打开并è¿è¡Œè„šæœ¬" msgid "Load Errors" msgstr "åŠ è½½é”™è¯¯" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "åœ¨ç¼–è¾‘å™¨ä¸æ‰“å¼€" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "åœ¨ç¼–è¾‘å™¨ä¸æ‰“å¼€" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Script Editor" +msgstr "åœ¨ç¼–è¾‘å™¨ä¸æ‰“å¼€" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open Asset Library" +msgstr "导出库" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "åœ¨ç¼–è¾‘å™¨ä¸æ‰“å¼€" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the previous Editor" +msgstr "åœ¨ç¼–è¾‘å™¨ä¸æ‰“å¼€" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "已安装æ’ä»¶:" @@ -2057,37 +2117,32 @@ msgid "Import From Node:" msgstr "从节点ä¸å¯¼å…¥:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Re-Download" -msgstr "釿–°åŠ è½½" +msgstr "釿–°ä¸‹è½½" #: editor/export_template_manager.cpp -#, fuzzy msgid "Uninstall" -msgstr "安装" +msgstr "å¸è½½" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Installed)" -msgstr "安装" +msgstr "(安装)" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download" -msgstr "å‘下" +msgstr "下载" #: editor/export_template_manager.cpp msgid "(Missing)" -msgstr "" +msgstr "(丢失)" #: editor/export_template_manager.cpp -#, fuzzy msgid "(Current)" -msgstr "当å‰:" +msgstr "(当å‰)" #: editor/export_template_manager.cpp msgid "Remove template version '%s'?" -msgstr "" +msgstr "移除版本为 '%s' 的模æ¿" #: editor/export_template_manager.cpp msgid "Can't open export templates zip." @@ -2095,27 +2150,25 @@ msgstr "æ— æ³•æ‰“å¼€ZIP导出模æ¿ã€‚" #: editor/export_template_manager.cpp msgid "Invalid version.txt format inside templates." -msgstr "" +msgstr "æ¨¡æ¿æ–‡ä»¶ä¸çš„version.txtä¸åˆæ³•。" #: editor/export_template_manager.cpp msgid "" "Invalid version.txt format inside templates. Revision is not a valid " "identifier." -msgstr "" +msgstr "模æ¿ä¸çš„ version.txtæ–‡ä»¶æ ¼å¼ä¸åˆæ³•ï¼Œæ— æ•ˆçš„ç‰ˆæœ¬æ ‡è¯†ç¬¦ã€‚" #: editor/export_template_manager.cpp msgid "No version.txt found inside templates." -msgstr "" +msgstr "模æ¿ä¸æ²¡æœ‰æ‰¾åˆ°version.txt文件。" #: editor/export_template_manager.cpp -#, fuzzy msgid "Error creating path for templates:\n" -msgstr "ä¿å˜è´´å›¾é›†å‡ºé”™:" +msgstr "æ— æ³•å°†æ¨¡æ¿ä¿å˜åˆ°ä»¥ä¸‹æ–‡ä»¶:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Extracting Export Templates" -msgstr "æ£åœ¨åŠ è½½å¯¼å‡ºæ¨¡æ¿" +msgstr "æ£åœ¨è§£åŽ‹å¯¼å‡ºæ¨¡æ¿" #: editor/export_template_manager.cpp msgid "Importing:" @@ -2126,34 +2179,28 @@ msgid "Loading Export Templates" msgstr "æ£åœ¨åŠ è½½å¯¼å‡ºæ¨¡æ¿" #: editor/export_template_manager.cpp -#, fuzzy msgid "Current Version:" -msgstr "当å‰åœºæ™¯" +msgstr "当å‰ç‰ˆæœ¬:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Installed Versions:" -msgstr "已安装æ’ä»¶:" +msgstr "已安装版本:" #: editor/export_template_manager.cpp -#, fuzzy msgid "Install From File" -msgstr "安装项目:" +msgstr "从文件安装" #: editor/export_template_manager.cpp -#, fuzzy msgid "Remove Template" -msgstr "移除项目" +msgstr "移除模æ¿" #: editor/export_template_manager.cpp -#, fuzzy msgid "Select template file" -msgstr "åˆ é™¤é€‰ä¸çš„æ–‡ä»¶ï¼Ÿ" +msgstr "åˆ é™¤é€‰ä¸æ¨¡æ¿æ–‡ä»¶" #: editor/export_template_manager.cpp -#, fuzzy msgid "Export Template Manager" -msgstr "æ£åœ¨åŠ è½½å¯¼å‡ºæ¨¡æ¿" +msgstr "模æ¿å¯¼å‡ºå·¥å…·" #: editor/file_type_cache.cpp msgid "Can't open file_type_cache.cch for writing, not saving file type cache!" @@ -2161,7 +2208,7 @@ msgstr "æ— æ³•ä»¥å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼" #: editor/filesystem_dock.cpp msgid "Cannot navigate to '" -msgstr "" +msgstr "æ— æ³•å¯¼èˆªåˆ° " #: editor/filesystem_dock.cpp msgid "Same source and destination files, doing nothing." @@ -2188,13 +2235,16 @@ msgid "No files selected!" msgstr "没有选ä¸ä»»ä½•文件ï¼" #: editor/filesystem_dock.cpp -#, fuzzy msgid "Expand all" -msgstr "展开父节点" +msgstr "展开所有" #: editor/filesystem_dock.cpp msgid "Collapse all" -msgstr "" +msgstr "收起所有" + +#: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "在资æºç®¡ç†å™¨ä¸æ‰“å¼€" #: editor/filesystem_dock.cpp msgid "Instance" @@ -2225,10 +2275,6 @@ msgid "Info" msgstr "ä¿¡æ¯" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "在资æºç®¡ç†å™¨ä¸æ‰“å¼€" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "釿–°å¯¼å…¥.." @@ -2306,21 +2352,18 @@ msgid "Saving.." msgstr "ä¿å˜ä¸..." #: editor/import_dock.cpp -#, fuzzy msgid " Files" msgstr "文件" #: editor/import_dock.cpp -#, fuzzy msgid "Import As:" -msgstr "导入" +msgstr "导入为:" #: editor/import_dock.cpp editor/property_editor.cpp msgid "Preset.." msgstr "预设.." #: editor/import_dock.cpp -#, fuzzy msgid "Reimport" msgstr "釿–°å¯¼å…¥" @@ -2395,9 +2438,10 @@ msgid "No target font resource!" msgstr "è¯·è®¾ç½®ç›®æ ‡å—体资æºï¼" #: editor/io_plugins/editor_font_import_plugin.cpp +#, fuzzy msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" "文件扩展åä¸åˆæ³•\n" "请使用.fnt文件。" @@ -2878,8 +2922,8 @@ msgstr "压缩" #: editor/io_plugins/editor_translation_import_plugin.cpp #, fuzzy -msgid "Add to Project (godot.cfg)" -msgstr "æ·»åŠ åˆ°é¡¹ç›®ï¼ˆengine.cfg)" +msgid "Add to Project (project.godot)" +msgstr "æ·»åŠ åˆ°é¡¹ç›® (godot.cfg)" #: editor/io_plugins/editor_translation_import_plugin.cpp msgid "Import Languages:" @@ -2918,9 +2962,8 @@ msgid "Change Animation Name:" msgstr "é‡å‘½å动画:" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Delete Animation?" -msgstr "å¤åˆ¶åŠ¨ç”»" +msgstr "åˆ é™¤åŠ¨ç”»" #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp @@ -3539,7 +3582,7 @@ msgid "Change default type" msgstr "修改默认值" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "好的" @@ -3590,17 +3633,6 @@ msgstr "创建 Poly3D (多边型3D)" msgid "Set Handle" msgstr "设置处ç†ç¨‹åº" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "æ·»åŠ /åˆ é™¤è‰²å½©æ¸å˜ç‚¹" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "修改色彩曲线图" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "创建 Mesh(ç½‘æ ¼) 库" @@ -3633,8 +3665,31 @@ msgstr "ä»Žåœºæ™¯ä¸æ›´æ–°" #: editor/plugins/curve_editor_plugin.cpp #, fuzzy +msgid "Add point" +msgstr "æ·»åŠ è¾“å…¥äº‹ä»¶" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "移除路径顶点" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Load preset" +msgstr "åŠ è½½èµ„æº" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" -msgstr "修改曲线图" +msgstr "修改曲线" + +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "æ·»åŠ /åˆ é™¤è‰²å½©æ¸å˜ç‚¹" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "修改色彩曲线图" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -3673,19 +3728,16 @@ msgid "RMB: Erase Point." msgstr "é¼ æ ‡å³é”®:移除点。" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Remove Point from Line2D" -msgstr "从曲线ä¸ç§»é™¤é¡¶ç‚¹" +msgstr "从Line2Dä¸ç§»é™¤é¡¶ç‚¹" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Add Point to Line2D" -msgstr "呿›²çº¿æ·»åŠ é¡¶ç‚¹" +msgstr "å‘Line2Dæ·»åŠ é¡¶ç‚¹" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Move Point in Line2D" -msgstr "在曲线ä¸ç§»åŠ¨é¡¶ç‚¹" +msgstr "在Line2Dä¸ç§»åŠ¨é¡¶ç‚¹" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3718,9 +3770,8 @@ msgid "Add Point (in empty space)" msgstr "æ·»åŠ ç‚¹ï¼ˆåœ¨ç©ºç™½å¤„ï¼‰" #: editor/plugins/line_2d_editor_plugin.cpp -#, fuzzy msgid "Split Segment (in line)" -msgstr "拆分(曲线)" +msgstr "拆分片段(使用线段)" #: editor/plugins/line_2d_editor_plugin.cpp #: editor/plugins/path_2d_editor_plugin.cpp @@ -3909,6 +3960,20 @@ msgid "Remove Poly And Point" msgstr "移除多边形åŠé¡¶ç‚¹" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "清除Emission Mask(å‘å°„å±è”½ï¼‰" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generating AABB" +msgstr "生æˆAABB" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "åŠ è½½å›¾ç‰‡å‡ºé”™:" @@ -3921,8 +3986,8 @@ msgid "Set Emission Mask" msgstr "设置Emission Mask(å‘å°„å±è”½ï¼‰" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" -msgstr "清除Emission Mask(å‘å°„å±è”½ï¼‰" +msgid "Generate Visibility Rect" +msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp msgid "Load Emission Mask" @@ -3932,6 +3997,27 @@ msgstr "åŠ è½½Emission Mask(å‘å°„å±è”½ï¼‰" msgid "Generated Point Count:" msgstr "生æˆé¡¶ç‚¹è®¡æ•°:" +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +#, fuzzy +msgid "Generation Time (sec):" +msgstr "å¹³å‡å¸§æ—¶é—´ï¼ˆç§’)" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Mask" +msgstr "设置Emission Mask(å‘å°„å±è”½ï¼‰" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Capture from Pixel" +msgstr "从场景ä¸åˆ›å»º" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#, fuzzy +msgid "Emission Colors" +msgstr "å‘å°„ä½ç½®:" + #: editor/plugins/particles_editor_plugin.cpp msgid "Node does not contain geometry." msgstr "节点ä¸åŒ…å«å‡ 何。" @@ -3942,12 +4028,7 @@ msgstr "节点ä¸åŒ…å«å‡ 何(é¢ï¼‰ã€‚" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." -msgstr "" - -#: editor/plugins/particles_editor_plugin.cpp -#, fuzzy -msgid "Generating AABB" -msgstr "生æˆAABB" +msgstr "需è¦ä½¿ç”¨â€œParticlesMaterialâ€ç±»åž‹çš„å¤„ç†æè´¨ã€‚" #: editor/plugins/particles_editor_plugin.cpp msgid "Faces contain no area!" @@ -3962,14 +4043,12 @@ msgid "Generate AABB" msgstr "生æˆAABB" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Mesh" -msgstr "ä»Žç½‘æ ¼ï¼ˆ Mesh)创建å‘射器(Emitter)" +msgstr "ä»Žç½‘æ ¼ï¼ˆ Mesh)创建å‘射器(Emission)" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Create Emission Points From Node" -msgstr "从节点创建å‘射器(Emitter)" +msgstr "从节点创建å‘射器(Emission)" #: editor/plugins/particles_editor_plugin.cpp msgid "Clear Emitter" @@ -3980,40 +4059,42 @@ msgid "Create Emitter" msgstr "创建å‘射器(Emitter)" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Points:" -msgstr "å‘å°„ä½ç½®ï¼š" +msgstr "å‘å°„ä½ç½®:" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Surface Points" -msgstr "è¡¨é¢ %d" +msgstr "表é¢é¡¶ç‚¹" #: editor/plugins/particles_editor_plugin.cpp msgid "Surface Points+Normal (Directed)" -msgstr "" +msgstr "表é¢å®šç‚¹+法线(方å‘å‘é‡ï¼‰" #: editor/plugins/particles_editor_plugin.cpp msgid "Volume" msgstr "体积" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source: " -msgstr "å‘射填充:" +msgstr "å‘å°„æºï¼š" #: editor/plugins/particles_editor_plugin.cpp #, fuzzy msgid "Generate Visibility AABB" msgstr "生æˆAABB" -#: editor/plugins/particles_editor_plugin.cpp +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" +msgstr "从曲线ä¸ç§»é™¤é¡¶ç‚¹" + +#: editor/plugins/path_2d_editor_plugin.cpp #, fuzzy -msgid "Generation Time (sec):" -msgstr "å¹³å‡å¸§æ—¶é—´ï¼ˆç§’)" +msgid "Remove Out-Control from Curve" +msgstr "移动曲线外控制点" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +#, fuzzy +msgid "Remove In-Control from Curve" msgstr "从曲线ä¸ç§»é™¤é¡¶ç‚¹" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4071,6 +4152,16 @@ msgstr "拆分路径" msgid "Remove Path Point" msgstr "移除路径顶点" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "移动曲线外控制点" + +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove In-Control Point" +msgstr "移动曲线内控制点" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "创建UV贴图" @@ -4224,6 +4315,11 @@ msgid "Pitch" msgstr "音调" #: editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Clear Recent Files" +msgstr "清除骨骼" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "ä¿å˜ä¸»é¢˜å‡ºé”™" @@ -4311,10 +4407,6 @@ msgstr "查找.." msgid "Find Next" msgstr "查找下一项" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "调试" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "啿¥è·³è¿‡" @@ -4348,16 +4440,9 @@ msgid "Move Right" msgstr "å‘å³ç§»åЍ" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "教程" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "打开 https://godotengine.org ä¸çš„æ•™ç¨‹." - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" -msgstr "类型" +#, fuzzy +msgid "Open Godot online documentation" +msgstr "æœç´¢æ–‡æ¡£ã€‚" #: editor/plugins/script_editor_plugin.cpp msgid "Search the class hierarchy." @@ -4376,9 +4461,8 @@ msgid "Go to next edited document." msgstr "å‰å¾€ä¸‹ä¸€ä¸ªç¼–辑文档。" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Discard" -msgstr "分离" +msgstr "忽略" #: editor/plugins/script_editor_plugin.cpp msgid "Create Script" @@ -4414,6 +4498,23 @@ msgid "Pick Color" msgstr "拾å–颜色" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "æ£åœ¨è½¬æ¢å›¾ç‰‡" + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4493,6 +4594,16 @@ msgid "Goto Previous Breakpoint" msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–点" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "转æ¢ä¸º.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "转æ¢ä¸º.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "查找上一项" @@ -4515,6 +4626,10 @@ msgstr "å‰å¾€è¡Œ.." msgid "Contextual Help" msgstr "æœç´¢å…‰æ ‡ä½ç½®" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "修改Scalar常é‡ç³»æ•°" @@ -4732,36 +4847,106 @@ msgid "Animation Key Inserted." msgstr "æ’入动画键。" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "å‰è¿›" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Backwards" +msgstr "å‘åŽ" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "滚轮å‘下滚动。" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "有更改时更新UI" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "有更改时更新UI" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "有更改时更新UI" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Vertices" +msgstr "顶点" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "与视图对é½" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" -msgstr "环境" +msgid "Display Normal" +msgstr "显示法线" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" -msgstr "音频监å¬å™¨" +msgid "Display Wireframe" +msgstr "显示线框" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" -msgstr "Gizmos(å¯è§†åŒ–调试工具)" +msgid "Display Overdraw" +msgstr "显示过度绘制" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" -msgstr "XFormå¯¹è¯æ¡†" +#, fuzzy +msgid "Display Unshaded" +msgstr "æ˜¾ç¤ºæ— é˜´å½±" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" -msgstr "没有选用è¦å®žä¾‹åŒ–的场景ï¼" +#, fuzzy +msgid "View Environment" +msgstr "环境" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" -msgstr "å…‰æ ‡å¤„å®žä¾‹" +#, fuzzy +msgid "View Gizmos" +msgstr "Gizmos(å¯è§†åŒ–调试工具)" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" -msgstr "æ— æ³•å®žä¾‹åŒ–åœºæ™¯ï¼" +msgid "View Information" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Audio Listener" +msgstr "音频监å¬å™¨" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" +msgstr "XFormå¯¹è¯æ¡†" #: editor/plugins/spatial_editor_plugin.cpp msgid "Move Mode (W)" @@ -4820,6 +5005,26 @@ msgid "Align Selection With View" msgstr "选ä¸é¡¹ä¸Žè§†å›¾å¯¹é½" #: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Select" +msgstr "选择" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Move" +msgstr "移动" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Rotate" +msgstr "Ctrl:旋转" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Tool Scale" +msgstr "缩放:" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Transform" msgstr "å˜æ¢" @@ -4832,14 +5037,6 @@ msgid "Transform Dialog.." msgstr "å˜æ¢å¯¹è¯æ¡†.." #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" -msgstr "使用默认光照" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" -msgstr "使用默认sRGB" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" msgstr "1个视å£" @@ -4864,22 +5061,6 @@ msgid "4 Viewports" msgstr "4个视å£" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "显示法线" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "显示线框" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "显示过度绘制" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "æ˜¾ç¤ºæ— é˜´å½±" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "显示原点" @@ -4888,6 +5069,10 @@ msgid "View Grid" msgstr "æ˜¾ç¤ºç½‘æ ¼" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "设置" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "æ•æ‰(snap)设置" @@ -4908,14 +5093,6 @@ msgid "Viewport Settings" msgstr "Viewport设置" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "默认光照法线:" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "环境光颜色:" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "é€è§†è§†è§’(角度):" @@ -5254,24 +5431,20 @@ msgid "Error" msgstr "错误" #: editor/project_export.cpp -#, fuzzy msgid "Runnable" msgstr "å¯ç”¨" #: editor/project_export.cpp -#, fuzzy msgid "Delete patch '" -msgstr "åˆ é™¤è¾“å…¥äº‹ä»¶" +msgstr "åˆ é™¤Patch" #: editor/project_export.cpp -#, fuzzy msgid "Delete preset '%s'?" -msgstr "åˆ é™¤é€‰ä¸çš„æ–‡ä»¶ï¼Ÿ" +msgstr "åˆ é™¤é€‰ä¸çš„ '%s'?" #: editor/project_export.cpp -#, fuzzy msgid "Presets" -msgstr "预设.." +msgstr "预设" #: editor/project_export.cpp editor/project_settings.cpp msgid "Add.." @@ -5282,17 +5455,14 @@ msgid "Resources" msgstr "资æº" #: editor/project_export.cpp -#, fuzzy msgid "Export all resources in the project" msgstr "导出项目ä¸çš„æ‰€æœ‰èµ„æºã€‚" #: editor/project_export.cpp -#, fuzzy msgid "Export selected scenes (and dependencies)" -msgstr "导出选ä¸çš„资æºï¼ˆåŒ…括其ä¾èµ–资æºï¼‰ã€‚" +msgstr "导出选ä¸çš„场景(包括其ä¾èµ–)。" #: editor/project_export.cpp -#, fuzzy msgid "Export selected resources (and dependencies)" msgstr "导出选ä¸çš„资æºï¼ˆåŒ…括其ä¾èµ–资æºï¼‰ã€‚" @@ -5301,40 +5471,34 @@ msgid "Export Mode:" msgstr "导出模å¼:" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" msgstr "导出的资æº:" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to export non-resource files (comma separated, e.g: *.json, *.txt)" msgstr "导出éžèµ„æºæ–‡ä»¶ç›é€‰ï¼ˆä½¿ç”¨è‹±æ–‡é€—å·åˆ†éš”,如:*.json,*.txt):" #: editor/project_export.cpp -#, fuzzy msgid "" "Filters to exclude files from project (comma separated, e.g: *.json, *.txt)" msgstr "排除导出的éžèµ„æºæ–‡ä»¶ç›é€‰ï¼ˆä½¿ç”¨è‹±æ–‡é€—å·åˆ†éš”,如:*.json,*.txt):" #: editor/project_export.cpp -#, fuzzy msgid "Patches" -msgstr "匹é…项:" +msgstr "Patch" #: editor/project_export.cpp -#, fuzzy msgid "Make Patch" -msgstr "ç›®æ ‡è·¯å¾„:" +msgstr "制作Patch" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" -msgstr "" +msgstr "没有下列平å°çš„导出模æ¿:" #: editor/project_export.cpp -#, fuzzy msgid "Export With Debug" -msgstr "å¯¼å‡ºç –å—集" +msgstr "导出为调试" #: editor/project_manager.cpp msgid "Invalid project path, the path must exist!" @@ -5342,13 +5506,13 @@ msgstr "项目目录ä¸å˜åœ¨ï¼" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must not exist." -msgstr "项目目录下必须包å«engin.cfg文件。" +msgid "Invalid project path, project.godot must not exist." +msgstr "项目目录下ä¸èƒ½åŒ…å«godot.cfg文件。" #: editor/project_manager.cpp #, fuzzy -msgid "Invalid project path, *.godot must exist." -msgstr "项目目录下必须包å«engin.cfg文件。" +msgid "Invalid project path, project.godot must exist." +msgstr "项目目录下必须包å«godot.cfg文件。" #: editor/project_manager.cpp msgid "Imported Project" @@ -5360,8 +5524,8 @@ msgstr "é¡¹ç›®è·¯å¾„éžæ³•(被外部修改?)。" #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't create *.godot project file in project path." -msgstr "æ— æ³•åœ¨é¡¹ç›®ç›®å½•ä¸‹åˆ›å»ºengine.cfg文件。" +msgid "Couldn't create project.godot in project path." +msgstr "æ— æ³•åœ¨é¡¹ç›®ç›®å½•ä¸‹åˆ›å»ºgodot.cfg文件。" #: editor/project_manager.cpp msgid "The following files failed extraction from package:" @@ -5456,7 +5620,7 @@ msgstr "新建" #: editor/project_manager.cpp #, fuzzy msgid "Templates" -msgstr "移除项目" +msgstr "移除模æ¿" #: editor/project_manager.cpp msgid "Exit" @@ -5558,16 +5722,14 @@ msgid "Button 9" msgstr "按键 9" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Axis Index:" -msgstr "手柄摇æ†:" +msgstr "手柄摇æ†åºå·:" #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Axis" msgstr "è½´" #: editor/project_settings.cpp -#, fuzzy msgid "Joypad Button Index:" msgstr "手柄按钮:" @@ -5579,6 +5741,11 @@ msgstr "æ·»åŠ è¾“å…¥åŠ¨ä½œ" msgid "Erase Input Action Event" msgstr "移除输入事件" +#: editor/project_settings.cpp +#, fuzzy +msgid "Add Event" +msgstr "æ·»åŠ ç©ºç™½å¸§" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "设备" @@ -5645,8 +5812,8 @@ msgstr "移除资æºé‡å®šå‘选项" #: editor/project_settings.cpp #, fuzzy -msgid "Project Settings " -msgstr "项目设置" +msgid "Project Settings (project.godot)" +msgstr "项目设置(godot.cfg)" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5713,9 +5880,8 @@ msgid "AutoLoad" msgstr "è‡ªåŠ¨åŠ è½½(AutoLoad)" #: editor/property_editor.cpp -#, fuzzy msgid "Pick a Viewport" -msgstr "1个视å£" +msgstr "选择1个视å£" #: editor/property_editor.cpp msgid "Ease In" @@ -5754,20 +5920,14 @@ msgid "New Script" msgstr "新建脚本" #: editor/property_editor.cpp -#, fuzzy msgid "Show in File System" -msgstr "文件系统" +msgstr "在资æºç®¡ç†å™¨ä¸å±•示" #: editor/property_editor.cpp msgid "Error loading file: Not a resource!" msgstr "åŠ è½½æ–‡ä»¶å‡ºé”™:䏿˜¯èµ„æºæ–‡ä»¶ï¼" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "æ— æ³•åŠ è½½å›¾ç‰‡" - -#: editor/property_editor.cpp -#, fuzzy msgid "Pick a Node" msgstr "选择一个节点" @@ -5911,7 +6071,7 @@ msgstr "æ¤æ“ä½œå¿…é¡»åœ¨æ‰“å¼€ä¸€ä¸ªåœºæ™¯åŽæ‰èƒ½æ‰§è¡Œã€‚" #: editor/scene_tree_dock.cpp msgid "Can not perform with the root node." -msgstr "" +msgstr "æ— æ³•å¯¹æ ¹èŠ‚ç‚¹æ‰§è¡Œæ¤æ“作。" #: editor/scene_tree_dock.cpp msgid "This operation can't be done on instanced scenes." @@ -5952,6 +6112,11 @@ msgid "Error duplicating scene to save it." msgstr "å¤åˆ¶åœºæ™¯å‡ºé”™ã€‚" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "资æº:" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "编辑分组" @@ -5992,9 +6157,8 @@ msgid "Save Branch as Scene" msgstr "将分支ä¿å˜ä¸ºåœºæ™¯" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Copy Node Path" -msgstr "æ‹·è´è·¯å¾„" +msgstr "æ‹·è´èŠ‚ç‚¹è·¯å¾„" #: editor/scene_tree_dock.cpp msgid "Delete (No Confirm)" @@ -6027,10 +6191,59 @@ msgid "Toggle CanvasItem Visible" msgstr "切æ¢CanvasItemå¯è§" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "调试选项" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "实例:" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "下一个脚本" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Toggle Visibility" +msgstr "切æ¢Spatialå¯è§" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "节点åç§°éžæ³•,ä¸å…许包å«ä»¥ä¸‹å—符:" @@ -6075,75 +6288,93 @@ msgid "Select a Node" msgstr "选择一个节点" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "基类åç§°éžæ³•" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "æ— æ³•åˆ›å»ºè„šæœ¬ã€‚" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "åˆæ³•çš„å—符:" +msgid "Error loading script from %s" +msgstr "从%såŠ è½½è„šæœ¬å‡ºé”™" #: editor/script_create_dialog.cpp -msgid "Invalid class name" -msgstr "ç±»åéžæ³•" +msgid "Path is empty" +msgstr "文件路径为空" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "åç§°å¯ç”¨" +msgid "Path is not local" +msgstr "必须是项目路径" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid base path" +msgstr "çˆ¶è·¯å¾„éžæ³•" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" -msgstr "ç±»åéžæ³•!" +msgid "Invalid extension" +msgstr "扩展åéžæ³•" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "基类åç§°éžæ³•!" +msgid "Wrong extension chosen" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" -msgstr "è·¯å¾„éžæ³•ï¼" +#, fuzzy +msgid "Invalid Path" +msgstr "è·¯å¾„éžæ³•。" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." -msgstr "æ— æ³•åˆ›å»ºè„šæœ¬ã€‚" +msgid "Invalid class name" +msgstr "ç±»åéžæ³•" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" -msgstr "从%såŠ è½½è„šæœ¬å‡ºé”™" +#, fuzzy +msgid "Invalid inherited parent name or path" +msgstr "属性åç§°éžæ³•。" #: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "文件路径为空" +#, fuzzy +msgid "Script valid" +msgstr "脚本" #: editor/script_create_dialog.cpp -msgid "Path is not local" -msgstr "必须是项目路径" +msgid "Allowed: a-z, A-Z, 0-9 and _" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "çˆ¶è·¯å¾„éžæ³•" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "扩展åéžæ³•" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +#, fuzzy +msgid "Create new script file" msgstr "创建新脚本" #: editor/script_create_dialog.cpp -msgid "Load existing script" +#, fuzzy +msgid "Load existing script file" msgstr "åŠ è½½çŽ°æœ‰è„šæœ¬" #: editor/script_create_dialog.cpp -msgid "Class Name:" +#, fuzzy +msgid "Inherits" +msgstr "基类:" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Class Name" msgstr "ç±»å:" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +#, fuzzy +msgid "Template" +msgstr "移除模æ¿" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" msgstr "内置脚本" #: editor/script_create_dialog.cpp @@ -6638,31 +6869,26 @@ msgid "just released" msgstr "刚好释放" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Run in Browser" -msgstr "æµè§ˆ" +msgstr "在æµè§ˆå™¨ä¸è¿è¡Œ" #: platform/javascript/export/export.cpp msgid "Run exported HTML in the system's default browser." -msgstr "" +msgstr "使用默认æµè§ˆå™¨æ‰“开导出的HTML文件." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file:\n" -msgstr "找ä¸åˆ°ç –å—:" +msgstr "æ— æ³•å†™å…¥æ–‡ä»¶:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file:\n" -msgstr "找ä¸åˆ°ç –å—:" +msgstr "æ— æ³•è¯»å–æ–‡ä»¶:\n" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export:\n" -msgstr "æ— æ³•åˆ›å»ºç›®å½•ã€‚" +msgstr "æ— æ³•æ‰“å¼€å¯¼å‡ºæ¨¡æ¿ï¼š\n" #: platform/uwp/export/export.cpp -#, fuzzy msgid "" "Couldn't read the certificate file. Are the path and password both correct?" msgstr "æ— æ³•è¯»å–è¯ä¹¦æ–‡ä»¶ã€‚è·¯å¾„å’Œå¯†ç æ˜¯å¦éƒ½æ£ç¡®ï¼Ÿ" @@ -6815,9 +7041,11 @@ msgid "" msgstr "" "ParallaxLayer类型的节点必须作为ParallaxBackgroundçš„å节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." -msgstr "path属性必须指å‘ä¸€ä¸ªåˆæ³•çš„Particles2D节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." +msgstr "" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -6894,12 +7122,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "path属性必须指å‘ä¸€ä¸ªåˆæ³•çš„Spatial节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" @@ -6917,6 +7139,15 @@ msgstr "" "SpriteFrame资æºå¿…须是通过AnimatedSprite3D节点的Frames属性创建的,å¦åˆ™æ— 法显示" "动画帧。" +#: scene/gui/color_picker.cpp +#, fuzzy +msgid "RAW Mode" +msgstr "è¿è¡Œæ¨¡å¼:" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "æç¤ºï¼" @@ -6960,6 +7191,15 @@ msgid "" "Use a container as child (VBox,HBox,etc), or a Control and set the custom " "minimum size manually." msgstr "" +"ScrollContainer旨在与å•ä¸ªåæŽ§ä»¶é…åˆä½¿ç”¨ã€‚\n" +"使用Container(VBox,HBoxç‰ï¼‰ä½œä¸ºå…¶å控件并手动或设置Control的自定义最å°å°º" +"寸。" + +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" #: scene/main/viewport.cpp msgid "" @@ -6978,9 +7218,62 @@ msgstr "" #~ msgid "Import assets to the project." #~ msgstr "导入资æºã€‚" -#, fuzzy -#~ msgid "Project Settings (godot.cfg)" -#~ msgstr "项目设置(engine.cfg)" +#~ msgid "Export the project to many platforms." +#~ msgstr "导出项目到多个平å°ã€‚" + +#~ msgid "Alerts when an external resource has changed." +#~ msgstr "å¤–éƒ¨èµ„æºæ”¹å˜åŽå¼¹å‡ºæç¤ºã€‚" + +#~ msgid "Tutorials" +#~ msgstr "教程" + +#~ msgid "Open https://godotengine.org at tutorials section." +#~ msgstr "打开 https://godotengine.org ä¸çš„æ•™ç¨‹." + +#~ msgid "No scene selected to instance!" +#~ msgstr "没有选用è¦å®žä¾‹åŒ–的场景ï¼" + +#~ msgid "Instance at Cursor" +#~ msgstr "å…‰æ ‡å¤„å®žä¾‹" + +#~ msgid "Could not instance scene!" +#~ msgstr "æ— æ³•å®žä¾‹åŒ–åœºæ™¯ï¼" + +#~ msgid "Use Default Light" +#~ msgstr "使用默认光照" + +#~ msgid "Use Default sRGB" +#~ msgstr "使用默认sRGB" + +#~ msgid "Default Light Normal:" +#~ msgstr "默认光照法线:" + +#~ msgid "Ambient Light Color:" +#~ msgstr "环境光颜色:" + +#~ msgid "Couldn't load image" +#~ msgstr "æ— æ³•åŠ è½½å›¾ç‰‡" + +#~ msgid "Invalid parent class name" +#~ msgstr "基类åç§°éžæ³•" + +#~ msgid "Valid chars:" +#~ msgstr "åˆæ³•çš„å—符:" + +#~ msgid "Valid name" +#~ msgstr "åç§°å¯ç”¨" + +#~ msgid "Class name is invalid!" +#~ msgstr "ç±»åéžæ³•!" + +#~ msgid "Parent class name is invalid!" +#~ msgstr "基类åç§°éžæ³•!" + +#~ msgid "Invalid path!" +#~ msgstr "è·¯å¾„éžæ³•ï¼" + +#~ msgid "Path property must point to a valid Particles2D node to work." +#~ msgstr "path属性必须指å‘ä¸€ä¸ªåˆæ³•çš„Particles2D节点æ‰èƒ½æ£å¸¸å·¥ä½œã€‚" #~ msgid "Surface" #~ msgstr "表é¢" @@ -7201,9 +7494,6 @@ msgstr "" #~ msgid "Trailing Silence:" #~ msgstr "å°¾éšæ²‰é»˜(Trailing Silence):" -#~ msgid "Script" -#~ msgstr "脚本" - #~ msgid "Script Export Mode:" #~ msgstr "脚本导出方å¼:" @@ -7237,9 +7527,6 @@ msgstr "" #~ msgid "BakedLightInstance does not contain a BakedLight resource." #~ msgstr "BakedLightInstance未包å«BakedLight资æºã€‚" -#~ msgid "Vertex" -#~ msgstr "顶点" - #~ msgid "Fragment" #~ msgstr "片段" @@ -7269,9 +7556,6 @@ msgstr "" #~ msgid "Cannot go into subdir:" #~ msgstr "æ— æ³•æ‰“å¼€ç›®å½•:" -#~ msgid "Help" -#~ msgstr "帮助" - #~ msgid "Imported Resources" #~ msgstr "已导入的资æº" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index e49582e901..110f5b6fab 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -1,6 +1,5 @@ -# Chinese (Honk Kong) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Chinese (Hong Kong) translation of the Godot Engine editor +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # # Wesley (zx-wt) <ZX_WT@ymail.com>, 2016. @@ -542,7 +541,8 @@ msgid "Search:" msgstr "" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" @@ -588,7 +588,7 @@ msgstr "" msgid "Official" msgstr "官方" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "社群" @@ -733,6 +733,7 @@ msgstr "æ·»åŠ " #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" msgstr "移除" @@ -839,6 +840,7 @@ msgstr "資æº" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" msgstr "路徑" @@ -939,8 +941,7 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" msgstr "" @@ -950,6 +951,7 @@ msgid "Save As" msgstr "å¦å˜ç‚º" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" msgstr "é è¨" @@ -1020,8 +1022,7 @@ msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" msgstr "路徑:" @@ -1215,7 +1216,8 @@ msgstr "" msgid "(Re)Importing Assets" msgstr "å°Žå…¥ä¸:" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1232,7 +1234,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1405,8 +1406,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1460,6 +1461,10 @@ msgid "Save Scene As.." msgstr "æŠŠå ´æ™¯å¦å˜ç‚º" #: editor/editor_node.cpp +msgid "No" +msgstr "" + +#: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" msgstr "" @@ -1516,7 +1521,7 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" msgstr "" @@ -1554,6 +1559,10 @@ msgstr "" msgid "%d more file(s) or folder(s)" msgstr "" +#: editor/editor_node.cpp +msgid "Distraction Free Mode" +msgstr "" + #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp msgid "Scene" msgstr "å ´æ™¯" @@ -1607,7 +1616,7 @@ msgstr "é—œé–‰å ´æ™¯" msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" msgstr "開啓最近的" @@ -1635,83 +1644,39 @@ msgid "Redo" msgstr "é‡è£½" #: editor/editor_node.cpp -msgid "Run Script" -msgstr "é‹è¡Œè…³æœ¬" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" - -#: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Project" msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." +msgid "Project Settings" msgstr "" #: editor/editor_node.cpp -msgid "Tools" -msgstr "工具" - -#: editor/editor_node.cpp -msgid "Export the project to many platforms." -msgstr "" +msgid "Run Script" +msgstr "é‹è¡Œè…³æœ¬" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" msgstr "" #: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "æš«åœå ´æ™¯" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "é‹è¡Œä¿®æ”¹çš„å ´æ™¯" - -#: editor/editor_node.cpp -msgid "Play Scene" -msgstr "é‹è¡Œå ´æ™¯" +msgid "Tools" +msgstr "工具" #: editor/editor_node.cpp -msgid "Play custom scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Play Custom Scene" -msgstr "é‹è¡Œå ´æ™¯" - -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1782,9 +1747,10 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" -msgstr "è¨å®š" +#: editor/editor_node.cpp +#, fuzzy +msgid "Editor" +msgstr "編輯" #: editor/editor_node.cpp editor/settings_config_dialog.cpp msgid "Editor Settings" @@ -1803,14 +1769,71 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy +msgid "Online Docs" +msgstr "é—œé–‰å ´æ™¯" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "關於" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "" + +#: editor/editor_node.cpp +msgid "Pause the scene" msgstr "" #: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "æš«åœå ´æ™¯" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "é‹è¡Œä¿®æ”¹çš„å ´æ™¯" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "é‹è¡Œå ´æ™¯" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" +msgstr "é‹è¡Œå ´æ™¯" + +#: editor/editor_node.cpp msgid "Spins when the editor window repaints!" msgstr "" @@ -1891,6 +1914,14 @@ msgid "Thanks!" msgstr "多è¬!" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1918,6 +1949,33 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 2D Editor" +msgstr "開啟資料夾" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open 3D Editor" +msgstr "開啟資料夾" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "è¦é›¢é–‹ç·¨è¼¯å™¨å—Ž?" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2164,6 +2222,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2192,10 +2254,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2364,7 +2422,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2839,7 +2897,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3499,7 +3557,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "OK" @@ -3548,17 +3606,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3590,9 +3637,32 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Add point" +msgstr "新增訊號" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "åªé™é¸ä¸" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3862,6 +3932,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3874,7 +3957,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3885,20 +3968,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3953,12 +4049,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -4016,6 +4116,15 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +#, fuzzy +msgid "Remove Out-Control Point" +msgstr "åªé™é¸ä¸" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4169,6 +4278,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4258,10 +4371,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4295,15 +4404,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4359,6 +4460,23 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "轉為..." + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4438,6 +4556,16 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "轉為..." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "轉為..." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4460,6 +4588,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4677,35 +4809,99 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Forward" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Down" +msgstr "下滾" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "當改變時更新" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Shader Changes" +msgstr "當改變時更新" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Surface Changes" +msgstr "當改變時更新" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "Audio Listener" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4766,23 +4962,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "所有é¸é …" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Local Coords" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4810,22 +5015,6 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" msgstr "" @@ -4834,6 +5023,10 @@ msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Settings" +msgstr "è¨å®š" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" msgstr "" @@ -4854,14 +5047,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5279,11 +5464,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5295,7 +5480,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5513,6 +5698,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "è¨å‚™" @@ -5578,9 +5767,8 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -#, fuzzy -msgid "Project Settings " -msgstr "è¨å®š" +msgid "Project Settings (project.godot)" +msgstr "" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5696,10 +5884,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp #, fuzzy msgid "Pick a Node" msgstr "貼上" @@ -5887,6 +6071,11 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +#, fuzzy +msgid "Sub-Resources:" +msgstr "資æº" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5964,10 +6153,57 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Subscene options" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "下一個腳本" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -6012,82 +6248,95 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" -msgstr "" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "無法新增資料夾" #: editor/script_create_dialog.cpp -msgid "Valid chars:" -msgstr "" +#, fuzzy +msgid "Error loading script from %s" +msgstr "載入å—形出ç¾éŒ¯èª¤" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is empty" +msgstr "路徑為空" + +#: editor/script_create_dialog.cpp +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" -msgstr "有效å稱" +msgid "Invalid base path" +msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" -msgstr "N/A" +msgid "Invalid extension" +msgstr "無效副檔å" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" -msgstr "" +#, fuzzy +msgid "Invalid Path" +msgstr "有效的路徑" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Error loading script from %s" -msgstr "載入å—形出ç¾éŒ¯èª¤" - -#: editor/script_create_dialog.cpp -msgid "Path is empty" -msgstr "路徑為空" +msgid "Script valid" +msgstr "腳本" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" -msgstr "" +msgid "N/A" +msgstr "N/A" #: editor/script_create_dialog.cpp -msgid "Invalid extension" -msgstr "無效副檔å" +msgid "Built-in script (into scene file)" +msgstr "" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Create new script" +msgid "Create new script file" msgstr "新增" #: editor/script_create_dialog.cpp #, fuzzy -msgid "Load existing script" +msgid "Load existing script file" msgstr "下一個腳本" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp #, fuzzy +msgid "Template" +msgstr "移除é¸é …" + +#: editor/script_create_dialog.cpp +#, fuzzy +msgid "Built-in Script" +msgstr "é‹è¡Œè…³æœ¬" + +#: editor/script_create_dialog.cpp +#, fuzzy msgid "Attach Node Script" msgstr "下一個腳本" @@ -6752,8 +7001,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6821,12 +7072,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6842,6 +7087,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "è¦å‘Š!" @@ -6884,6 +7137,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " @@ -6892,6 +7151,9 @@ msgid "" "texture to some node for display." msgstr "" +#~ msgid "Valid name" +#~ msgstr "有效å稱" + #~ msgid "Please save the scene first." #~ msgstr "請先儲å˜å ´æ™¯" @@ -6946,9 +7208,6 @@ msgstr "" #~ msgid "Keep" #~ msgstr "ä¿ç•™" -#~ msgid "Script" -#~ msgstr "腳本" - #~ msgid "Text" #~ msgstr "æ–‡å—" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 7836cd2f76..c5a1f6994c 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -1,31 +1,31 @@ # Chinese (Taiwan) translation of the Godot Engine editor -# Copyright (C) 2007-2017 Juan Linietsky, Ariel Manzur -# Copyright (C) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) +# Copyright (C) 2016-2017 Juan Linietsky, Ariel Manzur and the Godot community # This file is distributed under the same license as the Godot source code. # +# Allen H <w84miracle@gmail.com>, 2017. # popcade <popcade@gmail.com>, 2016. # Sam Pan <sampan66@gmail.com>, 2016. # msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" -"PO-Revision-Date: 2016-10-23 19:47+0000\n" -"Last-Translator: Sam Pan <sampan66@gmail.com>\n" -"Language-Team: Chinese (Taiwan) <https://hosted.weblate.org/projects/godot-" -"engine/godot/zh_TW/>\n" +"PO-Revision-Date: 2017-05-12 07:06+0000\n" +"Last-Translator: Allen H. <w84miracle@gmail.com>\n" +"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" +"godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 2.9-dev\n" +"X-Generator: Weblate 2.14-dev\n" #: editor/animation_editor.cpp msgid "Disabled" -msgstr "" +msgstr "å·²åœç”¨" #: editor/animation_editor.cpp msgid "All Selection" -msgstr "" +msgstr "æ‰€æœ‰çš„é¸æ“‡" #: editor/animation_editor.cpp msgid "Move Add Key" @@ -89,11 +89,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "Edit Node Curve" -msgstr "" +msgstr "編輯節點曲線" #: editor/animation_editor.cpp msgid "Edit Selection Curve" -msgstr "" +msgstr "ç·¨è¼¯æ‰€é¸æ›²ç·š" #: editor/animation_editor.cpp msgid "Anim Delete Keys" @@ -101,7 +101,7 @@ msgstr "" #: editor/animation_editor.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Duplicate Selection" -msgstr "" +msgstr "複製所é¸" #: editor/animation_editor.cpp msgid "Duplicate Transposed" @@ -109,7 +109,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Remove Selection" -msgstr "" +msgstr "移除所é¸" #: editor/animation_editor.cpp msgid "Continuous" @@ -121,7 +121,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Trigger" -msgstr "" +msgstr "觸發器" #: editor/animation_editor.cpp msgid "Anim Add Key" @@ -141,15 +141,15 @@ msgstr "" #: editor/animation_editor.cpp msgid "Goto Next Step" -msgstr "" +msgstr "往下一æ¥" #: editor/animation_editor.cpp msgid "Goto Prev Step" -msgstr "" +msgstr "往上一æ¥" #: editor/animation_editor.cpp editor/property_editor.cpp msgid "Linear" -msgstr "" +msgstr "線性" #: editor/animation_editor.cpp editor/plugins/theme_editor_plugin.cpp msgid "Constant" @@ -177,7 +177,7 @@ msgstr "" #: editor/animation_editor.cpp msgid "Optimize Animation" -msgstr "" +msgstr "最佳化動畫" #: editor/animation_editor.cpp msgid "Clean-Up Animation" @@ -199,7 +199,7 @@ msgstr "" #: editor/plugins/particles_editor_plugin.cpp editor/project_manager.cpp #: editor/script_create_dialog.cpp msgid "Create" -msgstr "" +msgstr "新增" #: editor/animation_editor.cpp msgid "Anim Create & Insert" @@ -247,11 +247,11 @@ msgstr "" #: editor/animation_editor.cpp msgid "Animation length (in seconds)." -msgstr "" +msgstr "動畫長度 (ç§’)" #: editor/animation_editor.cpp msgid "Step (s):" -msgstr "" +msgstr "æ¥é©Ÿ :" #: editor/animation_editor.cpp msgid "Cursor step snap (in seconds)." @@ -370,14 +370,15 @@ msgid "Contents:" msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "View Files" -msgstr "" +msgstr "éŽæ¿¾æª”案.." #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/property_selector.cpp #: editor/script_editor_debugger.cpp msgid "Description:" -msgstr "" +msgstr "æè¿°:" #: editor/asset_library_editor_plugin.cpp editor/project_manager.cpp msgid "Install" @@ -410,8 +411,9 @@ msgid "Connection error, please try again." msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Can't connect." -msgstr "" +msgstr "連接..." #: editor/asset_library_editor_plugin.cpp msgid "Can't connect to host:" @@ -478,16 +480,18 @@ msgid "Resolving.." msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Connecting.." -msgstr "" +msgstr "連接..." #: editor/asset_library_editor_plugin.cpp msgid "Requesting.." msgstr "" #: editor/asset_library_editor_plugin.cpp +#, fuzzy msgid "Error making request" -msgstr "" +msgstr "è¼‰å…¥å ´æ™¯æ™‚ç™¼ç”ŸéŒ¯èª¤" #: editor/asset_library_editor_plugin.cpp msgid "Idle" @@ -523,21 +527,22 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp msgid "All" -msgstr "" +msgstr "全部" #: editor/asset_library_editor_plugin.cpp editor/create_dialog.cpp #: editor/editor_help.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp editor/settings_config_dialog.cpp msgid "Search:" -msgstr "" +msgstr "æœå°‹:" #: editor/asset_library_editor_plugin.cpp editor/code_editor.cpp -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp #: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp editor/project_settings.cpp msgid "Search" -msgstr "" +msgstr "æœå°‹" #: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp #: editor/io_plugins/editor_bitmask_import_plugin.cpp @@ -557,15 +562,15 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp msgid "Sort:" -msgstr "" +msgstr "排åº:" #: editor/asset_library_editor_plugin.cpp msgid "Reverse" -msgstr "" +msgstr "å轉" #: editor/asset_library_editor_plugin.cpp editor/project_settings.cpp msgid "Category:" -msgstr "" +msgstr "類別:" #: editor/asset_library_editor_plugin.cpp msgid "Site:" @@ -577,9 +582,9 @@ msgstr "" #: editor/asset_library_editor_plugin.cpp msgid "Official" -msgstr "" +msgstr "官方" -#: editor/asset_library_editor_plugin.cpp +#: editor/asset_library_editor_plugin.cpp editor/editor_node.cpp msgid "Community" msgstr "" @@ -601,43 +606,43 @@ msgstr "" #: editor/call_dialog.cpp msgid "Method List:" -msgstr "" +msgstr "方法:" #: editor/call_dialog.cpp msgid "Arguments:" -msgstr "" +msgstr "è¼¸å…¥åƒæ•¸" #: editor/call_dialog.cpp msgid "Return:" -msgstr "" +msgstr "回傳值:" #: editor/code_editor.cpp msgid "Go to Line" -msgstr "" +msgstr "å‰å¾€ç¬¬...行" #: editor/code_editor.cpp msgid "Line Number:" -msgstr "" +msgstr "行號:" #: editor/code_editor.cpp msgid "No Matches" -msgstr "" +msgstr "ç„¡ç¬¦åˆæ¢ä»¶" #: editor/code_editor.cpp msgid "Replaced %d occurrence(s)." -msgstr "" +msgstr "å–代了 %d 個" #: editor/code_editor.cpp msgid "Replace" -msgstr "" +msgstr "å–代" #: editor/code_editor.cpp msgid "Replace All" -msgstr "" +msgstr "å–代全部" #: editor/code_editor.cpp msgid "Match Case" -msgstr "" +msgstr "符åˆå¤§å°å¯«" #: editor/code_editor.cpp msgid "Whole Words" @@ -645,27 +650,27 @@ msgstr "" #: editor/code_editor.cpp msgid "Selection Only" -msgstr "" +msgstr "åƒ…é¸æ“‡å€åŸŸ" #: editor/code_editor.cpp editor/editor_help.cpp msgid "Find" -msgstr "" +msgstr "尋找" #: editor/code_editor.cpp msgid "Next" -msgstr "" +msgstr "下一個" #: editor/code_editor.cpp msgid "Not found!" -msgstr "" +msgstr "找ä¸åˆ°!" #: editor/code_editor.cpp msgid "Replace By" -msgstr "" +msgstr "用...å–代" #: editor/code_editor.cpp msgid "Case Sensitive" -msgstr "" +msgstr "å€åˆ†å¤§å°å¯«" #: editor/code_editor.cpp msgid "Backwards" @@ -673,31 +678,31 @@ msgstr "" #: editor/code_editor.cpp msgid "Prompt On Replace" -msgstr "" +msgstr "æ¯æ¬¡å–代都è¦å…ˆè©¢å•我" #: editor/code_editor.cpp msgid "Skip" -msgstr "" +msgstr "è·³éŽ" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom In" -msgstr "" +msgstr "放大" #: editor/code_editor.cpp editor/plugins/canvas_item_editor_plugin.cpp msgid "Zoom Out" -msgstr "" +msgstr "縮å°" #: editor/code_editor.cpp msgid "Reset Zoom" -msgstr "" +msgstr "é‡è¨ç¸®æ”¾å¤§å°" #: editor/code_editor.cpp editor/script_editor_debugger.cpp msgid "Line:" -msgstr "" +msgstr "行:" #: editor/code_editor.cpp msgid "Col:" -msgstr "" +msgstr "列:" #: editor/connections_dialog.cpp msgid "Method in target Node must be specified!" @@ -717,13 +722,14 @@ msgstr "" #: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_settings.cpp msgid "Add" -msgstr "" +msgstr "新增" #: editor/connections_dialog.cpp editor/dependency_editor.cpp #: editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp +#: editor/project_settings.cpp msgid "Remove" -msgstr "" +msgstr "移除" #: editor/connections_dialog.cpp msgid "Add Extra Call Argument:" @@ -739,11 +745,12 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Make Function" -msgstr "" +msgstr "建立函å¼" #: editor/connections_dialog.cpp +#, fuzzy msgid "Deferred" -msgstr "" +msgstr "å»¶é²" #: editor/connections_dialog.cpp msgid "Oneshot" @@ -767,12 +774,12 @@ msgstr "" #: editor/connections_dialog.cpp msgid "Connect.." -msgstr "" +msgstr "連接..." #: editor/connections_dialog.cpp #: editor/plugins/animation_tree_editor_plugin.cpp msgid "Disconnect" -msgstr "" +msgstr "æ–·ç·š" #: editor/connections_dialog.cpp editor/node_dock.cpp msgid "Signals" @@ -780,22 +787,22 @@ msgstr "" #: editor/create_dialog.cpp msgid "Create New" -msgstr "" +msgstr "新增" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp #: editor/filesystem_dock.cpp msgid "Favorites:" -msgstr "" +msgstr "我的最愛:" #: editor/create_dialog.cpp editor/editor_file_dialog.cpp msgid "Recent:" -msgstr "" +msgstr "最近å˜å–:" #: editor/create_dialog.cpp editor/editor_help.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_selector.cpp #: editor/quick_open.cpp msgid "Matches:" -msgstr "" +msgstr "ç¬¦åˆæ¢ä»¶:" #: editor/dependency_editor.cpp msgid "Search Replacement For:" @@ -810,6 +817,8 @@ msgid "" "Scene '%s' is currently being edited.\n" "Changes will not take effect unless reloaded." msgstr "" +"å ´æ™¯ '%s' 已被變更\n" +"釿–°è¼‰å…¥æ‰èƒ½ä½¿è®Šæ›´ç”Ÿæ•ˆ" #: editor/dependency_editor.cpp msgid "" @@ -827,8 +836,9 @@ msgstr "" #: editor/dependency_editor.cpp editor/editor_autoload_settings.cpp #: editor/project_manager.cpp editor/project_settings.cpp +#: editor/script_create_dialog.cpp msgid "Path" -msgstr "" +msgstr "路徑" #: editor/dependency_editor.cpp msgid "Dependencies:" @@ -856,26 +866,29 @@ msgid "" "work.\n" "Remove them anyway? (no undo)" msgstr "" +"刪除這些檔案å¯èƒ½é€ æˆå…¶ä»–資æºç„¡æ³•æ£å¸¸é‹ä½œ\n" +"æ¤å‹•作無法復原, 確定è¦åˆªé™¤å—Ž?" #: editor/dependency_editor.cpp msgid "Remove selected files from the project? (no undo)" -msgstr "" +msgstr "æ¤å‹•作無法復原, 確定è¦å¾žå°ˆæ¡ˆä¸åˆªé™¤æ‰€é¸çš„æª”案?" #: editor/dependency_editor.cpp +#, fuzzy msgid "Error loading:" -msgstr "" +msgstr "載入時發生錯誤:" #: editor/dependency_editor.cpp msgid "Scene failed to load due to missing dependencies:" -msgstr "" +msgstr "å ´æ™¯ç¼ºå°‘äº†æŸäº›è³‡æºä»¥è‡³æ–¼ç„¡æ³•載入" #: editor/dependency_editor.cpp editor/editor_node.cpp msgid "Open Anyway" -msgstr "" +msgstr "強制開啟" #: editor/dependency_editor.cpp msgid "Which action should be taken?" -msgstr "" +msgstr "該執行什麼æ“作呢?" #: editor/dependency_editor.cpp msgid "Fix Dependencies" @@ -887,11 +900,11 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Permanently delete %d item(s)? (No undo!)" -msgstr "" +msgstr "ç¢ºå®šè¦æ°¸ä¹…刪除 %d 個物件 ? (無法復原)" #: editor/dependency_editor.cpp msgid "Owns" -msgstr "" +msgstr "æ“æœ‰" #: editor/dependency_editor.cpp msgid "Resources Without Explicit Ownership:" @@ -903,13 +916,13 @@ msgstr "" #: editor/dependency_editor.cpp msgid "Delete selected files?" -msgstr "" +msgstr "ç¢ºå®šåˆªé™¤æ‰€é¸æ“‡çš„æª”案嗎?" #: editor/dependency_editor.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/plugins/item_list_editor_plugin.cpp #: editor/project_export.cpp editor/scene_tree_dock.cpp msgid "Delete" -msgstr "" +msgstr "刪除" #: editor/editor_audio_buses.cpp msgid "Save Audio Bus Layout As.." @@ -927,19 +940,19 @@ msgstr "" msgid "Add Bus" msgstr "" -#: editor/editor_audio_buses.cpp editor/property_editor.cpp -#: editor/script_create_dialog.cpp +#: editor/editor_audio_buses.cpp editor/script_create_dialog.cpp msgid "Load" -msgstr "" +msgstr "載入" #: editor/editor_audio_buses.cpp #: editor/plugins/animation_player_editor_plugin.cpp msgid "Save As" -msgstr "" +msgstr "å¦å˜æ–°æª”" #: editor/editor_audio_buses.cpp editor/editor_node.cpp editor/import_dock.cpp +#: editor/script_create_dialog.cpp msgid "Default" -msgstr "" +msgstr "é è¨" #: editor/editor_autoload_settings.cpp msgid "Invalid name." @@ -955,23 +968,23 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing buit-in type name." -msgstr "" +msgstr "å稱已å˜åœ¨, ä¸èƒ½è·Ÿå·²ç¶“å˜åœ¨çš„內建類別é‡è¤‡" #: editor/editor_autoload_settings.cpp msgid "Invalid name. Must not collide with an existing global constant name." -msgstr "" +msgstr "å稱已å˜åœ¨, ä¸èƒ½è·Ÿå·²ç¶“å˜åœ¨çš„全域變數å稱é‡è¤‡" #: editor/editor_autoload_settings.cpp msgid "Invalid Path." -msgstr "" +msgstr "無效的路徑" #: editor/editor_autoload_settings.cpp msgid "File does not exist." -msgstr "" +msgstr "檔案ä¸å˜åœ¨" #: editor/editor_autoload_settings.cpp msgid "Not in resource path." -msgstr "" +msgstr "在資æºè·¯å¾‘䏿‰¾ä¸åˆ°" #: editor/editor_autoload_settings.cpp msgid "Add AutoLoad" @@ -999,27 +1012,26 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "Enable" -msgstr "" +msgstr "啟用" #: editor/editor_autoload_settings.cpp msgid "Rearrange Autoloads" msgstr "" #: editor/editor_autoload_settings.cpp editor/editor_file_dialog.cpp -#: editor/io_plugins/editor_font_import_plugin.cpp -#: editor/script_create_dialog.cpp scene/gui/file_dialog.cpp +#: editor/io_plugins/editor_font_import_plugin.cpp scene/gui/file_dialog.cpp msgid "Path:" -msgstr "" +msgstr "路徑:" #: editor/editor_autoload_settings.cpp msgid "Node Name:" -msgstr "" +msgstr "節點å稱:" #: editor/editor_autoload_settings.cpp #: editor/io_plugins/editor_scene_import_plugin.cpp #: editor/plugins/sample_library_editor_plugin.cpp editor/project_manager.cpp msgid "Name" -msgstr "" +msgstr "å稱" #: editor/editor_autoload_settings.cpp msgid "Singleton" @@ -1027,43 +1039,44 @@ msgstr "" #: editor/editor_autoload_settings.cpp msgid "List:" -msgstr "" +msgstr "列表:" #: editor/editor_data.cpp +#, fuzzy msgid "Updating Scene" -msgstr "" +msgstr "æ›´æ–°å ´æ™¯" #: editor/editor_data.cpp msgid "Storing local changes.." -msgstr "" +msgstr "æ£åœ¨å„²å˜è®Šæ›´.." #: editor/editor_data.cpp msgid "Updating scene.." -msgstr "" +msgstr "æ›´æ–°å ´æ™¯ä¸.." #: editor/editor_dir_dialog.cpp msgid "Choose a Directory" -msgstr "" +msgstr "鏿“‡è³‡æ–™å¤¾" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp msgid "Create Folder" -msgstr "" +msgstr "新增資料夾" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: editor/editor_plugin_settings.cpp editor/plugins/theme_editor_plugin.cpp #: editor/project_export.cpp scene/gui/file_dialog.cpp msgid "Name:" -msgstr "" +msgstr "å稱:" #: editor/editor_dir_dialog.cpp editor/editor_file_dialog.cpp #: scene/gui/file_dialog.cpp msgid "Could not create folder." -msgstr "" +msgstr "無法新增資料夾" #: editor/editor_dir_dialog.cpp msgid "Choose" -msgstr "" +msgstr "鏿“‡" #: editor/editor_export.cpp msgid "Storing File:" @@ -1079,11 +1092,11 @@ msgstr "" #: editor/editor_export.cpp msgid "Added:" -msgstr "" +msgstr "已新增:" #: editor/editor_export.cpp msgid "Removed:" -msgstr "" +msgstr "已刪除:" #: editor/editor_export.cpp msgid "Error saving atlas:" @@ -1103,7 +1116,7 @@ msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "File Exists, Overwrite?" -msgstr "" +msgstr "檔案已經å˜åœ¨, è¦è¦†å¯«å—Ž?" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Recognized" @@ -1111,19 +1124,19 @@ msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "All Files (*)" -msgstr "" +msgstr "所有類型檔案" #: editor/editor_file_dialog.cpp editor/editor_help.cpp editor/editor_node.cpp #: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp #: editor/property_selector.cpp editor/quick_open.cpp scene/gui/file_dialog.cpp msgid "Open" -msgstr "" +msgstr "開啟" #: editor/editor_file_dialog.cpp editor/editor_node.cpp #: editor/plugins/animation_player_editor_plugin.cpp #: editor/plugins/script_editor_plugin.cpp scene/gui/file_dialog.cpp msgid "Save" -msgstr "" +msgstr "儲å˜" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Save a File" @@ -1131,19 +1144,19 @@ msgstr "" #: editor/editor_file_dialog.cpp msgid "Go Back" -msgstr "" +msgstr "往後" #: editor/editor_file_dialog.cpp msgid "Go Forward" -msgstr "" +msgstr "å¾€å‰" #: editor/editor_file_dialog.cpp msgid "Go Up" -msgstr "" +msgstr "往上" #: editor/editor_file_dialog.cpp msgid "Refresh" -msgstr "" +msgstr "釿–°æ•´ç†" #: editor/editor_file_dialog.cpp msgid "Toggle Hidden Files" @@ -1171,20 +1184,20 @@ msgstr "" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Directories & Files:" -msgstr "" +msgstr "資料夾 & 檔案:" #: editor/editor_file_dialog.cpp msgid "Preview:" -msgstr "" +msgstr "é 覽:" #: editor/editor_file_dialog.cpp editor/script_editor_debugger.cpp #: scene/gui/file_dialog.cpp msgid "File:" -msgstr "" +msgstr "檔案:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Filter:" -msgstr "" +msgstr "éŽæ¿¾å™¨:" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Must use a valid extension." @@ -1196,9 +1209,10 @@ msgstr "" #: editor/editor_file_system.cpp msgid "(Re)Importing Assets" -msgstr "" +msgstr "(釿–°)è¼‰å…¥ç´ æ" -#: editor/editor_help.cpp editor/plugins/script_editor_plugin.cpp +#: editor/editor_help.cpp editor/editor_node.cpp +#: editor/plugins/script_editor_plugin.cpp msgid "Search Help" msgstr "" @@ -1215,7 +1229,6 @@ msgid "Class:" msgstr "" #: editor/editor_help.cpp editor/scene_tree_editor.cpp -#: editor/script_create_dialog.cpp msgid "Inherits:" msgstr "" @@ -1257,18 +1270,18 @@ msgstr "" #: editor/editor_help.cpp msgid "Search Text" -msgstr "" +msgstr "æœå°‹è©žå½™" #: editor/editor_log.cpp msgid " Output:" -msgstr "" +msgstr " 輸出:" #: editor/editor_log.cpp editor/plugins/animation_tree_editor_plugin.cpp #: editor/plugins/rich_text_editor_plugin.cpp editor/property_editor.cpp #: editor/script_editor_debugger.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Clear" -msgstr "" +msgstr "清除" #: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp #: editor/resources_dock.cpp @@ -1283,7 +1296,7 @@ msgstr "" #: editor/editor_node.cpp editor/export_template_manager.cpp #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp msgid "I see.." -msgstr "" +msgstr "我知é“了" #: editor/editor_node.cpp msgid "Can't open file for writing:" @@ -1303,11 +1316,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Analyzing" -msgstr "" +msgstr "分æžä¸" #: editor/editor_node.cpp msgid "Creating Thumbnail" -msgstr "" +msgstr "æ£åœ¨å»ºç«‹ç¸®åœ–" #: editor/editor_node.cpp msgid "" @@ -1352,19 +1365,19 @@ msgstr "" #: editor/editor_node.cpp msgid "Copy Params" -msgstr "" +msgstr "è¤‡è£½åƒæ•¸" #: editor/editor_node.cpp msgid "Paste Params" -msgstr "" +msgstr "è²¼ä¸Šåƒæ•¸" #: editor/editor_node.cpp editor/plugins/resource_preloader_editor_plugin.cpp msgid "Paste Resource" -msgstr "" +msgstr "貼上資æº" #: editor/editor_node.cpp msgid "Copy Resource" -msgstr "" +msgstr "複製資æº" #: editor/editor_node.cpp msgid "Make Built-In" @@ -1376,7 +1389,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Open in Help" -msgstr "" +msgstr "在幫助界é¢ä¸é–‹å•Ÿ" #: editor/editor_node.cpp msgid "There is no defined scene to run." @@ -1385,8 +1398,8 @@ msgstr "" #: editor/editor_node.cpp msgid "" "No main scene has ever been defined, select one?\n" -"You can change it later in later in \"Project Settings\" under the " -"'application' category." +"You can change it later in \"Project Settings\" under the 'application' " +"category." msgstr "" #: editor/editor_node.cpp @@ -1405,15 +1418,15 @@ msgstr "" #: editor/editor_node.cpp msgid "Current scene was never saved, please save it prior to running." -msgstr "" +msgstr "è«‹å…ˆå˜æª”æ‰èƒ½åŸ·è¡Œè©²å ´æ™¯" #: editor/editor_node.cpp msgid "Could not start subprocess!" -msgstr "" +msgstr "無法啟動å程åº" #: editor/editor_node.cpp msgid "Open Scene" -msgstr "" +msgstr "é–‹å•Ÿå ´æ™¯" #: editor/editor_node.cpp msgid "Open Base Scene" @@ -1421,7 +1434,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Quick Open Scene.." -msgstr "" +msgstr "å¿«é€Ÿé–‹å•Ÿå ´æ™¯" #: editor/editor_node.cpp msgid "Quick Open Script.." @@ -1429,19 +1442,23 @@ msgstr "" #: editor/editor_node.cpp msgid "Yes" -msgstr "" +msgstr "是" #: editor/editor_node.cpp msgid "Close scene? (Unsaved changes will be lost)" -msgstr "" +msgstr "沒有儲å˜çš„變更都會éºå¤±, 確定è¦é—œé–‰?" #: editor/editor_node.cpp msgid "Save Scene As.." +msgstr "å¦å˜å ´æ™¯ç‚º.." + +#: editor/editor_node.cpp +msgid "No" msgstr "" #: editor/editor_node.cpp msgid "This scene has never been saved. Save before running?" -msgstr "" +msgstr "æ¤å ´æ™¯å°šæœªå˜æª”, 執行å‰è«‹å…ˆå˜æª”" #: editor/editor_node.cpp msgid "Export Mesh Library" @@ -1453,41 +1470,41 @@ msgstr "" #: editor/editor_node.cpp msgid "Quit" -msgstr "" +msgstr "離開" #: editor/editor_node.cpp msgid "Exit the editor?" -msgstr "" +msgstr "離開編輯器嗎?" #: editor/editor_node.cpp msgid "Current scene not saved. Open anyway?" -msgstr "" +msgstr "ç›®å‰çš„å ´æ™¯å°šæœªå˜æª”, ä¾ç„¶è¦é–‹å•Ÿå—Ž?" #: editor/editor_node.cpp msgid "Can't reload a scene that was never saved." -msgstr "" +msgstr "ç„¡æ³•é‡æ–°è¼‰å…¥æœªå˜æª”çš„å ´æ™¯" #: editor/editor_node.cpp msgid "Revert" -msgstr "" +msgstr "還原" #: editor/editor_node.cpp msgid "This action cannot be undone. Revert anyway?" -msgstr "" +msgstr "æ¤æ“作無法復原, 確定è¦é‚„原嗎?" #: editor/editor_node.cpp msgid "Quick Run Scene.." -msgstr "" +msgstr "å¿«é€ŸåŸ·è¡Œå ´æ™¯.." #: editor/editor_node.cpp msgid "" "Open Project Manager? \n" "(Unsaved changes will be lost)" -msgstr "" +msgstr "未ä¿å˜çš„變更將éºå¤±, è¦é–‹å•Ÿå°ˆæ¡ˆç®¡ç†å“¡å—Ž?" #: editor/editor_node.cpp msgid "Pick a Main Scene" -msgstr "" +msgstr "挑一個主è¦å ´æ™¯" #: editor/editor_node.cpp msgid "" @@ -1496,9 +1513,9 @@ msgid "" msgstr "" #: editor/editor_node.cpp editor/plugins/canvas_item_editor_plugin.cpp -#: editor/scene_tree_dock.cpp editor/script_create_dialog.cpp +#: editor/scene_tree_dock.cpp msgid "Ugh" -msgstr "" +msgstr "呃" #: editor/editor_node.cpp msgid "" @@ -1508,7 +1525,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Error loading scene." -msgstr "" +msgstr "è¼‰å…¥å ´æ™¯æ™‚ç™¼ç”ŸéŒ¯èª¤" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" @@ -1524,19 +1541,24 @@ msgstr "" #: editor/editor_node.cpp msgid "Switch Scene Tab" -msgstr "" +msgstr "切æ›å ´æ™¯åˆ†é " #: editor/editor_node.cpp msgid "%d more file(s)" -msgstr "" +msgstr "還有 %d 個檔案" #: editor/editor_node.cpp msgid "%d more file(s) or folder(s)" +msgstr "還有 %d 個檔案或資料夾" + +#: editor/editor_node.cpp +msgid "Distraction Free Mode" msgstr "" #: editor/editor_node.cpp editor/io_plugins/editor_scene_import_plugin.cpp +#, fuzzy msgid "Scene" -msgstr "" +msgstr "å ´æ™¯" #: editor/editor_node.cpp msgid "Go to previously opened scene." @@ -1544,15 +1566,15 @@ msgstr "" #: editor/editor_node.cpp msgid "Next tab" -msgstr "" +msgstr "下個分é " #: editor/editor_node.cpp msgid "Previous tab" -msgstr "" +msgstr "上個分é " #: editor/editor_node.cpp msgid "Filter Files.." -msgstr "" +msgstr "éŽæ¿¾æª”案.." #: editor/editor_node.cpp msgid "Operations with scene files." @@ -1568,31 +1590,31 @@ msgstr "" #: editor/editor_node.cpp msgid "Open Scene.." -msgstr "" +msgstr "é–‹å•Ÿå ´æ™¯.." #: editor/editor_node.cpp msgid "Save Scene" -msgstr "" +msgstr "儲å˜å ´æ™¯" #: editor/editor_node.cpp msgid "Save all Scenes" -msgstr "" +msgstr "儲å˜å…¨éƒ¨å ´æ™¯" #: editor/editor_node.cpp msgid "Close Scene" -msgstr "" +msgstr "é—œé–‰å ´æ™¯" #: editor/editor_node.cpp msgid "Close Goto Prev. Scene" msgstr "" -#: editor/editor_node.cpp +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp msgid "Open Recent" -msgstr "" +msgstr "開啟最近å˜å–" #: editor/editor_node.cpp msgid "Convert To.." -msgstr "" +msgstr "è½‰æ›æˆ.." #: editor/editor_node.cpp msgid "MeshLibrary.." @@ -1606,91 +1628,48 @@ msgstr "" #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Undo" -msgstr "" +msgstr "復原" #: editor/editor_node.cpp editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Redo" -msgstr "" - -#: editor/editor_node.cpp -msgid "Run Script" -msgstr "" - -#: editor/editor_node.cpp -msgid "Project Settings" -msgstr "" +msgstr "å–æ¶ˆã€Œå¾©åŽŸã€" #: editor/editor_node.cpp msgid "Revert Scene" msgstr "" #: editor/editor_node.cpp -msgid "Quit to Project List" -msgstr "" - -#: editor/editor_node.cpp -msgid "Distraction Free Mode" +msgid "Miscellaneous project or scene-wide tools." msgstr "" #: editor/editor_node.cpp -msgid "Miscellaneous project or scene-wide tools." -msgstr "" +#, fuzzy +msgid "Project" +msgstr "專案è¨å®š" #: editor/editor_node.cpp -msgid "Tools" -msgstr "" +msgid "Project Settings" +msgstr "專案è¨å®š" #: editor/editor_node.cpp -msgid "Export the project to many platforms." +msgid "Run Script" msgstr "" #: editor/editor_node.cpp editor/project_export.cpp msgid "Export" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the project." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Play" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause the scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Pause Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Stop the scene." -msgstr "" - -#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp -msgid "Stop" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play the edited scene." -msgstr "" +msgstr "輸出" #: editor/editor_node.cpp -msgid "Play Scene" -msgstr "" - -#: editor/editor_node.cpp -msgid "Play custom scene" -msgstr "" +msgid "Tools" +msgstr "工具" #: editor/editor_node.cpp -msgid "Play Custom Scene" +msgid "Quit to Project List" msgstr "" -#: editor/editor_node.cpp -msgid "Debug options" +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Debug" msgstr "" #: editor/editor_node.cpp @@ -1761,8 +1740,8 @@ msgid "" "filesystem." msgstr "" -#: editor/editor_node.cpp editor/plugins/spatial_editor_plugin.cpp -msgid "Settings" +#: editor/editor_node.cpp +msgid "Editor" msgstr "" #: editor/editor_node.cpp editor/settings_config_dialog.cpp @@ -1782,11 +1761,67 @@ msgid "Manage Export Templates" msgstr "" #: editor/editor_node.cpp +msgid "Help" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Classes" +msgstr "" + +#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp +msgid "Online Docs" +msgstr "" + +#: editor/editor_node.cpp +msgid "Q&A" +msgstr "" + +#: editor/editor_node.cpp +msgid "Issue Tracker" +msgstr "" + +#: editor/editor_node.cpp msgid "About" msgstr "" #: editor/editor_node.cpp -msgid "Alerts when an external resource has changed." +msgid "Play the project." +msgstr "éŠçŽ©æ¤å°ˆæ¡ˆ" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Play" +msgstr "é–‹å§‹" + +#: editor/editor_node.cpp +msgid "Pause the scene" +msgstr "æš«åœæ¤å ´æ™¯" + +#: editor/editor_node.cpp +msgid "Pause Scene" +msgstr "æš«åœå ´æ™¯" + +#: editor/editor_node.cpp +msgid "Stop the scene." +msgstr "åœæ¢æ¤å ´æ™¯" + +#: editor/editor_node.cpp editor/plugins/sample_library_editor_plugin.cpp +msgid "Stop" +msgstr "åœæ¢" + +#: editor/editor_node.cpp +msgid "Play the edited scene." +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play custom scene" +msgstr "" + +#: editor/editor_node.cpp +msgid "Play Custom Scene" msgstr "" #: editor/editor_node.cpp @@ -1870,6 +1905,14 @@ msgid "Thanks!" msgstr "" #: editor/editor_node.cpp +msgid "Godot Engine contributors" +msgstr "" + +#: editor/editor_node.cpp +msgid "Developers" +msgstr "" + +#: editor/editor_node.cpp msgid "Import Templates From ZIP File" msgstr "" @@ -1897,6 +1940,31 @@ msgstr "" msgid "Load Errors" msgstr "" +#: editor/editor_node.cpp +msgid "Open 2D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open 3D Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Script Editor" +msgstr "" + +#: editor/editor_node.cpp +msgid "Open Asset Library" +msgstr "" + +#: editor/editor_node.cpp +#, fuzzy +msgid "Open the next Editor" +msgstr "離開編輯器嗎?" + +#: editor/editor_node.cpp +msgid "Open the previous Editor" +msgstr "" + #: editor/editor_plugin_settings.cpp msgid "Installed Plugins:" msgstr "" @@ -2140,6 +2208,10 @@ msgid "Collapse all" msgstr "" #: editor/filesystem_dock.cpp +msgid "Show In File Manager" +msgstr "" + +#: editor/filesystem_dock.cpp msgid "Instance" msgstr "" @@ -2168,10 +2240,6 @@ msgid "Info" msgstr "" #: editor/filesystem_dock.cpp -msgid "Show In File Manager" -msgstr "" - -#: editor/filesystem_dock.cpp msgid "Re-Import.." msgstr "" @@ -2337,7 +2405,7 @@ msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp msgid "" "Invalid file extension.\n" -"Please use .fnt." +"Please use .font." msgstr "" #: editor/io_plugins/editor_font_import_plugin.cpp @@ -2812,7 +2880,7 @@ msgid "Compress" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp -msgid "Add to Project (godot.cfg)" +msgid "Add to Project (project.godot)" msgstr "" #: editor/io_plugins/editor_translation_import_plugin.cpp @@ -3472,7 +3540,7 @@ msgid "Change default type" msgstr "" #: editor/plugins/canvas_item_editor_plugin.cpp editor/scene_tree_dock.cpp -#: scene/gui/dialogs.cpp +#: editor/script_create_dialog.cpp scene/gui/dialogs.cpp msgid "OK" msgstr "" @@ -3521,17 +3589,6 @@ msgstr "" msgid "Set Handle" msgstr "" -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -msgid "Add/Remove Color Ramp Point" -msgstr "" - -#: editor/plugins/color_ramp_editor_plugin.cpp -#: editor/plugins/gradient_texture_editor_plugin.cpp -#: editor/plugins/shader_graph_editor_plugin.cpp -msgid "Modify Color Ramp" -msgstr "" - #: editor/plugins/cube_grid_theme_editor_plugin.cpp msgid "Creating Mesh Library" msgstr "" @@ -3563,9 +3620,31 @@ msgid "Update from Scene" msgstr "" #: editor/plugins/curve_editor_plugin.cpp +msgid "Add point" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp +#, fuzzy +msgid "Remove point" +msgstr "移除" + +#: editor/plugins/curve_editor_plugin.cpp +msgid "Load preset" +msgstr "" + +#: editor/plugins/curve_editor_plugin.cpp msgid "Modify Curve" msgstr "" +#: editor/plugins/gradient_editor_plugin.cpp +msgid "Add/Remove Color Ramp Point" +msgstr "" + +#: editor/plugins/gradient_editor_plugin.cpp +#: editor/plugins/shader_graph_editor_plugin.cpp +msgid "Modify Color Ramp" +msgstr "" + #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" msgstr "" @@ -3835,6 +3914,19 @@ msgid "Remove Poly And Point" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Clear Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +#: editor/plugins/particles_editor_plugin.cpp +msgid "Generating AABB" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Can only set point into a ParticlesMaterial process material" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp msgid "Error loading image:" msgstr "" @@ -3847,7 +3939,7 @@ msgid "Set Emission Mask" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp -msgid "Clear Emission Mask" +msgid "Generate Visibility Rect" msgstr "" #: editor/plugins/particles_2d_editor_plugin.cpp @@ -3858,20 +3950,33 @@ msgstr "" msgid "Generated Point Count:" msgstr "" +#: editor/plugins/particles_2d_editor_plugin.cpp #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry." +msgid "Generation Time (sec):" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Mask" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Capture from Pixel" +msgstr "" + +#: editor/plugins/particles_2d_editor_plugin.cpp +msgid "Emission Colors" msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Node does not contain geometry (faces)." +msgid "Node does not contain geometry." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "A processor material of type 'ParticlesMaterial' is required." +msgid "Node does not contain geometry (faces)." msgstr "" #: editor/plugins/particles_editor_plugin.cpp -msgid "Generating AABB" +msgid "A processor material of type 'ParticlesMaterial' is required." msgstr "" #: editor/plugins/particles_editor_plugin.cpp @@ -3926,12 +4031,16 @@ msgstr "" msgid "Generate Visibility AABB" msgstr "" -#: editor/plugins/particles_editor_plugin.cpp -msgid "Generation Time (sec):" +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove Point from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp -msgid "Remove Point from Curve" +msgid "Remove Out-Control from Curve" +msgstr "" + +#: editor/plugins/path_2d_editor_plugin.cpp +msgid "Remove In-Control from Curve" msgstr "" #: editor/plugins/path_2d_editor_plugin.cpp @@ -3989,6 +4098,14 @@ msgstr "" msgid "Remove Path Point" msgstr "" +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove Out-Control Point" +msgstr "" + +#: editor/plugins/path_editor_plugin.cpp +msgid "Remove In-Control Point" +msgstr "" + #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create UV Map" msgstr "" @@ -4142,6 +4259,10 @@ msgid "Pitch" msgstr "" #: editor/plugins/script_editor_plugin.cpp +msgid "Clear Recent Files" +msgstr "" + +#: editor/plugins/script_editor_plugin.cpp msgid "Error while saving theme" msgstr "" @@ -4229,10 +4350,6 @@ msgstr "" msgid "Find Next" msgstr "" -#: editor/plugins/script_editor_plugin.cpp -msgid "Debug" -msgstr "" - #: editor/plugins/script_editor_plugin.cpp editor/script_editor_debugger.cpp msgid "Step Over" msgstr "" @@ -4266,15 +4383,7 @@ msgid "Move Right" msgstr "" #: editor/plugins/script_editor_plugin.cpp -msgid "Tutorials" -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Open https://godotengine.org at tutorials section." -msgstr "" - -#: editor/plugins/script_editor_plugin.cpp -msgid "Classes" +msgid "Open Godot online documentation" msgstr "" #: editor/plugins/script_editor_plugin.cpp @@ -4329,6 +4438,23 @@ msgid "Pick Color" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert Case" +msgstr "è½‰æ›æˆ.." + +#: editor/plugins/script_text_editor.cpp +msgid "Uppercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Lowercase" +msgstr "" + +#: editor/plugins/script_text_editor.cpp +msgid "Capitalize" +msgstr "" + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp scene/gui/line_edit.cpp #: scene/gui/text_edit.cpp msgid "Cut" @@ -4408,6 +4534,16 @@ msgid "Goto Previous Breakpoint" msgstr "" #: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Uppercase" +msgstr "è½‰æ›æˆ.." + +#: editor/plugins/script_text_editor.cpp +#, fuzzy +msgid "Convert To Lowercase" +msgstr "è½‰æ›æˆ.." + +#: editor/plugins/script_text_editor.cpp #: editor/plugins/shader_editor_plugin.cpp msgid "Find Previous" msgstr "" @@ -4430,6 +4566,10 @@ msgstr "" msgid "Contextual Help" msgstr "" +#: editor/plugins/shader_editor_plugin.cpp +msgid "Shader" +msgstr "" + #: editor/plugins/shader_graph_editor_plugin.cpp msgid "Change Scalar Constant" msgstr "" @@ -4647,35 +4787,97 @@ msgid "Animation Key Inserted." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Left" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Right" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Freelook Forward" +msgstr "å¾€å‰" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Backwards" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Up" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Down" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Freelook Speed Modifier" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Objects Drawn" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +#, fuzzy +msgid "Material Changes" +msgstr "æ£åœ¨å„²å˜è®Šæ›´.." + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Shader Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Surface Changes" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Draw Calls" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Vertices" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp msgid "Align with view" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Environment" +msgid "Display Normal" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Audio Listener" +msgid "Display Wireframe" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Gizmos" +msgid "Display Overdraw" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "XForm Dialog" +msgid "Display Unshaded" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Environment" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "View Gizmos" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "No scene selected to instance!" +msgid "View Information" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Instance at Cursor" +msgid "Audio Listener" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Could not instance scene!" +msgid "XForm Dialog" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4735,23 +4937,32 @@ msgid "Align Selection With View" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform" +#, fuzzy +msgid "Tool Select" +msgstr "æ‰€æœ‰çš„é¸æ“‡" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Tool Move" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Local Coords" +msgid "Tool Rotate" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Transform Dialog.." +msgid "Tool Scale" +msgstr "" + +#: editor/plugins/spatial_editor_plugin.cpp +msgid "Transform" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default Light" +msgid "Local Coords" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Use Default sRGB" +msgid "Transform Dialog.." msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4779,27 +4990,15 @@ msgid "4 Viewports" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Normal" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Wireframe" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Overdraw" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Display Shadeless" +msgid "View Origin" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Origin" +msgid "View Grid" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "View Grid" +msgid "Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp @@ -4823,14 +5022,6 @@ msgid "Viewport Settings" msgstr "" #: editor/plugins/spatial_editor_plugin.cpp -msgid "Default Light Normal:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp -msgid "Ambient Light Color:" -msgstr "" - -#: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" msgstr "" @@ -5209,9 +5400,8 @@ msgid "Export Mode:" msgstr "" #: editor/project_export.cpp -#, fuzzy msgid "Resources to export:" -msgstr "資æºè·¯å¾‘" +msgstr "è¦è¼¸å‡ºçš„資æº:" #: editor/project_export.cpp msgid "" @@ -5244,11 +5434,11 @@ msgid "Invalid project path, the path must exist!" msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must not exist." +msgid "Invalid project path, project.godot must not exist." msgstr "" #: editor/project_manager.cpp -msgid "Invalid project path, *.godot must exist." +msgid "Invalid project path, project.godot must exist." msgstr "" #: editor/project_manager.cpp @@ -5260,7 +5450,7 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't create *.godot project file in project path." +msgid "Couldn't create project.godot in project path." msgstr "" #: editor/project_manager.cpp @@ -5476,6 +5666,10 @@ msgstr "" msgid "Erase Input Action Event" msgstr "" +#: editor/project_settings.cpp +msgid "Add Event" +msgstr "" + #: editor/project_settings.cpp scene/gui/input_action.cpp msgid "Device" msgstr "" @@ -5541,8 +5735,9 @@ msgid "Remove Resource Remap Option" msgstr "" #: editor/project_settings.cpp -msgid "Project Settings " -msgstr "" +#, fuzzy +msgid "Project Settings (project.godot)" +msgstr "專案è¨å®š" #: editor/project_settings.cpp editor/settings_config_dialog.cpp msgid "General" @@ -5657,10 +5852,6 @@ msgid "Error loading file: Not a resource!" msgstr "" #: editor/property_editor.cpp -msgid "Couldn't load image" -msgstr "" - -#: editor/property_editor.cpp msgid "Pick a Node" msgstr "" @@ -5845,6 +6036,10 @@ msgid "Error duplicating scene to save it." msgstr "" #: editor/scene_tree_dock.cpp +msgid "Sub-Resources:" +msgstr "" + +#: editor/scene_tree_dock.cpp msgid "Edit Groups" msgstr "" @@ -5919,10 +6114,58 @@ msgid "Toggle CanvasItem Visible" msgstr "" #: editor/scene_tree_editor.cpp +msgid "Node configuration warning:" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connection(s) and group(s)\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node has connections.\n" +"Click to show signals dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is in group(s).\n" +"Click to show groups dock." +msgstr "" + +#: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Subscene options" +msgstr "除錯é¸é …" + +#: editor/scene_tree_editor.cpp msgid "Instance:" msgstr "" #: editor/scene_tree_editor.cpp +#, fuzzy +msgid "Open script" +msgstr "開啟最近å˜å–" + +#: editor/scene_tree_editor.cpp +msgid "" +"Node is locked.\n" +"Click to unlock" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "" +"Children are not selectable.\n" +"Click to make selectable" +msgstr "" + +#: editor/scene_tree_editor.cpp +msgid "Toggle Visibility" +msgstr "" + +#: editor/scene_tree_editor.cpp msgid "Invalid node name, the following characters are not allowed:" msgstr "" @@ -5967,75 +6210,85 @@ msgid "Select a Node" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid parent class name" +#, fuzzy +msgid "Error - Could not create script in filesystem." +msgstr "無法新增資料夾" + +#: editor/script_create_dialog.cpp +msgid "Error loading script from %s" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid chars:" +msgid "Path is empty" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid class name" +msgid "Path is not local" msgstr "" #: editor/script_create_dialog.cpp -msgid "Valid name" +msgid "Invalid base path" msgstr "" #: editor/script_create_dialog.cpp -msgid "N/A" +msgid "Invalid extension" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class name is invalid!" +msgid "Wrong extension chosen" msgstr "" #: editor/script_create_dialog.cpp -msgid "Parent class name is invalid!" +#, fuzzy +msgid "Invalid Path" +msgstr "無效的路徑" + +#: editor/script_create_dialog.cpp +msgid "Invalid class name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid path!" +msgid "Invalid inherited parent name or path" msgstr "" #: editor/script_create_dialog.cpp -msgid "Could not create script in filesystem." +msgid "Script valid" msgstr "" #: editor/script_create_dialog.cpp -msgid "Error loading script from %s" +msgid "Allowed: a-z, A-Z, 0-9 and _" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is empty" +msgid "N/A" msgstr "" #: editor/script_create_dialog.cpp -msgid "Path is not local" +msgid "Built-in script (into scene file)" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid base path" +msgid "Create new script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Invalid extension" +msgid "Load existing script file" msgstr "" #: editor/script_create_dialog.cpp -msgid "Create new script" +msgid "Inherits" msgstr "" #: editor/script_create_dialog.cpp -msgid "Load existing script" +msgid "Class Name" msgstr "" #: editor/script_create_dialog.cpp -msgid "Class Name:" +msgid "Template" msgstr "" #: editor/script_create_dialog.cpp -msgid "Built-In Script" +msgid "Built-in Script" msgstr "" #: editor/script_create_dialog.cpp @@ -6705,8 +6958,10 @@ msgid "" "ParallaxLayer node only works when set as child of a ParallaxBackground node." msgstr "" -#: scene/2d/particles_2d.cpp -msgid "Path property must point to a valid Particles2D node to work." +#: scene/2d/particles_2d.cpp scene/3d/particles.cpp +msgid "" +"A material to process the particles is not assigned, so no behavior is " +"imprinted." msgstr "" #: scene/2d/path_2d.cpp @@ -6774,12 +7029,6 @@ msgid "" "Nothing is visible because meshes have not been assigned to draw passes." msgstr "" -#: scene/3d/particles.cpp -msgid "" -"A material to process the particles is not assigned, so no behavior is " -"imprinted." -msgstr "" - #: scene/3d/remote_transform.cpp msgid "Path property must point to a valid Spatial node to work." msgstr "" @@ -6795,6 +7044,14 @@ msgid "" "order for AnimatedSprite3D to display frames." msgstr "" +#: scene/gui/color_picker.cpp +msgid "RAW Mode" +msgstr "" + +#: scene/gui/color_picker.cpp +msgid "Add current color as a preset" +msgstr "" + #: scene/gui/dialogs.cpp msgid "Alert!" msgstr "" @@ -6837,6 +7094,12 @@ msgid "" "minimum size manually." msgstr "" +#: scene/main/scene_main_loop.cpp +msgid "" +"Default Environment as specified in Project Setings (Rendering -> Viewport -" +"> Default Environment) could not be loaded." +msgstr "" + #: scene/main/viewport.cpp msgid "" "This viewport is not set as render target. If you intend for it to display " diff --git a/main/SCsub b/main/SCsub index 56dfbaa0f1..1675a6e6ab 100644 --- a/main/SCsub +++ b/main/SCsub @@ -47,11 +47,11 @@ env.add_source_files(env.main_sources, "*.cpp") Export('env') -env.Depends("#main/splash.h", "#main/splash.png") -env.Command("#main/splash.h", "#main/splash.png", make_splash) +env.Depends("#main/splash.gen.h", "#main/splash.png") +env.Command("#main/splash.gen.h", "#main/splash.png", make_splash) -env.Depends("#main/app_icon.h", "#main/app_icon.png") -env.Command("#main/app_icon.h", "#main/app_icon.png", make_app_icon) +env.Depends("#main/app_icon.gen.h", "#main/app_icon.png") +env.Command("#main/app_icon.gen.h", "#main/app_icon.png", make_app_icon) SConscript('tests/SCsub') diff --git a/main/input_default.cpp b/main/input_default.cpp index e488438059..bde1e84926 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -874,6 +874,8 @@ void InputDefault::joy_axis(int p_device, int p_axis, const JoyAxis &p_value) { _THREAD_SAFE_METHOD_; + ERR_FAIL_INDEX(p_axis, JOY_AXIS_MAX); + Joypad &joy = joy_names[p_device]; if (joy.last_axis[p_axis] == p_value.value) { diff --git a/main/main.cpp b/main/main.cpp index e00c136596..cd464de1aa 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "main.h" -#include "app_icon.h" +#include "app_icon.gen.h" #include "core/register_core_types.h" #include "drivers/register_driver_types.h" #include "global_config.h" @@ -39,7 +39,7 @@ #include "script_debugger_local.h" #include "script_debugger_remote.h" #include "servers/register_server_types.h" -#include "splash.h" +#include "splash.gen.h" #include "input_map.h" #include "io/resource_loader.h" diff --git a/methods.py b/methods.py index 5af6c6aed0..2f9d45897e 100644 --- a/methods.py +++ b/methods.py @@ -29,7 +29,7 @@ def build_shader_header(target, source, env): name = name.replace(".", "_") fs = open(str(x), "r") - fd = open(str(x) + ".h", "w") + fd = open(str(x) + ".gen.h", "w") fd.write("/* this file has been generated by SCons, do not edit! */\n") fd.write("static const char *" + name + "=\n") line = fs.readline() @@ -192,7 +192,7 @@ def build_glsl_header(filename): fs.close() - out_file = filename + ".h" + out_file = filename + ".gen.h" fd = open(out_file, "w") fd.write("/* WARNING, THIS FILE WAS GENERATED, DO NOT EDIT */\n") @@ -486,7 +486,7 @@ def build_hlsl_dx9_header(filename): fs.close() - out_file = filename + ".h" + out_file = filename + ".gen.h" fd = open(out_file, "w") fd.write("/* WARNING, THIS FILE WAS GENERATED, DO NOT EDIT */\n") @@ -843,7 +843,7 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs): header_data = LegacyGLHeaderStruct() include_file_in_legacygl_header(filename, header_data, 0) - out_file = filename + ".h" + out_file = filename + ".gen.h" fd = open(out_file, "w") enum_constants = [] @@ -858,7 +858,7 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs): fd.write("#ifndef " + out_file_ifdef + class_suffix + "_120\n") fd.write("#define " + out_file_ifdef + class_suffix + "_120\n") - out_file_class = out_file_base.replace(".glsl.h", "").title().replace("_", "").replace(".", "") + "Shader" + class_suffix + out_file_class = out_file_base.replace(".glsl.gen.h", "").title().replace("_", "").replace(".", "") + "Shader" + class_suffix fd.write("\n\n") fd.write("#include \"" + include + "\"\n\n\n") fd.write("class " + out_file_class + " : public Shader" + class_suffix + " {\n\n") @@ -1165,7 +1165,7 @@ def update_version(): print("Using custom revision: " + rev) import version - f = open("core/version_generated.h", "wb") + f = open("core/version_generated.gen.h", "wb") f.write("#define VERSION_SHORT_NAME " + str(version.short_name) + "\n") f.write("#define VERSION_NAME " + str(version.name) + "\n") f.write("#define VERSION_MAJOR " + str(version.major) + "\n") @@ -1224,7 +1224,7 @@ def build_cg_shader(sname): parse_cg_file("fp_" + sname + ".cg", fp_uniforms, fp_uniform_sizes, fp_conditionals) - fd = open("shader_" + sname + ".cg.h", "w") + fd = open("shader_" + sname + ".cg.gen.h", "w") fd.write('\n#include "shader_cell.h"\n') fd.write("\nclass Shader_" + sname + " : public ShaderCell {\n") @@ -1299,7 +1299,7 @@ void unregister_module_types() { """ - f = open("modules/register_module_types.cpp", "wb") + f = open("modules/register_module_types.gen.cpp", "wb") f.write(modules_cpp) return module_list @@ -1527,7 +1527,7 @@ def save_active_platforms(apnames, ap): str += "};\n" - wf = x + "/logo.h" + wf = x + "/logo.gen.h" logow = open(wf, "wb") logow.write(str) diff --git a/modules/SCsub b/modules/SCsub index 4b9c08cf78..d1c0cdc05c 100644 --- a/modules/SCsub +++ b/modules/SCsub @@ -7,7 +7,7 @@ env_modules = env.Clone() Export('env_modules') env.modules_sources = [ - "register_module_types.cpp", + "register_module_types.gen.cpp", ] # env.add_source_files(env.modules_sources,"*.cpp") Export('env') diff --git a/modules/freetype/SCsub b/modules/freetype/SCsub index 8401c36b54..6a89e8e087 100644 --- a/modules/freetype/SCsub +++ b/modules/freetype/SCsub @@ -34,10 +34,13 @@ if (env['builtin_freetype'] != 'no'): "src/base/fttype1.c", "src/base/ftwinfnt.c", "src/bdf/bdf.c", + "src/bzip2/ftbzip2.c", "src/cache/ftcache.c", "src/cff/cff.c", "src/cid/type1cid.c", "src/gxvalid/gxvalid.c", + "src/gzip/ftgzip.c", + "src/lzw/ftlzw.c", "src/otvalid/otvalid.c", "src/pcf/pcf.c", "src/pfr/pfr.c", @@ -77,6 +80,9 @@ if (env['builtin_freetype'] != 'no'): break if not inserted: env.Append(LIBS=[lib]) + env.Append(CCFLAGS=['-DFT2_BUILD_LIBRARY']) + if (env['target'] != 'release'): + env.Append(CCFLAGS=['-DZLIB_DEBUG']) # Godot source files env.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/gdscript/gd_editor.cpp b/modules/gdscript/gd_editor.cpp index 5e3ce31dd6..adf3c8edc4 100644 --- a/modules/gdscript/gd_editor.cpp +++ b/modules/gdscript/gd_editor.cpp @@ -1276,7 +1276,7 @@ static void _find_identifiers_in_class(GDCompletionContext &context, bool p_stat } } List<MethodInfo> methods; - ClassDB::get_method_list(type, &methods); + ClassDB::get_method_list(type, &methods, false, true); for (List<MethodInfo>::Element *E = methods.front(); E; E = E->next()) { if (E->get().name.begins_with("_")) continue; @@ -1643,7 +1643,7 @@ static void _find_type_arguments(GDCompletionContext &context, const GDParser::N } else { //regular method - if (p_method.operator String() == "connect") { + if (p_method.operator String() == "connect" || (p_method.operator String() == "emit_signal" && p_argidx == 0)) { if (p_argidx == 0) { List<MethodInfo> sigs; @@ -2251,7 +2251,7 @@ Error GDScriptLanguage::complete_code(const String &p_code, const String &p_base } List<MethodInfo> mi; - ClassDB::get_method_list(t.obj_type, &mi); + ClassDB::get_method_list(t.obj_type, &mi, false, true); for (List<MethodInfo>::Element *E = mi.front(); E; E = E->next()) { if (E->get().name.begins_with("_")) diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp index d64cd86de6..75029a020b 100644 --- a/modules/gdscript/gd_parser.cpp +++ b/modules/gdscript/gd_parser.cpp @@ -2626,7 +2626,7 @@ void GDParser::_parse_block(BlockNode *p_block, bool p_static) { ConstantNode *cn = alloc_node<ConstantNode>(); switch (args.size()) { - case 1: cn->value = constants[0]; break; + case 1: cn->value = (int)constants[0]; break; case 2: cn->value = Vector2(constants[0], constants[1]); break; case 3: cn->value = Vector3(constants[0], constants[1], constants[2]); break; } @@ -2639,7 +2639,7 @@ void GDParser::_parse_block(BlockNode *p_block, bool p_static) { on->arguments.push_back(tn); switch (args.size()) { - case 1: tn->vtype = Variant::REAL; break; + case 1: tn->vtype = Variant::INT; break; case 2: tn->vtype = Variant::VECTOR2; break; case 3: tn->vtype = Variant::VECTOR3; break; } diff --git a/modules/regex/regex.cpp b/modules/regex/regex.cpp index eb9f1d2ab1..c3e97e357d 100644 --- a/modules/regex/regex.cpp +++ b/modules/regex/regex.cpp @@ -590,6 +590,11 @@ struct RegExNodeGroup : public RegExNode { memdelete(childset[i]); } + virtual void test_success(RegExSearch &s, int pos) const { + + return; + } + virtual int test(RegExSearch &s, int pos) const { for (int i = 0; i < childset.size(); ++i) { @@ -598,10 +603,8 @@ struct RegExNodeGroup : public RegExNode { int res = childset[i]->test(s, pos); - if (s.complete) - return res; - if (inverse) { + s.complete = false; if (res < 0) res = pos + 1; else @@ -611,9 +614,13 @@ struct RegExNodeGroup : public RegExNode { continue; } + if (s.complete) + return res; + if (res >= 0) { if (reset_pos) res = pos; + this->test_success(s, res); return next ? next->test(s, res) : res; } } @@ -668,6 +675,12 @@ struct RegExNodeCapturing : public RegExNodeGroup { id = p_id; } + virtual void test_success(RegExSearch &s, int pos) const { + + RegExMatch::Group &ref = s.match->captures[id]; + ref.length = pos - ref.start; + } + virtual int test(RegExSearch &s, int pos) const { RegExMatch::Group &ref = s.match->captures[id]; @@ -676,13 +689,8 @@ struct RegExNodeCapturing : public RegExNodeGroup { int res = RegExNodeGroup::test(s, pos); - if (res >= 0) { - if (!s.complete) - ref.length = res - pos; - } else { + if (res < 0) ref.start = old_start; - } - return res; } @@ -1488,7 +1496,7 @@ void RegEx::_bind_methods() { ClassDB::bind_method(D_METHOD("clear"), &RegEx::clear); ClassDB::bind_method(D_METHOD("compile", "pattern"), &RegEx::compile); - ClassDB::bind_method(D_METHOD("search", "text", "start", "end"), &RegEx::search, DEFVAL(0), DEFVAL(-1)); + ClassDB::bind_method(D_METHOD("search:RegExMatch", "text", "start", "end"), &RegEx::search, DEFVAL(0), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("sub", "text", "replacement", "all", "start", "end"), &RegEx::sub, DEFVAL(false), DEFVAL(0), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("is_valid"), &RegEx::is_valid); ClassDB::bind_method(D_METHOD("get_pattern"), &RegEx::get_pattern); diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 51597526ab..d6ed234669 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -36,7 +36,7 @@ #include "io/zip_io.h" #include "os/file_access.h" #include "os/os.h" -#include "platform/android/logo.h" +#include "platform/android/logo.gen.h" #include "version.h" #include <string.h> #if 0 diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index ea388072c5..8b04deabd7 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -30,7 +30,7 @@ #include "editor/editor_node.h" #include "editor_export.h" #include "io/zip_io.h" -#include "platform/javascript/logo.h" +#include "platform/javascript/logo.gen.h" #define EXPORT_TEMPLATE_WEBASSEMBLY_RELEASE "webassembly_release.zip" #define EXPORT_TEMPLATE_WEBASSEMBLY_DEBUG "webassembly_debug.zip" diff --git a/platform/javascript/os_javascript.cpp b/platform/javascript/os_javascript.cpp index ae00fb429e..9df26f1471 100644 --- a/platform/javascript/os_javascript.cpp +++ b/platform/javascript/os_javascript.cpp @@ -46,14 +46,12 @@ #define DOM_BUTTON_RIGHT 2 template <typename T> -static InputModifierState dom2godot_mod(T emscripten_event_ptr) { +static void dom2godot_mod(T emscripten_event_ptr, Ref<InputEventWithModifiers> godot_event) { - InputModifierState mod; - mod.shift = emscripten_event_ptr->shiftKey; - mod.alt = emscripten_event_ptr->altKey; - mod.control = emscripten_event_ptr->ctrlKey; - mod.meta = emscripten_event_ptr->metaKey; - return mod; + godot_event->set_shift(emscripten_event_ptr->shiftKey); + godot_event->set_alt(emscripten_event_ptr->altKey); + godot_event->set_control(emscripten_event_ptr->ctrlKey); + godot_event->set_metakey(emscripten_event_ptr->metaKey); } int OS_JavaScript::get_video_driver_count() const { @@ -151,26 +149,26 @@ static EM_BOOL _mousebutton_callback(int event_type, const EmscriptenMouseEvent ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_MOUSEDOWN && event_type != EMSCRIPTEN_EVENT_MOUSEUP, false); - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::MOUSE_BUTTON; - ev->is_pressed() = event_type == EMSCRIPTEN_EVENT_MOUSEDOWN; - ev.mouse_button.global_x = ev->get_pos().x = mouse_event->canvasX; - ev.mouse_button.global_y = ev->get_pos().y = mouse_event->canvasY; - ev.mouse_button.mod = dom2godot_mod(mouse_event); + Ref<InputEventMouseButton> ev; + ev.instance(); + ev->set_pressed(event_type == EMSCRIPTEN_EVENT_MOUSEDOWN); + ev->set_position(Point2(mouse_event->canvasX, mouse_event->canvasY)); + ev->set_global_position(ev->get_position()); + dom2godot_mod(mouse_event, ev); switch (mouse_event->button) { - case DOM_BUTTON_LEFT: ev->get_button_index() = BUTTON_LEFT; break; - case DOM_BUTTON_MIDDLE: ev->get_button_index() = BUTTON_MIDDLE; break; - case DOM_BUTTON_RIGHT: ev->get_button_index() = BUTTON_RIGHT; break; + case DOM_BUTTON_LEFT: ev->set_button_index(BUTTON_LEFT); break; + case DOM_BUTTON_MIDDLE: ev->set_button_index(BUTTON_MIDDLE); break; + case DOM_BUTTON_RIGHT: ev->set_button_index(BUTTON_RIGHT); break; default: return false; } - ev->get_button_mask() = _input->get_mouse_button_mask(); + int mask = _input->get_mouse_button_mask(); if (ev->is_pressed()) - ev->get_button_mask() |= 1 << ev->get_button_index(); + mask |= 1 << ev->get_button_index(); else - ev->get_button_mask() &= ~(1 << ev->get_button_index()); - ev->get_button_mask() >>= 1; + mask &= ~(1 << ev->get_button_index()); + ev->set_button_mask(mask >> 1); _input->parse_input_event(ev); return true; @@ -180,20 +178,17 @@ static EM_BOOL _mousemove_callback(int event_type, const EmscriptenMouseEvent *m ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_MOUSEMOVE, false); - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::MOUSE_MOTION; - ev.mouse_motion.mod = dom2godot_mod(mouse_event); - ev->get_button_mask() = _input->get_mouse_button_mask() >> 1; + Ref<InputEventMouseMotion> ev; + ev.instance(); + dom2godot_mod(mouse_event, ev); + ev->set_button_mask(_input->get_mouse_button_mask() >> 1); - ev.mouse_motion.global_x = ev.mouse_motion.x = mouse_event->canvasX; - ev.mouse_motion.global_y = ev.mouse_motion.y = mouse_event->canvasY; + ev->set_position(Point2(mouse_event->canvasX, mouse_event->canvasY)); + ev->set_global_position(ev->get_position()); - ev->get_relative().x = _input->get_mouse_position().x - ev.mouse_motion.x; - ev->get_relative().y = _input->get_mouse_position().y - ev.mouse_motion.y; - - _input->set_mouse_position(Point2(ev.mouse_motion.x, ev.mouse_motion.y)); - ev.mouse_motion.speed_x = _input->get_last_mouse_speed().x; - ev.mouse_motion.speed_y = _input->get_last_mouse_speed().y; + ev->set_relative(_input->get_mouse_position() - ev->get_position()); + _input->set_mouse_position(ev->get_position()); + ev->set_speed(_input->get_last_mouse_speed()); _input->parse_input_event(ev); return true; @@ -203,31 +198,35 @@ static EM_BOOL _wheel_callback(int event_type, const EmscriptenWheelEvent *wheel ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_WHEEL, false); - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::MOUSE_BUTTON; - ev->get_button_mask() = _input->get_mouse_button_mask() >> 1; - ev.mouse_button.global_x = ev->get_pos().x = _input->get_mouse_position().x; - ev.mouse_button.global_y = ev->get_pos().y = _input->get_mouse_position().y; - ev.mouse_button->get_shift() = _input->is_key_pressed(KEY_SHIFT); - ev.mouse_button->get_alt() = _input->is_key_pressed(KEY_ALT); - ev.mouse_button->get_control() = _input->is_key_pressed(KEY_CONTROL); - ev.mouse_button->get_metakey() = _input->is_key_pressed(KEY_META); + Ref<InputEventMouseButton> ev; + ev.instance(); + ev->set_button_mask(_input->get_mouse_button_mask() >> 1); + ev->set_position(_input->get_mouse_position()); + ev->set_global_position(ev->get_position()); + + ev->set_shift(_input->is_key_pressed(KEY_SHIFT)); + ev->set_alt(_input->is_key_pressed(KEY_ALT)); + ev->set_control(_input->is_key_pressed(KEY_CONTROL)); + ev->set_metakey(_input->is_key_pressed(KEY_META)); if (wheel_event->deltaY < 0) - ev->get_button_index() = BUTTON_WHEEL_UP; + ev->set_button_index(BUTTON_WHEEL_UP); else if (wheel_event->deltaY > 0) - ev->get_button_index() = BUTTON_WHEEL_DOWN; + ev->set_button_index(BUTTON_WHEEL_DOWN); else if (wheel_event->deltaX > 0) - ev->get_button_index() = BUTTON_WHEEL_LEFT; + ev->set_button_index(BUTTON_WHEEL_LEFT); else if (wheel_event->deltaX < 0) - ev->get_button_index() = BUTTON_WHEEL_RIGHT; + ev->set_button_index(BUTTON_WHEEL_RIGHT); else return false; - ev->is_pressed() = true; + // Different browsers give wildly different delta values, and we can't + // interpret deltaMode, so use default value for wheel events' factor + + ev->set_pressed(true); _input->parse_input_event(ev); - ev->is_pressed() = false; + ev->set_pressed(false); _input->parse_input_event(ev); return true; @@ -243,8 +242,8 @@ static EM_BOOL _touchpress_callback(int event_type, const EmscriptenTouchEvent * event_type != EMSCRIPTEN_EVENT_TOUCHCANCEL, false); - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::SCREEN_TOUCH; + Ref<InputEventScreenTouch> ev; + ev.instance(); int lowest_id_index = -1; for (int i = 0; i < touch_event->numTouches; ++i) { @@ -253,25 +252,29 @@ static EM_BOOL _touchpress_callback(int event_type, const EmscriptenTouchEvent * lowest_id_index = i; if (!touch.isChanged) continue; - ev.screen_touch.index = touch.identifier; - _prev_touches[i].x = ev.screen_touch.x = touch.canvasX; - _prev_touches[i].y = ev.screen_touch.y = touch.canvasY; - ev.screen_touch->is_pressed() = event_type == EMSCRIPTEN_EVENT_TOUCHSTART; + ev->set_index(touch.identifier); + ev->set_position(Point2(touch.canvasX, touch.canvasY)); + _prev_touches[i] = ev->get_position(); + ev->set_pressed(event_type == EMSCRIPTEN_EVENT_TOUCHSTART); _input->parse_input_event(ev); } if (touch_event->touches[lowest_id_index].isChanged) { - ev.type = Ref<InputEvent>::MOUSE_BUTTON; - ev.mouse_button.mod = dom2godot_mod(touch_event); - ev->get_button_mask() = _input->get_mouse_button_mask() >> 1; - ev.mouse_button.global_x = ev->get_pos().x = touch_event->touches[lowest_id_index].canvasX; - ev.mouse_button.global_y = ev->get_pos().y = touch_event->touches[lowest_id_index].canvasY; - ev->get_button_index() = BUTTON_LEFT; - ev->is_pressed() = event_type == EMSCRIPTEN_EVENT_TOUCHSTART; + Ref<InputEventMouseButton> ev_mouse; + ev_mouse.instance(); + ev_mouse->set_button_mask(_input->get_mouse_button_mask() >> 1); + dom2godot_mod(touch_event, ev_mouse); - _input->parse_input_event(ev); + const EmscriptenTouchPoint &first_touch = touch_event->touches[lowest_id_index]; + ev_mouse->set_position(Point2(first_touch.canvasX, first_touch.canvasY)); + ev_mouse->set_global_position(ev_mouse->get_position()); + + ev_mouse->set_button_index(BUTTON_LEFT); + ev_mouse->set_pressed(event_type == EMSCRIPTEN_EVENT_TOUCHSTART); + + _input->parse_input_event(ev_mouse); } return true; } @@ -280,8 +283,8 @@ static EM_BOOL _touchmove_callback(int event_type, const EmscriptenTouchEvent *t ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_TOUCHMOVE, false); - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::SCREEN_DRAG; + Ref<InputEventScreenDrag> ev; + ev.instance(); int lowest_id_index = -1; for (int i = 0; i < touch_event->numTouches; ++i) { @@ -290,44 +293,42 @@ static EM_BOOL _touchmove_callback(int event_type, const EmscriptenTouchEvent *t lowest_id_index = i; if (!touch.isChanged) continue; - ev.screen_drag.index = touch.identifier; - ev.screen_drag.x = touch.canvasX; - ev.screen_drag.y = touch.canvasY; + ev->set_index(touch.identifier); + ev->set_position(Point2(touch.canvasX, touch.canvasY)); Point2 &prev = _prev_touches[i]; - ev.screen_drag.relative_x = touch.canvasX - prev.x; - ev.screen_drag.relative_y = touch.canvasY - prev.y; - prev.x = ev.screen_drag.x; - prev.y = ev.screen_drag.y; + ev->set_relative(ev->get_position() - prev); + prev = ev->get_position(); _input->parse_input_event(ev); } if (touch_event->touches[lowest_id_index].isChanged) { - ev.type = Ref<InputEvent>::MOUSE_MOTION; - ev.mouse_motion.mod = dom2godot_mod(touch_event); - ev->get_button_mask() = _input->get_mouse_button_mask() >> 1; - ev.mouse_motion.global_x = ev.mouse_motion.x = touch_event->touches[lowest_id_index].canvasX; - ev.mouse_motion.global_y = ev.mouse_motion.y = touch_event->touches[lowest_id_index].canvasY; - ev->get_relative().x = _input->get_mouse_position().x - ev.mouse_motion.x; - ev->get_relative().y = _input->get_mouse_position().y - ev.mouse_motion.y; + Ref<InputEventMouseMotion> ev_mouse; + ev_mouse.instance(); + dom2godot_mod(touch_event, ev_mouse); + ev_mouse->set_button_mask(_input->get_mouse_button_mask() >> 1); - _input->set_mouse_position(Point2(ev.mouse_motion.x, ev.mouse_motion.y)); - ev.mouse_motion.speed_x = _input->get_last_mouse_speed().x; - ev.mouse_motion.speed_y = _input->get_last_mouse_speed().y; + const EmscriptenTouchPoint &first_touch = touch_event->touches[lowest_id_index]; + ev_mouse->set_position(Point2(first_touch.canvasX, first_touch.canvasY)); + ev_mouse->set_global_position(ev_mouse->get_position()); - _input->parse_input_event(ev); + ev_mouse->set_relative(_input->get_mouse_position() - ev_mouse->get_position()); + _input->set_mouse_position(ev_mouse->get_position()); + ev_mouse->set_speed(_input->get_last_mouse_speed()); + + _input->parse_input_event(ev_mouse); } return true; } -static Ref<InputEvent> _setup_key_event(const EmscriptenKeyboardEvent *emscripten_event) { +static Ref<InputEventKey> _setup_key_event(const EmscriptenKeyboardEvent *emscripten_event) { - Ref<InputEvent> ev; - ev.type = Ref<InputEvent>::KEY; - ev->is_echo() = emscripten_event->repeat; - ev.key.mod = dom2godot_mod(emscripten_event); - ev->get_scancode() = dom2godot_scancode(emscripten_event->keyCode); + Ref<InputEventKey> ev; + ev.instance(); + ev->set_echo(emscripten_event->repeat); + dom2godot_mod(emscripten_event, ev); + ev->set_scancode(dom2godot_scancode(emscripten_event->keyCode)); String unicode = String::utf8(emscripten_event->key); // check if empty or multi-character (e.g. `CapsLock`) @@ -336,21 +337,21 @@ static Ref<InputEvent> _setup_key_event(const EmscriptenKeyboardEvent *emscripte unicode = String::utf8(emscripten_event->charValue); } if (unicode.length() == 1) { - ev.key.unicode = unicode[0]; + ev->set_unicode(unicode[0]); } return ev; } -static Ref<InputEvent> deferred_key_event; +static Ref<InputEventKey> deferred_key_event; static EM_BOOL _keydown_callback(int event_type, const EmscriptenKeyboardEvent *key_event, void *user_data) { ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_KEYDOWN, false); - Ref<InputEvent> ev = _setup_key_event(key_event); - ev->is_pressed() = true; - if (ev.key.unicode == 0 && keycode_has_unicode(ev->get_scancode())) { + Ref<InputEventKey> ev = _setup_key_event(key_event); + ev->set_pressed(true); + if (ev->get_unicode() == 0 && keycode_has_unicode(ev->get_scancode())) { // defer to keypress event for legacy unicode retrieval deferred_key_event = ev; return false; // do not suppress keypress event @@ -363,7 +364,7 @@ static EM_BOOL _keypress_callback(int event_type, const EmscriptenKeyboardEvent ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_KEYPRESS, false); - deferred_key_event.key.unicode = key_event->charCode; + deferred_key_event->set_unicode(key_event->charCode); _input->parse_input_event(deferred_key_event); return true; } @@ -372,8 +373,8 @@ static EM_BOOL _keyup_callback(int event_type, const EmscriptenKeyboardEvent *ke ERR_FAIL_COND_V(event_type != EMSCRIPTEN_EVENT_KEYUP, false); - Ref<InputEvent> ev = _setup_key_event(key_event); - ev->is_pressed() = false; + Ref<InputEventKey> ev = _setup_key_event(key_event); + ev->set_pressed(false); _input->parse_input_event(ev); return ev->get_scancode() != KEY_UNKNOWN && ev->get_scancode() != 0; } diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index 2033bc76a1..066adde780 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -27,6 +27,7 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ + #include "export.h" #include "editor/editor_export.h" #include "editor/editor_node.h" @@ -37,384 +38,286 @@ #include "io/zip_io.h" #include "os/file_access.h" #include "os/os.h" -#include "platform/osx/logo.h" +#include "platform/osx/logo.gen.h" #include "string.h" #include "version.h" -#if 0 class EditorExportPlatformOSX : public EditorExportPlatform { - GDCLASS( EditorExportPlatformOSX,EditorExportPlatform ); - - String custom_release_package; - String custom_debug_package; - - enum BitsMode { - BITS_FAT, - BITS_64, - BITS_32 - }; + GDCLASS(EditorExportPlatformOSX, EditorExportPlatform); int version_code; - String app_name; - String info; - String icon; - String identifier; - String short_version; - String version; - String signature; - String copyright; - BitsMode bits_mode; - bool high_resolution; - Ref<ImageTexture> logo; - void _fix_plist(Vector<uint8_t>& plist, const String &p_binary); - void _make_icon(const Image& p_icon,Vector<uint8_t>& data); - + void _fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary); + void _make_icon(const Ref<Image> &p_icon, Vector<uint8_t> &p_data); protected: - - bool _set(const StringName& p_name, const Variant& p_value); - bool _get(const StringName& p_name,Variant &r_ret) const; - void _get_property_list( List<PropertyInfo> *p_list) const; + virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features); + virtual void get_export_options(List<ExportOption> *r_options); public: - virtual String get_name() const { return "Mac OSX"; } - virtual ImageCompression get_image_compression() const { return IMAGE_COMPRESSION_BC; } virtual Ref<Texture> get_logo() const { return logo; } - - virtual bool poll_devices() { return false;} - virtual int get_device_count() const { return 0; } - virtual String get_device_name(int p_device) const { return String(); } - virtual String get_device_info(int p_device) const { return String(); } - virtual Error run(int p_device,int p_flags=0); - - virtual bool requires_password(bool p_debug) const { return false; } virtual String get_binary_extension() const { return "zip"; } - virtual Error export_project(const String& p_path,bool p_debug,int p_flags=0); + virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0); - virtual bool can_export(String *r_error=NULL) const; + virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const; EditorExportPlatformOSX(); ~EditorExportPlatformOSX(); }; -bool EditorExportPlatformOSX::_set(const StringName& p_name, const Variant& p_value) { - - String n=p_name; - - if (n=="custom_package/debug") - custom_debug_package=p_value; - else if (n=="custom_package/release") - custom_release_package=p_value; - else if (n=="application/name") - app_name=p_value; - else if (n=="application/info") - info=p_value; - else if (n=="application/icon") - icon=p_value; - else if (n=="application/identifier") - identifier=p_value; - else if (n=="application/signature") - signature=p_value; - else if (n=="application/short_version") - short_version=p_value; - else if (n=="application/version") - version=p_value; - else if (n=="application/copyright") - copyright=p_value; - else if (n=="application/bits_mode") - bits_mode=BitsMode(int(p_value)); - else if (n=="display/high_res") - high_resolution=p_value; - else - return false; - - return true; -} - -bool EditorExportPlatformOSX::_get(const StringName& p_name,Variant &r_ret) const{ - - String n=p_name; - - if (n=="custom_package/debug") - r_ret=custom_debug_package; - else if (n=="custom_package/release") - r_ret=custom_release_package; - else if (n=="application/name") - r_ret=app_name; - else if (n=="application/info") - r_ret=info; - else if (n=="application/icon") - r_ret=icon; - else if (n=="application/identifier") - r_ret=identifier; - else if (n=="application/signature") - r_ret=signature; - else if (n=="application/short_version") - r_ret=short_version; - else if (n=="application/version") - r_ret=version; - else if (n=="application/copyright") - r_ret=copyright; - else if (n=="application/bits_mode") - r_ret=bits_mode; - else if (n=="display/high_res") - r_ret=high_resolution; - else - return false; +void EditorExportPlatformOSX::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) { - return true; + // what does this need to do? } -void EditorExportPlatformOSX::_get_property_list( List<PropertyInfo> *p_list) const{ - - p_list->push_back( PropertyInfo( Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE,"zip")); - p_list->push_back( PropertyInfo( Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE,"zip")); - - p_list->push_back( PropertyInfo( Variant::STRING, "application/name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/info") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/icon",PROPERTY_HINT_FILE,"png") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/identifier") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/signature") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/short_version") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/version") ); - p_list->push_back( PropertyInfo( Variant::STRING, "application/copyright") ); - p_list->push_back( PropertyInfo( Variant::INT, "application/bits_mode", PROPERTY_HINT_ENUM, "Fat (32 & 64 bits),64 bits,32 bits") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "display/high_res") ); +void EditorExportPlatformOSX::get_export_options(List<ExportOption> *r_options) { + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/name"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/info"), "Made with Godot Engine")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/icon", PROPERTY_HINT_FILE, "png"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/identifier"), "org.godotengine.macgame")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/signature"), "godotmacgame")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/short_version"), "1.0")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/version"), "1.0")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/copyright"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/bits_mode", PROPERTY_HINT_ENUM, "Fat (32 & 64 bits),64 bits,32 bits"), 0)); + r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "display/high_res"), false)); } -void EditorExportPlatformOSX::_make_icon(const Image& p_icon,Vector<uint8_t>& icon) { +void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_t> &p_data) { - - Ref<ImageTexture> it = memnew( ImageTexture ); - int size=512; + 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'; + data[0] = 'i'; + data[1] = 'c'; + data[2] = 'n'; + data[3] = 's'; - const char *name[]={"ic09","ic08","ic07","icp6","icp5","icp4"}; - int index=0; + const char *name[] = { "ic09", "ic08", "ic07", "icp6", "icp5", "icp4" }; + int index = 0; - while(size>=16) { + while (size >= 16) { - Image copy = p_icon; - copy.convert(Image::FORMAT_RGBA8); - copy.resize(size,size); + 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_settings_path()+"/tmp/icon.png"; - ResourceSaver::save(path,it); + String path = EditorSettings::get_singleton()->get_settings_path() + "/tmp/icon.png"; + ResourceSaver::save(path, it); - FileAccess *f = FileAccess::open(path,FileAccess::READ); + 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); + 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]); + len += 8; + len = BSWAP32(len); + copymem(&data[ofs], name[index], 4); + encode_uint32(len, &data[ofs + 4]); index++; - size/=2; + size /= 2; } uint32_t total_len = data.size(); total_len = BSWAP32(total_len); - encode_uint32(total_len,&data[4]); + encode_uint32(total_len, &data[4]); - icon=data; + p_data = data; } - -void EditorExportPlatformOSX::_fix_plist(Vector<uint8_t>& plist,const String& p_binary) { - +void EditorExportPlatformOSX::_fix_plist(const Ref<EditorExportPreset> &p_preset, Vector<uint8_t> &plist, const String &p_binary) { String str; String strnew; - str.parse_utf8((const char*)plist.ptr(),plist.size()); - Vector<String> lines=str.split("\n"); - for(int i=0;i<lines.size();i++) { - if (lines[i].find("$binary")!=-1) { - strnew+=lines[i].replace("$binary",p_binary)+"\n"; - } else if (lines[i].find("$name")!=-1) { - strnew+=lines[i].replace("$name",p_binary)+"\n"; - } else if (lines[i].find("$info")!=-1) { - strnew+=lines[i].replace("$info",info)+"\n"; - } else if (lines[i].find("$identifier")!=-1) { - strnew+=lines[i].replace("$identifier",identifier)+"\n"; - } else if (lines[i].find("$short_version")!=-1) { - strnew+=lines[i].replace("$short_version",short_version)+"\n"; - } else if (lines[i].find("$version")!=-1) { - strnew+=lines[i].replace("$version",version)+"\n"; - } else if (lines[i].find("$signature")!=-1) { - strnew+=lines[i].replace("$signature",signature)+"\n"; - } else if (lines[i].find("$copyright")!=-1) { - strnew+=lines[i].replace("$copyright",copyright)+"\n"; - } else if (lines[i].find("$highres")!=-1) { - strnew+=lines[i].replace("$highres",high_resolution?"<true/>":"<false/>")+"\n"; + str.parse_utf8((const char *)plist.ptr(), plist.size()); + Vector<String> lines = str.split("\n"); + for (int i = 0; i < lines.size(); i++) { + if (lines[i].find("$binary") != -1) { + strnew += lines[i].replace("$binary", p_binary) + "\n"; + } else if (lines[i].find("$name") != -1) { + strnew += lines[i].replace("$name", p_binary) + "\n"; + } else if (lines[i].find("$info") != -1) { + strnew += lines[i].replace("$info", p_preset->get("application/info")) + "\n"; + } else if (lines[i].find("$identifier") != -1) { + strnew += lines[i].replace("$identifier", p_preset->get("application/identifier")) + "\n"; + } else if (lines[i].find("$short_version") != -1) { + strnew += lines[i].replace("$short_version", p_preset->get("application/short_version")) + "\n"; + } else if (lines[i].find("$version") != -1) { + strnew += lines[i].replace("$version", p_preset->get("application/version")) + "\n"; + } else if (lines[i].find("$signature") != -1) { + strnew += lines[i].replace("$signature", p_preset->get("application/signature")) + "\n"; + } else if (lines[i].find("$copyright") != -1) { + strnew += lines[i].replace("$copyright", p_preset->get("application/copyright")) + "\n"; + } else if (lines[i].find("$highres") != -1) { + strnew += lines[i].replace("$highres", p_preset->get("display/high_res") ? "<true/>" : "<false/>") + "\n"; } else { - strnew+=lines[i]+"\n"; + strnew += lines[i] + "\n"; } } CharString cs = strnew.utf8(); plist.resize(cs.size()); - for(int i=9;i<cs.size();i++) { - plist[i]=cs[i]; + for (int i = 9; i < cs.size(); i++) { + plist[i] = cs[i]; } } -Error EditorExportPlatformOSX::export_project(const String& p_path, bool p_debug, int p_flags) { +Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) { String src_pkg; - EditorProgress ep("export","Exporting for OSX",104); - + EditorProgress ep("export", "Exporting for OSX", 104); if (p_debug) - src_pkg=custom_debug_package; + src_pkg = p_preset->get("custom_package/debug"); else - src_pkg=custom_release_package; + src_pkg = p_preset->get("custom_package/release"); - if (src_pkg=="") { + if (src_pkg == "") { String err; - src_pkg=find_export_template("osx.zip", &err); - if (src_pkg=="") { + src_pkg = find_export_template("osx.zip", &err); + if (src_pkg == "") { EditorNode::add_io_error(err); return ERR_FILE_NOT_FOUND; } } - - FileAccess *src_f=NULL; + FileAccess *src_f = NULL; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - ep.step("Creating app",0); + ep.step("Creating app", 0); unzFile pkg = unzOpen2(src_pkg.utf8().get_data(), &io); if (!pkg) { - EditorNode::add_io_error("Could not find template app to export:\n"+src_pkg); + EditorNode::add_io_error("Could not find template app to export:\n" + src_pkg); return ERR_FILE_NOT_FOUND; } ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN); int ret = unzGoToFirstFile(pkg); - zlib_filefunc_def io2=io; - FileAccess *dst_f=NULL; - io2.opaque=&dst_f; - zipFile dpkg=zipOpen2(p_path.utf8().get_data(),APPEND_STATUS_CREATE,NULL,&io2); + zlib_filefunc_def io2 = io; + FileAccess *dst_f = NULL; + io2.opaque = &dst_f; + zipFile dpkg = zipOpen2(p_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io2); String binary_to_use = "godot_osx_" + String(p_debug ? "debug" : "release") + "."; - binary_to_use += String(bits_mode==BITS_FAT ? "fat" : bits_mode==BITS_64 ? "64" : "32"); + int bits_mode = p_preset->get("application/bits_mode"); + binary_to_use += String(bits_mode == 0 ? "fat" : bits_mode == 1 ? "64" : "32"); - print_line("binary: "+binary_to_use); + print_line("binary: " + binary_to_use); String pkg_name; - if (app_name!="") - pkg_name=app_name; - else if (String(GlobalConfig::get_singleton()->get("application/name"))!="") - pkg_name=String(GlobalConfig::get_singleton()->get("application/name")); + if (p_preset->get("application/name") != "") + pkg_name = p_preset->get("application/name"); // app_name + else if (String(GlobalConfig::get_singleton()->get("application/name")) != "") + pkg_name = String(GlobalConfig::get_singleton()->get("application/name")); else - pkg_name="Unnamed"; - + pkg_name = "Unnamed"; bool found_binary = false; - while(ret==UNZ_OK) { + while (ret == UNZ_OK) { //get filename unz_file_info info; char fname[16384]; - ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0); + ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); - String file=fname; + String file = fname; - print_line("READ: "+file); + print_line("READ: " + file); Vector<uint8_t> data; data.resize(info.uncompressed_size); //read unzOpenCurrentFile(pkg); - unzReadCurrentFile(pkg,data.ptr(),data.size()); + unzReadCurrentFile(pkg, data.ptr(), data.size()); unzCloseCurrentFile(pkg); //write - file = file.replace_first("osx_template.app/",""); + file = file.replace_first("osx_template.app/", ""); - - if (file=="Contents/Info.plist") { + if (file == "Contents/Info.plist") { print_line("parse plist"); - _fix_plist(data,pkg_name); + _fix_plist(p_preset, data, pkg_name); } if (file.begins_with("Contents/MacOS/godot_")) { - if (file!="Contents/MacOS/"+binary_to_use) { + if (file != "Contents/MacOS/" + binary_to_use) { ret = unzGoToNextFile(pkg); continue; //ignore! } found_binary = true; - file="Contents/MacOS/"+pkg_name; + file = "Contents/MacOS/" + pkg_name; } - if (file=="Contents/Resources/icon.icns") { + if (file == "Contents/Resources/icon.icns") { //see if there is an icon - String iconpath = GlobalConfig::get_singleton()->get("application/icon"); - print_line("icon? "+iconpath); - if (iconpath!="") { - Image icon; - icon.load(iconpath); - if (!icon.empty()) { + String iconpath; + if (p_preset->get("application/icon") != "") + iconpath = p_preset->get("application/icon"); + else + iconpath = GlobalConfig::get_singleton()->get("application/icon"); + print_line("icon? " + iconpath); + if (iconpath != "") { + Ref<Image> icon; + icon.instance(); + icon->load(iconpath); + if (!icon->empty()) { print_line("loaded?"); - _make_icon(icon,data); + _make_icon(icon, data); } } //bleh? } - file=pkg_name+".app/"+file; + file = pkg_name + ".app/" + file; - if (data.size()>0) { - print_line("ADDING: "+file+" size: "+itos(data.size())); + if (data.size() > 0) { + print_line("ADDING: " + file + " size: " + itos(data.size())); zip_fileinfo fi; - fi.tmz_date.tm_hour=info.tmu_date.tm_hour; - fi.tmz_date.tm_min=info.tmu_date.tm_min; - fi.tmz_date.tm_sec=info.tmu_date.tm_sec; - fi.tmz_date.tm_mon=info.tmu_date.tm_mon; - fi.tmz_date.tm_mday=info.tmu_date.tm_mday; - fi.tmz_date.tm_year=info.tmu_date.tm_year; - fi.dosDate=info.dosDate; - fi.internal_fa=info.internal_fa; - fi.external_fa=info.external_fa; + fi.tmz_date.tm_hour = info.tmu_date.tm_hour; + fi.tmz_date.tm_min = info.tmu_date.tm_min; + fi.tmz_date.tm_sec = info.tmu_date.tm_sec; + fi.tmz_date.tm_mon = info.tmu_date.tm_mon; + fi.tmz_date.tm_mday = info.tmu_date.tm_mday; + fi.tmz_date.tm_year = info.tmu_date.tm_year; + fi.dosDate = info.dosDate; + fi.internal_fa = info.internal_fa; + fi.external_fa = info.external_fa; int err = zipOpenNewFileInZip(dpkg, - file.utf8().get_data(), - &fi, - NULL, - 0, - NULL, - 0, - NULL, - Z_DEFLATED, - Z_DEFAULT_COMPRESSION); - - print_line("OPEN ERR: "+itos(err)); - err = zipWriteInFileInZip(dpkg,data.ptr(),data.size()); - print_line("WRITE ERR: "+itos(err)); + file.utf8().get_data(), + &fi, + NULL, + 0, + NULL, + 0, + NULL, + Z_DEFLATED, + Z_DEFAULT_COMPRESSION); + + print_line("OPEN ERR: " + itos(err)); + err = zipWriteInFileInZip(dpkg, data.ptr(), data.size()); + print_line("WRITE ERR: " + itos(err)); zipCloseFileInZip(dpkg); } @@ -422,126 +325,98 @@ Error EditorExportPlatformOSX::export_project(const String& p_path, bool p_debug } if (!found_binary) { - ERR_PRINTS("Requested template binary '"+binary_to_use+"' not found. It might be missing from your template archive."); - zipClose(dpkg,NULL); + ERR_PRINTS("Requested template binary '" + binary_to_use + "' not found. It might be missing from your template archive."); + zipClose(dpkg, NULL); unzClose(pkg); return ERR_FILE_NOT_FOUND; } + ep.step("Making PKG", 1); - ep.step("Making PKG",1); - - String pack_path=EditorSettings::get_singleton()->get_settings_path()+"/tmp/data.pck"; - FileAccess *pfs = FileAccess::open(pack_path,FileAccess::WRITE); - Error err = save_pack(pfs); - memdelete(pfs); + String pack_path = EditorSettings::get_singleton()->get_settings_path() + "/tmp/data.pck"; + Error err = save_pack(p_preset, pack_path); if (err) { - zipClose(dpkg,NULL); + zipClose(dpkg, NULL); unzClose(pkg); return err; - } { //write datapack zipOpenNewFileInZip(dpkg, - (pkg_name+".app/Contents/Resources/data.pck").utf8().get_data(), - NULL, - NULL, - 0, - NULL, - 0, - NULL, - Z_DEFLATED, - Z_DEFAULT_COMPRESSION); - - - FileAccess *pf = FileAccess::open(pack_path,FileAccess::READ); - ERR_FAIL_COND_V(!pf,ERR_CANT_OPEN); + (pkg_name + ".app/Contents/Resources/data.pck").utf8().get_data(), + NULL, + NULL, + 0, + NULL, + 0, + NULL, + Z_DEFLATED, + Z_DEFAULT_COMPRESSION); + + FileAccess *pf = FileAccess::open(pack_path, FileAccess::READ); + ERR_FAIL_COND_V(!pf, ERR_CANT_OPEN); const int BSIZE = 16384; uint8_t buf[BSIZE]; - while(true) { + while (true) { - int r = pf->get_buffer(buf,BSIZE); - if (r<=0) + int r = pf->get_buffer(buf, BSIZE); + if (r <= 0) break; - zipWriteInFileInZip(dpkg,buf,r); - + zipWriteInFileInZip(dpkg, buf, r); } zipCloseFileInZip(dpkg); memdelete(pf); - } - zipClose(dpkg,NULL); + zipClose(dpkg, NULL); unzClose(pkg); return OK; } +bool EditorExportPlatformOSX::can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const { -Error EditorExportPlatformOSX::run(int p_device, int p_flags) { - - return OK; -} - - -EditorExportPlatformOSX::EditorExportPlatformOSX() { - - Image img( _osx_logo ); - logo = Ref<ImageTexture>( memnew( ImageTexture )); - logo->create_from_image(img); - - info="Made with Godot Engine"; - identifier="org.godotengine.macgame"; - signature="godotmacgame"; - short_version="1.0"; - version="1.0"; - bits_mode=BITS_FAT; - high_resolution=false; - -} - -bool EditorExportPlatformOSX::can_export(String *r_error) const { - - - bool valid=true; + bool valid = true; String err; - if (!exists_export_template("osx.zip")) { - valid=false; - err+="No export templates found.\nDownload and install export templates.\n"; + if (!exists_export_template("osx.zip", &err)) { + valid = false; } - if (custom_debug_package!="" && !FileAccess::exists(custom_debug_package)) { - valid=false; - err+="Custom debug package not found.\n"; + if (p_preset->get("custom_package/debug") != "" && !FileAccess::exists(p_preset->get("custom_package/debug"))) { + valid = false; + err += "Custom debug package not found.\n"; } - if (custom_release_package!="" && !FileAccess::exists(custom_release_package)) { - valid=false; - err+="Custom release package not found.\n"; + if (p_preset->get("custom_package/release") != "" && !FileAccess::exists(p_preset->get("custom_package/release"))) { + valid = false; + err += "Custom release package not found.\n"; } - if (r_error) - *r_error=err; + if (!err.empty()) + r_error = err; return valid; } +EditorExportPlatformOSX::EditorExportPlatformOSX() { -EditorExportPlatformOSX::~EditorExportPlatformOSX() { + Ref<Image> img = memnew(Image(_osx_logo)); + logo.instance(); + logo->create_from_image(img); +} +EditorExportPlatformOSX::~EditorExportPlatformOSX() { } -#endif void register_osx_exporter() { -#if 0 - Ref<EditorExportPlatformOSX> exporter = Ref<EditorExportPlatformOSX>( memnew(EditorExportPlatformOSX) ); - EditorImportExport::get_singleton()->add_export_platform(exporter); -#endif + Ref<EditorExportPlatformOSX> platform; + platform.instance(); + + EditorExport::get_singleton()->add_export_platform(platform); } diff --git a/platform/windows/export/export.cpp b/platform/windows/export/export.cpp index 3802e7e784..c9271f6266 100644 --- a/platform/windows/export/export.cpp +++ b/platform/windows/export/export.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "editor/editor_export.h" -#include "platform/windows/logo.h" +#include "platform/windows/logo.gen.h" void register_windows_exporter() { diff --git a/platform/windows/godot.ico b/platform/windows/godot.ico Binary files differindex fd5c28944f..dd611e07da 100644 --- a/platform/windows/godot.ico +++ b/platform/windows/godot.ico diff --git a/platform/x11/export/export.cpp b/platform/x11/export/export.cpp index d6bad95e5b..69784a473d 100644 --- a/platform/x11/export/export.cpp +++ b/platform/x11/export/export.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "export.h" #include "editor/editor_export.h" -#include "platform/x11/logo.h" +#include "platform/x11/logo.gen.h" #include "scene/resources/texture.h" void register_x11_exporter() { diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index 6a3238b64e..a1ab51b3c8 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -30,7 +30,6 @@ #include "animated_sprite.h" #include "os/os.h" #include "scene/scene_string_names.h" -#include "scene/scene_string_names.h" #define NORMAL_SUFFIX "_normal" diff --git a/scene/2d/animated_sprite.h b/scene/2d/animated_sprite.h index 2274450647..80defac079 100644 --- a/scene/2d/animated_sprite.h +++ b/scene/2d/animated_sprite.h @@ -99,7 +99,7 @@ public: const Map<StringName, Anim>::Element *EN = animations.find(E->get().normal_name); - if (p_idx >= EN->get().frames.size()) + if (!EN || p_idx >= EN->get().frames.size()) return Ref<Texture>(); return EN->get().frames[p_idx]; diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index 3d9e64ae79..cef473dcdf 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -61,7 +61,7 @@ void AudioStreamPlayer2D::_mix_audio() { for (int j = 0; j < buffer_size; j++) { - target[j] = buffer[j] * vol; + target[j] += buffer[j] * vol; vol += vol_inc; } @@ -76,8 +76,8 @@ void AudioStreamPlayer2D::_mix_audio() { for (int j = 0; j < buffer_size; j++) { AudioFrame frame = buffer[j] * vol; - targets[0][j] = frame; - targets[1][j] = frame; + targets[0][j] += frame; + targets[1][j] += frame; vol += vol_inc; } @@ -93,9 +93,9 @@ void AudioStreamPlayer2D::_mix_audio() { for (int j = 0; j < buffer_size; j++) { AudioFrame frame = buffer[j] * vol; - targets[0][j] = frame; - targets[1][j] = frame; - targets[2][j] = frame; + targets[0][j] += frame; + targets[1][j] += frame; + targets[2][j] += frame; vol += vol_inc; } diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index 9d8b5da366..908c95b50c 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -199,10 +199,8 @@ Transform2D Camera2D::get_camera_transform() { /* if (0) { - xform = get_global_transform() * xform; } else { - xform.elements[2]+=get_global_transform().get_origin(); } */ @@ -267,25 +265,76 @@ void Camera2D::_notification(int p_what) { if (!is_inside_tree() || !get_tree()->is_editor_hint()) break; - Color area_axis_color(0.5, 0.42, 0.87, 0.63); - float area_axis_width = 1; - if (current) - area_axis_width = 3; + if (screen_drawing_enabled) { + Color area_axis_color(0.5, 0.42, 0.87, 0.63); + float area_axis_width = 1; + if (is_current()) { + area_axis_width = 3; + area_axis_color.a = 0.83; + } - Transform2D inv_camera_transform = get_camera_transform().affine_inverse(); - Size2 screen_size = get_viewport_rect().size; + Transform2D inv_camera_transform = get_camera_transform().affine_inverse(); + Size2 screen_size = get_viewport_rect().size; - Vector2 screen_endpoints[4] = { - inv_camera_transform.xform(Vector2(0, 0)), - inv_camera_transform.xform(Vector2(screen_size.width, 0)), - inv_camera_transform.xform(Vector2(screen_size.width, screen_size.height)), - inv_camera_transform.xform(Vector2(0, screen_size.height)) - }; + Vector2 screen_endpoints[4] = { + inv_camera_transform.xform(Vector2(0, 0)), + inv_camera_transform.xform(Vector2(screen_size.width, 0)), + inv_camera_transform.xform(Vector2(screen_size.width, screen_size.height)), + inv_camera_transform.xform(Vector2(0, screen_size.height)) + }; - Transform2D inv_transform = get_global_transform().affine_inverse(); // undo global space + Transform2D inv_transform = get_global_transform().affine_inverse(); // undo global space - for (int i = 0; i < 4; i++) { - draw_line(inv_transform.xform(screen_endpoints[i]), inv_transform.xform(screen_endpoints[(i + 1) % 4]), area_axis_color, area_axis_width); + for (int i = 0; i < 4; i++) { + draw_line(inv_transform.xform(screen_endpoints[i]), inv_transform.xform(screen_endpoints[(i + 1) % 4]), area_axis_color, area_axis_width); + } + } + + if (limit_drawing_enabled) { + Color limit_drawing_color(1, 1, 0, 0.63); + float limit_drawing_width = 1; + if (is_current()) { + limit_drawing_color.a = 0.83; + limit_drawing_width = 3; + } + + Vector2 camera_origin = get_global_transform().get_origin(); + Vector2 camera_scale = get_global_transform().get_scale().abs(); + Vector2 limit_points[4] = { + (Vector2(limit[MARGIN_LEFT], limit[MARGIN_TOP]) - camera_origin) / camera_scale, + (Vector2(limit[MARGIN_RIGHT], limit[MARGIN_TOP]) - camera_origin) / camera_scale, + (Vector2(limit[MARGIN_RIGHT], limit[MARGIN_BOTTOM]) - camera_origin) / camera_scale, + (Vector2(limit[MARGIN_LEFT], limit[MARGIN_BOTTOM]) - camera_origin) / camera_scale + }; + + for (int i = 0; i < 4; i++) { + draw_line(limit_points[i], limit_points[(i + 1) % 4], limit_drawing_color, limit_drawing_width); + } + } + + if (margin_drawing_enabled) { + Color margin_drawing_color(0, 1, 1, 0.63); + float margin_drawing_width = 1; + if (is_current()) { + margin_drawing_width = 3; + margin_drawing_color.a = 0.83; + } + + Transform2D inv_camera_transform = get_camera_transform().affine_inverse(); + Size2 screen_size = get_viewport_rect().size; + + Vector2 margin_endpoints[4] = { + inv_camera_transform.xform(Vector2((screen_size.width / 2) - ((screen_size.width / 2) * drag_margin[MARGIN_LEFT]), (screen_size.height / 2) - ((screen_size.height / 2) * drag_margin[MARGIN_TOP]))), + inv_camera_transform.xform(Vector2((screen_size.width / 2) + ((screen_size.width / 2) * drag_margin[MARGIN_RIGHT]), (screen_size.height / 2) - ((screen_size.height / 2) * drag_margin[MARGIN_TOP]))), + inv_camera_transform.xform(Vector2((screen_size.width / 2) + ((screen_size.width / 2) * drag_margin[MARGIN_RIGHT]), (screen_size.height / 2) + ((screen_size.height / 2) * drag_margin[MARGIN_BOTTOM]))), + inv_camera_transform.xform(Vector2((screen_size.width / 2) - ((screen_size.width / 2) * drag_margin[MARGIN_LEFT]), (screen_size.height / 2) + ((screen_size.height / 2) * drag_margin[MARGIN_BOTTOM]))) + }; + + Transform2D inv_transform = get_global_transform().affine_inverse(); // undo global space + + for (int i = 0; i < 4; i++) { + draw_line(inv_transform.xform(margin_endpoints[i]), inv_transform.xform(margin_endpoints[(i + 1) % 4]), margin_drawing_color, margin_drawing_width); + } } } break; @@ -330,7 +379,6 @@ void Camera2D::_make_current(Object *p_which) { if (p_which == this) { current = true; - _update_scroll(); } else { current = false; } @@ -342,6 +390,7 @@ void Camera2D::_set_current(bool p_current) { make_current(); current = p_current; + update(); } bool Camera2D::is_current() const { @@ -370,6 +419,7 @@ void Camera2D::set_limit(Margin p_margin, int p_limit) { ERR_FAIL_INDEX(p_margin, 4); limit[p_margin] = p_limit; + update(); } int Camera2D::get_limit(Margin p_margin) const { @@ -393,6 +443,7 @@ void Camera2D::set_drag_margin(Margin p_margin, float p_drag_margin) { ERR_FAIL_INDEX(p_margin, 4); drag_margin[p_margin] = p_drag_margin; + update(); } float Camera2D::get_drag_margin(Margin p_margin) const { @@ -554,6 +605,33 @@ Node *Camera2D::get_custom_viewport() const { return custom_viewport; } +void Camera2D::set_screen_drawing_enabled(bool enable) { + screen_drawing_enabled = enable; + update(); +} + +bool Camera2D::is_screen_drawing_enabled() const { + return screen_drawing_enabled; +} + +void Camera2D::set_limit_drawing_enabled(bool enable) { + limit_drawing_enabled = enable; + update(); +} + +bool Camera2D::is_limit_drawing_enabled() const { + return limit_drawing_enabled; +} + +void Camera2D::set_margin_drawing_enabled(bool enable) { + margin_drawing_enabled = enable; + update(); +} + +bool Camera2D::is_margin_drawing_enabled() const { + return margin_drawing_enabled; +} + void Camera2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_offset", "offset"), &Camera2D::set_offset); @@ -616,6 +694,15 @@ void Camera2D::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_old_smoothing", "follow_smoothing"), &Camera2D::_set_old_smoothing); + ClassDB::bind_method(D_METHOD("set_screen_drawing_enabled", "screen_drawing_enabled"), &Camera2D::set_screen_drawing_enabled); + ClassDB::bind_method(D_METHOD("is_screen_drawing_enabled"), &Camera2D::is_screen_drawing_enabled); + + ClassDB::bind_method(D_METHOD("set_limit_drawing_enabled", "limit_drawing_enabled"), &Camera2D::set_limit_drawing_enabled); + ClassDB::bind_method(D_METHOD("is_limit_drawing_enabled"), &Camera2D::is_limit_drawing_enabled); + + ClassDB::bind_method(D_METHOD("set_margin_drawing_enabled", "margin_drawing_enabled"), &Camera2D::set_margin_drawing_enabled); + ClassDB::bind_method(D_METHOD("is_margin_drawing_enabled"), &Camera2D::is_margin_drawing_enabled); + ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset"); ADD_PROPERTY(PropertyInfo(Variant::INT, "anchor_mode", PROPERTY_HINT_ENUM, "Fixed TopLeft,Drag Center"), "set_anchor_mode", "get_anchor_mode"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "rotating"), "set_rotating", "is_rotating"); @@ -643,6 +730,11 @@ void Camera2D::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::REAL, "drag_margin_right", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_drag_margin", "get_drag_margin", MARGIN_RIGHT); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "drag_margin_bottom", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_drag_margin", "get_drag_margin", MARGIN_BOTTOM); + ADD_GROUP("Editor", "editor_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editor_draw_screen"), "set_screen_drawing_enabled", "is_screen_drawing_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editor_draw_limits"), "set_limit_drawing_enabled", "is_limit_drawing_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editor_draw_drag_margin"), "set_margin_drawing_enabled", "is_margin_drawing_enabled"); + BIND_CONSTANT(ANCHOR_MODE_DRAG_CENTER); BIND_CONSTANT(ANCHOR_MODE_FIXED_TOP_LEFT); } @@ -671,6 +763,10 @@ Camera2D::Camera2D() { smoothing = 5.0; zoom = Vector2(1, 1); + screen_drawing_enabled = true; + limit_drawing_enabled = false; + margin_drawing_enabled = false; + h_drag_enabled = true; v_drag_enabled = true; h_ofs = 0; diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 686f40bedf..8d9e76be85 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -79,6 +79,10 @@ protected: void _set_old_smoothing(float p_enable); + bool screen_drawing_enabled; + bool limit_drawing_enabled; + bool margin_drawing_enabled; + protected: virtual Transform2D get_camera_transform(); void _notification(int p_what); @@ -138,6 +142,15 @@ public: void reset_smoothing(); void align(); + void set_screen_drawing_enabled(bool enable); + bool is_screen_drawing_enabled() const; + + void set_limit_drawing_enabled(bool enable); + bool is_limit_drawing_enabled() const; + + void set_margin_drawing_enabled(bool enable); + bool is_margin_drawing_enabled() const; + Camera2D(); }; diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 471f529713..4a80aba355 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "canvas_item.h" -#include "core/method_bind_ext.inc" +#include "core/method_bind_ext.gen.inc" #include "message_queue.h" #include "os/input.h" #include "scene/main/canvas_layer.h" @@ -39,6 +39,196 @@ #include "scene/scene_string_names.h" #include "servers/visual_server.h" +Mutex *CanvasItemMaterial::material_mutex = NULL; +SelfList<CanvasItemMaterial>::List CanvasItemMaterial::dirty_materials; +Map<CanvasItemMaterial::MaterialKey, CanvasItemMaterial::ShaderData> CanvasItemMaterial::shader_map; + +void CanvasItemMaterial::init_shaders() { + +#ifndef NO_THREADS + material_mutex = Mutex::create(); +#endif +} + +void CanvasItemMaterial::finish_shaders() { + +#ifndef NO_THREADS + memdelete(material_mutex); +#endif +} + +void CanvasItemMaterial::_update_shader() { + + dirty_materials.remove(&element); + + MaterialKey mk = _compute_key(); + if (mk.key == current_key.key) + return; //no update required in the end + + if (shader_map.has(current_key)) { + shader_map[current_key].users--; + if (shader_map[current_key].users == 0) { + //deallocate shader, as it's no longer in use + VS::get_singleton()->free(shader_map[current_key].shader); + shader_map.erase(current_key); + } + } + + current_key = mk; + + if (shader_map.has(mk)) { + + VS::get_singleton()->material_set_shader(_get_material(), shader_map[mk].shader); + shader_map[mk].users++; + return; + } + + //must create a shader! + + String code = "shader_type canvas_item;\nrender_mode "; + switch (blend_mode) { + case BLEND_MODE_MIX: code += "blend_mix"; break; + case BLEND_MODE_ADD: code += "blend_add"; break; + case BLEND_MODE_SUB: code += "blend_sub"; break; + case BLEND_MODE_MUL: code += "blend_mul"; break; + case BLEND_MODE_PREMULT_ALPHA: code += "blend_premul_alpha"; break; + } + + switch (light_mode) { + case LIGHT_MODE_NORMAL: break; + case LIGHT_MODE_UNSHADED: code += ",unshaded"; break; + case LIGHT_MODE_LIGHT_ONLY: code += ",light_only"; break; + } + code += ";\n"; //thats it. + + ShaderData shader_data; + shader_data.shader = VS::get_singleton()->shader_create(); + shader_data.users = 1; + + VS::get_singleton()->shader_set_code(shader_data.shader, code); + + shader_map[mk] = shader_data; + + VS::get_singleton()->material_set_shader(_get_material(), shader_data.shader); +} + +void CanvasItemMaterial::flush_changes() { + + if (material_mutex) + material_mutex->lock(); + + while (dirty_materials.first()) { + + dirty_materials.first()->self()->_update_shader(); + } + + if (material_mutex) + material_mutex->unlock(); +} + +void CanvasItemMaterial::_queue_shader_change() { + + if (material_mutex) + material_mutex->lock(); + + if (!element.in_list()) { + dirty_materials.add(&element); + } + + if (material_mutex) + material_mutex->unlock(); +} + +bool CanvasItemMaterial::_is_shader_dirty() const { + + bool dirty = false; + + if (material_mutex) + material_mutex->lock(); + + dirty = element.in_list(); + + if (material_mutex) + material_mutex->unlock(); + + return dirty; +} +void CanvasItemMaterial::set_blend_mode(BlendMode p_blend_mode) { + + blend_mode = p_blend_mode; + _queue_shader_change(); +} + +CanvasItemMaterial::BlendMode CanvasItemMaterial::get_blend_mode() const { + return blend_mode; +} + +void CanvasItemMaterial::set_light_mode(LightMode p_light_mode) { + + light_mode = p_light_mode; + _queue_shader_change(); +} + +CanvasItemMaterial::LightMode CanvasItemMaterial::get_light_mode() const { + + return light_mode; +} + +void CanvasItemMaterial::_validate_property(PropertyInfo &property) const { +} + +void CanvasItemMaterial::_bind_methods() { + + ClassDB::bind_method(D_METHOD("set_blend_mode", "blend_mode"), &CanvasItemMaterial::set_blend_mode); + ClassDB::bind_method(D_METHOD("get_blend_mode"), &CanvasItemMaterial::get_blend_mode); + + ClassDB::bind_method(D_METHOD("set_light_mode", "light_mode"), &CanvasItemMaterial::set_light_mode); + ClassDB::bind_method(D_METHOD("get_light_mode"), &CanvasItemMaterial::get_light_mode); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "blend_mode", PROPERTY_HINT_ENUM, "Mix,Add,Sub,Mul,Premult Alpha"), "set_blend_mode", "get_blend_mode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "light_mode", PROPERTY_HINT_ENUM, "Normal,Unshaded,Light Only"), "set_light_mode", "get_light_mode"); + + BIND_CONSTANT(BLEND_MODE_MIX); + BIND_CONSTANT(BLEND_MODE_ADD); + BIND_CONSTANT(BLEND_MODE_SUB); + BIND_CONSTANT(BLEND_MODE_MUL); + BIND_CONSTANT(BLEND_MODE_PREMULT_ALPHA); + BIND_CONSTANT(LIGHT_MODE_NORMAL); + BIND_CONSTANT(LIGHT_MODE_UNSHADED); + BIND_CONSTANT(LIGHT_MODE_LIGHT_ONLY); +} + +CanvasItemMaterial::CanvasItemMaterial() + : element(this) { + + blend_mode = BLEND_MODE_MIX; + light_mode = LIGHT_MODE_NORMAL; + + current_key.key = 0; + current_key.invalid_key = 1; + _queue_shader_change(); +} + +CanvasItemMaterial::~CanvasItemMaterial() { + + if (material_mutex) + material_mutex->lock(); + + if (shader_map.has(current_key)) { + shader_map[current_key].users--; + if (shader_map[current_key].users == 0) { + //deallocate shader, as it's no longer in use + VS::get_singleton()->free(shader_map[current_key].shader); + shader_map.erase(current_key); + } + + VS::get_singleton()->material_set_shader(_get_material(), RID()); + } + + if (material_mutex) + material_mutex->unlock(); +} + /////////////////////////////////////////////////////////////////// bool CanvasItem::is_visible_in_tree() const { @@ -177,7 +367,9 @@ Transform2D CanvasItem::get_global_transform_with_canvas() const { } Transform2D CanvasItem::get_global_transform() const { - +#ifdef DEBUG_ENABLED + ERR_FAIL_COND_V(!is_inside_tree(), get_transform()); +#endif if (global_invalid) { const CanvasItem *pi = get_parent_item(); @@ -417,14 +609,22 @@ void CanvasItem::draw_line(const Point2 &p_from, const Point2 &p_to, const Color VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_from, p_to, p_color, p_width, p_antialiased); } -void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color) { +void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled) { if (!drawing) { ERR_EXPLAIN("Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL(); } - VisualServer::get_singleton()->canvas_item_add_rect(canvas_item, p_rect, p_color); + if (p_filled) { + + VisualServer::get_singleton()->canvas_item_add_rect(canvas_item, p_rect, p_color); + } else { + VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position, p_rect.position + Size2(p_rect.size.width, 0), p_color); + VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position, p_rect.position + Size2(0, p_rect.size.height), p_color); + VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position + Point2(0, p_rect.size.height), p_rect.position + p_rect.size, p_color); + VisualServer::get_singleton()->canvas_item_add_line(canvas_item, p_rect.position + Point2(p_rect.size.width, 0), p_rect.position + p_rect.size, p_color); + } } void CanvasItem::draw_circle(const Point2 &p_pos, float p_radius, const Color &p_color) { @@ -567,8 +767,9 @@ float CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const void CanvasItem::_notify_transform(CanvasItem *p_node) { - if (/*p_node->xform_change.in_list() &&*/ p_node->global_invalid) + if (/*p_node->xform_change.in_list() &&*/ p_node->global_invalid) { return; //nothing to do + } p_node->global_invalid = true; @@ -657,7 +858,7 @@ bool CanvasItem::is_draw_behind_parent_enabled() const { return behind; } -void CanvasItem::set_material(const Ref<ShaderMaterial> &p_material) { +void CanvasItem::set_material(const Ref<Material> &p_material) { material = p_material; RID rid; @@ -678,7 +879,7 @@ bool CanvasItem::get_use_parent_material() const { return use_parent_material; } -Ref<ShaderMaterial> CanvasItem::get_material() const { +Ref<Material> CanvasItem::get_material() const { return material; } @@ -754,7 +955,7 @@ void CanvasItem::_bind_methods() { //ClassDB::bind_method(D_METHOD("get_transform"),&CanvasItem::get_transform); ClassDB::bind_method(D_METHOD("draw_line", "from", "to", "color", "width", "antialiased"), &CanvasItem::draw_line, DEFVAL(1.0), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color"), &CanvasItem::draw_rect); + ClassDB::bind_method(D_METHOD("draw_rect", "rect", "color", "filled"), &CanvasItem::draw_rect, DEFVAL(true)); ClassDB::bind_method(D_METHOD("draw_circle", "pos", "radius", "color"), &CanvasItem::draw_circle); ClassDB::bind_method(D_METHOD("draw_texture", "texture:Texture", "pos", "modulate", "normal_map:Texture"), &CanvasItem::draw_texture, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("draw_texture_rect", "texture:Texture", "rect", "tile", "modulate", "transpose", "normal_map:Texture"), &CanvasItem::draw_texture_rect, DEFVAL(Color(1, 1, 1)), DEFVAL(false), DEFVAL(Variant())); @@ -780,8 +981,8 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("get_world_2d"), &CanvasItem::get_world_2d); //ClassDB::bind_method(D_METHOD("get_viewport"),&CanvasItem::get_viewport); - ClassDB::bind_method(D_METHOD("set_material", "material:ShaderMaterial"), &CanvasItem::set_material); - ClassDB::bind_method(D_METHOD("get_material:ShaderMaterial"), &CanvasItem::get_material); + ClassDB::bind_method(D_METHOD("set_material", "material:Material"), &CanvasItem::set_material); + ClassDB::bind_method(D_METHOD("get_material:Material"), &CanvasItem::get_material); ClassDB::bind_method(D_METHOD("set_use_parent_material", "enable"), &CanvasItem::set_use_parent_material); ClassDB::bind_method(D_METHOD("get_use_parent_material"), &CanvasItem::get_use_parent_material); @@ -807,7 +1008,7 @@ void CanvasItem::_bind_methods() { ADD_PROPERTYNO(PropertyInfo(Variant::INT, "light_mask", PROPERTY_HINT_LAYERS_2D_RENDER), "set_light_mask", "get_light_mask"); ADD_GROUP("Material", ""); - ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial"), "set_material", "get_material"); + ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,CanvasItemMaterial"), "set_material", "get_material"); ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "use_parent_material"), "set_use_parent_material", "get_use_parent_material"); //exporting these two things doesn't really make much sense i think //ADD_PROPERTY( PropertyInfo(Variant::BOOL,"transform/toplevel"), "set_as_toplevel","is_set_as_toplevel") ; @@ -869,7 +1070,15 @@ bool CanvasItem::is_local_transform_notification_enabled() const { } void CanvasItem::set_notify_transform(bool p_enable) { + if (notify_transform == p_enable) + return; + notify_transform = p_enable; + + if (notify_transform && is_inside_tree()) { + //this ensures that invalid globals get resolved, so notifications can be received + get_global_transform(); + } } bool CanvasItem::is_transform_notification_enabled() const { diff --git a/scene/2d/canvas_item.h b/scene/2d/canvas_item.h index 595dd03057..bffc171fc1 100644 --- a/scene/2d/canvas_item.h +++ b/scene/2d/canvas_item.h @@ -42,6 +42,92 @@ class Font; class StyleBox; +class CanvasItemMaterial : public Material { + + GDCLASS(CanvasItemMaterial, Material) + +public: + enum BlendMode { + BLEND_MODE_MIX, + BLEND_MODE_ADD, + BLEND_MODE_SUB, + BLEND_MODE_MUL, + BLEND_MODE_PREMULT_ALPHA + }; + + enum LightMode { + LIGHT_MODE_NORMAL, + LIGHT_MODE_UNSHADED, + LIGHT_MODE_LIGHT_ONLY + }; + +private: + union MaterialKey { + + struct { + uint32_t blend_mode : 4; + uint32_t light_mode : 4; + uint32_t invalid_key : 1; + }; + + uint32_t key; + + bool operator<(const MaterialKey &p_key) const { + return key < p_key.key; + } + }; + + struct ShaderData { + RID shader; + int users; + }; + + static Map<MaterialKey, ShaderData> shader_map; + + MaterialKey current_key; + + _FORCE_INLINE_ MaterialKey _compute_key() const { + + MaterialKey mk; + mk.key = 0; + mk.blend_mode = blend_mode; + mk.light_mode = light_mode; + return mk; + } + + static Mutex *material_mutex; + static SelfList<CanvasItemMaterial>::List dirty_materials; + SelfList<CanvasItemMaterial> element; + + void _update_shader(); + _FORCE_INLINE_ void _queue_shader_change(); + _FORCE_INLINE_ bool _is_shader_dirty() const; + + BlendMode blend_mode; + LightMode light_mode; + +protected: + static void _bind_methods(); + void _validate_property(PropertyInfo &property) const; + +public: + void set_blend_mode(BlendMode p_blend_mode); + BlendMode get_blend_mode() const; + + void set_light_mode(LightMode p_light_mode); + LightMode get_light_mode() const; + + static void init_shaders(); + static void finish_shaders(); + static void flush_changes(); + + CanvasItemMaterial(); + virtual ~CanvasItemMaterial(); +}; + +VARIANT_ENUM_CAST(CanvasItemMaterial::BlendMode) +VARIANT_ENUM_CAST(CanvasItemMaterial::LightMode) + class CanvasItem : public Node { GDCLASS(CanvasItem, Node); @@ -83,7 +169,7 @@ private: bool notify_local_transform; bool notify_transform; - Ref<ShaderMaterial> material; + Ref<Material> material; mutable Transform2D global_transform; mutable bool global_invalid; @@ -156,7 +242,7 @@ public: /* DRAWING API */ void draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width = 1.0, bool p_antialiased = false); - void draw_rect(const Rect2 &p_rect, const Color &p_color); + void draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled = true); void draw_circle(const Point2 &p_pos, float p_radius, const Color &p_color); void draw_texture(const Ref<Texture> &p_texture, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1, 1), const Ref<Texture> &p_normal_map = Ref<Texture>()); void draw_texture_rect(const Ref<Texture> &p_texture, const Rect2 &p_rect, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, const Ref<Texture> &p_normal_map = Ref<Texture>()); @@ -203,8 +289,8 @@ public: RID get_canvas() const; Ref<World2D> get_world_2d() const; - void set_material(const Ref<ShaderMaterial> &p_material); - Ref<ShaderMaterial> get_material() const; + void set_material(const Ref<Material> &p_material); + Ref<Material> get_material() const; void set_use_parent_material(bool p_use_parent_material); bool get_use_parent_material() const; diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index caf9cf201a..c5c274e225 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -31,18 +31,6 @@ #include "scene/scene_string_names.h" #include "servers/physics_2d_server.h" -void CollisionObject2D::_update_shapes_from_children() { - - shapes.clear(); - for (int i = 0; i < get_child_count(); i++) { - - Node *n = get_child(i); - n->call("_add_to_collision_object", this); - } - - _update_shapes(); -} - void CollisionObject2D::_notification(int p_what) { switch (p_what) { @@ -88,82 +76,197 @@ void CollisionObject2D::_notification(int p_what) { } } -void CollisionObject2D::_update_shapes() { +uint32_t CollisionObject2D::create_shape_owner(Object *p_owner) { - if (!rid.is_valid()) - return; + ShapeData sd; + uint32_t id; + + if (shapes.size() == 0) { + id = 1; + } else { + id = shapes.back()->key() + 1; + } + + sd.owner = p_owner; + + shapes[id] = sd; + + return id; +} + +void CollisionObject2D::remove_shape_owner(uint32_t owner) { + + ERR_FAIL_COND(!shapes.has(owner)); + + shape_owner_clear_shapes(owner); + + shapes.erase(owner); +} + +void CollisionObject2D::shape_owner_set_disabled(uint32_t p_owner, bool p_disabled) { + ERR_FAIL_COND(!shapes.has(p_owner)); + + ShapeData &sd = shapes[p_owner]; + sd.disabled = p_disabled; + for (int i = 0; i < sd.shapes.size(); i++) { + if (area) { + Physics2DServer::get_singleton()->area_set_shape_disabled(rid, sd.shapes[i].index, p_disabled); + } else { + Physics2DServer::get_singleton()->body_set_shape_disabled(rid, sd.shapes[i].index, p_disabled); + } + } +} + +bool CollisionObject2D::is_shape_owner_disabled(uint32_t p_owner) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), false); + + return shapes[p_owner].disabled; +} + +void CollisionObject2D::shape_owner_set_one_way_collision(uint32_t p_owner, bool p_enable) { if (area) - Physics2DServer::get_singleton()->area_clear_shapes(rid); - else - Physics2DServer::get_singleton()->body_clear_shapes(rid); - - for (int i = 0; i < shapes.size(); i++) { - - if (shapes[i].shape.is_null()) - continue; - if (area) - Physics2DServer::get_singleton()->area_add_shape(rid, shapes[i].shape->get_rid(), shapes[i].xform); - else { - Physics2DServer::get_singleton()->body_add_shape(rid, shapes[i].shape->get_rid(), shapes[i].xform); - if (shapes[i].trigger) - Physics2DServer::get_singleton()->body_set_shape_as_trigger(rid, i, shapes[i].trigger); + return; //not for areas + + ERR_FAIL_COND(!shapes.has(p_owner)); + + ShapeData &sd = shapes[p_owner]; + sd.one_way_collision = p_enable; + for (int i = 0; i < sd.shapes.size(); i++) { + Physics2DServer::get_singleton()->body_set_shape_as_one_way_collision(rid, sd.shapes[i].index, p_enable); + } +} + +bool CollisionObject2D::is_shape_owner_one_way_collision_enabled(uint32_t p_owner) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), false); + + return shapes[p_owner].one_way_collision; +} + +void CollisionObject2D::get_shape_owners(List<uint32_t> *r_owners) { + + for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { + r_owners->push_back(E->key()); + } +} + +void CollisionObject2D::shape_owner_set_transform(uint32_t p_owner, const Transform2D &p_transform) { + + ERR_FAIL_COND(!shapes.has(p_owner)); + + ShapeData &sd = shapes[p_owner]; + sd.xform = p_transform; + for (int i = 0; i < sd.shapes.size(); i++) { + if (area) { + Physics2DServer::get_singleton()->area_set_shape_transform(rid, sd.shapes[i].index, p_transform); + } else { + Physics2DServer::get_singleton()->body_set_shape_transform(rid, sd.shapes[i].index, p_transform); } } } +Transform2D CollisionObject2D::shape_owner_get_transform(uint32_t p_owner) const { -bool CollisionObject2D::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; + ERR_FAIL_COND_V(!shapes.has(p_owner), Transform2D()); - if (name.begins_with("shapes/")) { + return shapes[p_owner].xform; +} - int idx = name.get_slicec('/', 1).to_int(); - String what = name.get_slicec('/', 2); - if (what == "shape") { - if (idx >= shapes.size()) - add_shape(RefPtr(p_value)); - else - set_shape(idx, RefPtr(p_value)); - } else if (what == "transform") - set_shape_transform(idx, p_value); - else if (what == "trigger") - set_shape_as_trigger(idx, p_value); - } else - return false; - - return true; +Object *CollisionObject2D::shape_owner_get_owner(uint32_t p_owner) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), NULL); + + return shapes[p_owner].owner; +} + +void CollisionObject2D::shape_owner_add_shape(uint32_t p_owner, const Ref<Shape2D> &p_shape) { + + ERR_FAIL_COND(!shapes.has(p_owner)); + ERR_FAIL_COND(p_shape.is_null()); + + ShapeData &sd = shapes[p_owner]; + ShapeData::Shape s; + s.index = total_subshapes; + s.shape = p_shape; + if (area) { + Physics2DServer::get_singleton()->area_add_shape(rid, p_shape->get_rid(), sd.xform); + } else { + Physics2DServer::get_singleton()->body_add_shape(rid, p_shape->get_rid(), sd.xform); + } + sd.shapes.push_back(s); + + total_subshapes++; +} +int CollisionObject2D::shape_owner_get_shape_count(uint32_t p_owner) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), 0); + + return shapes[p_owner].shapes.size(); +} +Ref<Shape> CollisionObject2D::shape_owner_get_shape(uint32_t p_owner, int p_shape) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), Ref<Shape>()); + ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), Ref<Shape>()); + + return shapes[p_owner].shapes[p_shape].shape; +} +int CollisionObject2D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const { + + ERR_FAIL_COND_V(!shapes.has(p_owner), -1); + ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), -1); + + return shapes[p_owner].shapes[p_shape].index; } -bool CollisionObject2D::_get(const StringName &p_name, Variant &r_ret) const { +void CollisionObject2D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) { + + ERR_FAIL_COND(!shapes.has(p_owner)); + ERR_FAIL_INDEX(p_shape, shapes[p_owner].shapes.size()); + + int index_to_remove = shapes[p_owner].shapes[p_shape].index; + if (area) { + Physics2DServer::get_singleton()->area_remove_shape(rid, index_to_remove); + } else { + Physics2DServer::get_singleton()->body_remove_shape(rid, index_to_remove); + } + + shapes[p_owner].shapes.remove(p_shape); + + for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { + for (int i = 0; i < E->get().shapes.size(); i++) { + if (E->get().shapes[i].index > index_to_remove) { + E->get().shapes[i].index -= 1; + } + } + } - String name = p_name; + total_subshapes--; +} - if (name.begins_with("shapes/")) { +void CollisionObject2D::shape_owner_clear_shapes(uint32_t p_owner) { - int idx = name.get_slicec('/', 1).to_int(); - String what = name.get_slicec('/', 2); - if (what == "shape") - r_ret = get_shape(idx); - else if (what == "transform") - r_ret = get_shape_transform(idx); - else if (what == "trigger") - r_ret = is_shape_set_as_trigger(idx); - } else - return false; + ERR_FAIL_COND(!shapes.has(p_owner)); - return true; + while (shape_owner_get_shape_count(p_owner) > 0) { + shape_owner_remove_shape(p_owner, 0); + } } -void CollisionObject2D::_get_property_list(List<PropertyInfo> *p_list) const { +uint32_t CollisionObject2D::shape_find_owner(int p_shape_index) const { - //p_list->push_back( PropertyInfo(Variant::INT,"shape_count",PROPERTY_HINT_RANGE,"0,256,1",PROPERTY_USAGE_NOEDITOR|PROPERTY_USAGE_NO_INSTANCE_STATE) ); + ERR_FAIL_INDEX_V(p_shape_index, total_subshapes, 0); - for (int i = 0; i < shapes.size(); i++) { - String path = "shapes/" + itos(i) + "/"; - p_list->push_back(PropertyInfo(Variant::OBJECT, path + "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape2D", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_NO_INSTANCE_STATE)); - p_list->push_back(PropertyInfo(Variant::TRANSFORM, path + "transform", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_NO_INSTANCE_STATE)); - p_list->push_back(PropertyInfo(Variant::BOOL, path + "trigger", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_NO_INSTANCE_STATE)); + for (const Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { + for (int i = 0; i < E->get().shapes.size(); i++) { + if (E->get().shapes[i].index == p_shape_index) { + return E->key(); + } + } } + + //in theory it should be unreachable + return 0; } void CollisionObject2D::set_pickable(bool p_enabled) { @@ -216,16 +319,6 @@ void CollisionObject2D::_update_pickable() { void CollisionObject2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_shape", "shape:Shape2D", "transform"), &CollisionObject2D::add_shape, DEFVAL(Transform2D())); - ClassDB::bind_method(D_METHOD("get_shape_count"), &CollisionObject2D::get_shape_count); - ClassDB::bind_method(D_METHOD("set_shape", "shape_idx", "shape:Shape"), &CollisionObject2D::set_shape); - ClassDB::bind_method(D_METHOD("set_shape_transform", "shape_idx", "transform"), &CollisionObject2D::set_shape_transform); - ClassDB::bind_method(D_METHOD("set_shape_as_trigger", "shape_idx", "enable"), &CollisionObject2D::set_shape_as_trigger); - ClassDB::bind_method(D_METHOD("get_shape:Shape2D", "shape_idx"), &CollisionObject2D::get_shape); - ClassDB::bind_method(D_METHOD("get_shape_transform", "shape_idx"), &CollisionObject2D::get_shape_transform); - ClassDB::bind_method(D_METHOD("is_shape_set_as_trigger", "shape_idx"), &CollisionObject2D::is_shape_set_as_trigger); - ClassDB::bind_method(D_METHOD("remove_shape", "shape_idx"), &CollisionObject2D::remove_shape); - ClassDB::bind_method(D_METHOD("clear_shapes"), &CollisionObject2D::clear_shapes); ClassDB::bind_method(D_METHOD("get_rid"), &CollisionObject2D::get_rid); ClassDB::bind_method(D_METHOD("set_pickable", "enabled"), &CollisionObject2D::set_pickable); @@ -242,100 +335,13 @@ void CollisionObject2D::_bind_methods() { ADD_GROUP("", ""); } -void CollisionObject2D::add_shape(const Ref<Shape2D> &p_shape, const Transform2D &p_transform) { - - ERR_FAIL_COND(p_shape.is_null()); - - ShapeData sdata; - sdata.shape = p_shape; - sdata.xform = p_transform; - sdata.trigger = false; - - if (area) - Physics2DServer::get_singleton()->area_add_shape(get_rid(), p_shape->get_rid(), p_transform); - else - Physics2DServer::get_singleton()->body_add_shape(get_rid(), p_shape->get_rid(), p_transform); - - shapes.push_back(sdata); -} -int CollisionObject2D::get_shape_count() const { - - return shapes.size(); -} -void CollisionObject2D::set_shape(int p_shape_idx, const Ref<Shape2D> &p_shape) { - - ERR_FAIL_INDEX(p_shape_idx, shapes.size()); - ERR_FAIL_COND(p_shape.is_null()); - - shapes[p_shape_idx].shape = p_shape; - if (area) - Physics2DServer::get_singleton()->area_set_shape(get_rid(), p_shape_idx, p_shape->get_rid()); - else - Physics2DServer::get_singleton()->body_set_shape(get_rid(), p_shape_idx, p_shape->get_rid()); - - //_update_shapes(); -} - -void CollisionObject2D::set_shape_transform(int p_shape_idx, const Transform2D &p_transform) { - - ERR_FAIL_INDEX(p_shape_idx, shapes.size()); - shapes[p_shape_idx].xform = p_transform; - - if (area) - Physics2DServer::get_singleton()->area_set_shape_transform(get_rid(), p_shape_idx, p_transform); - else - Physics2DServer::get_singleton()->body_set_shape_transform(get_rid(), p_shape_idx, p_transform); - - //_update_shapes(); -} - -Ref<Shape2D> CollisionObject2D::get_shape(int p_shape_idx) const { - - ERR_FAIL_INDEX_V(p_shape_idx, shapes.size(), Ref<Shape2D>()); - return shapes[p_shape_idx].shape; -} -Transform2D CollisionObject2D::get_shape_transform(int p_shape_idx) const { - - ERR_FAIL_INDEX_V(p_shape_idx, shapes.size(), Transform2D()); - return shapes[p_shape_idx].xform; -} -void CollisionObject2D::remove_shape(int p_shape_idx) { - - ERR_FAIL_INDEX(p_shape_idx, shapes.size()); - shapes.remove(p_shape_idx); - - _update_shapes(); -} - -void CollisionObject2D::set_shape_as_trigger(int p_shape_idx, bool p_trigger) { - - ERR_FAIL_INDEX(p_shape_idx, shapes.size()); - shapes[p_shape_idx].trigger = p_trigger; - if (!area && rid.is_valid()) { - - Physics2DServer::get_singleton()->body_set_shape_as_trigger(rid, p_shape_idx, p_trigger); - } -} - -bool CollisionObject2D::is_shape_set_as_trigger(int p_shape_idx) const { - - ERR_FAIL_INDEX_V(p_shape_idx, shapes.size(), false); - return shapes[p_shape_idx].trigger; -} - -void CollisionObject2D::clear_shapes() { - - shapes.clear(); - - _update_shapes(); -} - CollisionObject2D::CollisionObject2D(RID p_rid, bool p_area) { rid = p_rid; area = p_area; pickable = true; set_notify_transform(true); + total_subshapes = 0; if (p_area) { @@ -348,6 +354,7 @@ CollisionObject2D::CollisionObject2D(RID p_rid, bool p_area) { CollisionObject2D::CollisionObject2D() { //owner= + set_notify_transform(true); } diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h index 4d4611afd1..deffe8a002 100644 --- a/scene/2d/collision_object_2d.h +++ b/scene/2d/collision_object_2d.h @@ -35,37 +35,40 @@ class CollisionObject2D : public Node2D { - GDCLASS(CollisionObject2D, Node2D); + GDCLASS(CollisionObject2D, Node2D) bool area; RID rid; bool pickable; struct ShapeData { + + Object *owner; Transform2D xform; - Ref<Shape2D> shape; - bool trigger; + struct Shape { + Ref<Shape2D> shape; + int index; + }; + + Vector<Shape> shapes; + bool disabled; + bool one_way_collision; ShapeData() { - trigger = false; + disabled = false; + one_way_collision = false; + owner = NULL; } }; - Vector<ShapeData> shapes; - - void _update_shapes(); + int total_subshapes; - friend class CollisionShape2D; - friend class CollisionPolygon2D; - void _update_shapes_from_children(); + Map<uint32_t, ShapeData> shapes; protected: CollisionObject2D(RID p_rid, bool p_area); void _notification(int p_what); - bool _set(const StringName &p_name, const Variant &p_value); - bool _get(const StringName &p_name, Variant &r_ret) const; - void _get_property_list(List<PropertyInfo> *p_list) const; static void _bind_methods(); void _update_pickable(); @@ -75,16 +78,29 @@ protected: void _mouse_exit(); public: - void add_shape(const Ref<Shape2D> &p_shape, const Transform2D &p_transform = Transform2D()); - int get_shape_count() const; - void set_shape(int p_shape_idx, const Ref<Shape2D> &p_shape); - void set_shape_transform(int p_shape_idx, const Transform2D &p_transform); - Ref<Shape2D> get_shape(int p_shape_idx) const; - Transform2D get_shape_transform(int p_shape_idx) const; - void set_shape_as_trigger(int p_shape_idx, bool p_trigger); - bool is_shape_set_as_trigger(int p_shape_idx) const; - void remove_shape(int p_shape_idx); - void clear_shapes(); + uint32_t create_shape_owner(Object *p_owner); + void remove_shape_owner(uint32_t owner); + void get_shape_owners(List<uint32_t> *r_owners); + + void shape_owner_set_transform(uint32_t p_owner, const Transform2D &p_transform); + Transform2D shape_owner_get_transform(uint32_t p_owner) const; + Object *shape_owner_get_owner(uint32_t p_owner) const; + + void shape_owner_set_disabled(uint32_t p_owner, bool p_disabled); + bool is_shape_owner_disabled(uint32_t p_owner) const; + + void shape_owner_set_one_way_collision(uint32_t p_owner, bool p_enable); + bool is_shape_owner_one_way_collision_enabled(uint32_t p_owner) const; + + void shape_owner_add_shape(uint32_t p_owner, const Ref<Shape2D> &p_shape); + int shape_owner_get_shape_count(uint32_t p_owner) const; + Ref<Shape> shape_owner_get_shape(uint32_t p_owner, int p_shape) const; + int shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const; + + void shape_owner_remove_shape(uint32_t p_owner, int p_shape); + void shape_owner_clear_shapes(uint32_t p_owner); + + uint32_t shape_find_owner(int p_shape_index) const; void set_pickable(bool p_enabled); bool is_pickable() const; diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index 6b603c6473..bd669eb4c8 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -35,13 +35,9 @@ #include "thirdparty/misc/triangulator.h" -void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { +void CollisionPolygon2D::_build_polygon() { - if (unparenting || !can_update_body) - return; - - CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); - ERR_FAIL_COND(!co); + parent->shape_owner_clear_shapes(owner_id); if (polygon.size() == 0) return; @@ -53,18 +49,10 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them Vector<Vector<Vector2> > decomp = _decompose_in_convex(); - shape_from = co->get_shape_count(); for (int i = 0; i < decomp.size(); i++) { Ref<ConvexPolygonShape2D> convex = memnew(ConvexPolygonShape2D); convex->set_points(decomp[i]); - co->add_shape(convex, get_transform()); - if (trigger) - co->set_shape_as_trigger(co->get_shape_count() - 1, true); - } - shape_to = co->get_shape_count() - 1; - if (shape_to < shape_from) { - shape_from = -1; - shape_to = -1; + parent->shape_owner_add_shape(owner_id, convex); } } else { @@ -83,28 +71,8 @@ void CollisionPolygon2D::_add_to_collision_object(Object *p_obj) { w = PoolVector<Vector2>::Write(); concave->set_segments(segments); - co->add_shape(concave, get_transform()); - if (trigger) - co->set_shape_as_trigger(co->get_shape_count() - 1, true); - - shape_from = co->get_shape_count() - 1; - shape_to = co->get_shape_count() - 1; + parent->shape_owner_add_shape(owner_id, concave); } - - //co->add_shape(shape,get_transform()); -} - -void CollisionPolygon2D::_update_parent() { - - if (!can_update_body) - return; - Node *parent = get_parent(); - if (!parent) - return; - CollisionObject2D *co = parent->cast_to<CollisionObject2D>(); - if (!co) - return; - co->_update_shapes_from_children(); } Vector<Vector<Vector2> > CollisionPolygon2D::_decompose_in_convex() { @@ -155,33 +123,38 @@ Vector<Vector<Vector2> > CollisionPolygon2D::_decompose_in_convex() { void CollisionPolygon2D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - unparenting = false; - can_update_body = get_tree()->is_editor_hint(); - if (!get_tree()->is_editor_hint()) { + case NOTIFICATION_PARENTED: { + + parent = get_parent()->cast_to<CollisionObject2D>(); + if (parent) { + owner_id = parent->create_shape_owner(this); + _build_polygon(); + parent->shape_owner_set_transform(owner_id, get_transform()); + parent->shape_owner_set_disabled(owner_id, disabled); + parent->shape_owner_set_one_way_collision(owner_id, one_way_collision); + } + + /*if (get_tree()->is_editor_hint()) { //display above all else set_z_as_relative(false); set_z(VS::CANVAS_ITEM_Z_MAX - 1); - } + }*/ } break; - case NOTIFICATION_EXIT_TREE: { - can_update_body = false; - } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (!is_inside_tree()) - break; - if (can_update_body) { - _update_parent(); - } else if (shape_from >= 0 && shape_to >= 0) { - CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); - for (int i = shape_from; i <= shape_to; i++) { - co->set_shape_transform(i, get_transform()); - } + if (parent) { + parent->shape_owner_set_transform(owner_id, get_transform()); } } break; + case NOTIFICATION_UNPARENTED: { + if (parent) { + parent->remove_shape_owner(owner_id); + } + owner_id = 0; + parent = NULL; + } break; case NOTIFICATION_DRAW: { @@ -210,10 +183,22 @@ void CollisionPolygon2D::_notification(int p_what) { draw_colored_polygon(polygon, get_tree()->get_debug_collisions_color()); #endif - } break; - case NOTIFICATION_UNPARENTED: { - unparenting = true; - _update_parent(); + if (one_way_collision) { + Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); + dcol.a = 1.0; + Vector2 line_to(0, 20); + draw_line(Vector2(), line_to, dcol, 3); + Vector<Vector2> pts; + float tsize = 8; + pts.push_back(line_to + (Vector2(0, tsize))); + pts.push_back(line_to + (Vector2(0.707 * tsize, 0))); + pts.push_back(line_to + (Vector2(-0.707 * tsize, 0))); + Vector<Color> cols; + for (int i = 0; i < 3; i++) + cols.push_back(dcol); + + draw_primitive(pts, cols, Vector<Vector2>()); //small arrow + } } break; } } @@ -222,7 +207,7 @@ void CollisionPolygon2D::set_polygon(const Vector<Point2> &p_polygon) { polygon = p_polygon; - if (can_update_body) { + { for (int i = 0; i < polygon.size(); i++) { if (i == 0) aabb = Rect2(polygon[i], Size2()); @@ -236,7 +221,10 @@ void CollisionPolygon2D::set_polygon(const Vector<Point2> &p_polygon) { aabb.position -= aabb.size * 0.3; aabb.size += aabb.size * 0.6; } - _update_parent(); + } + + if (parent) { + _build_polygon(); } update(); update_configuration_warning(); @@ -251,7 +239,9 @@ void CollisionPolygon2D::set_build_mode(BuildMode p_mode) { ERR_FAIL_INDEX(p_mode, 2); build_mode = p_mode; - _update_parent(); + if (parent) { + _build_polygon(); + } } CollisionPolygon2D::BuildMode CollisionPolygon2D::get_build_mode() const { @@ -264,79 +254,69 @@ Rect2 CollisionPolygon2D::get_item_rect() const { return aabb; } -void CollisionPolygon2D::set_trigger(bool p_trigger) { +String CollisionPolygon2D::get_configuration_warning() const { - trigger = p_trigger; - _update_parent(); - if (!can_update_body && is_inside_tree() && shape_from >= 0 && shape_to >= 0) { - CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); - for (int i = shape_from; i <= shape_to; i++) { - co->set_shape_as_trigger(i, p_trigger); - } + if (!get_parent()->cast_to<CollisionObject2D>()) { + return TTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } -} -bool CollisionPolygon2D::is_trigger() const { + if (polygon.empty()) { + return TTR("An empty CollisionPolygon2D has no effect on collision."); + } - return trigger; + return String(); } -void CollisionPolygon2D::_set_shape_range(const Vector2 &p_range) { - - shape_from = p_range.x; - shape_to = p_range.y; +void CollisionPolygon2D::set_disabled(bool p_disabled) { + disabled = p_disabled; + update(); + if (parent) { + parent->shape_owner_set_disabled(owner_id, p_disabled); + } } -Vector2 CollisionPolygon2D::_get_shape_range() const { - - return Vector2(shape_from, shape_to); +bool CollisionPolygon2D::is_disabled() const { + return disabled; } -String CollisionPolygon2D::get_configuration_warning() const { - - if (!get_parent()->cast_to<CollisionObject2D>()) { - return TTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); +void CollisionPolygon2D::set_one_way_collision(bool p_enable) { + one_way_collision = p_enable; + update(); + if (parent) { + parent->shape_owner_set_one_way_collision(owner_id, p_enable); } +} - if (polygon.empty()) { - return TTR("An empty CollisionPolygon2D has no effect on collision."); - } +bool CollisionPolygon2D::is_one_way_collision_enabled() const { - return String(); + return one_way_collision; } void CollisionPolygon2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("_add_to_collision_object"), &CollisionPolygon2D::_add_to_collision_object); ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &CollisionPolygon2D::set_polygon); ClassDB::bind_method(D_METHOD("get_polygon"), &CollisionPolygon2D::get_polygon); ClassDB::bind_method(D_METHOD("set_build_mode", "build_mode"), &CollisionPolygon2D::set_build_mode); ClassDB::bind_method(D_METHOD("get_build_mode"), &CollisionPolygon2D::get_build_mode); - - ClassDB::bind_method(D_METHOD("set_trigger", "trigger"), &CollisionPolygon2D::set_trigger); - ClassDB::bind_method(D_METHOD("is_trigger"), &CollisionPolygon2D::is_trigger); - - ClassDB::bind_method(D_METHOD("_set_shape_range", "shape_range"), &CollisionPolygon2D::_set_shape_range); - ClassDB::bind_method(D_METHOD("_get_shape_range"), &CollisionPolygon2D::_get_shape_range); - - ClassDB::bind_method(D_METHOD("get_collision_object_first_shape"), &CollisionPolygon2D::get_collision_object_first_shape); - ClassDB::bind_method(D_METHOD("get_collision_object_last_shape"), &CollisionPolygon2D::get_collision_object_last_shape); + ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionPolygon2D::set_disabled); + ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionPolygon2D::is_disabled); + ClassDB::bind_method(D_METHOD("set_one_way_collision", "enabled"), &CollisionPolygon2D::set_one_way_collision); + ClassDB::bind_method(D_METHOD("is_one_way_collision_enabled"), &CollisionPolygon2D::is_one_way_collision_enabled); ADD_PROPERTY(PropertyInfo(Variant::INT, "build_mode", PROPERTY_HINT_ENUM, "Solids,Segments"), "set_build_mode", "get_build_mode"); ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "polygon"), "set_polygon", "get_polygon"); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "shape_range", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_shape_range", "_get_shape_range"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "trigger"), "set_trigger", "is_trigger"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "one_way_collision"), "set_one_way_collision", "is_one_way_collision_enabled"); } CollisionPolygon2D::CollisionPolygon2D() { aabb = Rect2(-10, -10, 20, 20); build_mode = BUILD_SOLIDS; - trigger = false; - unparenting = false; - shape_from = -1; - shape_to = -1; - can_update_body = false; set_notify_local_transform(true); + parent = NULL; + owner_id = 0; + disabled = false; + one_way_collision = false; } diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h index b1a4a4822d..f0666ba9de 100644 --- a/scene/2d/collision_polygon_2d.h +++ b/scene/2d/collision_polygon_2d.h @@ -33,6 +33,8 @@ #include "scene/2d/node_2d.h" #include "scene/resources/shape_2d.h" +class CollisionObject2D; + class CollisionPolygon2D : public Node2D { GDCLASS(CollisionPolygon2D, Node2D); @@ -47,29 +49,20 @@ protected: Rect2 aabb; BuildMode build_mode; Vector<Point2> polygon; - bool trigger; - bool unparenting; - - void _add_to_collision_object(Object *p_obj); - void _update_parent(); - - bool can_update_body; - int shape_from; - int shape_to; - - void _set_shape_range(const Vector2 &p_range); - Vector2 _get_shape_range() const; + uint32_t owner_id; + CollisionObject2D *parent; + bool disabled; + bool one_way_collision; Vector<Vector<Vector2> > _decompose_in_convex(); + void _build_polygon(); + protected: void _notification(int p_what); static void _bind_methods(); public: - void set_trigger(bool p_trigger); - bool is_trigger() const; - void set_build_mode(BuildMode p_mode); BuildMode get_build_mode() const; @@ -78,11 +71,14 @@ public: virtual Rect2 get_item_rect() const; - int get_collision_object_first_shape() const { return shape_from; } - int get_collision_object_last_shape() const { return shape_to; } - virtual String get_configuration_warning() const; + void set_disabled(bool p_disabled); + bool is_disabled() const; + + void set_one_way_collision(bool p_enable); + bool is_one_way_collision_enabled() const; + CollisionPolygon2D(); }; diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index 1687a898db..ff4aa245ec 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -37,68 +37,48 @@ #include "scene/resources/segment_shape_2d.h" #include "scene/resources/shape_line_2d.h" -void CollisionShape2D::_add_to_collision_object(Object *p_obj) { - - if (unparenting) - return; - - CollisionObject2D *co = p_obj->cast_to<CollisionObject2D>(); - ERR_FAIL_COND(!co); - update_shape_index = co->get_shape_count(); - co->add_shape(shape, get_transform()); - if (trigger) - co->set_shape_as_trigger(co->get_shape_count() - 1, true); -} - void CollisionShape2D::_shape_changed() { update(); - _update_parent(); -} - -void CollisionShape2D::_update_parent() { - - Node *parent = get_parent(); - if (!parent) - return; - CollisionObject2D *co = parent->cast_to<CollisionObject2D>(); - if (!co) - return; - co->_update_shapes_from_children(); } void CollisionShape2D::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - unparenting = false; - can_update_body = get_tree()->is_editor_hint(); - if (!get_tree()->is_editor_hint()) { + case NOTIFICATION_PARENTED: { + + parent = get_parent()->cast_to<CollisionObject2D>(); + if (parent) { + owner_id = parent->create_shape_owner(this); + if (shape.is_valid()) { + parent->shape_owner_add_shape(owner_id, shape); + } + parent->shape_owner_set_transform(owner_id, get_transform()); + parent->shape_owner_set_disabled(owner_id, disabled); + parent->shape_owner_set_one_way_collision(owner_id, one_way_collision); + } + + /*if (get_tree()->is_editor_hint()) { //display above all else set_z_as_relative(false); set_z(VS::CANVAS_ITEM_Z_MAX - 1); - } + }*/ } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (!is_inside_tree()) - break; - if (can_update_body) { - _update_parent(); - } else if (update_shape_index >= 0) { - - CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); - if (co) { - co->set_shape_transform(update_shape_index, get_transform()); - } + if (parent) { + parent->shape_owner_set_transform(owner_id, get_transform()); } } break; - case NOTIFICATION_EXIT_TREE: { - can_update_body = false; - + case NOTIFICATION_UNPARENTED: { + if (parent) { + parent->remove_shape_owner(owner_id); + } + owner_id = 0; + parent = NULL; } break; /* case NOTIFICATION_TRANSFORM_CHANGED: { @@ -121,15 +101,33 @@ void CollisionShape2D::_notification(int p_what) { rect = Rect2(); Color draw_col = get_tree()->get_debug_collisions_color(); + if (disabled) { + float g = draw_col.gray(); + draw_col.r = g; + draw_col.g = g; + draw_col.b = g; + } shape->draw(get_canvas_item(), draw_col); rect = shape->get_rect(); rect = rect.grow(3); - } break; - case NOTIFICATION_UNPARENTED: { - unparenting = true; - _update_parent(); + if (one_way_collision) { + Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4); + dcol.a = 1.0; + Vector2 line_to(0, 20); + draw_line(Vector2(), line_to, dcol, 3); + Vector<Vector2> pts; + float tsize = 8; + pts.push_back(line_to + (Vector2(0, tsize))); + pts.push_back(line_to + (Vector2(0.707 * tsize, 0))); + pts.push_back(line_to + (Vector2(-0.707 * tsize, 0))); + Vector<Color> cols; + for (int i = 0; i < 3; i++) + cols.push_back(dcol); + + draw_primitive(pts, cols, Vector<Vector2>()); //small arrow + } } break; } } @@ -140,14 +138,13 @@ void CollisionShape2D::set_shape(const Ref<Shape2D> &p_shape) { shape->disconnect("changed", this, "_shape_changed"); shape = p_shape; update(); - if (is_inside_tree() && can_update_body) - _update_parent(); - if (is_inside_tree() && !can_update_body && update_shape_index >= 0) { - CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); - if (co) { - co->set_shape(update_shape_index, p_shape); + if (parent) { + parent->shape_owner_clear_shapes(owner_id); + if (shape.is_valid()) { + parent->shape_owner_add_shape(owner_id, shape); } } + if (shape.is_valid()) shape->connect("changed", this, "_shape_changed"); @@ -164,72 +161,65 @@ Rect2 CollisionShape2D::get_item_rect() const { return rect; } -void CollisionShape2D::set_trigger(bool p_trigger) { +String CollisionShape2D::get_configuration_warning() const { - trigger = p_trigger; - if (can_update_body) { - _update_parent(); - } else if (is_inside_tree() && update_shape_index >= 0) { - CollisionObject2D *co = get_parent()->cast_to<CollisionObject2D>(); - if (co) { - co->set_shape_as_trigger(update_shape_index, p_trigger); - } + if (!get_parent()->cast_to<CollisionObject2D>()) { + return TTR("CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } -} -bool CollisionShape2D::is_trigger() const { + if (!shape.is_valid()) { + return TTR("A shape must be provided for CollisionShape2D to function. Please create a shape resource for it!"); + } - return trigger; + return String(); } -void CollisionShape2D::_set_update_shape_index(int p_index) { - - update_shape_index = p_index; +void CollisionShape2D::set_disabled(bool p_disabled) { + disabled = p_disabled; + update(); + if (parent) { + parent->shape_owner_set_disabled(owner_id, p_disabled); + } } -int CollisionShape2D::_get_update_shape_index() const { - - return update_shape_index; +bool CollisionShape2D::is_disabled() const { + return disabled; } -String CollisionShape2D::get_configuration_warning() const { - - if (!get_parent()->cast_to<CollisionObject2D>()) { - return TTR("CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); +void CollisionShape2D::set_one_way_collision(bool p_enable) { + one_way_collision = p_enable; + update(); + if (parent) { + parent->shape_owner_set_one_way_collision(owner_id, p_enable); } +} - if (!shape.is_valid()) { - return TTR("A shape must be provided for CollisionShape2D to function. Please create a shape resource for it!"); - } +bool CollisionShape2D::is_one_way_collision_enabled() const { - return String(); + return one_way_collision; } void CollisionShape2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_shape", "shape"), &CollisionShape2D::set_shape); ClassDB::bind_method(D_METHOD("get_shape"), &CollisionShape2D::get_shape); + ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionShape2D::set_disabled); + ClassDB::bind_method(D_METHOD("is_disabled"), &CollisionShape2D::is_disabled); + ClassDB::bind_method(D_METHOD("set_one_way_collision", "enabled"), &CollisionShape2D::set_one_way_collision); + ClassDB::bind_method(D_METHOD("is_one_way_collision_enabled"), &CollisionShape2D::is_one_way_collision_enabled); ClassDB::bind_method(D_METHOD("_shape_changed"), &CollisionShape2D::_shape_changed); - ClassDB::bind_method(D_METHOD("_add_to_collision_object"), &CollisionShape2D::_add_to_collision_object); - ClassDB::bind_method(D_METHOD("set_trigger", "enable"), &CollisionShape2D::set_trigger); - ClassDB::bind_method(D_METHOD("is_trigger"), &CollisionShape2D::is_trigger); - - ClassDB::bind_method(D_METHOD("_set_update_shape_index", "index"), &CollisionShape2D::_set_update_shape_index); - ClassDB::bind_method(D_METHOD("_get_update_shape_index"), &CollisionShape2D::_get_update_shape_index); - - ClassDB::bind_method(D_METHOD("get_collision_object_shape_index"), &CollisionShape2D::get_collision_object_shape_index); ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape2D"), "set_shape", "get_shape"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "trigger"), "set_trigger", "is_trigger"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "_update_shape_index", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_update_shape_index", "_get_update_shape_index"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "one_way_collision"), "set_one_way_collision", "is_one_way_collision_enabled"); } CollisionShape2D::CollisionShape2D() { rect = Rect2(-Point2(10, 10), Point2(20, 20)); set_notify_local_transform(true); - trigger = false; - unparenting = false; - can_update_body = false; - update_shape_index = -1; + owner_id = 0; + parent = NULL; + disabled = false; + one_way_collision = false; } diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h index 3e63981010..1f2b96b91f 100644 --- a/scene/2d/collision_shape_2d.h +++ b/scene/2d/collision_shape_2d.h @@ -33,35 +33,33 @@ #include "scene/2d/node_2d.h" #include "scene/resources/shape_2d.h" +class CollisionObject2D; + class CollisionShape2D : public Node2D { - GDCLASS(CollisionShape2D, Node2D); + GDCLASS(CollisionShape2D, Node2D) Ref<Shape2D> shape; Rect2 rect; - bool trigger; - bool unparenting; - bool can_update_body; + uint32_t owner_id; + CollisionObject2D *parent; void _shape_changed(); - int update_shape_index; - - void _set_update_shape_index(int p_index); - int _get_update_shape_index() const; + bool disabled; + bool one_way_collision; protected: - void _update_parent(); void _notification(int p_what); static void _bind_methods(); - void _add_to_collision_object(Object *p_obj); - public: void set_shape(const Ref<Shape2D> &p_shape); Ref<Shape2D> get_shape() const; virtual Rect2 get_item_rect() const; - void set_trigger(bool p_trigger); - bool is_trigger() const; - int get_collision_object_shape_index() const { return _get_update_shape_index(); } + void set_disabled(bool p_disabled); + bool is_disabled() const; + + void set_one_way_collision(bool p_enable); + bool is_one_way_collision_enabled() const; virtual String get_configuration_warning() const; diff --git a/scene/2d/line_2d.cpp b/scene/2d/line_2d.cpp index 1a57d24342..5438557d0b 100644 --- a/scene/2d/line_2d.cpp +++ b/scene/2d/line_2d.cpp @@ -310,12 +310,15 @@ void Line2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "points"), "set_points", "get_points"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "width"), "set_width", "get_width"); ADD_PROPERTY(PropertyInfo(Variant::COLOR, "default_color"), "set_default_color", "get_default_color"); + ADD_GROUP("Fill", ""); ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_gradient", "get_gradient"); ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "texture_mode", PROPERTY_HINT_ENUM, "None,Tile"), "set_texture_mode", "get_texture_mode"); + ADD_GROUP("Capping", ""); ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "joint_mode", PROPERTY_HINT_ENUM, "Sharp,Bevel,Round"), "set_joint_mode", "get_joint_mode"); ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "begin_cap_mode", PROPERTY_HINT_ENUM, "None,Box,Round"), "set_begin_cap_mode", "get_begin_cap_mode"); ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "end_cap_mode", PROPERTY_HINT_ENUM, "None,Box,Round"), "set_end_cap_mode", "get_end_cap_mode"); + ADD_GROUP("Border", ""); ADD_PROPERTY(PropertyInfo(Variant::REAL, "sharp_limit"), "set_sharp_limit", "get_sharp_limit"); ADD_PROPERTY(PropertyInfo(Variant::INT, "round_precision"), "set_round_precision", "get_round_precision"); diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp index 21d64c5d64..aa9258c7b4 100644 --- a/scene/2d/particles_2d.cpp +++ b/scene/2d/particles_2d.cpp @@ -28,903 +28,246 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "particles_2d.h" -#include "scene/scene_string_names.h" - -void ParticleAttractor2D::_notification(int p_what) { - - switch (p_what) { - - case NOTIFICATION_ENTER_TREE: { - - _update_owner(); - } break; - case NOTIFICATION_DRAW: { - - if (!get_tree()->is_editor_hint()) - return; - - Vector2 pv; - float dr = MIN(disable_radius, radius); - for (int i = 0; i <= 32; i++) { - Vector2 v(Math::sin(i / 32.0 * Math_PI * 2), Math::cos(i / 32.0 * Math_PI * 2)); - if (i > 0) { - draw_line(pv * radius, v * radius, Color(0, 0, 0.5, 0.9)); - if (dr > 0) { - draw_line(pv * dr, v * dr, Color(0.5, 0, 0.0, 0.9)); - } - } - pv = v; - } +#include "scene/3d/particles.h" +#include "scene/scene_string_names.h" - } break; - case NOTIFICATION_EXIT_TREE: { - if (owner) { - _set_owner(NULL); - } +void Particles2D::set_emitting(bool p_emitting) { - } break; - } + emitting = p_emitting; + VS::get_singleton()->particles_set_emitting(particles, emitting); } -void ParticleAttractor2D::_owner_exited() { +void Particles2D::set_amount(int p_amount) { - ERR_FAIL_COND(!owner); - owner->attractors.erase(this); - owner = NULL; + ERR_FAIL_COND(p_amount < 1); + amount = p_amount; + VS::get_singleton()->particles_set_amount(particles, amount); } +void Particles2D::set_lifetime(float p_lifetime) { -void ParticleAttractor2D::_update_owner() { - - if (!is_inside_tree() || !has_node(path)) { - _set_owner(NULL); - return; - } - - Node *n = get_node(path); - ERR_FAIL_COND(!n); - Particles2D *pn = n->cast_to<Particles2D>(); - if (!pn) { - _set_owner(NULL); - return; - } - - _set_owner(pn); + ERR_FAIL_COND(p_lifetime <= 0); + lifetime = p_lifetime; + VS::get_singleton()->particles_set_lifetime(particles, lifetime); } -void ParticleAttractor2D::_set_owner(Particles2D *p_owner) { - - if (owner == p_owner) - return; - - if (owner) { - owner->disconnect("tree_exited", this, "_owner_exited"); - owner->attractors.erase(this); - owner = NULL; - } - owner = p_owner; - - if (owner) { +void Particles2D::set_one_shot(bool p_enable) { - owner->connect("tree_exited", this, "_owner_exited", varray(), CONNECT_ONESHOT); - owner->attractors.insert(this); - } + one_shot = p_enable; + VS::get_singleton()->particles_set_one_shot(particles, one_shot); } +void Particles2D::set_pre_process_time(float p_time) { -void ParticleAttractor2D::_bind_methods() { - - ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &ParticleAttractor2D::set_enabled); - ClassDB::bind_method(D_METHOD("is_enabled"), &ParticleAttractor2D::is_enabled); - - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &ParticleAttractor2D::set_radius); - ClassDB::bind_method(D_METHOD("get_radius"), &ParticleAttractor2D::get_radius); - - ClassDB::bind_method(D_METHOD("set_disable_radius", "radius"), &ParticleAttractor2D::set_disable_radius); - ClassDB::bind_method(D_METHOD("get_disable_radius"), &ParticleAttractor2D::get_disable_radius); - - ClassDB::bind_method(D_METHOD("set_gravity", "gravity"), &ParticleAttractor2D::set_gravity); - ClassDB::bind_method(D_METHOD("get_gravity"), &ParticleAttractor2D::get_gravity); - - ClassDB::bind_method(D_METHOD("set_absorption", "absorption"), &ParticleAttractor2D::set_absorption); - ClassDB::bind_method(D_METHOD("get_absorption"), &ParticleAttractor2D::get_absorption); - - ClassDB::bind_method(D_METHOD("set_particles_path", "path"), &ParticleAttractor2D::set_particles_path); - ClassDB::bind_method(D_METHOD("get_particles_path"), &ParticleAttractor2D::get_particles_path); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "radius", PROPERTY_HINT_RANGE, "0.1,16000,0.1"), "set_radius", "get_radius"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "disable_radius", PROPERTY_HINT_RANGE, "0.1,16000,0.1"), "set_disable_radius", "get_disable_radius"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "gravity", PROPERTY_HINT_RANGE, "-512,512,0.01"), "set_gravity", "get_gravity"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "absorption", PROPERTY_HINT_RANGE, "0,512,0.01"), "set_absorption", "get_absorption"); - ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "particles_path", PROPERTY_HINT_RESOURCE_TYPE, "Particles2D"), "set_particles_path", "get_particles_path"); + pre_process_time = p_time; + VS::get_singleton()->particles_set_pre_process_time(particles, pre_process_time); } +void Particles2D::set_explosiveness_ratio(float p_ratio) { -void ParticleAttractor2D::set_enabled(bool p_enabled) { - - enabled = p_enabled; + explosiveness_ratio = p_ratio; + VS::get_singleton()->particles_set_explosiveness_ratio(particles, explosiveness_ratio); } +void Particles2D::set_randomness_ratio(float p_ratio) { -bool ParticleAttractor2D::is_enabled() const { - - return enabled; + randomness_ratio = p_ratio; + VS::get_singleton()->particles_set_randomness_ratio(particles, randomness_ratio); } +void Particles2D::set_visibility_rect(const Rect2 &p_aabb) { -void ParticleAttractor2D::set_radius(float p_radius) { - - radius = p_radius; - update(); -} + visibility_rect = p_aabb; + Rect3 aabb; + aabb.position.x = p_aabb.position.x; + aabb.position.y = p_aabb.position.y; + aabb.size.x = p_aabb.size.x; + aabb.size.y = p_aabb.size.y; -float ParticleAttractor2D::get_radius() const { + VS::get_singleton()->particles_set_custom_aabb(particles, aabb); - return radius; -} - -void ParticleAttractor2D::set_disable_radius(float p_disable_radius) { - - disable_radius = p_disable_radius; + _change_notify("visibility_rect"); update(); } -float ParticleAttractor2D::get_disable_radius() const { - - return disable_radius; -} - -void ParticleAttractor2D::set_gravity(float p_gravity) { - - gravity = p_gravity; -} -float ParticleAttractor2D::get_gravity() const { - - return gravity; -} - -void ParticleAttractor2D::set_absorption(float p_absorption) { +void Particles2D::set_use_local_coordinates(bool p_enable) { - absorption = p_absorption; -} -float ParticleAttractor2D::get_absorption() const { - - return absorption; -} - -void ParticleAttractor2D::set_particles_path(NodePath p_path) { - - path = p_path; - _update_owner(); - update_configuration_warning(); -} -NodePath ParticleAttractor2D::get_particles_path() const { - - return path; -} - -String ParticleAttractor2D::get_configuration_warning() const { - - if (!has_node(path) || !get_node(path) || !get_node(path)->cast_to<Particles2D>()) { - return TTR("Path property must point to a valid Particles2D node to work."); + local_coords = p_enable; + VS::get_singleton()->particles_set_use_local_coordinates(particles, local_coords); + set_notify_transform(!p_enable); + if (!p_enable && is_inside_tree()) { + _update_particle_emission_transform(); } - - return String(); } -ParticleAttractor2D::ParticleAttractor2D() { +void Particles2D::_update_particle_emission_transform() { - owner = NULL; - radius = 50; - disable_radius = 0; - gravity = 100; - absorption = 0; - path = String(".."); - enabled = true; -} - -/****************************************/ + Transform2D xf2d = get_global_transform(); + Transform xf; + xf.basis.set_axis(0, Vector3(xf2d.get_axis(0).x, xf2d.get_axis(0).y, 0)); + xf.basis.set_axis(1, Vector3(xf2d.get_axis(1).x, xf2d.get_axis(1).y, 0)); + xf.set_origin(Vector3(xf2d.get_origin().x, xf2d.get_origin().y, 0)); -_FORCE_INLINE_ static float _rand_from_seed(uint64_t *seed) { - - uint32_t r = Math::rand_from_seed(seed); - return 2.0f * (float)r / (float)Math::RANDOM_MAX - 1.0f; + VS::get_singleton()->particles_set_emission_transform(particles, xf); } -void Particles2D::_process_particles(float p_delta) { - - if (particles.size() == 0 || lifetime == 0) - return; - - p_delta *= time_scale; - - float frame_time = p_delta; - - if (emit_timeout > 0) { - time_to_live -= frame_time; - if (time_to_live < 0) { - - emitting = false; - _change_notify("config/emitting"); - }; - }; - - float next_time = time + frame_time; - - if (next_time > lifetime) - next_time = Math::fmod(next_time, lifetime); - - Particle *pdata = &particles[0]; - int particle_count = particles.size(); - Transform2D xform; - if (!local_space) - xform = get_global_transform(); - - active_count = 0; +void Particles2D::set_process_material(const Ref<Material> &p_material) { - PoolVector<Point2>::Read r; - int emission_point_count = 0; - if (emission_points.size()) { - - emission_point_count = emission_points.size(); - r = emission_points.read(); - } - - int attractor_count = 0; - AttractorCache *attractor_ptr = NULL; - - if (attractors.size()) { - if (attractors.size() != attractor_cache.size()) { - attractor_cache.resize(attractors.size()); - } - - int idx = 0; - Transform2D m; - if (local_space) { - m = get_global_transform().affine_inverse(); - } - for (Set<ParticleAttractor2D *>::Element *E = attractors.front(); E; E = E->next()) { - - attractor_cache[idx].pos = m.xform(E->get()->get_global_position()); - attractor_cache[idx].attractor = E->get(); - idx++; - } - - attractor_ptr = attractor_cache.ptr(); - attractor_count = attractor_cache.size(); + process_material = p_material; + Ref<ParticlesMaterial> pm = p_material; + if (pm.is_valid() && !pm->get_flag(ParticlesMaterial::FLAG_DISABLE_Z) && pm->get_gravity() == Vector3(0, -9.8, 0)) { + //likely a new material, modify it! + pm->set_flag(ParticlesMaterial::FLAG_DISABLE_Z, true); + pm->set_gravity(Vector3(0, 98, 0)); } + RID material_rid; + if (process_material.is_valid()) + material_rid = process_material->get_rid(); + VS::get_singleton()->particles_set_process_material(particles, material_rid); - for (int i = 0; i < particle_count; i++) { - - Particle &p = pdata[i]; - - float restart_time = (i * lifetime / particle_count) * explosiveness; - - bool restart = false; - - if (next_time < time) { - - if (restart_time > time || restart_time < next_time) - restart = true; - - } else if (restart_time > time && restart_time < next_time) { - restart = true; - } - - if (restart) { - - if (emitting) { - - p.pos = emissor_offset; - if (emission_point_count) { - - Vector2 ep = r[Math::rand() % emission_point_count]; - if (!local_space) { - p.pos = xform.xform(p.pos + ep * extents); - } else { - p.pos += ep * extents; - } - } else { - if (!local_space) { - p.pos = xform.xform(p.pos + Vector2(Math::random(-extents.x, extents.x), Math::random(-extents.y, extents.y))); - } else { - p.pos += Vector2(Math::random(-extents.x, extents.x), Math::random(-extents.y, extents.y)); - } - } - p.seed = Math::rand() % 12345678; - uint64_t rand_seed = p.seed * (i + 1); - - float angle = Math::deg2rad(param[PARAM_DIRECTION] + _rand_from_seed(&rand_seed) * param[PARAM_SPREAD]); - - p.velocity = Vector2(Math::sin(angle), Math::cos(angle)); - if (!local_space) { - - p.velocity = xform.basis_xform(p.velocity).normalized(); - } - - p.velocity *= param[PARAM_LINEAR_VELOCITY] + param[PARAM_LINEAR_VELOCITY] * _rand_from_seed(&rand_seed) * randomness[PARAM_LINEAR_VELOCITY]; - p.velocity += initial_velocity; - p.active = true; - p.rot = Math::deg2rad(param[PARAM_INITIAL_ANGLE] + param[PARAM_INITIAL_ANGLE] * randomness[PARAM_INITIAL_ANGLE] * _rand_from_seed(&rand_seed)); - active_count++; - - p.frame = Math::fmod(param[PARAM_ANIM_INITIAL_POS] + randomness[PARAM_ANIM_INITIAL_POS] * _rand_from_seed(&rand_seed), 1.0f); - - } else { - - p.active = false; - } - - } else { - - if (!p.active) - continue; - - uint64_t rand_seed = p.seed * (i + 1); - - Vector2 force; - - //apply gravity - float gravity_dir = Math::deg2rad(param[PARAM_GRAVITY_DIRECTION] + 180 * randomness[PARAM_GRAVITY_DIRECTION] * _rand_from_seed(&rand_seed)); - force += Vector2(Math::sin(gravity_dir), Math::cos(gravity_dir)) * (param[PARAM_GRAVITY_STRENGTH] + param[PARAM_GRAVITY_STRENGTH] * randomness[PARAM_GRAVITY_STRENGTH] * _rand_from_seed(&rand_seed)); - //apply radial - Vector2 rvec = (p.pos - emissor_offset).normalized(); - force += rvec * (param[PARAM_RADIAL_ACCEL] + param[PARAM_RADIAL_ACCEL] * randomness[PARAM_RADIAL_ACCEL] * _rand_from_seed(&rand_seed)); - //apply orbit - float orbitvel = (param[PARAM_ORBIT_VELOCITY] + param[PARAM_ORBIT_VELOCITY] * randomness[PARAM_ORBIT_VELOCITY] * _rand_from_seed(&rand_seed)); - if (orbitvel != 0) { - Vector2 rel = p.pos - xform.elements[2]; - Transform2D rot(orbitvel * frame_time, Vector2()); - p.pos = rot.xform(rel) + xform.elements[2]; - } - - Vector2 tvec = rvec.tangent(); - force += tvec * (param[PARAM_TANGENTIAL_ACCEL] + param[PARAM_TANGENTIAL_ACCEL] * randomness[PARAM_TANGENTIAL_ACCEL] * _rand_from_seed(&rand_seed)); - - for (int j = 0; j < attractor_count; j++) { - - Vector2 vec = (attractor_ptr[j].pos - p.pos); - float vl = vec.length(); - - if (!attractor_ptr[j].attractor->enabled || vl == 0 || vl > attractor_ptr[j].attractor->radius) - continue; - - force += vec * attractor_ptr[j].attractor->gravity; - float fvl = p.velocity.length(); - if (fvl && attractor_ptr[j].attractor->absorption) { - Vector2 target = vec.normalized(); - p.velocity = p.velocity.normalized().linear_interpolate(target, MIN(frame_time * attractor_ptr[j].attractor->absorption, 1)) * fvl; - } - - if (attractor_ptr[j].attractor->disable_radius && vl < attractor_ptr[j].attractor->disable_radius) { - p.active = false; - } - } - - p.velocity += force * frame_time; - - if (param[PARAM_DAMPING]) { - float dmp = param[PARAM_DAMPING] + param[PARAM_DAMPING] * randomness[PARAM_DAMPING] * _rand_from_seed(&rand_seed); - float v = p.velocity.length(); - v -= dmp * frame_time; - if (v <= 0) { - p.velocity = Vector2(); - } else { - p.velocity = p.velocity.normalized() * v; - } - } - - p.pos += p.velocity * frame_time; - p.rot += Math::lerp(param[PARAM_SPIN_VELOCITY], param[PARAM_SPIN_VELOCITY] * randomness[PARAM_SPIN_VELOCITY] * _rand_from_seed(&rand_seed), randomness[PARAM_SPIN_VELOCITY]) * frame_time; - float anim_spd = param[PARAM_ANIM_SPEED_SCALE] + param[PARAM_ANIM_SPEED_SCALE] * randomness[PARAM_ANIM_SPEED_SCALE] * _rand_from_seed(&rand_seed); - p.frame = Math::fposmod(p.frame + (frame_time / lifetime) * anim_spd, 1.0f); - - active_count++; - } - } - - time = Math::fmod(time + frame_time, lifetime); - if (!emitting && active_count == 0) { - emit_signal(SceneStringNames::get_singleton()->emission_finished); - set_process(false); - set_fixed_process(false); - } - - update(); + update_configuration_warning(); } -void Particles2D::_notification(int p_what) { - - switch (p_what) { - - case NOTIFICATION_PROCESS: { - - _process_particles(get_process_delta_time()); - } break; - - case NOTIFICATION_FIXED_PROCESS: { - - _process_particles(get_fixed_process_delta_time()); - } break; - - case NOTIFICATION_ENTER_TREE: { - - float ppt = preprocess; - while (ppt > 0) { - _process_particles(0.1); - ppt -= 0.1; - } - } break; - case NOTIFICATION_DRAW: { - - if (particles.size() == 0 || lifetime == 0) - return; - - RID ci = get_canvas_item(); - Size2 size(1, 1); - Point2 center; - int total_frames = 1; +void Particles2D::set_speed_scale(float p_scale) { - if (!texture.is_null()) { - size = texture->get_size(); - size.x /= h_frames; - size.y /= v_frames; - total_frames = h_frames * v_frames; - } - - float time_pos = (time / lifetime); - - Particle *pdata = &particles[0]; - int particle_count = particles.size(); - - RID texrid; - - if (texture.is_valid()) - texrid = texture->get_rid(); - - Transform2D invxform; - if (!local_space) - invxform = get_global_transform().affine_inverse(); - - int start_particle = (int)(time * (float)particle_count / lifetime); - - for (int id = 0; id < particle_count; ++id) { - int i = start_particle + id; - if (i >= particle_count) { - i -= particle_count; - } - - Particle &p = pdata[i]; - if (!p.active) - continue; - - float ptime = ((float)i / particle_count) * explosiveness; - - if (ptime < time_pos) - ptime = time_pos - ptime; - else - ptime = (1.0 - ptime) + time_pos; - - uint64_t rand_seed = p.seed * (i + 1); - - Color color; - - if (gradient.is_valid()) { - color = gradient->get_color_at_offset(ptime); - } else { - color = default_color; - } - - { - float huerand = _rand_from_seed(&rand_seed); - float huerot = param[PARAM_HUE_VARIATION] + randomness[PARAM_HUE_VARIATION] * huerand; - - if (Math::abs(huerot) > CMP_EPSILON) { - - float h = color.get_h(); - float s = color.get_s(); - float v = color.get_v(); - float a = color.a; - //float preh=h; - h += huerot; - h = Math::abs(Math::fposmod(h, 1.0f)); - //print_line("rand: "+rtos(randomness[PARAM_HUE_VARIATION])+" rand: "+rtos(huerand)); - //print_line(itos(i)+":hue: "+rtos(preh)+" + "+rtos(huerot)+" = "+rtos(h)); - color.set_hsv(h, s, v); - color.a = a; - } - } - - float initial_size = param[PARAM_INITIAL_SIZE] + param[PARAM_INITIAL_SIZE] * _rand_from_seed(&rand_seed) * randomness[PARAM_INITIAL_SIZE]; - float final_size = param[PARAM_FINAL_SIZE] + param[PARAM_FINAL_SIZE] * _rand_from_seed(&rand_seed) * randomness[PARAM_FINAL_SIZE]; - - float size_mult = initial_size * (1.0 - ptime) + final_size * ptime; - - //Size2 rectsize=size * size_mult; - //rectsize=rectsize.floor(); - - //Rect2 r = Rect2(Vecto,rectsize); - - Transform2D xform; - - if (p.rot) { - - xform.set_rotation(p.rot); - xform.translate(-size * size_mult / 2.0); - xform.elements[2] += p.pos; - } else { - xform.elements[2] = -size * size_mult / 2.0; - xform.elements[2] += p.pos; - } - - if (!local_space) { - xform = invxform * xform; - } - - xform.scale_basis(Size2(size_mult, size_mult)); - - VisualServer::get_singleton()->canvas_item_add_set_transform(ci, xform); - - if (texrid.is_valid()) { - - Rect2 src_rect; - src_rect.size = size; - - if (total_frames > 1) { - int frame = Math::fast_ftoi(Math::floor(p.frame * total_frames)) % total_frames; - src_rect.position.x = size.x * (frame % h_frames); - src_rect.position.y = size.y * (frame / h_frames); - } - Rect2 dst_rect(Point2(), size); - if (flip_h) - dst_rect.size.x = -dst_rect.size.x; - if (flip_v) - dst_rect.size.y = -dst_rect.size.y; - - texture->draw_rect_region(ci, dst_rect, src_rect, color); - //VisualServer::get_singleton()->canvas_item_add_texture_rect(ci,r,texrid,false,color); - } else { - VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(), size), color); - } - } - - } break; - } -} - -static const char *_particlesframe_property_names[Particles2D::PARAM_MAX] = { - "params/direction", - "params/spread", - "params/linear_velocity", - "params/spin_velocity", - "params/orbit_velocity", - "params/gravity_direction", - "params/gravity_strength", - "params/radial_accel", - "params/tangential_accel", - "params/damping", - "params/initial_angle", - "params/initial_size", - "params/final_size", - "params/hue_variation", - "params/anim_speed_scale", - "params/anim_initial_pos", -}; - -static const char *_particlesframe_property_rnames[Particles2D::PARAM_MAX] = { - "randomness/direction", - "randomness/spread", - "randomness/linear_velocity", - "randomness/spin_velocity", - "randomness/orbit_velocity", - "randomness/gravity_direction", - "randomness/gravity_strength", - "randomness/radial_accel", - "randomness/tangential_accel", - "randomness/damping", - "randomness/initial_angle", - "randomness/initial_size", - "randomness/final_size", - "randomness/hue_variation", - "randomness/anim_speed_scale", - "randomness/anim_initial_pos", -}; - -static const char *_particlesframe_property_ranges[Particles2D::PARAM_MAX] = { - "0,360,0.01", - "0,180,0.01", - "-1024,1024,0.01", - "-1024,1024,0.01", - "-1024,1024,0.01", - "0,360,0.01", - "0,1024,0.01", - "-128,128,0.01", - "-128,128,0.01", - "0,1024,0.001", - "0,360,0.01", - "0,1024,0.01", - "0,1024,0.01", - "0,1,0.01", - "0,128,0.01", - "0,1,0.01", -}; - -void Particles2D::set_emitting(bool p_emitting) { - - if (emitting == p_emitting) - return; - - if (p_emitting) { - - if (active_count == 0) - time = 0; - set_process(process_mode == PROCESS_IDLE); - set_fixed_process(process_mode == PROCESS_FIXED); - time_to_live = emit_timeout; - }; - emitting = p_emitting; - _change_notify("config/emitting"); + speed_scale = p_scale; + VS::get_singleton()->particles_set_speed_scale(particles, p_scale); } bool Particles2D::is_emitting() const { return emitting; } - -void Particles2D::set_process_mode(ProcessMode p_mode) { - - process_mode = p_mode; - const bool should_process = emitting || active_count != 0; - set_process(should_process && process_mode == PROCESS_IDLE); - set_fixed_process(should_process && process_mode == PROCESS_FIXED); -} - -Particles2D::ProcessMode Particles2D::get_process_mode() const { - - return process_mode; -} - -void Particles2D::set_amount(int p_amount) { - - ERR_FAIL_INDEX(p_amount, 1024 + 1); - - particles.resize(p_amount); -} int Particles2D::get_amount() const { - return particles.size(); -} - -void Particles2D::set_emit_timeout(float p_timeout) { - - emit_timeout = p_timeout; - time_to_live = p_timeout; -}; - -float Particles2D::get_emit_timeout() const { - - return emit_timeout; -}; - -void Particles2D::set_lifetime(float p_lifetime) { - - ERR_FAIL_INDEX(p_lifetime, 3600 + 1); - - lifetime = p_lifetime; + return amount; } float Particles2D::get_lifetime() const { return lifetime; } -void Particles2D::set_time_scale(float p_time_scale) { +bool Particles2D::get_one_shot() const { - time_scale = p_time_scale; + return one_shot; } -float Particles2D::get_time_scale() const { - - return time_scale; -} - -void Particles2D::set_pre_process_time(float p_pre_process_time) { - - preprocess = p_pre_process_time; -} - float Particles2D::get_pre_process_time() const { - return preprocess; -} - -void Particles2D::set_param(Parameter p_param, float p_value) { - - ERR_FAIL_INDEX(p_param, PARAM_MAX); - param[p_param] = p_value; + return pre_process_time; } -float Particles2D::get_param(Parameter p_param) const { +float Particles2D::get_explosiveness_ratio() const { - ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); - return param[p_param]; + return explosiveness_ratio; } +float Particles2D::get_randomness_ratio() const { -void Particles2D::set_randomness(Parameter p_param, float p_value) { - - ERR_FAIL_INDEX(p_param, PARAM_MAX); - randomness[p_param] = p_value; + return randomness_ratio; } -float Particles2D::get_randomness(Parameter p_param) const { +Rect2 Particles2D::get_visibility_rect() const { - ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); - return randomness[p_param]; + return visibility_rect; } +bool Particles2D::get_use_local_coordinates() const { -void Particles2D::set_texture(const Ref<Texture> &p_texture) { - - texture = p_texture; -} - -Ref<Texture> Particles2D::get_texture() const { - - return texture; + return local_coords; } +Ref<Material> Particles2D::get_process_material() const { -void Particles2D::set_color(const Color &p_color) { - - default_color = p_color; + return process_material; } -Color Particles2D::get_color() const { +float Particles2D::get_speed_scale() const { - return default_color; + return speed_scale; } -void Particles2D::set_gradient(const Ref<Gradient> &p_gradient) { +void Particles2D::set_draw_order(DrawOrder p_order) { - gradient = p_gradient; + draw_order = p_order; + VS::get_singleton()->particles_set_draw_order(particles, VS::ParticlesDrawOrder(p_order)); } -Ref<Gradient> Particles2D::get_gradient() const { +Particles2D::DrawOrder Particles2D::get_draw_order() const { - return gradient; + return draw_order; } -void Particles2D::set_emissor_offset(const Point2 &p_offset) { - - emissor_offset = p_offset; +void Particles2D::set_fixed_fps(int p_count) { + fixed_fps = p_count; + VS::get_singleton()->particles_set_fixed_fps(particles, p_count); } -Point2 Particles2D::get_emissor_offset() const { - - return emissor_offset; +int Particles2D::get_fixed_fps() const { + return fixed_fps; } -void Particles2D::set_use_local_space(bool p_use) { - - local_space = p_use; +void Particles2D::set_fractional_delta(bool p_enable) { + fractional_delta = p_enable; + VS::get_singleton()->particles_set_fractional_delta(particles, p_enable); } -bool Particles2D::is_using_local_space() const { - - return local_space; +bool Particles2D::get_fractional_delta() const { + return fractional_delta; } -//Deprecated. Converts color phases to color ramp -void Particles2D::set_color_phases(int p_phases) { - - //Create color ramp if we have 2 or more phases. - //Otherwise first phase phase will be assigned to default color. - if (p_phases > 1 && gradient.is_null()) { - gradient = Ref<Gradient>(memnew(Gradient())); - } - if (gradient.is_valid()) { - gradient->get_points().resize(p_phases); - } -} +String Particles2D::get_configuration_warning() const { -//Deprecated. -int Particles2D::get_color_phases() const { + String warnings; - if (gradient.is_valid()) { - return gradient->get_points_count(); + if (process_material.is_null()) { + if (warnings != String()) + warnings += "\n"; + warnings += "- " + TTR("A material to process the particles is not assigned, so no behavior is imprinted."); } - return 0; -} - -//Deprecated. Converts color phases to color ramp -void Particles2D::set_color_phase_color(int p_phase, const Color &p_color) { - - ERR_FAIL_INDEX(p_phase, MAX_COLOR_PHASES); - if (gradient.is_valid()) { - if (gradient->get_points_count() > p_phase) - gradient->set_color(p_phase, p_color); - } else { - if (p_phase == 0) - default_color = p_color; - } -} - -//Deprecated. -Color Particles2D::get_color_phase_color(int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, MAX_COLOR_PHASES, Color()); - if (gradient.is_valid()) { - return gradient->get_color(p_phase); - } - return Color(0, 0, 0, 1); -} - -//Deprecated. Converts color phases to color ramp -void Particles2D::set_color_phase_pos(int p_phase, float p_pos) { - ERR_FAIL_INDEX(p_phase, MAX_COLOR_PHASES); - ERR_FAIL_COND(p_pos < 0.0 || p_pos > 1.0); - if (gradient.is_valid() && gradient->get_points_count() > p_phase) { - return gradient->set_offset(p_phase, p_pos); - } -} - -//Deprecated. -float Particles2D::get_color_phase_pos(int p_phase) const { - - ERR_FAIL_INDEX_V(p_phase, MAX_COLOR_PHASES, 0); - if (gradient.is_valid()) { - return gradient->get_offset(p_phase); - } - return 0; -} - -void Particles2D::set_emission_half_extents(const Vector2 &p_extents) { - extents = p_extents; + return warnings; } -Vector2 Particles2D::get_emission_half_extents() const { +Rect2 Particles2D::capture_rect() const { - return extents; + Rect3 aabb = VS::get_singleton()->particles_get_current_aabb(particles); + Rect2 r; + r.position.x = aabb.position.x; + r.position.y = aabb.position.y; + r.size.x = aabb.size.x; + r.size.y = aabb.size.y; + return r; } -void Particles2D::set_initial_velocity(const Vector2 &p_velocity) { - - initial_velocity = p_velocity; -} -Vector2 Particles2D::get_initial_velocity() const { - - return initial_velocity; +void Particles2D::set_texture(const Ref<Texture> &p_texture) { + texture = p_texture; + update(); } -void Particles2D::pre_process(float p_delta) { - - _process_particles(p_delta); +Ref<Texture> Particles2D::get_texture() const { + return texture; } -void Particles2D::set_explosiveness(float p_value) { +void Particles2D::set_normal_map(const Ref<Texture> &p_normal_map) { - explosiveness = p_value; + normal_map = p_normal_map; + update(); } -float Particles2D::get_explosiveness() const { - - return explosiveness; +Ref<Texture> Particles2D::get_normal_map() const { + return normal_map; } -void Particles2D::set_flip_h(bool p_flip) { - - flip_h = p_flip; +void Particles2D::_validate_property(PropertyInfo &property) const { } -bool Particles2D::is_flipped_h() const { +void Particles2D::set_v_frames(int p_count) { - return flip_h; + ERR_FAIL_COND(p_count < 1); + v_frames = p_count; + update(); } -void Particles2D::set_flip_v(bool p_flip) { - - flip_v = p_flip; -} -bool Particles2D::is_flipped_v() const { +int Particles2D::get_v_frames() const { - return flip_v; + return v_frames; } -void Particles2D::set_h_frames(int p_frames) { +void Particles2D::set_h_frames(int p_count) { - ERR_FAIL_COND(p_frames < 1); - h_frames = p_frames; + ERR_FAIL_COND(p_count < 1); + h_frames = p_count; + update(); } int Particles2D::get_h_frames() const { @@ -932,215 +275,133 @@ int Particles2D::get_h_frames() const { return h_frames; } -void Particles2D::set_v_frames(int p_frames) { - - ERR_FAIL_COND(p_frames < 1); - v_frames = p_frames; +void Particles2D::restart() { + VS::get_singleton()->particles_restart(particles); } -int Particles2D::get_v_frames() const { - return v_frames; -} +void Particles2D::_notification(int p_what) { -void Particles2D::set_emission_points(const PoolVector<Vector2> &p_points) { + if (p_what == NOTIFICATION_DRAW) { - emission_points = p_points; -} + RID texture_rid; + if (texture.is_valid()) + texture_rid = texture->get_rid(); + RID normal_rid; + if (normal_map.is_valid()) + normal_rid = texture->get_rid(); -PoolVector<Vector2> Particles2D::get_emission_points() const { + VS::get_singleton()->canvas_item_add_particles(get_canvas_item(), particles, texture_rid, normal_rid, h_frames, v_frames); - return emission_points; -} +#ifdef TOOLS_ENABLED + if (get_tree()->is_editor_hint() && (this == get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->is_a_parent_of(this))) { -void Particles2D::reset() { + draw_rect(visibility_rect, Color(0, 0.7, 0.9, 0.4), false); + } +#endif + } - for (int i = 0; i < particles.size(); i++) { - particles[i].active = false; + if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { + _update_particle_emission_transform(); } - time = 0; - active_count = 0; } void Particles2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_emitting", "active"), &Particles2D::set_emitting); - ClassDB::bind_method(D_METHOD("is_emitting"), &Particles2D::is_emitting); - - ClassDB::bind_method(D_METHOD("set_process_mode", "mode"), &Particles2D::set_process_mode); - ClassDB::bind_method(D_METHOD("get_process_mode"), &Particles2D::get_process_mode); - + ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &Particles2D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &Particles2D::set_amount); - ClassDB::bind_method(D_METHOD("get_amount"), &Particles2D::get_amount); + ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &Particles2D::set_lifetime); + ClassDB::bind_method(D_METHOD("set_one_shot", "secs"), &Particles2D::set_one_shot); + ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &Particles2D::set_pre_process_time); + ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &Particles2D::set_explosiveness_ratio); + ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &Particles2D::set_randomness_ratio); + ClassDB::bind_method(D_METHOD("set_visibility_rect", "aabb"), &Particles2D::set_visibility_rect); + ClassDB::bind_method(D_METHOD("set_use_local_coordinates", "enable"), &Particles2D::set_use_local_coordinates); + ClassDB::bind_method(D_METHOD("set_fixed_fps", "fps"), &Particles2D::set_fixed_fps); + ClassDB::bind_method(D_METHOD("set_fractional_delta", "enable"), &Particles2D::set_fractional_delta); + ClassDB::bind_method(D_METHOD("set_process_material", "material:Material"), &Particles2D::set_process_material); + ClassDB::bind_method(D_METHOD("set_speed_scale", "scale"), &Particles2D::set_speed_scale); - ClassDB::bind_method(D_METHOD("set_lifetime", "lifetime"), &Particles2D::set_lifetime); + ClassDB::bind_method(D_METHOD("is_emitting"), &Particles2D::is_emitting); + ClassDB::bind_method(D_METHOD("get_amount"), &Particles2D::get_amount); ClassDB::bind_method(D_METHOD("get_lifetime"), &Particles2D::get_lifetime); - - ClassDB::bind_method(D_METHOD("set_time_scale", "time_scale"), &Particles2D::set_time_scale); - ClassDB::bind_method(D_METHOD("get_time_scale"), &Particles2D::get_time_scale); - - ClassDB::bind_method(D_METHOD("set_pre_process_time", "time"), &Particles2D::set_pre_process_time); + ClassDB::bind_method(D_METHOD("get_one_shot"), &Particles2D::get_one_shot); ClassDB::bind_method(D_METHOD("get_pre_process_time"), &Particles2D::get_pre_process_time); - - ClassDB::bind_method(D_METHOD("set_emit_timeout", "value"), &Particles2D::set_emit_timeout); - ClassDB::bind_method(D_METHOD("get_emit_timeout"), &Particles2D::get_emit_timeout); - - ClassDB::bind_method(D_METHOD("set_param", "param", "value"), &Particles2D::set_param); - ClassDB::bind_method(D_METHOD("get_param", "param"), &Particles2D::get_param); - - ClassDB::bind_method(D_METHOD("set_randomness", "param", "value"), &Particles2D::set_randomness); - ClassDB::bind_method(D_METHOD("get_randomness", "param"), &Particles2D::get_randomness); - - ClassDB::bind_method(D_METHOD("set_texture:Texture", "texture"), &Particles2D::set_texture); + ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &Particles2D::get_explosiveness_ratio); + ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &Particles2D::get_randomness_ratio); + ClassDB::bind_method(D_METHOD("get_visibility_rect"), &Particles2D::get_visibility_rect); + ClassDB::bind_method(D_METHOD("get_use_local_coordinates"), &Particles2D::get_use_local_coordinates); + ClassDB::bind_method(D_METHOD("get_fixed_fps"), &Particles2D::get_fixed_fps); + ClassDB::bind_method(D_METHOD("get_fractional_delta"), &Particles2D::get_fractional_delta); + ClassDB::bind_method(D_METHOD("get_process_material:Material"), &Particles2D::get_process_material); + ClassDB::bind_method(D_METHOD("get_speed_scale"), &Particles2D::get_speed_scale); + + ClassDB::bind_method(D_METHOD("set_draw_order", "order"), &Particles2D::set_draw_order); + ClassDB::bind_method(D_METHOD("get_draw_order"), &Particles2D::get_draw_order); + + ClassDB::bind_method(D_METHOD("set_texture", "texture:Texture"), &Particles2D::set_texture); ClassDB::bind_method(D_METHOD("get_texture:Texture"), &Particles2D::get_texture); - ClassDB::bind_method(D_METHOD("set_color", "color"), &Particles2D::set_color); - ClassDB::bind_method(D_METHOD("get_color"), &Particles2D::get_color); - - ClassDB::bind_method(D_METHOD("set_gradient:Gradient", "gradient"), &Particles2D::set_gradient); - ClassDB::bind_method(D_METHOD("get_gradient:Gradient"), &Particles2D::get_gradient); + ClassDB::bind_method(D_METHOD("set_normal_map", "texture:Texture"), &Particles2D::set_normal_map); + ClassDB::bind_method(D_METHOD("get_normal_map:Texture"), &Particles2D::get_normal_map); - ClassDB::bind_method(D_METHOD("set_emissor_offset", "offset"), &Particles2D::set_emissor_offset); - ClassDB::bind_method(D_METHOD("get_emissor_offset"), &Particles2D::get_emissor_offset); - - ClassDB::bind_method(D_METHOD("set_flip_h", "enable"), &Particles2D::set_flip_h); - ClassDB::bind_method(D_METHOD("is_flipped_h"), &Particles2D::is_flipped_h); - - ClassDB::bind_method(D_METHOD("set_flip_v", "enable"), &Particles2D::set_flip_v); - ClassDB::bind_method(D_METHOD("is_flipped_v"), &Particles2D::is_flipped_v); - - ClassDB::bind_method(D_METHOD("set_h_frames", "enable"), &Particles2D::set_h_frames); - ClassDB::bind_method(D_METHOD("get_h_frames"), &Particles2D::get_h_frames); + ClassDB::bind_method(D_METHOD("capture_rect"), &Particles2D::capture_rect); - ClassDB::bind_method(D_METHOD("set_v_frames", "enable"), &Particles2D::set_v_frames); + ClassDB::bind_method(D_METHOD("set_v_frames", "frames"), &Particles2D::set_v_frames); ClassDB::bind_method(D_METHOD("get_v_frames"), &Particles2D::get_v_frames); - ClassDB::bind_method(D_METHOD("set_emission_half_extents", "extents"), &Particles2D::set_emission_half_extents); - ClassDB::bind_method(D_METHOD("get_emission_half_extents"), &Particles2D::get_emission_half_extents); - - ClassDB::bind_method(D_METHOD("set_color_phases", "phases"), &Particles2D::set_color_phases); - ClassDB::bind_method(D_METHOD("get_color_phases"), &Particles2D::get_color_phases); - - ClassDB::bind_method(D_METHOD("set_color_phase_color", "phase", "color"), &Particles2D::set_color_phase_color); - ClassDB::bind_method(D_METHOD("get_color_phase_color", "phase"), &Particles2D::get_color_phase_color); - - ClassDB::bind_method(D_METHOD("set_color_phase_pos", "phase", "pos"), &Particles2D::set_color_phase_pos); - ClassDB::bind_method(D_METHOD("get_color_phase_pos", "phase"), &Particles2D::get_color_phase_pos); - - ClassDB::bind_method(D_METHOD("pre_process", "time"), &Particles2D::pre_process); - ClassDB::bind_method(D_METHOD("reset"), &Particles2D::reset); - - ClassDB::bind_method(D_METHOD("set_use_local_space", "enable"), &Particles2D::set_use_local_space); - ClassDB::bind_method(D_METHOD("is_using_local_space"), &Particles2D::is_using_local_space); - - ClassDB::bind_method(D_METHOD("set_initial_velocity", "velocity"), &Particles2D::set_initial_velocity); - ClassDB::bind_method(D_METHOD("get_initial_velocity"), &Particles2D::get_initial_velocity); - - ClassDB::bind_method(D_METHOD("set_explosiveness", "amount"), &Particles2D::set_explosiveness); - ClassDB::bind_method(D_METHOD("get_explosiveness"), &Particles2D::get_explosiveness); - - ClassDB::bind_method(D_METHOD("set_emission_points", "points"), &Particles2D::set_emission_points); - ClassDB::bind_method(D_METHOD("get_emission_points"), &Particles2D::get_emission_points); - - ADD_SIGNAL(MethodInfo("emission_finished")); - - ADD_PROPERTY(PropertyInfo(Variant::INT, "config/amount", PROPERTY_HINT_EXP_RANGE, "1,1024"), "set_amount", "get_amount"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "config/lifetime", PROPERTY_HINT_EXP_RANGE, "0.1,3600,0.1"), "set_lifetime", "get_lifetime"); - ADD_PROPERTYNO(PropertyInfo(Variant::REAL, "config/time_scale", PROPERTY_HINT_EXP_RANGE, "0.01,128,0.01"), "set_time_scale", "get_time_scale"); - ADD_PROPERTYNZ(PropertyInfo(Variant::REAL, "config/preprocess", PROPERTY_HINT_EXP_RANGE, "0,3600,0.1"), "set_pre_process_time", "get_pre_process_time"); - ADD_PROPERTYNZ(PropertyInfo(Variant::REAL, "config/emit_timeout", PROPERTY_HINT_RANGE, "0,3600,0.1"), "set_emit_timeout", "get_emit_timeout"); - ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "config/emitting"), "set_emitting", "is_emitting"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "config/process_mode", PROPERTY_HINT_ENUM, "Fixed,Idle"), "set_process_mode", "get_process_mode"); - ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "config/offset"), "set_emissor_offset", "get_emissor_offset"); - ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "config/half_extents"), "set_emission_half_extents", "get_emission_half_extents"); - ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "config/local_space"), "set_use_local_space", "is_using_local_space"); - ADD_PROPERTYNO(PropertyInfo(Variant::REAL, "config/explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness", "get_explosiveness"); - ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "config/flip_h"), "set_flip_h", "is_flipped_h"); - ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "config/flip_v"), "set_flip_v", "is_flipped_v"); - ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "config/texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); - ADD_PROPERTYNO(PropertyInfo(Variant::INT, "config/h_frames", PROPERTY_HINT_RANGE, "1,512,1"), "set_h_frames", "get_h_frames"); - ADD_PROPERTYNO(PropertyInfo(Variant::INT, "config/v_frames", PROPERTY_HINT_RANGE, "1,512,1"), "set_v_frames", "get_v_frames"); - - for (int i = 0; i < PARAM_MAX; i++) { - ADD_PROPERTYI(PropertyInfo(Variant::REAL, _particlesframe_property_names[i], PROPERTY_HINT_RANGE, _particlesframe_property_ranges[i]), "set_param", "get_param", i); - } - - for (int i = 0; i < PARAM_MAX; i++) { - ADD_PROPERTYINZ(PropertyInfo(Variant::REAL, _particlesframe_property_rnames[i], PROPERTY_HINT_RANGE, "-1,1,0.01"), "set_randomness", "get_randomness", i); - } - - ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "color_phases/count", PROPERTY_HINT_RANGE, "0,4,1", 0), "set_color_phases", "get_color_phases"); - - //Backward compatibility. They will be converted to color ramp - for (int i = 0; i < MAX_COLOR_PHASES; i++) { - String phase = "phase_" + itos(i) + "/"; - ADD_PROPERTYI(PropertyInfo(Variant::REAL, phase + "pos", PROPERTY_HINT_RANGE, "0,1,0.01", 0), "set_color_phase_pos", "get_color_phase_pos", i); - ADD_PROPERTYI(PropertyInfo(Variant::COLOR, phase + "color", PROPERTY_HINT_NONE, "", 0), "set_color_phase_color", "get_color_phase_color", i); - } + ClassDB::bind_method(D_METHOD("set_h_frames", "frames"), &Particles2D::set_h_frames); + ClassDB::bind_method(D_METHOD("get_h_frames"), &Particles2D::get_h_frames); - ADD_PROPERTYNO(PropertyInfo(Variant::COLOR, "color/color"), "set_color", "get_color"); - ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "color/color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_gradient", "get_gradient"); - - ADD_PROPERTYNZ(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "emission_points", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_emission_points", "get_emission_points"); - - BIND_CONSTANT(PARAM_DIRECTION); - BIND_CONSTANT(PARAM_SPREAD); - BIND_CONSTANT(PARAM_LINEAR_VELOCITY); - BIND_CONSTANT(PARAM_SPIN_VELOCITY); - BIND_CONSTANT(PARAM_ORBIT_VELOCITY); - BIND_CONSTANT(PARAM_GRAVITY_DIRECTION); - BIND_CONSTANT(PARAM_GRAVITY_STRENGTH); - BIND_CONSTANT(PARAM_RADIAL_ACCEL); - BIND_CONSTANT(PARAM_TANGENTIAL_ACCEL); - BIND_CONSTANT(PARAM_DAMPING); - BIND_CONSTANT(PARAM_INITIAL_ANGLE); - BIND_CONSTANT(PARAM_INITIAL_SIZE); - BIND_CONSTANT(PARAM_FINAL_SIZE); - BIND_CONSTANT(PARAM_HUE_VARIATION); - BIND_CONSTANT(PARAM_ANIM_SPEED_SCALE); - BIND_CONSTANT(PARAM_ANIM_INITIAL_POS); - BIND_CONSTANT(PARAM_MAX); - - BIND_CONSTANT(MAX_COLOR_PHASES); + ClassDB::bind_method(D_METHOD("restart"), &Particles2D::restart); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,100000,1"), "set_amount", "get_amount"); + ADD_GROUP("Time", ""); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01"), "set_lifetime", "get_lifetime"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "get_one_shot"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "preprocess", PROPERTY_HINT_RANGE, "0.00,600.0,0.01"), "set_pre_process_time", "get_pre_process_time"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_speed_scale", "get_speed_scale"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta"); + ADD_GROUP("Drawing", ""); + ADD_PROPERTY(PropertyInfo(Variant::RECT3, "visibility_rect"), "set_visibility_rect", "get_visibility_rect"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "local_coords"), "set_use_local_coordinates", "get_use_local_coordinates"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_order", PROPERTY_HINT_ENUM, "Index,Lifetime"), "set_draw_order", "get_draw_order"); + ADD_GROUP("Process Material", "process_"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,ParticlesMaterial"), "set_process_material", "get_process_material"); + ADD_GROUP("Textures", ""); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "normal_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_normal_map", "get_normal_map"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "h_frames", PROPERTY_HINT_RANGE, "1,1024,1"), "set_h_frames", "get_h_frames"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "v_frames", PROPERTY_HINT_RANGE, "1,1024,1"), "set_v_frames", "get_v_frames"); + + BIND_CONSTANT(DRAW_ORDER_INDEX); + BIND_CONSTANT(DRAW_ORDER_LIFETIME); } Particles2D::Particles2D() { - for (int i = 0; i < PARAM_MAX; i++) { + particles = VS::get_singleton()->particles_create(); - param[i] = 0; - randomness[i] = 0; - } - - set_param(PARAM_SPREAD, 10); - set_param(PARAM_LINEAR_VELOCITY, 20); - set_param(PARAM_GRAVITY_STRENGTH, 9.8); - set_param(PARAM_RADIAL_ACCEL, 0); - set_param(PARAM_TANGENTIAL_ACCEL, 0); - set_param(PARAM_INITIAL_ANGLE, 0.0); - set_param(PARAM_INITIAL_SIZE, 1.0); - set_param(PARAM_FINAL_SIZE, 1.0); - set_param(PARAM_ANIM_SPEED_SCALE, 1.0); - - set_color(Color(1, 1, 1, 1)); - - time = 0; - lifetime = 2; - emitting = false; - particles.resize(32); - active_count = -1; set_emitting(true); - process_mode = PROCESS_IDLE; - local_space = true; - preprocess = 0; - time_scale = 1.0; - - flip_h = false; - flip_v = false; - - v_frames = 1; + set_one_shot(false); + set_amount(8); + set_lifetime(1); + set_fixed_fps(0); + set_fractional_delta(true); + set_pre_process_time(0); + set_explosiveness_ratio(0); + set_randomness_ratio(0); + set_visibility_rect(Rect2(Vector2(-100, -100), Vector2(200, 200))); + set_use_local_coordinates(true); + set_speed_scale(1); h_frames = 1; + v_frames = 1; +} + +Particles2D::~Particles2D() { - emit_timeout = 0; - time_to_live = 0; - explosiveness = 1.0; + VS::get_singleton()->free(particles); } diff --git a/scene/2d/particles_2d.h b/scene/2d/particles_2d.h index 856beaa836..23278ce746 100644 --- a/scene/2d/particles_2d.h +++ b/scene/2d/particles_2d.h @@ -34,235 +34,102 @@ #include "scene/resources/color_ramp.h" #include "scene/resources/texture.h" -class Particles2D; -class ParticleAttractor2D : public Node2D { - - GDCLASS(ParticleAttractor2D, Node2D); - - friend class Particles2D; - bool enabled; - float radius; - float disable_radius; - float gravity; - float absorption; - NodePath path; - - Particles2D *owner; - - void _update_owner(); - void _owner_exited(); - void _set_owner(Particles2D *p_owner); - - void _notification(int p_what); - static void _bind_methods(); - -public: - void set_enabled(bool p_enabled); - bool is_enabled() const; - - void set_radius(float p_radius); - float get_radius() const; - - void set_disable_radius(float p_disable_radius); - float get_disable_radius() const; - - void set_gravity(float p_gravity); - float get_gravity() const; - - void set_absorption(float p_absorption); - float get_absorption() const; - - void set_particles_path(NodePath p_path); - NodePath get_particles_path() const; - - virtual String get_configuration_warning() const; - - ParticleAttractor2D(); -}; - class Particles2D : public Node2D { - - GDCLASS(Particles2D, Node2D); +private: + GDCLASS(Particles2D, Node2D) public: - enum Parameter { - PARAM_DIRECTION, - PARAM_SPREAD, - PARAM_LINEAR_VELOCITY, - PARAM_SPIN_VELOCITY, - PARAM_ORBIT_VELOCITY, - PARAM_GRAVITY_DIRECTION, - PARAM_GRAVITY_STRENGTH, - PARAM_RADIAL_ACCEL, - PARAM_TANGENTIAL_ACCEL, - PARAM_DAMPING, - PARAM_INITIAL_ANGLE, - PARAM_INITIAL_SIZE, - PARAM_FINAL_SIZE, - PARAM_HUE_VARIATION, - PARAM_ANIM_SPEED_SCALE, - PARAM_ANIM_INITIAL_POS, - PARAM_MAX - }; - - enum { - MAX_COLOR_PHASES = 4 - }; - - enum ProcessMode { - PROCESS_FIXED, - PROCESS_IDLE, + enum DrawOrder { + DRAW_ORDER_INDEX, + DRAW_ORDER_LIFETIME, }; private: - float param[PARAM_MAX]; - float randomness[PARAM_MAX]; + RID particles; - struct Particle { - bool active; - Point2 pos; - Vector2 velocity; - float rot; - float frame; - uint64_t seed; - Particle() { - active = false; - seed = 123465789; - rot = 0; - frame = 0; - } - }; - - Vector<Particle> particles; - - struct AttractorCache { - - Vector2 pos; - ParticleAttractor2D *attractor; - }; - - Vector<AttractorCache> attractor_cache; - - float explosiveness; - float preprocess; - float lifetime; bool emitting; - bool local_space; - float emit_timeout; - float time_to_live; - float time_scale; - bool flip_h; - bool flip_v; - int h_frames; + bool one_shot; + int amount; + float lifetime; + float pre_process_time; + float explosiveness_ratio; + float randomness_ratio; + float speed_scale; + Rect2 visibility_rect; + bool local_coords; + int fixed_fps; + bool fractional_delta; int v_frames; - Point2 emissor_offset; - Vector2 initial_velocity; - Vector2 extents; - PoolVector<Vector2> emission_points; + int h_frames; - ProcessMode process_mode; + Ref<Material> process_material; - float time; - int active_count; + DrawOrder draw_order; Ref<Texture> texture; + Ref<Texture> normal_map; - //If no color ramp is set then default color is used. Created as simple alternative to color_ramp. - Color default_color; - Ref<Gradient> gradient; - - void _process_particles(float p_delta); - friend class ParticleAttractor2D; - - Set<ParticleAttractor2D *> attractors; + void _update_particle_emission_transform(); protected: - void _notification(int p_what); static void _bind_methods(); + virtual void _validate_property(PropertyInfo &property) const; + void _notification(int p_what); public: void set_emitting(bool p_emitting); - bool is_emitting() const; - - void set_process_mode(ProcessMode p_mode); - ProcessMode get_process_mode() const; - void set_amount(int p_amount); - int get_amount() const; - void set_lifetime(float p_lifetime); - float get_lifetime() const; - - void set_time_scale(float p_time_scale); - float get_time_scale() const; + void set_one_shot(bool p_enabled); + void set_pre_process_time(float p_time); + void set_explosiveness_ratio(float p_ratio); + void set_randomness_ratio(float p_ratio); + void set_visibility_rect(const Rect2 &p_aabb); + void set_use_local_coordinates(bool p_enable); + void set_process_material(const Ref<Material> &p_material); + void set_speed_scale(float p_scale); - void set_pre_process_time(float p_pre_process_time); + bool is_emitting() const; + int get_amount() const; + float get_lifetime() const; + bool get_one_shot() const; float get_pre_process_time() const; + float get_explosiveness_ratio() const; + float get_randomness_ratio() const; + Rect2 get_visibility_rect() const; + bool get_use_local_coordinates() const; + Ref<Material> get_process_material() const; + float get_speed_scale() const; - void set_emit_timeout(float p_timeout); - float get_emit_timeout() const; - - void set_emission_half_extents(const Vector2 &p_extents); - Vector2 get_emission_half_extents() const; + void set_fixed_fps(int p_count); + int get_fixed_fps() const; - void set_param(Parameter p_param, float p_value); - float get_param(Parameter p_param) const; + void set_fractional_delta(bool p_enable); + bool get_fractional_delta() const; - void set_randomness(Parameter p_randomness, float p_value); - float get_randomness(Parameter p_randomness) const; - - void set_explosiveness(float p_value); - float get_explosiveness() const; - - void set_flip_h(bool p_flip); - bool is_flipped_h() const; - - void set_flip_v(bool p_flip); - bool is_flipped_v() const; - - void set_h_frames(int p_frames); - int get_h_frames() const; - - void set_v_frames(int p_frames); - int get_v_frames() const; - - void set_color_phases(int p_phases); - int get_color_phases() const; - - void set_color_phase_color(int p_phase, const Color &p_color); - Color get_color_phase_color(int p_phase) const; - - void set_color_phase_pos(int p_phase, float p_pos); - float get_color_phase_pos(int p_phase) const; + void set_draw_order(DrawOrder p_order); + DrawOrder get_draw_order() const; void set_texture(const Ref<Texture> &p_texture); Ref<Texture> get_texture() const; - void set_color(const Color &p_color); - Color get_color() const; - - void set_gradient(const Ref<Gradient> &p_texture); - Ref<Gradient> get_gradient() const; - - void set_emissor_offset(const Point2 &p_offset); - Point2 get_emissor_offset() const; + void set_normal_map(const Ref<Texture> &p_normal_map); + Ref<Texture> get_normal_map() const; - void set_use_local_space(bool p_use); - bool is_using_local_space() const; - - void set_initial_velocity(const Vector2 &p_velocity); - Vector2 get_initial_velocity() const; + virtual String get_configuration_warning() const; - void set_emission_points(const PoolVector<Vector2> &p_points); - PoolVector<Vector2> get_emission_points() const; + void set_v_frames(int p_count); + int get_v_frames() const; - void pre_process(float p_delta); - void reset(); + void set_h_frames(int p_count); + int get_h_frames() const; + void restart(); + Rect2 capture_rect() const; Particles2D(); + ~Particles2D(); }; -VARIANT_ENUM_CAST(Particles2D::ProcessMode); -VARIANT_ENUM_CAST(Particles2D::Parameter); +VARIANT_ENUM_CAST(Particles2D::DrawOrder) #endif // PARTICLES_FRAME_H diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 68270ed771..fd261117e1 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -44,28 +44,6 @@ void PhysicsBody2D::_notification(int p_what) { */ } -void PhysicsBody2D::set_one_way_collision_direction(const Vector2 &p_dir) { - - one_way_collision_direction = p_dir; - Physics2DServer::get_singleton()->body_set_one_way_collision_direction(get_rid(), p_dir); -} - -Vector2 PhysicsBody2D::get_one_way_collision_direction() const { - - return one_way_collision_direction; -} - -void PhysicsBody2D::set_one_way_collision_max_depth(float p_depth) { - - one_way_collision_max_depth = p_depth; - Physics2DServer::get_singleton()->body_set_one_way_collision_max_depth(get_rid(), p_depth); -} - -float PhysicsBody2D::get_one_way_collision_max_depth() const { - - return one_way_collision_max_depth; -} - void PhysicsBody2D::_set_layers(uint32_t p_mask) { set_collision_layer(p_mask); @@ -92,10 +70,6 @@ void PhysicsBody2D::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_layers", "mask"), &PhysicsBody2D::_set_layers); ClassDB::bind_method(D_METHOD("_get_layers"), &PhysicsBody2D::_get_layers); - ClassDB::bind_method(D_METHOD("set_one_way_collision_direction", "dir"), &PhysicsBody2D::set_one_way_collision_direction); - ClassDB::bind_method(D_METHOD("get_one_way_collision_direction"), &PhysicsBody2D::get_one_way_collision_direction); - ClassDB::bind_method(D_METHOD("set_one_way_collision_max_depth", "depth"), &PhysicsBody2D::set_one_way_collision_max_depth); - ClassDB::bind_method(D_METHOD("get_one_way_collision_max_depth"), &PhysicsBody2D::get_one_way_collision_max_depth); ClassDB::bind_method(D_METHOD("add_collision_exception_with", "body:PhysicsBody2D"), &PhysicsBody2D::add_collision_exception_with); ClassDB::bind_method(D_METHOD("remove_collision_exception_with", "body:PhysicsBody2D"), &PhysicsBody2D::remove_collision_exception_with); ADD_PROPERTY(PropertyInfo(Variant::INT, "layers", PROPERTY_HINT_LAYERS_2D_PHYSICS, "", 0), "_set_layers", "_get_layers"); //for backwards compat @@ -103,9 +77,6 @@ void PhysicsBody2D::_bind_methods() { ADD_GROUP("Collision", "collision_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_layer", "get_collision_layer"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask"); - ADD_GROUP("", ""); - ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "one_way_collision/direction"), "set_one_way_collision_direction", "get_one_way_collision_direction"); - ADD_PROPERTYNZ(PropertyInfo(Variant::REAL, "one_way_collision/max_depth"), "set_one_way_collision_max_depth", "get_one_way_collision_max_depth"); } void PhysicsBody2D::set_collision_layer(uint32_t p_layer) { @@ -164,7 +135,6 @@ PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) collision_layer = 1; collision_mask = 1; - set_one_way_collision_max_depth(0); set_pickable(false); } @@ -971,248 +941,105 @@ RigidBody2D::~RigidBody2D() { ////////////////////////// -Variant KinematicBody2D::_get_collider() const { - - ObjectID oid = get_collider(); - if (oid == 0) - return Variant(); - Object *obj = ObjectDB::get_instance(oid); - if (!obj) - return Variant(); - - Reference *ref = obj->cast_to<Reference>(); - if (ref) { - return Ref<Reference>(ref); - } - - return obj; -} - -void KinematicBody2D::revert_motion() { +Dictionary KinematicBody2D::_move(const Vector2 &p_motion) { + + Collision col; + if (move(p_motion, col)) { + Dictionary d; + d["position"] = col.collision; + d["normal"] = col.collision; + d["local_shape"] = col.local_shape; + d["travel"] = col.travel; + d["remainder"] = col.remainder; + d["collider_id"] = col.collider; + if (col.collider) { + d["collider"] = ObjectDB::get_instance(col.collider); + } else { + d["collider"] = Variant(); + } - Transform2D gt = get_global_transform(); - gt.elements[2] -= travel; - travel = Vector2(); - set_global_transform(gt); -} + d["collider_shape_index"] = col.collider_shape; + d["collider_metadata"] = col.collider_metadata; -Vector2 KinematicBody2D::get_travel() const { + return d; - return travel; + } else { + return Dictionary(); + } } -Vector2 KinematicBody2D::move(const Vector2 &p_motion) { - -#if 1 +bool KinematicBody2D::move(const Vector2 &p_motion, Collision &r_collision) { Transform2D gt = get_global_transform(); Physics2DServer::MotionResult result; - colliding = Physics2DServer::get_singleton()->body_test_motion(get_rid(), gt, p_motion, margin, &result); - - collider_metadata = result.collider_metadata; - collider_shape = result.collider_shape; - collider_vel = result.collider_velocity; - collision = result.collision_point; - normal = result.collision_normal; - collider = result.collider_id; - - gt.elements[2] += result.motion; - set_global_transform(gt); - travel = result.motion; - - return result.remainder; - -#else - //give me back regular physics engine logic - //this is madness - //and most people using this function will think - //what it does is simpler than using physics - //this took about a week to get right.. - //but is it right? who knows at this point.. - - colliding = false; - ERR_FAIL_COND_V(!is_inside_tree(), Vector2()); - Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(get_world_2d()->get_space()); - ERR_FAIL_COND_V(!dss, Vector2()); - const int max_shapes = 32; - Vector2 sr[max_shapes * 2]; - int res_shapes; - - Set<RID> exclude; - exclude.insert(get_rid()); - - //recover first - int recover_attempts = 4; - - bool collided = false; - uint32_t mask = 0; - if (true) - mask |= Physics2DDirectSpaceState::TYPE_MASK_STATIC_BODY; - if (true) - mask |= Physics2DDirectSpaceState::TYPE_MASK_KINEMATIC_BODY; - if (true) - mask |= Physics2DDirectSpaceState::TYPE_MASK_RIGID_BODY; - if (true) - mask |= Physics2DDirectSpaceState::TYPE_MASK_CHARACTER_BODY; - - //print_line("margin: "+rtos(margin)); - do { - - //motion recover - for (int i = 0; i < get_shape_count(); i++) { - - if (is_shape_set_as_trigger(i)) - continue; - if (dss->collide_shape(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), Vector2(), margin, sr, max_shapes, res_shapes, exclude, get_layer_mask(), mask)) - collided = true; - } - - if (!collided) - break; - - Vector2 recover_motion; - - for (int i = 0; i < res_shapes; i++) { - - Vector2 a = sr[i * 2 + 0]; - Vector2 b = sr[i * 2 + 1]; - - float d = a.distance_to(b); - - /* - if (d<margin) - continue; - */ - recover_motion += (b - a) * 0.4; - } - - if (recover_motion == Vector2()) { - collided = false; - break; - } - - Transform2D gt = get_global_transform(); - gt.elements[2] += recover_motion; - set_global_transform(gt); - - recover_attempts--; - - } while (recover_attempts); - - //move second - float safe = 1.0; - float unsafe = 1.0; - int best_shape = -1; - - for (int i = 0; i < get_shape_count(); i++) { - - if (is_shape_set_as_trigger(i)) - continue; - - float lsafe, lunsafe; - bool valid = dss->cast_motion(get_shape(i)->get_rid(), get_global_transform() * get_shape_transform(i), p_motion, 0, lsafe, lunsafe, exclude, get_layer_mask(), mask); - //print_line("shape: "+itos(i)+" travel:"+rtos(ltravel)); - if (!valid) { - - safe = 0; - unsafe = 0; - best_shape = i; //sadly it's the best - break; - } - if (lsafe == 1.0) { - continue; - } - if (lsafe < safe) { - - safe = lsafe; - unsafe = lunsafe; - best_shape = i; - } + bool colliding = Physics2DServer::get_singleton()->body_test_motion(get_rid(), gt, p_motion, margin, &result); + + if (colliding) { + r_collision.collider_metadata = result.collider_metadata; + r_collision.collider_shape = result.collider_shape; + r_collision.collider_vel = result.collider_velocity; + r_collision.collision = result.collision_point; + r_collision.normal = result.collision_normal; + r_collision.collider = result.collider_id; + r_collision.travel = result.motion; + r_collision.remainder = result.remainder; + r_collision.local_shape = result.collision_local_shape; } - //print_line("best shape: "+itos(best_shape)+" motion "+p_motion); - - if (safe >= 1) { - //not collided - colliding = false; - - } else { - - //it collided, let's get the rest info in unsafe advance - Transform2D ugt = get_global_transform(); - ugt.elements[2] += p_motion * unsafe; - Physics2DDirectSpaceState::ShapeRestInfo rest_info; - bool c2 = dss->rest_info(get_shape(best_shape)->get_rid(), ugt * get_shape_transform(best_shape), Vector2(), margin, &rest_info, exclude, get_layer_mask(), mask); - if (!c2) { - //should not happen, but floating point precision is so weird.. - - colliding = false; - } else { - - //print_line("Travel: "+rtos(travel)); - colliding = true; - collision = rest_info.point; - normal = rest_info.normal; - collider = rest_info.collider_id; - collider_vel = rest_info.linear_velocity; - collider_shape = rest_info.shape; - collider_metadata = rest_info.metadata; - } - } - - Vector2 motion = p_motion * safe; - Transform2D gt = get_global_transform(); - gt.elements[2] += motion; + gt.elements[2] += result.motion; set_global_transform(gt); - return p_motion - motion; -#endif + return colliding; } Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction, float p_slope_stop_min_velocity, int p_max_bounces, float p_floor_max_angle) { - Vector2 motion = (move_and_slide_floor_velocity + p_linear_velocity) * get_fixed_process_delta_time(); + Vector2 motion = (floor_velocity + p_linear_velocity) * get_fixed_process_delta_time(); Vector2 lv = p_linear_velocity; - move_and_slide_on_floor = false; - move_and_slide_on_ceiling = false; - move_and_slide_on_wall = false; - move_and_slide_colliders.clear(); - move_and_slide_floor_velocity = Vector2(); + on_floor = false; + on_ceiling = false; + on_wall = false; + colliders.clear(); + floor_velocity = Vector2(); while (p_max_bounces) { - motion = move(motion); + Collision collision; + + bool collided = move(motion, collision); - if (is_colliding()) { + if (collided) { + + motion = collision.remainder; if (p_floor_direction == Vector2()) { //all is a wall - move_and_slide_on_wall = true; + on_wall = true; } else { - if (get_collision_normal().dot(p_floor_direction) >= Math::cos(p_floor_max_angle)) { //floor + if (collision.normal.dot(p_floor_direction) >= Math::cos(p_floor_max_angle)) { //floor - move_and_slide_on_floor = true; - move_and_slide_floor_velocity = get_collider_velocity(); + on_floor = true; + floor_velocity = collision.collider_vel; - if (get_travel().length() < 1 && ABS((lv.x - move_and_slide_floor_velocity.x)) < p_slope_stop_min_velocity) { - revert_motion(); + if (collision.travel.length() < 1 && ABS((lv.x - floor_velocity.x)) < p_slope_stop_min_velocity) { + Transform2D gt = get_global_transform(); + gt.elements[2] -= collision.travel; + set_global_transform(gt); return Vector2(); } - } else if (get_collision_normal().dot(-p_floor_direction) >= Math::cos(p_floor_max_angle)) { //ceiling - move_and_slide_on_ceiling = true; + } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle)) { //ceiling + on_ceiling = true; } else { - move_and_slide_on_wall = true; + on_wall = true; } } - Vector2 n = get_collision_normal(); + Vector2 n = collision.normal; motion = motion.slide(n); lv = lv.slide(n); - Variant collider = _get_collider(); - if (collider.get_type() != Variant::NIL) { - move_and_slide_colliders.push_back(collider); - } + + colliders.push_back(collision); } else { break; @@ -1226,26 +1053,22 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const return lv; } -bool KinematicBody2D::is_move_and_slide_on_floor() const { +bool KinematicBody2D::is_on_floor() const { - return move_and_slide_on_floor; + return on_floor; } -bool KinematicBody2D::is_move_and_slide_on_wall() const { +bool KinematicBody2D::is_on_wall() const { - return move_and_slide_on_wall; + return on_wall; } -bool KinematicBody2D::is_move_and_slide_on_ceiling() const { +bool KinematicBody2D::is_on_ceiling() const { - return move_and_slide_on_ceiling; + return on_ceiling; } -Array KinematicBody2D::get_move_and_slide_colliders() const { - return move_and_slide_colliders; -} +Vector2 KinematicBody2D::get_floor_velocity() const { -Vector2 KinematicBody2D::move_to(const Vector2 &p_position) { - - return move(p_position - get_global_position()); + return floor_velocity; } bool KinematicBody2D::test_move(const Transform2D &p_from, const Vector2 &p_motion) { @@ -1255,98 +1078,123 @@ bool KinematicBody2D::test_move(const Transform2D &p_from, const Vector2 &p_moti return Physics2DServer::get_singleton()->body_test_motion(get_rid(), p_from, p_motion, margin); } -Vector2 KinematicBody2D::get_collision_pos() const { +void KinematicBody2D::set_safe_margin(float p_margin) { - ERR_FAIL_COND_V(!colliding, Vector2()); - return collision; + margin = p_margin; } -Vector2 KinematicBody2D::get_collision_normal() const { +float KinematicBody2D::get_safe_margin() const { - ERR_FAIL_COND_V(!colliding, Vector2()); - return normal; + return margin; } -Vector2 KinematicBody2D::get_collider_velocity() const { +int KinematicBody2D::get_collision_count() const { - return collider_vel; + return colliders.size(); } +Vector2 KinematicBody2D::get_collision_position(int p_collision) const { -ObjectID KinematicBody2D::get_collider() const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Vector2()); - ERR_FAIL_COND_V(!colliding, 0); - return collider; + return colliders[p_collision].collision; } - -int KinematicBody2D::get_collider_shape() const { - - ERR_FAIL_COND_V(!colliding, 0); - return collider_shape; +Vector2 KinematicBody2D::get_collision_normal(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Vector2()); + return colliders[p_collision].normal; } -Variant KinematicBody2D::get_collider_metadata() const { - - ERR_FAIL_COND_V(!colliding, 0); - return collider_metadata; +Vector2 KinematicBody2D::get_collision_travel(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Vector2()); + return colliders[p_collision].travel; } - -bool KinematicBody2D::is_colliding() const { - - return colliding; +Vector2 KinematicBody2D::get_collision_remainder(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Vector2()); + return colliders[p_collision].remainder; } +Object *KinematicBody2D::get_collision_local_shape(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), NULL); + uint32_t owner = shape_find_owner(colliders[p_collision].local_shape); + return shape_owner_get_owner(owner); +} +Object *KinematicBody2D::get_collision_collider(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), NULL); -void KinematicBody2D::set_collision_margin(float p_margin) { + if (colliders[p_collision].collider) { + return ObjectDB::get_instance(colliders[p_collision].collider); + } - margin = p_margin; + return NULL; } +ObjectID KinematicBody2D::get_collision_collider_id(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), 0); -float KinematicBody2D::get_collision_margin() const { + return colliders[p_collision].collider; +} +Object *KinematicBody2D::get_collision_collider_shape(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), NULL); + Object *collider = get_collision_collider(p_collision); + if (collider) { + CollisionObject2D *obj2d = collider->cast_to<CollisionObject2D>(); + if (obj2d) { + uint32_t owner = shape_find_owner(colliders[p_collision].collider_shape); + return obj2d->shape_owner_get_owner(owner); + } + } - return margin; + return NULL; +} +int KinematicBody2D::get_collision_collider_shape_index(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), -1); + return colliders[p_collision].collider_shape; +} +Vector2 KinematicBody2D::get_collision_collider_velocity(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Vector2()); + return colliders[p_collision].collider_vel; +} +Variant KinematicBody2D::get_collision_collider_metadata(int p_collision) const { + ERR_FAIL_INDEX_V(p_collision, colliders.size(), Variant()); + return colliders[p_collision].collider_metadata; } void KinematicBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("move", "rel_vec"), &KinematicBody2D::move); - ClassDB::bind_method(D_METHOD("move_to", "position"), &KinematicBody2D::move_to); + ClassDB::bind_method(D_METHOD("move", "rel_vec"), &KinematicBody2D::_move); ClassDB::bind_method(D_METHOD("move_and_slide", "linear_velocity", "floor_normal", "slope_stop_min_velocity", "max_bounces", "floor_max_angle"), &KinematicBody2D::move_and_slide, DEFVAL(Vector2(0, 0)), DEFVAL(5), DEFVAL(4), DEFVAL(Math::deg2rad((float)45))); ClassDB::bind_method(D_METHOD("test_move", "from", "rel_vec"), &KinematicBody2D::test_move); - ClassDB::bind_method(D_METHOD("get_travel"), &KinematicBody2D::get_travel); - ClassDB::bind_method(D_METHOD("revert_motion"), &KinematicBody2D::revert_motion); - ClassDB::bind_method(D_METHOD("is_colliding"), &KinematicBody2D::is_colliding); + ClassDB::bind_method(D_METHOD("is_on_floor"), &KinematicBody2D::is_on_floor); + ClassDB::bind_method(D_METHOD("is_on_ceiling"), &KinematicBody2D::is_on_ceiling); + ClassDB::bind_method(D_METHOD("is_on_wall"), &KinematicBody2D::is_on_wall); + ClassDB::bind_method(D_METHOD("get_floor_velocity"), &KinematicBody2D::get_floor_velocity); - ClassDB::bind_method(D_METHOD("get_collision_pos"), &KinematicBody2D::get_collision_pos); - ClassDB::bind_method(D_METHOD("get_collision_normal"), &KinematicBody2D::get_collision_normal); - ClassDB::bind_method(D_METHOD("get_collider_velocity"), &KinematicBody2D::get_collider_velocity); - ClassDB::bind_method(D_METHOD("get_collider:Variant"), &KinematicBody2D::_get_collider); - ClassDB::bind_method(D_METHOD("get_collider_shape"), &KinematicBody2D::get_collider_shape); - ClassDB::bind_method(D_METHOD("get_collider_metadata:Variant"), &KinematicBody2D::get_collider_metadata); - ClassDB::bind_method(D_METHOD("get_move_and_slide_colliders"), &KinematicBody2D::get_move_and_slide_colliders); - ClassDB::bind_method(D_METHOD("is_move_and_slide_on_floor"), &KinematicBody2D::is_move_and_slide_on_floor); - ClassDB::bind_method(D_METHOD("is_move_and_slide_on_ceiling"), &KinematicBody2D::is_move_and_slide_on_ceiling); - ClassDB::bind_method(D_METHOD("is_move_and_slide_on_wall"), &KinematicBody2D::is_move_and_slide_on_wall); + ClassDB::bind_method(D_METHOD("set_safe_margin", "pixels"), &KinematicBody2D::set_safe_margin); + ClassDB::bind_method(D_METHOD("get_safe_margin", "pixels"), &KinematicBody2D::get_safe_margin); - ClassDB::bind_method(D_METHOD("set_collision_margin", "pixels"), &KinematicBody2D::set_collision_margin); - ClassDB::bind_method(D_METHOD("get_collision_margin", "pixels"), &KinematicBody2D::get_collision_margin); + ClassDB::bind_method(D_METHOD("get_collision_count"), &KinematicBody2D::get_collision_count); + ClassDB::bind_method(D_METHOD("get_collision_position", "collision"), &KinematicBody2D::get_collision_position); + ClassDB::bind_method(D_METHOD("get_collision_normal", "collision"), &KinematicBody2D::get_collision_normal); + ClassDB::bind_method(D_METHOD("get_collision_travel", "collision"), &KinematicBody2D::get_collision_travel); + ClassDB::bind_method(D_METHOD("get_collision_remainder", "collision"), &KinematicBody2D::get_collision_remainder); + ClassDB::bind_method(D_METHOD("get_collision_local_shape", "collision"), &KinematicBody2D::get_collision_local_shape); + ClassDB::bind_method(D_METHOD("get_collision_collider", "collision"), &KinematicBody2D::get_collision_collider); + ClassDB::bind_method(D_METHOD("get_collision_collider_id", "collision"), &KinematicBody2D::get_collision_collider_id); + ClassDB::bind_method(D_METHOD("get_collision_collider_shape", "collision"), &KinematicBody2D::get_collision_collider_shape); + ClassDB::bind_method(D_METHOD("get_collision_collider_shape_index", "collision"), &KinematicBody2D::get_collision_collider_shape_index); + ClassDB::bind_method(D_METHOD("get_collision_collider_velocity", "collision"), &KinematicBody2D::get_collision_collider_velocity); + ClassDB::bind_method(D_METHOD("get_collision_collider_metadata", "collision"), &KinematicBody2D::get_collision_collider_metadata); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "collision/margin", PROPERTY_HINT_RANGE, "0.001,256,0.001"), "set_collision_margin", "get_collision_margin"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "collision/safe_margin", PROPERTY_HINT_RANGE, "0.001,256,0.001"), "set_safe_margin", "get_safe_margin"); } KinematicBody2D::KinematicBody2D() : PhysicsBody2D(Physics2DServer::BODY_MODE_KINEMATIC) { - colliding = false; - collider = 0; - - collider_shape = 0; - margin = 0.08; - move_and_slide_on_floor = false; - move_and_slide_on_ceiling = false; - move_and_slide_on_wall = false; + on_floor = false; + on_ceiling = false; + on_wall = false; } KinematicBody2D::~KinematicBody2D() { } diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 50c9865f18..8c8e4ebc77 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -40,8 +40,6 @@ class PhysicsBody2D : public CollisionObject2D { uint32_t collision_layer; uint32_t collision_mask; - Vector2 one_way_collision_direction; - float one_way_collision_max_depth; void _set_layers(uint32_t p_mask); uint32_t _get_layers() const; @@ -68,12 +66,6 @@ public: void add_collision_exception_with(Node *p_node); //must be physicsbody void remove_collision_exception_with(Node *p_node); - void set_one_way_collision_direction(const Vector2 &p_dir); - Vector2 get_one_way_collision_direction() const; - - void set_one_way_collision_max_depth(float p_dir); - float get_one_way_collision_max_depth() const; - PhysicsBody2D(); }; @@ -272,54 +264,60 @@ class KinematicBody2D : public PhysicsBody2D { GDCLASS(KinematicBody2D, PhysicsBody2D); +public: + struct Collision { + Vector2 collision; + Vector2 normal; + Vector2 collider_vel; + ObjectID collider; + int collider_shape; + Variant collider_metadata; + Vector2 remainder; + Vector2 travel; + int local_shape; + }; + +private: float margin; - bool colliding; - Vector2 collision; - Vector2 normal; - Vector2 collider_vel; - ObjectID collider; - int collider_shape; - Variant collider_metadata; - Vector2 travel; - - Vector2 move_and_slide_floor_velocity; - bool move_and_slide_on_floor; - bool move_and_slide_on_ceiling; - bool move_and_slide_on_wall; - Array move_and_slide_colliders; - - Variant _get_collider() const; + + Vector2 floor_velocity; + bool on_floor; + bool on_ceiling; + bool on_wall; + Vector<Collision> colliders; _FORCE_INLINE_ bool _ignores_mode(Physics2DServer::BodyMode) const; + Dictionary _move(const Vector2 &p_motion); + protected: static void _bind_methods(); public: - Vector2 move(const Vector2 &p_motion); - Vector2 move_to(const Vector2 &p_position); - + bool move(const Vector2 &p_motion, Collision &r_collision); bool test_move(const Transform2D &p_from, const Vector2 &p_motion); - bool is_colliding() const; - - Vector2 get_travel() const; - void revert_motion(); - - Vector2 get_collision_pos() const; - Vector2 get_collision_normal() const; - Vector2 get_collider_velocity() const; - ObjectID get_collider() const; - int get_collider_shape() const; - Variant get_collider_metadata() const; - void set_collision_margin(float p_margin); - float get_collision_margin() const; + void set_safe_margin(float p_margin); + float get_safe_margin() const; Vector2 move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_floor_direction = Vector2(0, 0), float p_slope_stop_min_velocity = 5, int p_max_bounces = 4, float p_floor_max_angle = Math::deg2rad((float)45)); - bool is_move_and_slide_on_floor() const; - bool is_move_and_slide_on_wall() const; - bool is_move_and_slide_on_ceiling() const; - Array get_move_and_slide_colliders() const; + bool is_on_floor() const; + bool is_on_wall() const; + bool is_on_ceiling() const; + Vector2 get_floor_velocity() const; + + int get_collision_count() const; + Vector2 get_collision_position(int p_collision) const; + Vector2 get_collision_normal(int p_collision) const; + Vector2 get_collision_travel(int p_collision) const; + Vector2 get_collision_remainder(int p_collision) const; + Object *get_collision_local_shape(int p_collision) const; + Object *get_collision_collider(int p_collision) const; + ObjectID get_collision_collider_id(int p_collision) const; + Object *get_collision_collider_shape(int p_collision) const; + int get_collision_collider_shape_index(int p_collision) const; + Vector2 get_collision_collider_velocity(int p_collision) const; + Variant get_collision_collider_metadata(int p_collision) const; KinematicBody2D(); ~KinematicBody2D(); diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index ff574a6bd6..450f8e2474 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -351,10 +351,12 @@ void Sprite::_bind_methods() { ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); ADD_PROPERTYNZ(PropertyInfo(Variant::OBJECT, "normal_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_normal_map", "get_normal_map"); + ADD_GROUP("Offset", ""); ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "centered"), "set_centered", "is_centered"); ADD_PROPERTYNZ(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset"); ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "flip_h"), "set_flip_h", "is_flipped_h"); ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "flip_v"), "set_flip_v", "is_flipped_v"); + ADD_GROUP("Animation", ""); ADD_PROPERTYNO(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTYNO(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 4f892a31fc..57e25ec609 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "tile_map.h" #include "io/marshalls.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" #include "os/os.h" #include "servers/physics_2d_server.h" @@ -441,35 +441,36 @@ void TileMap::_update_dirty_quadrants() { rect.position.y -= center.y; } + Ref<Texture> normal_map = tile_set->tile_get_normal_map(c.id); Color modulate = tile_set->tile_get_modulate(c.id); Color self_modulate = get_self_modulate(); modulate = Color(modulate.r * self_modulate.r, modulate.g * self_modulate.g, modulate.b * self_modulate.b, modulate.a * self_modulate.a); if (r == Rect2()) { - tex->draw_rect(canvas_item, rect, false, modulate, c.transpose); + tex->draw_rect(canvas_item, rect, false, modulate, c.transpose, normal_map); } else { - tex->draw_rect_region(canvas_item, rect, r, modulate, c.transpose); + tex->draw_rect_region(canvas_item, rect, r, modulate, c.transpose, normal_map); } - Vector<Ref<Shape2D> > shapes = tile_set->tile_get_shapes(c.id); + Vector<TileSet::ShapeData> shapes = tile_set->tile_get_shapes(c.id); for (int i = 0; i < shapes.size(); i++) { - Ref<Shape2D> shape = shapes[i]; + Ref<Shape2D> shape = shapes[i].shape; if (shape.is_valid()) { - - Vector2 shape_ofs = tile_set->tile_get_shape_offset(c.id); Transform2D xform; xform.set_origin(offset.floor()); - _fix_cell_transform(xform, c, shape_ofs + center_ofs, s); + _fix_cell_transform(xform, c, shapes[i].shape_offset + center_ofs, s); if (debug_canvas_item.is_valid()) { vs->canvas_item_add_set_transform(debug_canvas_item, xform); shape->draw(debug_canvas_item, debug_collision_color); } ps->body_add_shape(q.body, shape->get_rid(), xform); - ps->body_set_shape_metadata(q.body, shape_idx++, Vector2(E->key().x, E->key().y)); + shape_idx++; + ps->body_set_shape_as_one_way_collision(q.body, shape_idx, shapes[i].one_way_collision); + ps->body_set_shape_metadata(q.body, shape_idx, Vector2(E->key().x, E->key().y)); } } diff --git a/scene/3d/mesh_instance.cpp b/scene/3d/mesh_instance.cpp index 5b5bce342d..e755b1480b 100644 --- a/scene/3d/mesh_instance.cpp +++ b/scene/3d/mesh_instance.cpp @@ -98,7 +98,7 @@ void MeshInstance::_get_property_list(List<PropertyInfo> *p_list) const { if (mesh.is_valid()) { for (int i = 0; i < mesh->get_surface_count(); i++) { - p_list->push_back(PropertyInfo(Variant::OBJECT, "material/" + itos(i), PROPERTY_HINT_RESOURCE_TYPE, "Material")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "material/" + itos(i), PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,SpatialMaterial")); } } } diff --git a/scene/3d/particles.cpp b/scene/3d/particles.cpp index 71079ea780..c291aa33ed 100644 --- a/scene/3d/particles.cpp +++ b/scene/3d/particles.cpp @@ -58,6 +58,13 @@ void Particles::set_lifetime(float p_lifetime) { lifetime = p_lifetime; VS::get_singleton()->particles_set_lifetime(particles, lifetime); } + +void Particles::set_one_shot(bool p_one_shot) { + + one_shot = p_one_shot; + VS::get_singleton()->particles_set_one_shot(particles, one_shot); +} + void Particles::set_pre_process_time(float p_time) { pre_process_time = p_time; @@ -114,6 +121,11 @@ float Particles::get_lifetime() const { return lifetime; } +bool Particles::get_one_shot() const { + + return one_shot; +} + float Particles::get_pre_process_time() const { return pre_process_time; @@ -233,6 +245,11 @@ String Particles::get_configuration_warning() const { return warnings; } +void Particles::restart() { + + VisualServer::get_singleton()->particles_restart(particles); +} + Rect3 Particles::capture_aabb() const { return VS::get_singleton()->particles_get_current_aabb(particles); @@ -254,6 +271,7 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &Particles::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &Particles::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &Particles::set_lifetime); + ClassDB::bind_method(D_METHOD("set_one_shot", "enable"), &Particles::set_one_shot); ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &Particles::set_pre_process_time); ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &Particles::set_explosiveness_ratio); ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &Particles::set_randomness_ratio); @@ -267,6 +285,7 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("is_emitting"), &Particles::is_emitting); ClassDB::bind_method(D_METHOD("get_amount"), &Particles::get_amount); ClassDB::bind_method(D_METHOD("get_lifetime"), &Particles::get_lifetime); + ClassDB::bind_method(D_METHOD("get_one_shot"), &Particles::get_one_shot); ClassDB::bind_method(D_METHOD("get_pre_process_time"), &Particles::get_pre_process_time); ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &Particles::get_explosiveness_ratio); ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &Particles::get_randomness_ratio); @@ -287,23 +306,26 @@ void Particles::_bind_methods() { ClassDB::bind_method(D_METHOD("get_draw_passes"), &Particles::get_draw_passes); ClassDB::bind_method(D_METHOD("get_draw_pass_mesh:Mesh", "pass"), &Particles::get_draw_pass_mesh); + ClassDB::bind_method(D_METHOD("restart"), &Particles::restart); ClassDB::bind_method(D_METHOD("capture_aabb"), &Particles::capture_aabb); - ADD_GROUP("Parameters", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting"); ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,100000,1"), "set_amount", "get_amount"); + ADD_GROUP("Time", ""); ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01"), "set_lifetime", "get_lifetime"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "get_one_shot"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "preprocess", PROPERTY_HINT_RANGE, "0.00,600.0,0.01"), "set_pre_process_time", "get_pre_process_time"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "randomness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_randomness_ratio", "get_randomness_ratio"); - ADD_PROPERTY(PropertyInfo(Variant::RECT3, "visibility_aabb"), "set_visibility_aabb", "get_visibility_aabb"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "local_coords"), "set_use_local_coordinates", "get_use_local_coordinates"); ADD_PROPERTY(PropertyInfo(Variant::INT, "fixed_fps", PROPERTY_HINT_RANGE, "0,1000,1"), "set_fixed_fps", "get_fixed_fps"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fract_delta"), "set_fractional_delta", "get_fractional_delta"); + ADD_GROUP("Drawing", ""); + ADD_PROPERTY(PropertyInfo(Variant::RECT3, "visibility_aabb"), "set_visibility_aabb", "get_visibility_aabb"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "local_coords"), "set_use_local_coordinates", "get_use_local_coordinates"); ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_order", PROPERTY_HINT_ENUM, "Index,Lifetime,View Depth"), "set_draw_order", "get_draw_order"); ADD_GROUP("Process Material", ""); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ParticlesMaterial,ShaderMaterial"), "set_process_material", "get_process_material"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,ParticlesMaterial"), "set_process_material", "get_process_material"); ADD_GROUP("Draw Passes", "draw_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_passes", PROPERTY_HINT_RANGE, "0," + itos(MAX_DRAW_PASSES) + ",1"), "set_draw_passes", "get_draw_passes"); for (int i = 0; i < MAX_DRAW_PASSES; i++) { @@ -322,6 +344,7 @@ Particles::Particles() { particles = VS::get_singleton()->particles_create(); set_base(particles); set_emitting(true); + set_one_shot(false); set_amount(8); set_lifetime(1); set_fixed_fps(0); @@ -404,6 +427,7 @@ void ParticlesMaterial::init_shaders() { shader_names->emission_texture_point_count = "emission_texture_point_count"; shader_names->emission_texture_points = "emission_texture_points"; shader_names->emission_texture_normal = "emission_texture_normal"; + shader_names->emission_texture_color = "emission_texture_color"; shader_names->trail_divisor = "trail_divisor"; shader_names->trail_size_modifier = "trail_size_modifier"; @@ -481,6 +505,28 @@ void ParticlesMaterial::_update_shader() { code += "uniform float anim_speed_random;\n"; code += "uniform float anim_offset_random;\n"; + switch (emission_shape) { + case EMISSION_SHAPE_POINT: { + //do none + } break; + case EMISSION_SHAPE_SPHERE: { + code += "uniform float emission_sphere_radius;\n"; + } break; + case EMISSION_SHAPE_BOX: { + code += "uniform vec3 emission_box_extents;\n"; + } break; + case EMISSION_SHAPE_DIRECTED_POINTS: { + code += "uniform sampler2D emission_texture_normal : hint_black;\n"; + } //fallthrough + case EMISSION_SHAPE_POINTS: { + code += "uniform sampler2D emission_texture_points : hint_black;\n"; + code += "uniform int emission_texture_point_count;\n"; + if (emission_color_texture.is_valid()) { + code += "uniform sampler2D emission_texture_color : hint_white;\n"; + } + } break; + } + code += "uniform vec4 color_value : hint_color;\n"; code += "uniform int trail_divisor;\n"; @@ -515,25 +561,6 @@ void ParticlesMaterial::_update_shader() { if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) code += "uniform sampler2D anim_offset_texture;\n"; - switch (emission_shape) { - case EMISSION_SHAPE_POINT: { - //do none - } break; - case EMISSION_SHAPE_SPHERE: { - code += "uniform float emission_sphere_radius;\n"; - } break; - case EMISSION_SHAPE_BOX: { - code += "uniform vec3 emission_box_extents;\n"; - } break; - case EMISSION_SHAPE_DIRECTED_POINTS: { - code += "uniform sampler2D emission_texture_normal : hint_black;\n"; - } //fallthrough - case EMISSION_SHAPE_POINTS: { - code += "uniform sampler2D emission_texture_points : hint_black;\n"; - code += "uniform int emission_texture_point_count;\n"; - } break; - } - if (trail_size_modifier.is_valid()) { code += "uniform sampler2D trail_size_modifier;\n"; } @@ -567,7 +594,7 @@ void ParticlesMaterial::_update_shader() { code += "\n"; code += " uint base_number=NUMBER/uint(trail_divisor);\n"; - code += " uint alt_seed=hash(base_number+uint(1));\n"; + code += " uint alt_seed=hash(base_number+uint(1)+RANDOM_SEED);\n"; code += " float angle_rand=rand_from_seed(alt_seed);\n"; code += " float scale_rand=rand_from_seed(alt_seed);\n"; code += " float hue_rot_rand=rand_from_seed(alt_seed);\n"; @@ -576,6 +603,11 @@ void ParticlesMaterial::_update_shader() { code += "\n"; code += "\n"; code += "\n"; + if (emission_shape >= EMISSION_SHAPE_POINTS) { + code += " int point = min(emission_texture_point_count-1,int(rand_from_seed(alt_seed) * float(emission_texture_point_count)));\n"; + code += " ivec2 emission_tex_size = textureSize( emission_texture_points, 0 );\n"; + code += " ivec2 emission_tex_ofs = ivec2( point % emission_tex_size.x, point / emission_tex_size.x );\n"; + } code += " if (RESTART) {\n"; if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) @@ -593,11 +625,21 @@ void ParticlesMaterial::_update_shader() { else code += " float tex_anim_offset = 0.0;\n"; - code += " float angle1 = rand_from_seed(alt_seed)*spread*3.1416;\n"; - code += " float angle2 = rand_from_seed(alt_seed)*20.0*3.1416; // make it more random like\n"; - code += " vec3 rot_xz=vec3( sin(angle1), 0.0, cos(angle1) );\n"; - code += " vec3 rot = vec3( cos(angle2)*rot_xz.x,sin(angle2)*rot_xz.x, rot_xz.z);\n"; - code += " VELOCITY=(rot*initial_linear_velocity+rot*initial_linear_velocity_random*rand_from_seed(alt_seed));\n"; + if (flags[FLAG_DISABLE_Z]) { + + code += " float angle1 = rand_from_seed(alt_seed)*spread*3.1416;\n"; + code += " vec3 rot=vec3( cos(angle1), sin(angle1),0.0 );\n"; + code += " VELOCITY=(rot*initial_linear_velocity+rot*initial_linear_velocity_random*rand_from_seed(alt_seed));\n"; + + } else { + //initiate velocity spread in 3D + code += " float angle1 = rand_from_seed(alt_seed)*spread*3.1416;\n"; + code += " float angle2 = rand_from_seed(alt_seed)*20.0*3.1416; // make it more random like\n"; + code += " vec3 rot_xz=vec3( sin(angle1), 0.0, cos(angle1) );\n"; + code += " vec3 rot = vec3( cos(angle2)*rot_xz.x,sin(angle2)*rot_xz.x, rot_xz.z);\n"; + code += " VELOCITY=(rot*initial_linear_velocity+rot*initial_linear_velocity_random*rand_from_seed(alt_seed));\n"; + } + code += " float base_angle=(initial_angle+tex_angle)*mix(1.0,angle_rand,initial_angle_random);\n"; code += " CUSTOM.x=base_angle*3.1416/180.0;\n"; //angle code += " CUSTOM.y=0.0;\n"; //phase @@ -614,21 +656,31 @@ void ParticlesMaterial::_update_shader() { } break; case EMISSION_SHAPE_POINTS: case EMISSION_SHAPE_DIRECTED_POINTS: { - code += " int point = min(emission_texture_point_count-1,int(rand_from_seed(alt_seed) * float(emission_texture_point_count)));\n"; - code += " ivec2 tex_size = textureSize( emission_texture_points, 0 );\n"; - code += " ivec2 tex_ofs = ivec2( point % tex_size.x, point / tex_size.x );\n"; - code += " TRANSFORM[3].xyz = texelFetch(emission_texture_points, tex_ofs,0).xyz;\n"; + code += " TRANSFORM[3].xyz = texelFetch(emission_texture_points, emission_tex_ofs,0).xyz;\n"; + if (emission_shape == EMISSION_SHAPE_DIRECTED_POINTS) { - code += " vec3 normal = texelFetch(emission_texture_normal, tex_ofs,0).xyz;\n"; - code += " vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0, 1.0, 0.0);\n"; - code += " vec3 tangent = normalize(cross(v0, normal));\n"; - code += " vec3 bitangent = normalize(cross(tangent, normal));\n"; - code += " VELOCITY = mat3(tangent,bitangent,normal) * VELOCITY;\n"; + if (flags[FLAG_DISABLE_Z]) { + + code += " mat2 rotm;"; + code += " rotm[0]=texelFetch(emission_texture_normal, emission_tex_ofs,0).xy;\n"; + code += " rotm[1]=rotm[0].yx * vec2(1.0,-1.0);\n"; + code += " VELOCITY.xy = rotm * VELOCITY.xy;\n"; + } else { + code += " vec3 normal = texelFetch(emission_texture_normal, emission_tex_ofs,0).xyz;\n"; + code += " vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0, 1.0, 0.0);\n"; + code += " vec3 tangent = normalize(cross(v0, normal));\n"; + code += " vec3 bitangent = normalize(cross(tangent, normal));\n"; + code += " VELOCITY = mat3(tangent,bitangent,normal) * VELOCITY;\n"; + } } } break; } code += " VELOCITY = (EMISSION_TRANSFORM * vec4(VELOCITY,0.0)).xyz;\n"; code += " TRANSFORM = EMISSION_TRANSFORM * TRANSFORM;\n"; + if (flags[FLAG_DISABLE_Z]) { + code += " VELOCITY.z=0.0;\n"; + code += " TRANSFORM[3].z=0.0;\n"; + } code += " } else {\n"; @@ -685,6 +737,9 @@ void ParticlesMaterial::_update_shader() { code += " vec3 force = gravity; \n"; code += " vec3 pos = TRANSFORM[3].xyz; \n"; + if (flags[FLAG_DISABLE_Z]) { + code += " pos.z=0.0; \n"; + } code += " //apply linear acceleration\n"; code += " force+=normalize(VELOCITY) * (linear_accel+tex_linear_accel)*mix(1.0,rand_from_seed(alt_seed),linear_accel_random);\n"; code += " //apply radial acceleration\n"; @@ -693,11 +748,17 @@ void ParticlesMaterial::_update_shader() { code += " //org=p_transform.origin;\n"; code += " force+=normalize(pos-org) * (radial_accel+tex_radial_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random);\n"; code += " //apply tangential acceleration;\n"; - code += " force+=normalize(cross(normalize(pos-org),normalize(gravity))) * ((tangent_accel+tex_tangent_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random));\n"; + if (flags[FLAG_DISABLE_Z]) { + code += " force+=vec3(normalize((pos-org).yx * vec2(-1.0,1.0)),0.0) * ((tangent_accel+tex_tangent_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random));\n"; + + } else { + code += " force+=normalize(cross(normalize(pos-org),normalize(gravity))) * ((tangent_accel+tex_tangent_accel)*mix(1.0,rand_from_seed(alt_seed),radial_accel_random));\n"; + } code += " //apply attractor forces\n"; code += " VELOCITY+=force * DELTA;\n"; - if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) + if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { code += " VELOCITY=normalize(VELOCITY)*tex_linear_velocity;\n"; + } code += " if (damping+tex_damping>0.0) {\n"; code += " \n"; code += " float v = length(VELOCITY);\n"; @@ -709,9 +770,16 @@ void ParticlesMaterial::_update_shader() { code += " VELOCITY=normalize(VELOCITY) * v;\n"; code += " }\n"; code += " }\n"; - code += " float base_angle=(initial_angle+tex_angle)*mix(1.0,angle_rand,initial_angle_random)*3.1416/180.0;\n"; - code += " CUSTOM.x=((base_angle+tex_angle)+CUSTOM.y*LIFETIME*(angular_velocity+tex_angular_velocity)*mix(1.0,rand_from_seed(alt_seed)*2.0-1.0,angular_velocity_random))*3.1416/180.0;\n"; //angle - code += " CUSTOM.z=(anim_offset+tex_anim_offset)*mix(1.0,anim_offset_rand,anim_offset_random)+CUSTOM.y*LIFETIME*(anim_speed+tex_anim_speed)*mix(1.0,rand_from_seed(alt_seed),anim_speed_random);\n"; //angle + code += " float base_angle=(initial_angle+tex_angle)*mix(1.0,angle_rand,initial_angle_random);\n"; + code += " base_angle+=CUSTOM.y*LIFETIME*(angular_velocity+tex_angular_velocity)*mix(1.0,rand_from_seed(alt_seed)*2.0-1.0,angular_velocity_random);\n"; + code += " CUSTOM.x=base_angle*3.1416/180.0;\n"; //angle + code += " CUSTOM.z=(anim_offset+tex_anim_offset)*mix(1.0,anim_offset_rand,anim_offset_random)+CUSTOM.y*(anim_speed+tex_anim_speed)*mix(1.0,rand_from_seed(alt_seed),anim_speed_random);\n"; //angle + if (flags[FLAG_ANIM_LOOP]) { + code += " CUSTOM.z=mod(CUSTOM.z,1.0);\n"; //loop + + } else { + code += " CUSTOM.z=clamp(CUSTOM.z,0.0,1.0);\n"; //0 to 1 only + } code += " }\n"; //apply color //apply hue rotation @@ -747,28 +815,40 @@ void ParticlesMaterial::_update_shader() { } else { code += " COLOR = color_value * hue_rot_mat;\n"; } + if (emission_color_texture.is_valid() && emission_shape >= EMISSION_SHAPE_POINTS) { + code += " COLOR*= texelFetch(emission_texture_color,emission_tex_ofs,0);\n"; + } if (trail_color_modifier.is_valid()) { code += "if (trail_divisor>1) { COLOR*=textureLod(trail_color_modifier,vec2(float(int(NUMBER)%trail_divisor)/float(trail_divisor-1),0.0),0.0); }\n"; } code += "\n"; - //orient particle Y towards velocity - if (flags[FLAG_ALIGN_Y_TO_VELOCITY]) { - code += " if (length(VELOCITY)>0.0) {TRANSFORM[1].xyz=normalize(VELOCITY);} else {TRANSFORM[1].xyz=normalize(TRANSFORM[1].xyz);}\n"; - code += " if (TRANSFORM[1].xyz==normalize(TRANSFORM[0].xyz)) {\n"; - code += "\tTRANSFORM[0].xyz=normalize(cross(normalize(TRANSFORM[1].xyz),normalize(TRANSFORM[2].xyz)));\n"; - code += "\tTRANSFORM[2].xyz=normalize(cross(normalize(TRANSFORM[0].xyz),normalize(TRANSFORM[1].xyz)));\n"; - code += " } else {\n"; - code += "\tTRANSFORM[2].xyz=normalize(cross(normalize(TRANSFORM[0].xyz),normalize(TRANSFORM[1].xyz)));\n"; - code += "\tTRANSFORM[0].xyz=normalize(cross(normalize(TRANSFORM[1].xyz),normalize(TRANSFORM[2].xyz)));\n"; - code += " }\n"; + + if (flags[FLAG_DISABLE_Z]) { + + code += " TRANSFORM[0]=vec4(cos(CUSTOM.x),-sin(CUSTOM.x),0.0,0.0);\n"; + code += " TRANSFORM[1]=vec4(sin(CUSTOM.x),cos(CUSTOM.x),0.0,0.0);\n"; + code += " TRANSFORM[2]=vec4(0.0,0.0,1.0,0.0);\n"; + } else { - code += "\tTRANSFORM[0].xyz=normalize(TRANSFORM[0].xyz);\n"; - code += "\tTRANSFORM[1].xyz=normalize(TRANSFORM[1].xyz);\n"; - code += "\tTRANSFORM[2].xyz=normalize(TRANSFORM[2].xyz);\n"; - } - //turn particle by rotation in Y - if (flags[FLAG_ROTATE_Y]) { - code += "\tTRANSFORM = TRANSFORM * mat4( vec4(cos(CUSTOM.x),0.0,-sin(CUSTOM.x),0.0), vec4(0.0,1.0,0.0,0.0),vec4(sin(CUSTOM.x),0.0,cos(CUSTOM.x),0.0),vec4(0.0,0.0,0.0,1.0));\n"; + //orient particle Y towards velocity + if (flags[FLAG_ALIGN_Y_TO_VELOCITY]) { + code += " if (length(VELOCITY)>0.0) {TRANSFORM[1].xyz=normalize(VELOCITY);} else {TRANSFORM[1].xyz=normalize(TRANSFORM[1].xyz);}\n"; + code += " if (TRANSFORM[1].xyz==normalize(TRANSFORM[0].xyz)) {\n"; + code += "\tTRANSFORM[0].xyz=normalize(cross(normalize(TRANSFORM[1].xyz),normalize(TRANSFORM[2].xyz)));\n"; + code += "\tTRANSFORM[2].xyz=normalize(cross(normalize(TRANSFORM[0].xyz),normalize(TRANSFORM[1].xyz)));\n"; + code += " } else {\n"; + code += "\tTRANSFORM[2].xyz=normalize(cross(normalize(TRANSFORM[0].xyz),normalize(TRANSFORM[1].xyz)));\n"; + code += "\tTRANSFORM[0].xyz=normalize(cross(normalize(TRANSFORM[1].xyz),normalize(TRANSFORM[2].xyz)));\n"; + code += " }\n"; + } else { + code += "\tTRANSFORM[0].xyz=normalize(TRANSFORM[0].xyz);\n"; + code += "\tTRANSFORM[1].xyz=normalize(TRANSFORM[1].xyz);\n"; + code += "\tTRANSFORM[2].xyz=normalize(TRANSFORM[2].xyz);\n"; + } + //turn particle by rotation in Y + if (flags[FLAG_ROTATE_Y]) { + code += "\tTRANSFORM = TRANSFORM * mat4( vec4(cos(CUSTOM.x),0.0,-sin(CUSTOM.x),0.0), vec4(0.0,1.0,0.0,0.0),vec4(sin(CUSTOM.x),0.0,cos(CUSTOM.x),0.0),vec4(0.0,0.0,0.0,1.0));\n"; + } } //scale by scale code += " float base_scale=mix(scale*tex_scale,1.0,scale_random*scale_rand);\n"; @@ -779,6 +859,10 @@ void ParticlesMaterial::_update_shader() { code += " TRANSFORM[0].xyz*=base_scale;\n"; code += " TRANSFORM[1].xyz*=base_scale;\n"; code += " TRANSFORM[2].xyz*=base_scale;\n"; + if (flags[FLAG_DISABLE_Z]) { + code += " VELOCITY.z=0.0;\n"; + code += " TRANSFORM[3].z=0.0;\n"; + } code += "}\n"; code += "\n"; @@ -1021,16 +1105,9 @@ void ParticlesMaterial::set_param_texture(Parameter p_param, const Ref<Texture> case PARAM_SCALE: { VisualServer::get_singleton()->material_set_param(_get_material(), shader_names->scale_texture, p_texture); - Ref<CurveTexture> curve = p_texture; - if (curve.is_valid()) { - if (curve->get_min() == 0 && curve->get_max() == 1) { - - curve->set_max(32); - PoolVector<Vector2> points; - points.push_back(Vector2(0, 1)); - points.push_back(Vector2(1, 1)); - curve->set_points(points); - } + Ref<CurveTexture> curve_tex = p_texture; + if (curve_tex.is_valid()) { + curve_tex->ensure_default_setup(); } } break; @@ -1130,6 +1207,16 @@ void ParticlesMaterial::set_emission_normal_texture(const Ref<Texture> &p_normal VisualServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_normal, texture); } +void ParticlesMaterial::set_emission_color_texture(const Ref<Texture> &p_colors) { + + emission_color_texture = p_colors; + RID texture; + if (p_colors.is_valid()) + texture = p_colors->get_rid(); + VisualServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_color, texture); + _queue_shader_change(); +} + void ParticlesMaterial::set_emission_point_count(int p_count) { emission_point_count = p_count; @@ -1158,6 +1245,11 @@ Ref<Texture> ParticlesMaterial::get_emission_normal_texture() const { return emission_normal_texture; } +Ref<Texture> ParticlesMaterial::get_emission_color_texture() const { + + return emission_color_texture; +} + int ParticlesMaterial::get_emission_point_count() const { return emission_point_count; @@ -1181,14 +1273,7 @@ void ParticlesMaterial::set_trail_size_modifier(const Ref<CurveTexture> &p_trail Ref<CurveTexture> curve = trail_size_modifier; if (curve.is_valid()) { - if (curve->get_min() == 0 && curve->get_max() == 1) { - - curve->set_max(32); - PoolVector<Vector2> points; - points.push_back(Vector2(0, 1)); - points.push_back(Vector2(1, 1)); - curve->set_points(points); - } + curve->ensure_default_setup(); } RID texture; @@ -1247,7 +1332,7 @@ void ParticlesMaterial::_validate_property(PropertyInfo &property) const { property.usage = 0; } - if (property.name == "emission_point_texture" && (emission_shape != EMISSION_SHAPE_POINTS && emission_shape != EMISSION_SHAPE_DIRECTED_POINTS)) { + if ((property.name == "emission_point_texture" || property.name == "emission_color_texture") && (emission_shape < EMISSION_SHAPE_POINTS)) { property.usage = 0; } @@ -1301,6 +1386,9 @@ void ParticlesMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_emission_normal_texture", "texture:Texture"), &ParticlesMaterial::set_emission_normal_texture); ClassDB::bind_method(D_METHOD("get_emission_normal_texture:Texture"), &ParticlesMaterial::get_emission_normal_texture); + ClassDB::bind_method(D_METHOD("set_emission_color_texture", "texture:Texture"), &ParticlesMaterial::set_emission_color_texture); + ClassDB::bind_method(D_METHOD("get_emission_color_texture:Texture"), &ParticlesMaterial::get_emission_color_texture); + ClassDB::bind_method(D_METHOD("set_emission_point_count", "point_count"), &ParticlesMaterial::set_emission_point_count); ClassDB::bind_method(D_METHOD("get_emission_point_count"), &ParticlesMaterial::get_emission_point_count); @@ -1326,10 +1414,12 @@ void ParticlesMaterial::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "emission_box_extents"), "set_emission_box_extents", "get_emission_box_extents"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "emission_point_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_emission_point_texture", "get_emission_point_texture"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "emission_normal_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_emission_normal_texture", "get_emission_normal_texture"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "emission_color_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_emission_color_texture", "get_emission_color_texture"); ADD_PROPERTY(PropertyInfo(Variant::INT, "emission_point_count", PROPERTY_HINT_RANGE, "0,1000000,1"), "set_emission_point_count", "get_emission_point_count"); ADD_GROUP("Flags", "flag_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flag_align_y"), "set_flag", "get_flag", FLAG_ALIGN_Y_TO_VELOCITY); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flag_rotate_y"), "set_flag", "get_flag", FLAG_ROTATE_Y); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "flag_disable_z"), "set_flag", "get_flag", FLAG_DISABLE_Z); ADD_GROUP("Spread", ""); ADD_PROPERTY(PropertyInfo(Variant::REAL, "spread", PROPERTY_HINT_RANGE, "0,180,0.01"), "set_spread", "get_spread"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "flatness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_flatness", "get_flatness"); @@ -1379,12 +1469,13 @@ void ParticlesMaterial::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::REAL, "hue_variation_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_HUE_VARIATION); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "hue_variation_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_HUE_VARIATION); ADD_GROUP("Animation", "anim_"); - ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anim_speed", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_ANIM_SPEED); + ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anim_speed", PROPERTY_HINT_RANGE, "0,128,0.01"), "set_param", "get_param", PARAM_ANIM_SPEED); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anim_speed_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_ANIM_SPEED); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "anim_speed_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_ANIM_SPEED); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anim_offset", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param", "get_param", PARAM_ANIM_OFFSET); ADD_PROPERTYI(PropertyInfo(Variant::REAL, "anim_offset_random", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_param_randomness", "get_param_randomness", PARAM_ANIM_OFFSET); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "anim_offset_curve", PROPERTY_HINT_RESOURCE_TYPE, "CurveTexture"), "set_param_texture", "get_param_texture", PARAM_ANIM_OFFSET); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "anim_loop"), "set_flag", "get_flag", FLAG_ANIM_LOOP); BIND_CONSTANT(PARAM_INITIAL_LINEAR_VELOCITY); BIND_CONSTANT(PARAM_ANGULAR_VELOCITY); diff --git a/scene/3d/particles.h b/scene/3d/particles.h index 63ebd7ed7b..0549eb4c09 100644 --- a/scene/3d/particles.h +++ b/scene/3d/particles.h @@ -58,6 +58,7 @@ private: RID particles; bool emitting; + bool one_shot; int amount; float lifetime; float pre_process_time; @@ -86,6 +87,7 @@ public: void set_emitting(bool p_emitting); void set_amount(int p_amount); void set_lifetime(float p_lifetime); + void set_one_shot(bool p_enabled); void set_pre_process_time(float p_time); void set_explosiveness_ratio(float p_ratio); void set_randomness_ratio(float p_ratio); @@ -97,6 +99,7 @@ public: bool is_emitting() const; int get_amount() const; float get_lifetime() const; + bool get_one_shot() const; float get_pre_process_time() const; float get_explosiveness_ratio() const; float get_randomness_ratio() const; @@ -122,6 +125,8 @@ public: virtual String get_configuration_warning() const; + void restart(); + Rect3 capture_aabb() const; Particles(); ~Particles(); @@ -154,6 +159,8 @@ public: enum Flags { FLAG_ALIGN_Y_TO_VELOCITY, FLAG_ROTATE_Y, + FLAG_DISABLE_Z, + FLAG_ANIM_LOOP, FLAG_MAX }; @@ -171,11 +178,12 @@ private: struct { uint32_t texture_mask : 16; uint32_t texture_color : 1; - uint32_t flags : 2; + uint32_t flags : 4; uint32_t emission_shape : 2; uint32_t trail_size_texture : 1; uint32_t trail_color_texture : 1; uint32_t invalid_key : 1; + uint32_t has_emission_color : 1; }; uint32_t key; @@ -213,6 +221,7 @@ private: mk.emission_shape = emission_shape; mk.trail_color_texture = trail_color_modifier.is_valid() ? 1 : 0; mk.trail_size_texture = trail_size_modifier.is_valid() ? 1 : 0; + mk.has_emission_color = emission_shape >= EMISSION_SHAPE_POINTS && emission_color_texture.is_valid(); return mk; } @@ -269,6 +278,7 @@ private: StringName emission_texture_point_count; StringName emission_texture_points; StringName emission_texture_normal; + StringName emission_texture_color; StringName trail_divisor; StringName trail_size_modifier; @@ -302,8 +312,11 @@ private: Vector3 emission_box_extents; Ref<Texture> emission_point_texture; Ref<Texture> emission_normal_texture; + Ref<Texture> emission_color_texture; int emission_point_count; + bool anim_loop; + int trail_divisor; Ref<CurveTexture> trail_size_modifier; @@ -347,6 +360,7 @@ public: void set_emission_box_extents(Vector3 p_extents); void set_emission_point_texture(const Ref<Texture> &p_points); void set_emission_normal_texture(const Ref<Texture> &p_normals); + void set_emission_color_texture(const Ref<Texture> &p_colors); void set_emission_point_count(int p_count); EmissionShape get_emission_shape() const; @@ -354,6 +368,7 @@ public: Vector3 get_emission_box_extents() const; Ref<Texture> get_emission_point_texture() const; Ref<Texture> get_emission_normal_texture() const; + Ref<Texture> get_emission_color_texture() const; int get_emission_point_count() const; void set_trail_divisor(int p_divisor); diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp index d535c545a8..5c29918118 100644 --- a/scene/3d/path.cpp +++ b/scene/3d/path.cpp @@ -108,40 +108,58 @@ void PathFollow::_update_transform() { Vector3 pos = c->interpolate_baked(o, cubic); Transform t = get_transform(); - if (rotation_mode != ROTATION_NONE) { - - Vector3 n = (c->interpolate_baked(o + lookahead, cubic) - pos).normalized(); - - if (rotation_mode == ROTATION_Y) { + t.origin = pos; + Vector3 pos_offset = Vector3(h_offset, v_offset, 0); - n.y = 0; - n.normalize(); - } + if (rotation_mode != ROTATION_NONE) { + // perform parallel transport + // + // see C. Dougan, The Parallel Transport Frame, Game Programming Gems 2 for example + // for a discussion about why not Frenet frame. + + Vector3 t_prev = pos - c->interpolate_baked(o - lookahead, cubic); + Vector3 t_cur = c->interpolate_baked(o + lookahead, cubic) - pos; + + Vector3 axis = t_prev.cross(t_cur); + float dot = t_prev.normalized().dot(t_cur.normalized()); + float angle = Math::acos(CLAMP(dot, -1, 1)); + + if (axis.length() > CMP_EPSILON && angle > CMP_EPSILON) { + if (rotation_mode == ROTATION_Y) { + // assuming we're referring to global Y-axis. is this correct? + axis.x = 0; + axis.z = 0; + } else if (rotation_mode == ROTATION_XY) { + axis.z = 0; + } else if (rotation_mode == ROTATION_XYZ) { + // all components are OK + } - if (n.length() < CMP_EPSILON) { //nothing, use previous - n = -t.get_basis().get_axis(2).normalized(); + t.rotate_basis(axis.normalized(), angle); } - Vector3 up = Vector3(0, 1, 0); - - if (rotation_mode == ROTATION_XYZ) { - - float tilt = c->interpolate_baked_tilt(o); - if (tilt != 0) { - - Basis rot(-n, tilt); //remember.. lookat will be znegative.. znegative!! we abide by opengl clan. - up = rot.xform(up); + // do the additional tilting + float tilt_angle = c->interpolate_baked_tilt(o); + Vector3 tilt_axis = t_cur; // is this correct?? + + if (tilt_axis.length() > CMP_EPSILON && tilt_angle > CMP_EPSILON) { + if (rotation_mode == ROTATION_Y) { + tilt_axis.x = 0; + tilt_axis.z = 0; + } else if (rotation_mode == ROTATION_XY) { + tilt_axis.z = 0; + } else if (rotation_mode == ROTATION_XYZ) { + // all components are OK } - } - t.set_look_at(pos, pos + n, up); + t.rotate_basis(tilt_axis.normalized(), tilt_angle); + } + t.translate(pos_offset); } else { - - t.origin = pos; + t.origin += pos_offset; } - t.origin += t.basis.get_axis(0) * h_offset + t.basis.get_axis(1) * v_offset; set_transform(t); } diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index 3a55a2bc32..2a7a804470 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "physics_body.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" #include "scene/scene_string_names.h" void PhysicsBody::_notification(int p_what) { diff --git a/scene/3d/scenario_fx.cpp b/scene/3d/scenario_fx.cpp index 874c21546d..abc7766ecb 100644 --- a/scene/3d/scenario_fx.cpp +++ b/scene/3d/scenario_fx.cpp @@ -28,43 +28,44 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "scenario_fx.h" +#include "scene/main/viewport.h" void WorldEnvironment::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_WORLD) { + if (p_what == Spatial::NOTIFICATION_ENTER_WORLD || p_what == Spatial::NOTIFICATION_ENTER_TREE) { if (environment.is_valid()) { - if (get_world()->get_environment().is_valid()) { + if (get_viewport()->find_world()->get_environment().is_valid()) { WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding."); } - get_world()->set_environment(environment); - add_to_group("_world_environment_" + itos(get_world()->get_scenario().get_id())); + get_viewport()->find_world()->set_environment(environment); + add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); } - } else if (p_what == NOTIFICATION_EXIT_WORLD) { + } else if (p_what == Spatial::NOTIFICATION_EXIT_WORLD || p_what == Spatial::NOTIFICATION_EXIT_TREE) { - if (environment.is_valid() && get_world()->get_environment() == environment) { - get_world()->set_environment(Ref<Environment>()); - remove_from_group("_world_environment_" + itos(get_world()->get_scenario().get_id())); + if (environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) { + get_viewport()->find_world()->set_environment(Ref<Environment>()); + remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); } } } void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) { - if (is_inside_world() && environment.is_valid() && get_world()->get_environment() == environment) { - get_world()->set_environment(Ref<Environment>()); - remove_from_group("_world_environment_" + itos(get_world()->get_scenario().get_id())); + if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world()->get_environment() == environment) { + get_viewport()->find_world()->set_environment(Ref<Environment>()); + remove_from_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); //clean up } environment = p_environment; - if (is_inside_world() && environment.is_valid()) { - if (get_world()->get_environment().is_valid()) { + if (is_inside_tree() && environment.is_valid()) { + if (get_viewport()->find_world()->get_environment().is_valid()) { WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding."); } - get_world()->set_environment(environment); - add_to_group("_world_environment_" + itos(get_world()->get_scenario().get_id())); + get_viewport()->find_world()->set_environment(environment); + add_to_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id())); } update_configuration_warning(); @@ -77,11 +78,11 @@ Ref<Environment> WorldEnvironment::get_environment() const { String WorldEnvironment::get_configuration_warning() const { - if (!is_visible_in_tree() || !is_inside_tree() || !environment.is_valid()) + if (/*!is_visible_in_tree() ||*/ !is_inside_tree() || !environment.is_valid()) return String(); List<Node *> nodes; - get_tree()->get_nodes_in_group("_world_environment_" + itos(get_world()->get_scenario().get_id()), &nodes); + get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world()->get_scenario().get_id()), &nodes); if (nodes.size() > 1) { return TTR("Only one WorldEnvironment is allowed per scene (or set of instanced scenes)."); diff --git a/scene/3d/scenario_fx.h b/scene/3d/scenario_fx.h index b2a4bc5472..d1e0a63130 100644 --- a/scene/3d/scenario_fx.h +++ b/scene/3d/scenario_fx.h @@ -36,9 +36,9 @@ @author Juan Linietsky <reduzio@gmail.com> */ -class WorldEnvironment : public Spatial { +class WorldEnvironment : public Node { - GDCLASS(WorldEnvironment, Spatial); + GDCLASS(WorldEnvironment, Node); Ref<Environment> environment; diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index a95bb4a67f..78e8e92afc 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -273,10 +273,12 @@ void SpriteBase3D::_bind_methods() { ADD_GROUP("Flags", ""); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "transparent"), "set_draw_flag", "get_draw_flag", FLAG_TRANSPARENT); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "shaded"), "set_draw_flag", "get_draw_flag", FLAG_SHADED); + ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "double_sided"), "set_draw_flag", "get_draw_flag", FLAG_DOUBLE_SIDED); ADD_PROPERTY(PropertyInfo(Variant::INT, "alpha_cut", PROPERTY_HINT_ENUM, "Disabled,Discard,Opaque Pre-Pass"), "set_alpha_cut_mode", "get_alpha_cut_mode"); BIND_CONSTANT(FLAG_TRANSPARENT); BIND_CONSTANT(FLAG_SHADED); + BIND_CONSTANT(FLAG_DOUBLE_SIDED); BIND_CONSTANT(FLAG_MAX); BIND_CONSTANT(ALPHA_CUT_DISABLED); @@ -294,7 +296,7 @@ SpriteBase3D::SpriteBase3D() { pI = NULL; for (int i = 0; i < FLAG_MAX; i++) - flags[i] = i == FLAG_TRANSPARENT; + flags[i] = i == FLAG_TRANSPARENT || i == FLAG_DOUBLE_SIDED; axis = Vector3::AXIS_Z; pixel_size = 0.01; @@ -387,7 +389,7 @@ void Sprite3D::_draw() { int axis = get_axis(); normal[axis] = 1.0; - RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS); + RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS); VS::get_singleton()->immediate_set_material(immediate, mat); VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid()); @@ -579,10 +581,12 @@ void Sprite3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_hframes"), &Sprite3D::get_hframes); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture"); + ADD_GROUP("Animation", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "vframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_vframes", "get_vframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "hframes", PROPERTY_HINT_RANGE, "1,16384,1"), "set_hframes", "get_hframes"); ADD_PROPERTY(PropertyInfo(Variant::INT, "frame", PROPERTY_HINT_SPRITE_FRAME), "set_frame", "get_frame"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region"), "set_region", "is_region"); + ADD_GROUP("Region", "region_"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "region_enabled"), "set_region", "is_region"); ADD_PROPERTY(PropertyInfo(Variant::RECT2, "region_rect"), "set_region_rect", "get_region_rect"); ADD_SIGNAL(MethodInfo("frame_changed")); @@ -888,7 +892,7 @@ void AnimatedSprite3D::_draw() { int axis = get_axis(); normal[axis] = 1.0; - RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS); + RID mat = VS::get_singleton()->material_2d_get(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS); VS::get_singleton()->immediate_set_material(immediate, mat); VS::get_singleton()->immediate_begin(immediate, VS::PRIMITIVE_TRIANGLE_FAN, texture->get_rid()); diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 625b37c32e..b4600c00b8 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -41,6 +41,7 @@ public: enum DrawFlags { FLAG_TRANSPARENT, FLAG_SHADED, + FLAG_DOUBLE_SIDED, FLAG_MAX }; diff --git a/scene/3d/visual_instance.cpp b/scene/3d/visual_instance.cpp index 104fa0f70f..6f8c38eddd 100644 --- a/scene/3d/visual_instance.cpp +++ b/scene/3d/visual_instance.cpp @@ -316,7 +316,7 @@ void GeometryInstance::_bind_methods() { ClassDB::bind_method(D_METHOD("get_aabb"), &GeometryInstance::get_aabb); ADD_GROUP("Geometry", ""); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "Material"), "set_material_override", "get_material_override"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,SpatialMaterial"), "set_material_override", "get_material_override"); ADD_PROPERTY(PropertyInfo(Variant::INT, "cast_shadow", PROPERTY_HINT_ENUM, "Off,On,Double-Sided,Shadows Only"), "set_cast_shadows_setting", "get_cast_shadows_setting"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "extra_cull_margin", PROPERTY_HINT_RANGE, "0,16384,0"), "set_extra_cull_margin", "get_extra_cull_margin"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "visible_in_all_rooms"), "set_flag", "get_flag", FLAG_VISIBLE_IN_ALL_ROOMS); diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index 67920d177e..ad0b0fbfb2 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "tween.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" void Tween::_add_pending_command(StringName p_key, const Variant &p_arg1, const Variant &p_arg2, const Variant &p_arg3, const Variant &p_arg4, const Variant &p_arg5, const Variant &p_arg6, const Variant &p_arg7, const Variant &p_arg8, const Variant &p_arg9, const Variant &p_arg10) { diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index bc1b16bea8..9ef340edbc 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -48,7 +48,15 @@ void ColorPicker::_notification(int p_what) { btn_pick->set_icon(get_icon("screen_picker", "ColorPicker")); _update_color(); - } + } break; + + case MainLoop::NOTIFICATION_WM_QUIT_REQUEST: { + if (screen != NULL) { + if (screen->is_visible()) { + screen->hide(); + } + } + } break; } } @@ -84,9 +92,6 @@ void ColorPicker::set_pick_color(const Color &p_color) { if (!is_inside_tree()) return; - return; //it crashes, so returning - uv_edit->get_child(0)->cast_to<Control>()->update(); - w_edit->get_child(0)->cast_to<Control>()->update(); _update_color(); } @@ -117,9 +122,6 @@ void ColorPicker::_value_changed(double) { } set_pick_color(color); - - _update_text_value(); - emit_signal("color_changed", color); } @@ -252,7 +254,7 @@ void ColorPicker::_update_text_value() { } void ColorPicker::_sample_draw() { - sample->draw_rect(Rect2(Point2(), Size2(256, 20)), color); + sample->draw_rect(Rect2(Point2(), Size2(uv_edit->get_size().width, 20)), color); } void ColorPicker::_hsv_draw(int p_wich, Control *c) { @@ -272,12 +274,12 @@ void ColorPicker::_hsv_draw(int p_wich, Control *c) { c->draw_polygon(points, colors); Vector<Color> colors2; Color col = color; - col.set_hsv(color.get_h(), 1, 1); + col.set_hsv(h, 1, 1); col.a = 0; colors2.push_back(col); col.a = 1; colors2.push_back(col); - col.set_hsv(color.get_h(), 1, 0); + col.set_hsv(h, 1, 0); colors2.push_back(col); col.a = 0; colors2.push_back(col); @@ -306,10 +308,10 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &ev) { if (bev.is_valid()) { if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { changing_color = true; - float x = CLAMP((float)bev->get_position().x, 0, 256); - float y = CLAMP((float)bev->get_position().y, 0, 256); - s = x / 256; - v = 1.0 - y / 256.0; + float x = CLAMP((float)bev->get_position().x, 0, uv_edit->get_size().width); + float y = CLAMP((float)bev->get_position().y, 0, uv_edit->get_size().height); + s = x / uv_edit->get_size().width; + v = 1.0 - y / uv_edit->get_size().height; color.set_hsv(h, s, v, color.a); last_hsv = color; set_pick_color(color); @@ -325,10 +327,10 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &ev) { if (mev.is_valid()) { if (!changing_color) return; - float x = CLAMP((float)mev->get_position().x, 0, 256); - float y = CLAMP((float)mev->get_position().y, 0, 256); - s = x / 256; - v = 1.0 - y / 256.0; + float x = CLAMP((float)mev->get_position().x, 0, uv_edit->get_size().width); + float y = CLAMP((float)mev->get_position().y, 0, uv_edit->get_size().height); + s = x / uv_edit->get_size().width; + v = 1.0 - y / uv_edit->get_size().height; color.set_hsv(h, s, v, color.a); last_hsv = color; set_pick_color(color); @@ -345,8 +347,8 @@ void ColorPicker::_w_input(const Ref<InputEvent> &ev) { if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { changing_color = true; - h = 1 - (256.0 - (float)bev->get_position().y) / 256.0; - + float y = CLAMP((float)bev->get_position().y, 0, w_edit->get_size().height); + h = y / w_edit->get_size().height; } else { changing_color = false; } @@ -363,9 +365,8 @@ void ColorPicker::_w_input(const Ref<InputEvent> &ev) { if (!changing_color) return; - float y = CLAMP((float)mev->get_position().y, 0, 256); - //h = 1.0 - y / 256.0; - h = y / 256.0; + float y = CLAMP((float)mev->get_position().y, 0, w_edit->get_size().height); + h = y / w_edit->get_size().height; color.set_hsv(h, s, v, color.a); last_hsv = color; set_pick_color(color); @@ -427,19 +428,12 @@ void ColorPicker::_screen_input(const Ref<InputEvent> &ev) { Viewport *r = get_tree()->get_root(); if (!r->get_visible_rect().has_point(Point2(mev->get_global_position().x, mev->get_global_position().y))) return; - Ref<Image> img; //= r->get_screen_capture(); - if (!img.is_null()) { - last_capture = img; - //r->queue_screen_capture(); - } - if (last_capture.is_valid() && !last_capture->empty()) { - int pw = last_capture->get_format() == Image::FORMAT_RGBA8 ? 4 : 3; - int ofs = (mev->get_global_position().y * last_capture->get_width() + mev->get_global_position().x) * pw; - - PoolVector<uint8_t>::Read r = last_capture->get_data().read(); - - Color c(r[ofs + 0] / 255.0, r[ofs + 1] / 255.0, r[ofs + 2] / 255.0); - + Ref<Image> img = r->get_texture()->get_data(); + if (img.is_valid() && !img->empty()) { + img->lock(); + Vector2 ofs = mev->get_global_position() - r->get_visible_rect().get_position(); + Color c = img->get_pixel(ofs.x, r->get_visible_rect().size.height - ofs.y); + img->unlock(); set_pick_color(c); } } @@ -456,11 +450,11 @@ void ColorPicker::_screen_pick_pressed() { r->add_child(screen); screen->set_as_toplevel(true); screen->set_area_as_parent_rect(); + screen->set_default_cursor_shape(CURSOR_POINTING_HAND); screen->connect("gui_input", this, "_screen_input"); } screen->raise(); screen->show_modal(); - // r->queue_screen_capture(); } void ColorPicker::_bind_methods() { @@ -510,12 +504,14 @@ ColorPicker::ColorPicker() add_child(hb_smpl); HBoxContainer *hb_edit = memnew(HBoxContainer); + hb_edit->set_v_size_flags(SIZE_EXPAND_FILL); uv_edit = memnew(Control); uv_edit->connect("gui_input", this, "_uv_input"); uv_edit->set_mouse_filter(MOUSE_FILTER_PASS); - uv_edit->set_custom_minimum_size(Size2(256, 256)); + uv_edit->set_h_size_flags(SIZE_EXPAND_FILL); + uv_edit->set_v_size_flags(SIZE_EXPAND_FILL); Vector<Variant> args = Vector<Variant>(); args.push_back(0); args.push_back(uv_edit); @@ -525,7 +521,9 @@ ColorPicker::ColorPicker() w_edit = memnew(Control); //w_edit->set_ignore_mouse(false); - w_edit->set_custom_minimum_size(Size2(30, 256)); + w_edit->set_custom_minimum_size(Size2(30, 0)); + w_edit->set_h_size_flags(SIZE_FILL); + w_edit->set_v_size_flags(SIZE_EXPAND_FILL); w_edit->connect("gui_input", this, "_w_input"); args.clear(); args.push_back(1); @@ -551,6 +549,7 @@ ColorPicker::ColorPicker() HBoxContainer *hbc = memnew(HBoxContainer); labels[i] = memnew(Label(lt[i])); + labels[i]->set_custom_minimum_size(Size2(10, 0)); hbc->add_child(labels[i]); scroll[i] = memnew(HSlider); @@ -572,7 +571,7 @@ ColorPicker::ColorPicker() HBoxContainer *hhb = memnew(HBoxContainer); btn_mode = memnew(CheckButton); - btn_mode->set_text("RAW Mode"); + btn_mode->set_text(TTR("RAW Mode")); btn_mode->connect("toggled", this, "set_raw_mode"); hhb->add_child(btn_mode); vbr->add_child(hhb); @@ -603,7 +602,7 @@ ColorPicker::ColorPicker() bt_add_preset = memnew(Button); bt_add_preset->set_icon(get_icon("add_preset")); - bt_add_preset->set_tooltip("Add current color as a preset"); + bt_add_preset->set_tooltip(TTR("Add current color as a preset")); bt_add_preset->connect("pressed", this, "_add_preset_pressed"); bbc->add_child(bt_add_preset); } @@ -632,6 +631,10 @@ void ColorPickerButton::_notification(int p_what) { Ref<StyleBox> normal = get_stylebox("normal"); draw_rect(Rect2(normal->get_offset(), get_size() - normal->get_minimum_size()), picker->get_pick_color()); } + + if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST) { + popup->hide(); + } } void ColorPickerButton::set_pick_color(const Color &p_color) { diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index ca47c3a5f4..de624fd029 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -47,7 +47,6 @@ class ColorPicker : public BoxContainer { private: Control *screen; - Ref<Image> last_capture; Control *uv_edit; Control *w_edit; TextureRect *sample; diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index 95f65f31d6..538dd846e4 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "graph_node.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" bool GraphNode::_set(const StringName &p_name, const Variant &p_value) { diff --git a/scene/gui/input_action.cpp b/scene/gui/input_action.cpp index 311cb4ab13..3f80c31c8b 100644 --- a/scene/gui/input_action.cpp +++ b/scene/gui/input_action.cpp @@ -43,7 +43,7 @@ Ref<InputEvent> ShortCut::get_shortcut() const { bool ShortCut::is_shortcut(const Ref<InputEvent> &p_event) const { - return shortcut.is_valid() && shortcut->action_match(p_event); + return shortcut.is_valid() && shortcut->shortcut_match(p_event); } String ShortCut::get_as_text() const { diff --git a/scene/gui/patch_9_rect.cpp b/scene/gui/patch_9_rect.cpp index 0c2b94d700..735f36b55d 100644 --- a/scene/gui/patch_9_rect.cpp +++ b/scene/gui/patch_9_rect.cpp @@ -44,7 +44,7 @@ void NinePatchRect::_notification(int p_what) { texture->get_rect_region(rect, src_rect, rect, src_rect); RID ci = get_canvas_item(); - VS::get_singleton()->canvas_item_add_nine_patch(ci, rect, src_rect, texture->get_rid(), Vector2(margin[MARGIN_LEFT], margin[MARGIN_TOP]), Vector2(margin[MARGIN_RIGHT], margin[MARGIN_BOTTOM]), VS::NINE_PATCH_STRETCH, VS::NINE_PATCH_STRETCH, draw_center); + VS::get_singleton()->canvas_item_add_nine_patch(ci, rect, src_rect, texture->get_rid(), Vector2(margin[MARGIN_LEFT], margin[MARGIN_TOP]), Vector2(margin[MARGIN_RIGHT], margin[MARGIN_BOTTOM]), VS::NinePatchAxisMode(axis_h), VS::NinePatchAxisMode(axis_v), draw_center); } } @@ -62,6 +62,10 @@ void NinePatchRect::_bind_methods() { ClassDB::bind_method(D_METHOD("get_region_rect"), &NinePatchRect::get_region_rect); ClassDB::bind_method(D_METHOD("set_draw_center", "draw_center"), &NinePatchRect::set_draw_center); ClassDB::bind_method(D_METHOD("get_draw_center"), &NinePatchRect::get_draw_center); + ClassDB::bind_method(D_METHOD("set_h_axis_stretch_mode", "mode"), &NinePatchRect::set_h_axis_stretch_mode); + ClassDB::bind_method(D_METHOD("get_h_axis_stretch_mode"), &NinePatchRect::get_h_axis_stretch_mode); + ClassDB::bind_method(D_METHOD("set_v_axis_stretch_mode", "mode"), &NinePatchRect::set_v_axis_stretch_mode); + ClassDB::bind_method(D_METHOD("get_v_axis_stretch_mode"), &NinePatchRect::get_v_axis_stretch_mode); ADD_SIGNAL(MethodInfo("texture_changed")); @@ -74,6 +78,13 @@ void NinePatchRect::_bind_methods() { ADD_PROPERTYINZ(PropertyInfo(Variant::INT, "patch_margin_top", PROPERTY_HINT_RANGE, "0,16384,1"), "set_patch_margin", "get_patch_margin", MARGIN_TOP); ADD_PROPERTYINZ(PropertyInfo(Variant::INT, "patch_margin_right", PROPERTY_HINT_RANGE, "0,16384,1"), "set_patch_margin", "get_patch_margin", MARGIN_RIGHT); ADD_PROPERTYINZ(PropertyInfo(Variant::INT, "patch_margin_bottom", PROPERTY_HINT_RANGE, "0,16384,1"), "set_patch_margin", "get_patch_margin", MARGIN_BOTTOM); + ADD_GROUP("Axis Stretch", "axis_stretch_"); + ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "axis_stretch_horizontal", PROPERTY_HINT_ENUM, "Stretch,Tile,Tile Fit"), "set_h_axis_stretch_mode", "get_h_axis_stretch_mode"); + ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "axis_stretch_vertical", PROPERTY_HINT_ENUM, "Stretch,Tile,Tile Fit"), "set_v_axis_stretch_mode", "get_v_axis_stretch_mode"); + + BIND_CONSTANT(AXIS_STRETCH_MODE_STRETCH); + BIND_CONSTANT(AXIS_STRETCH_MODE_TILE); + BIND_CONSTANT(AXIS_STRETCH_MODE_TILE_FIT); } void NinePatchRect::set_texture(const Ref<Texture> &p_tex) { @@ -150,6 +161,26 @@ bool NinePatchRect::get_draw_center() const { return draw_center; } +void NinePatchRect::set_h_axis_stretch_mode(AxisStretchMode p_mode) { + axis_h = p_mode; + update(); +} + +NinePatchRect::AxisStretchMode NinePatchRect::get_h_axis_stretch_mode() const { + return axis_h; +} + +void NinePatchRect::set_v_axis_stretch_mode(AxisStretchMode p_mode) { + + axis_v = p_mode; + update(); +} + +NinePatchRect::AxisStretchMode NinePatchRect::get_v_axis_stretch_mode() const { + + return axis_v; +} + NinePatchRect::NinePatchRect() { margin[MARGIN_LEFT] = 0; @@ -159,6 +190,9 @@ NinePatchRect::NinePatchRect() { set_mouse_filter(MOUSE_FILTER_IGNORE); draw_center = true; + + axis_h = AXIS_STRETCH_MODE_STRETCH; + axis_v = AXIS_STRETCH_MODE_STRETCH; } NinePatchRect::~NinePatchRect() { diff --git a/scene/gui/patch_9_rect.h b/scene/gui/patch_9_rect.h index ba978f2f81..602a6d22bf 100644 --- a/scene/gui/patch_9_rect.h +++ b/scene/gui/patch_9_rect.h @@ -38,11 +38,20 @@ class NinePatchRect : public Control { GDCLASS(NinePatchRect, Control); +public: + enum AxisStretchMode { + AXIS_STRETCH_MODE_STRETCH, + AXIS_STRETCH_MODE_TILE, + AXIS_STRETCH_MODE_TILE_FIT, + }; + bool draw_center; int margin[4]; Rect2 region_rect; Ref<Texture> texture; + AxisStretchMode axis_h, axis_v; + protected: void _notification(int p_what); virtual Size2 get_minimum_size() const; @@ -61,7 +70,15 @@ public: void set_draw_center(bool p_enable); bool get_draw_center() const; + void set_h_axis_stretch_mode(AxisStretchMode p_mode); + AxisStretchMode get_h_axis_stretch_mode() const; + + void set_v_axis_stretch_mode(AxisStretchMode p_mode); + AxisStretchMode get_v_axis_stretch_mode() const; + NinePatchRect(); ~NinePatchRect(); }; + +VARIANT_ENUM_CAST(NinePatchRect::AxisStretchMode) #endif // PATCH_9_FRAME_H diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index c4991700aa..74b26da580 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -884,7 +884,7 @@ void PopupMenu::activate_item(int p_item) { while (pop) { // We close all parents that are chained together, // with hide_on_item_selection enabled - if (hide_on_item_selection && pop->is_hide_on_item_selection()) { + if ((items[p_item].checkable && hide_on_checkable_item_selection && pop->is_hide_on_checkable_item_selection()) || (!items[p_item].checkable && hide_on_item_selection && pop->is_hide_on_item_selection())) { pop->hide(); next = next->get_parent(); pop = next->cast_to<PopupMenu>(); @@ -895,8 +895,8 @@ void PopupMenu::activate_item(int p_item) { } } // Hides popup by default; unless otherwise specified - // by using set_hide_on_item_selection - if (hide_on_item_selection) { + // by using set_hide_on_item_selection and set_hide_on_checkable_item_selection + if ((items[p_item].checkable && hide_on_checkable_item_selection) || (!items[p_item].checkable && hide_on_item_selection)) { hide(); } } @@ -1019,6 +1019,16 @@ bool PopupMenu::is_hide_on_item_selection() { return hide_on_item_selection; } +void PopupMenu::set_hide_on_checkable_item_selection(bool p_enabled) { + + hide_on_checkable_item_selection = p_enabled; +} + +bool PopupMenu::is_hide_on_checkable_item_selection() { + + return hide_on_checkable_item_selection; +} + String PopupMenu::get_tooltip(const Point2 &p_pos) const { int over = _get_mouse_over(p_pos); @@ -1107,10 +1117,14 @@ void PopupMenu::_bind_methods() { ClassDB::bind_method(D_METHOD("set_hide_on_item_selection", "enable"), &PopupMenu::set_hide_on_item_selection); ClassDB::bind_method(D_METHOD("is_hide_on_item_selection"), &PopupMenu::is_hide_on_item_selection); + ClassDB::bind_method(D_METHOD("set_hide_on_checkable_item_selection", "enable"), &PopupMenu::set_hide_on_checkable_item_selection); + ClassDB::bind_method(D_METHOD("is_hide_on_checkable_item_selection"), &PopupMenu::is_hide_on_checkable_item_selection); + ClassDB::bind_method(D_METHOD("_submenu_timeout"), &PopupMenu::_submenu_timeout); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_items", "_get_items"); ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "hide_on_item_selection"), "set_hide_on_item_selection", "is_hide_on_item_selection"); + ADD_PROPERTYNO(PropertyInfo(Variant::BOOL, "hide_on_checkable_item_selection"), "set_hide_on_checkable_item_selection", "is_hide_on_checkable_item_selection"); ADD_SIGNAL(MethodInfo("id_pressed", PropertyInfo(Variant::INT, "ID"))); ADD_SIGNAL(MethodInfo("index_pressed", PropertyInfo(Variant::INT, "index"))); @@ -1128,6 +1142,7 @@ PopupMenu::PopupMenu() { set_focus_mode(FOCUS_ALL); set_as_toplevel(true); set_hide_on_item_selection(true); + set_hide_on_checkable_item_selection(true); submenu_timer = memnew(Timer); submenu_timer->set_wait_time(0.3); diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index 7ef532453d..a9bd8f7e50 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -85,6 +85,7 @@ class PopupMenu : public Popup { bool invalidated_click; bool hide_on_item_selection; + bool hide_on_checkable_item_selection; Vector2 moved; Array _get_items() const; @@ -168,6 +169,9 @@ public: void set_hide_on_item_selection(bool p_enabled); bool is_hide_on_item_selection(); + void set_hide_on_checkable_item_selection(bool p_enabled); + bool is_hide_on_checkable_item_selection(); + PopupMenu(); ~PopupMenu(); }; diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 0b8595de42..78ede6e494 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -1831,7 +1831,7 @@ void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("add_image", "image:Texture"), &RichTextLabel::add_image); ClassDB::bind_method(D_METHOD("newline"), &RichTextLabel::add_newline); ClassDB::bind_method(D_METHOD("remove_line"), &RichTextLabel::remove_line); - ClassDB::bind_method(D_METHOD("push_font", "font"), &RichTextLabel::push_font); + ClassDB::bind_method(D_METHOD("push_font", "font:Font"), &RichTextLabel::push_font); ClassDB::bind_method(D_METHOD("push_color", "color"), &RichTextLabel::push_color); ClassDB::bind_method(D_METHOD("push_align", "align"), &RichTextLabel::push_align); ClassDB::bind_method(D_METHOD("push_indent", "level"), &RichTextLabel::push_indent); @@ -1854,7 +1854,7 @@ void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("set_scroll_follow", "follow"), &RichTextLabel::set_scroll_follow); ClassDB::bind_method(D_METHOD("is_scroll_following"), &RichTextLabel::is_scroll_following); - ClassDB::bind_method(D_METHOD("get_v_scroll"), &RichTextLabel::get_v_scroll); + ClassDB::bind_method(D_METHOD("get_v_scroll:VScrollBar"), &RichTextLabel::get_v_scroll); ClassDB::bind_method(D_METHOD("scroll_to_line", "line"), &RichTextLabel::scroll_to_line); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index d864d9fce7..d8788b4eca 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -622,6 +622,40 @@ bool TreeItem::is_custom_set_as_button(int p_column) const { return cells[p_column].custom_button; } +void TreeItem::set_text_align(int p_column, TextAlign p_align) { + ERR_FAIL_INDEX(p_column, cells.size()); + cells[p_column].text_align = p_align; + _changed_notify(p_column); +} + +TreeItem::TextAlign TreeItem::get_text_align(int p_column) const { + ERR_FAIL_INDEX_V(p_column, cells.size(), ALIGN_LEFT); + return cells[p_column].text_align; +} + +void TreeItem::set_expand_right(int p_column, bool p_enable) { + + ERR_FAIL_INDEX(p_column, cells.size()); + cells[p_column].expand_right = p_enable; + _changed_notify(p_column); +} + +bool TreeItem::get_expand_right(int p_column) const { + + ERR_FAIL_INDEX_V(p_column, cells.size(), false); + return cells[p_column].expand_right; +} + +void TreeItem::set_disable_folding(bool p_disable) { + + disable_folding = p_disable; + _changed_notify(0); +} + +bool TreeItem::is_folding_disabled() const { + return disable_folding; +} + void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_cell_mode", "column", "mode"), &TreeItem::set_cell_mode); @@ -692,12 +726,19 @@ void TreeItem::_bind_methods() { ClassDB::bind_method(D_METHOD("erase_button", "column", "button_idx"), &TreeItem::erase_button); ClassDB::bind_method(D_METHOD("is_button_disabled", "column", "button_idx"), &TreeItem::is_button_disabled); + ClassDB::bind_method(D_METHOD("set_expand_right", "column", "enable"), &TreeItem::set_expand_right); + ClassDB::bind_method(D_METHOD("get_expand_right", "column"), &TreeItem::get_expand_right); + ClassDB::bind_method(D_METHOD("set_tooltip", "column", "tooltip"), &TreeItem::set_tooltip); ClassDB::bind_method(D_METHOD("get_tooltip", "column"), &TreeItem::get_tooltip); - + ClassDB::bind_method(D_METHOD("set_text_align", "column", "text_align"), &TreeItem::set_text_align); + ClassDB::bind_method(D_METHOD("get_text_align", "column"), &TreeItem::get_text_align); ClassDB::bind_method(D_METHOD("move_to_top"), &TreeItem::move_to_top); ClassDB::bind_method(D_METHOD("move_to_bottom"), &TreeItem::move_to_bottom); + ClassDB::bind_method(D_METHOD("set_disable_folding", "disable"), &TreeItem::set_disable_folding); + ClassDB::bind_method(D_METHOD("is_folding_disabled"), &TreeItem::is_folding_disabled); + BIND_CONSTANT(CELL_MODE_STRING); BIND_CONSTANT(CELL_MODE_CHECK); BIND_CONSTANT(CELL_MODE_RANGE); @@ -724,6 +765,7 @@ TreeItem::TreeItem(Tree *p_tree) { tree = p_tree; collapsed = false; + disable_folding = false; parent = 0; // parent item next = 0; // next in list @@ -894,6 +936,32 @@ int Tree::get_item_height(TreeItem *p_item) const { void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color) { Rect2i rect = p_rect; + Ref<Font> font = cache.font; + String text = p_cell.text; + if (p_cell.suffix != String()) + text += " " + p_cell.suffix; + + int w = 0; + if (!p_cell.icon.is_null()) { + Size2i bmsize = p_cell.get_icon_size(); + + if (p_cell.icon_max_w > 0 && bmsize.width > p_cell.icon_max_w) { + bmsize.width = p_cell.icon_max_w; + } + w += bmsize.width + cache.hseparation; + } + w += font->get_string_size(text).width; + + switch (p_cell.text_align) { + case TreeItem::ALIGN_LEFT: + break; //do none + case TreeItem::ALIGN_CENTER: + rect.position.x = MAX(0, (rect.size.width - w) / 2); + break; //do none + case TreeItem::ALIGN_RIGHT: + rect.position.x = MAX(0, (rect.size.width - w)); + break; //do none + } RID ci = get_canvas_item(); if (!p_cell.icon.is_null()) { @@ -914,12 +982,6 @@ void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, co rect.size.x-=Math::floor(rect.size.y/2); */ - Ref<Font> font = cache.font; - - String text = p_cell.text; - if (p_cell.suffix != String()) - text += " " + p_cell.suffix; - rect.position.y += Math::floor((rect.size.y - font->get_height()) / 2.0) + font->get_ascent(); font->draw(ci, rect.position, text, p_color, rect.size.x); } @@ -970,20 +1032,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 if (!skip && (p_pos.y + label_h - cache.offset.y) > 0) { - if (!hide_folding && p_item->childs) { //has childs, draw the guide box - - Ref<Texture> arrow; - - if (p_item->collapsed) { - - arrow = cache.arrow_collapsed; - } else { - arrow = cache.arrow; - } - - arrow->draw(ci, p_pos + p_draw_ofs + Point2i(0, (label_h - arrow->get_height()) / 2) - cache.offset); - } - //draw separation. //if (p_item->get_parent()!=root || !hide_root) @@ -991,9 +1039,15 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int font_ascent = font->get_ascent(); - int ofs = p_pos.x + (hide_folding ? cache.hseparation : cache.item_margin); + int ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); + int skip = 0; for (int i = 0; i < columns.size(); i++) { + if (skip) { + skip--; + continue; + } + int w = get_column_width(i); if (i == 0) { @@ -1011,6 +1065,16 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 w -= cache.hseparation; } + if (p_item->cells[i].expand_right) { + + int plus = 1; + while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { + w += get_column_width(i + plus); + plus++; + skip++; + } + } + int bw = 0; for (int j = p_item->cells[i].buttons.size() - 1; j >= 0; j--) { Ref<Texture> b = p_item->cells[i].buttons[j].texture; @@ -1076,8 +1140,13 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 if (p_item->cells[i].custom_bg_color) { Rect2 r = cell_rect; - r.position.x -= cache.hseparation; - r.size.x += cache.hseparation; + if (i == 0) { + r.position.x = p_draw_ofs.x; + r.size.x = w + ofs; + } else { + r.position.x -= cache.hseparation; + r.size.x += cache.hseparation; + } if (p_item->cells[i].custom_bg_outline) { VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y, r.size.x, 1), p_item->cells[i].bg_color); VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(r.position.x, r.position.y + r.size.y - 1, r.size.x, 1), p_item->cells[i].bg_color); @@ -1274,6 +1343,19 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } } + if (!p_item->disable_folding && !hide_folding && p_item->childs) { //has childs, draw the guide box + + Ref<Texture> arrow; + + if (p_item->collapsed) { + + arrow = cache.arrow_collapsed; + } else { + arrow = cache.arrow; + } + + arrow->draw(ci, p_pos + p_draw_ofs + Point2i(0, (label_h - arrow->get_height()) / 2) - cache.offset); + } //separator //get_painter()->draw_fill_rect( Point2i(0,pos.y),Size2i(get_size().width,1),color( COLOR_TREE_GRID) ); @@ -1295,8 +1377,8 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 while (c) { if (cache.draw_relationship_lines == 1) { - int root_ofs = children_pos.x + (hide_folding ? cache.hseparation : cache.item_margin); - int parent_ofs = p_pos.x + (hide_folding ? cache.hseparation : cache.item_margin); + int root_ofs = children_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); + int parent_ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); Point2i root_pos = Point2i(root_ofs, children_pos.y + label_h / 2) - cache.offset + p_draw_ofs; if (c->get_children() != NULL) root_pos -= Point2i(cache.arrow->get_width(), 0); @@ -1488,7 +1570,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool return -1; } - if (!hide_folding && (p_pos.x >= x_ofs && p_pos.x < (x_ofs + cache.item_margin))) { + if (!p_item->disable_folding && !hide_folding && (p_pos.x >= x_ofs && p_pos.x < (x_ofs + cache.item_margin))) { if (p_item->childs) p_item->set_collapsed(!p_item->is_collapsed()); @@ -1504,6 +1586,18 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool for (int i = 0; i < columns.size(); i++) { col_width = get_column_width(i); + + if (p_item->cells[i].expand_right) { + + int plus = 1; + while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { + plus++; + col_width += cache.hseparation; + col_width += get_column_width(i + plus); + plus++; + } + } + if (x > col_width) { col_ofs += col_width; x -= col_width; @@ -1528,6 +1622,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool x -= cache.hseparation; } + if (!p_item->disable_folding && !hide_folding && !p_item->cells[col].editable && !p_item->cells[col].selectable && p_item->get_children()) { + p_item->set_collapsed(!p_item->is_collapsed()); + return -1; //collapse/uncollapse because nothing can be done with item + } + TreeItem::Cell &c = p_item->cells[col]; bool already_selected = c.selected; diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 097e0110e8..59e35bb230 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -58,6 +58,12 @@ public: CELL_MODE_CUSTOM, ///< Contains a custom value, show a string, and an edit button }; + enum TextAlign { + ALIGN_LEFT, + ALIGN_CENTER, + ALIGN_RIGHT + }; + private: friend class Tree; @@ -82,6 +88,9 @@ private: bool custom_bg_outline; Color bg_color; bool custom_button; + bool expand_right; + + TextAlign text_align; Variant meta; String tooltip; @@ -122,6 +131,8 @@ private: custom_bg_color = false; expr = false; icon_max_w = 0; + text_align = ALIGN_LEFT; + expand_right = false; } Size2 get_icon_size() const; @@ -131,6 +142,7 @@ private: Vector<Cell> cells; bool collapsed; // wont show childs + bool disable_folding; TreeItem *parent; // parent item TreeItem *next; // next in list @@ -248,13 +260,23 @@ public: void clear_children(); + void set_text_align(int p_column, TextAlign p_align); + TextAlign get_text_align(int p_column) const; + + void set_expand_right(int p_column, bool p_enable); + bool get_expand_right(int p_column) const; + void move_to_top(); void move_to_bottom(); + void set_disable_folding(bool p_disable); + bool is_folding_disabled() const; + ~TreeItem(); }; VARIANT_ENUM_CAST(TreeItem::TreeCellMode); +VARIANT_ENUM_CAST(TreeItem::TextAlign); class Tree : public Control { diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 714327c5b7..a87c83f17c 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -49,6 +49,7 @@ #include "scene/scene_string_names.h" #include "global_config.h" +#include "scene/3d/scenario_fx.h" void ViewportTexture::setup_local_to_scene() { @@ -1017,10 +1018,9 @@ void Viewport::_propagate_enter_world(Node *p_node) { if (!p_node->is_inside_tree()) //may not have entered scene yet return; - Spatial *s = p_node->cast_to<Spatial>(); - if (s) { + if (p_node->cast_to<Spatial>() || p_node->cast_to<WorldEnvironment>()) { - s->notification(Spatial::NOTIFICATION_ENTER_WORLD); + p_node->notification(Spatial::NOTIFICATION_ENTER_WORLD); } else { Viewport *v = p_node->cast_to<Viewport>(); if (v) { @@ -1055,10 +1055,9 @@ void Viewport::_propagate_exit_world(Node *p_node) { if (!p_node->is_inside_tree()) //may have exited scene already return; - Spatial *s = p_node->cast_to<Spatial>(); - if (s) { + if (p_node->cast_to<Spatial>() || p_node->cast_to<WorldEnvironment>()) { - s->notification(Spatial::NOTIFICATION_EXIT_WORLD, true); + p_node->notification(Spatial::NOTIFICATION_EXIT_WORLD); } else { Viewport *v = p_node->cast_to<Viewport>(); if (v) { diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index b2737353fb..151bc80321 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -469,9 +469,12 @@ void register_scene_types() { ClassDB::register_class<Shader>(); ClassDB::register_class<ShaderMaterial>(); ClassDB::register_virtual_class<CanvasItem>(); + ClassDB::register_class<CanvasItemMaterial>(); + SceneTree::add_idle_callback(CanvasItemMaterial::flush_changes); + CanvasItemMaterial::init_shaders(); ClassDB::register_class<Node2D>(); ClassDB::register_class<Particles2D>(); - ClassDB::register_class<ParticleAttractor2D>(); + //ClassDB::register_class<ParticleAttractor2D>(); ClassDB::register_class<Sprite>(); //ClassDB::register_type<ViewportSprite>(); ClassDB::register_class<SpriteFrames>(); @@ -577,6 +580,7 @@ void register_scene_types() { ClassDB::register_class<Animation>(); ClassDB::register_virtual_class<Font>(); ClassDB::register_class<BitmapFont>(); + ClassDB::register_class<Curve>(); ClassDB::register_class<DynamicFontData>(); ClassDB::register_class<DynamicFont>(); @@ -663,5 +667,6 @@ void unregister_scene_types() { SpatialMaterial::finish_shaders(); ParticlesMaterial::finish_shaders(); + CanvasItemMaterial::finish_shaders(); SceneStringNames::free(); } diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index 10c12c9411..3957923c6a 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -380,6 +380,365 @@ Curve2D::Curve2D() #endif +Curve::Curve() { + _bake_resolution = 100; + _baked_cache_dirty = false; +#ifdef TOOLS_ENABLED + _disable_set_data = false; +#endif +} + +int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent) { + // Add a point and preserve order + + // Curve bounds is in 0..1 + if (p_pos.x > MAX_X) + p_pos.x = MAX_X; + else if (p_pos.x < MIN_X) + p_pos.x = MIN_X; + + int ret = -1; + + if (_points.size() == 0) { + _points.push_back(Point(p_pos, left_tangent, right_tangent)); + ret = 0; + + } else if (_points.size() == 1) { + // TODO Is the `else` able to handle this block already? + + real_t diff = p_pos.x - _points[0].pos.x; + + if (diff > 0) { + _points.push_back(Point(p_pos, left_tangent, right_tangent)); + ret = 1; + } else { + _points.insert(0, Point(p_pos, left_tangent, right_tangent)); + ret = 0; + } + + } else { + + int i = get_index(p_pos.x); + + int nearest_index = i; + if (i + 1 < _points.size()) { + real_t diff0 = p_pos.x - _points[i].pos.x; + real_t diff1 = _points[i + 1].pos.x - p_pos.x; + + if (diff1 < diff0) + nearest_index = i + 1; + } + + if (i == 0 && p_pos.x < _points[0].pos.x) { + // Insert before anything else + _points.insert(0, Point(p_pos, left_tangent, right_tangent)); + ret = 0; + } else { + // Insert between i and i+1 + ++i; + _points.insert(i, Point(p_pos, left_tangent, right_tangent)); + ret = i; + } + } + + mark_dirty(); + + return ret; +} + +int Curve::get_index(real_t offset) const { + + // Lower-bound float binary search + + int imin = 0; + int imax = _points.size() - 1; + + while (imax - imin > 1) { + int m = (imin + imax) / 2; + + real_t a = _points[m].pos.x; + real_t b = _points[m + 1].pos.x; + + if (a < offset && b < offset) { + imin = m; + + } else if (a > offset) { + imax = m; + + } else { + return m; + } + } + + // Will happen if the offset is out of bounds + if (offset > _points[imax].pos.x) + return imax; + return imin; +} + +void Curve::clean_dupes() { + + bool dirty = false; + + for (int i = 1; i < _points.size(); ++i) { + real_t diff = _points[i - 1].pos.x - _points[i].pos.x; + if (diff <= CMP_EPSILON) { + _points.remove(i); + --i; + dirty = true; + } + } + + if (dirty) + mark_dirty(); +} + +void Curve::set_point_left_tangent(int i, real_t tangent) { + ERR_FAIL_INDEX(i, _points.size()); + _points[i].left_tangent = tangent; + mark_dirty(); +} + +void Curve::set_point_right_tangent(int i, real_t tangent) { + ERR_FAIL_INDEX(i, _points.size()); + _points[i].right_tangent = tangent; + mark_dirty(); +} + +real_t Curve::get_point_left_tangent(int i) const { + ERR_FAIL_INDEX_V(i, _points.size(), 0); + return _points[i].left_tangent; +} + +real_t Curve::get_point_right_tangent(int i) const { + ERR_FAIL_INDEX_V(i, _points.size(), 0); + return _points[i].right_tangent; +} + +void Curve::remove_point(int p_index) { + ERR_FAIL_INDEX(p_index, _points.size()); + _points.remove(p_index); + mark_dirty(); +} + +void Curve::clear_points() { + _points.clear(); + mark_dirty(); +} + +void Curve::set_point_value(int p_index, real_t pos) { + ERR_FAIL_INDEX(p_index, _points.size()); + _points[p_index].pos.y = pos; + mark_dirty(); +} + +int Curve::set_point_offset(int p_index, float offset) { + ERR_FAIL_INDEX_V(p_index, _points.size(), -1); + Point p = _points[p_index]; + remove_point(p_index); + int i = add_point(Vector2(offset, p.pos.y)); + _points[i].left_tangent = p.left_tangent; + _points[i].right_tangent = p.right_tangent; + return i; +} + +Vector2 Curve::get_point_pos(int p_index) const { + ERR_FAIL_INDEX_V(p_index, _points.size(), Vector2(0, 0)); + return _points[p_index].pos; +} + +real_t Curve::interpolate(real_t offset) const { + if (_points.size() == 0) + return 0; + if (_points.size() == 1) + return _points[0].pos.y; + + int i = get_index(offset); + + if (i == _points.size() - 1) + return _points[i].pos.y; + + real_t local = offset - _points[i].pos.x; + + if (i == 0 && local <= 0) + return _points[0].pos.y; + + return interpolate_local_nocheck(i, local); +} + +real_t Curve::interpolate_local_nocheck(int index, real_t local_offset) const { + + const Point a = _points[index]; + const Point b = _points[index + 1]; + + // Cubic bezier + + // ac-----bc + // / \ + // / \ Here with a.right_tangent > 0 + // / \ and b.left_tangent < 0 + // / \ + // a b + // + // |-d1--|-d2--|-d3--| + // + // d1 == d2 == d3 == d / 3 + + // Control points are chosen at equal distances + real_t d = b.pos.x - a.pos.x; + if (Math::abs(d) <= CMP_EPSILON) + return b.pos.y; + local_offset /= d; + d /= 3.0; + real_t yac = a.pos.y + d * a.right_tangent; + real_t ybc = b.pos.y - d * b.left_tangent; + + real_t y = _bezier_interp(local_offset, a.pos.y, yac, ybc, b.pos.y); + + return y; +} + +void Curve::mark_dirty() { + _baked_cache_dirty = true; + emit_signal(CoreStringNames::get_singleton()->changed); +} + +Array Curve::get_data() const { + + Array output; + output.resize(_points.size() * 3); + + for (int j = 0; j < _points.size(); ++j) { + + const Point p = _points[j]; + int i = j * 3; + + output[i] = p.pos; + output[i + 1] = p.left_tangent; + output[i + 2] = p.right_tangent; + } + + return output; +} + +void Curve::set_data(Array input) { + ERR_FAIL_COND(input.size() % 3 != 0); + +#ifdef TOOLS_ENABLED + if (_disable_set_data) + return; +#endif + + _points.clear(); + + // Validate input + for (int i = 0; i < input.size(); i += 3) { + ERR_FAIL_COND(input[i].get_type() != Variant::VECTOR2); + ERR_FAIL_COND(input[i + 1].get_type() != Variant::REAL); + ERR_FAIL_COND(input[i + 2].get_type() != Variant::REAL); + } + + _points.resize(input.size() / 3); + + for (int j = 0; j < _points.size(); ++j) { + + Point &p = _points[j]; + int i = j * 3; + + p.pos = input[i]; + p.left_tangent = input[i + 1]; + p.right_tangent = input[i + 2]; + } + + mark_dirty(); +} + +void Curve::bake() { + _baked_cache.clear(); + + _baked_cache.resize(_bake_resolution); + + for (int i = 1; i < _bake_resolution - 1; ++i) { + real_t x = i / static_cast<real_t>(_bake_resolution); + real_t y = interpolate(x); + _baked_cache[i] = y; + } + + if (_points.size() != 0) { + _baked_cache[0] = _points[0].pos.y; + _baked_cache[_baked_cache.size() - 1] = _points[_points.size() - 1].pos.y; + } + + _baked_cache_dirty = false; +} + +void Curve::set_bake_resolution(int p_resolution) { + ERR_FAIL_COND(p_resolution < 1); + ERR_FAIL_COND(p_resolution > 1000); + _bake_resolution = p_resolution; + _baked_cache_dirty = true; +} + +real_t Curve::interpolate_baked(real_t offset) { + if (_baked_cache_dirty) { + // Last-second bake if not done already + bake(); + } + + // Special cases if the cache is too small + if (_baked_cache.size() == 0) { + if (_points.size() == 0) + return 0; + return _points[0].pos.y; + } else if (_baked_cache.size() == 1) { + return _baked_cache[0]; + } + + // Get interpolation index + real_t fi = offset * _baked_cache.size(); + int i = Math::floor(fi); + if (i < 0) { + i = 0; + fi = 0; + } else if (i >= _baked_cache.size()) { + i = _baked_cache.size() - 1; + fi = 0; + } + + // Interpolate + if (i + 1 < _baked_cache.size()) { + real_t t = fi - i; + return Math::lerp(_baked_cache[i], _baked_cache[i + 1], t); + } else { + return _baked_cache[_baked_cache.size() - 1]; + } +} + +void Curve::_bind_methods() { + + ClassDB::bind_method(D_METHOD("add_point", "pos", "left_tangent", "right_tangent"), &Curve::add_point, DEFVAL(0), DEFVAL(0)); + ClassDB::bind_method(D_METHOD("remove_point", "index"), &Curve::remove_point); + ClassDB::bind_method(D_METHOD("clear_points"), &Curve::clear_points); + ClassDB::bind_method(D_METHOD("get_point_pos", "index"), &Curve::get_point_pos); + ClassDB::bind_method(D_METHOD("set_point_value", "index", "y"), &Curve::set_point_value); + ClassDB::bind_method(D_METHOD("set_point_offset", "index", "offset"), &Curve::set_point_value); + ClassDB::bind_method(D_METHOD("interpolate", "offset"), &Curve::interpolate); + ClassDB::bind_method(D_METHOD("interpolate_baked", "offset"), &Curve::interpolate_baked); + ClassDB::bind_method(D_METHOD("get_point_left_tangent", "index"), &Curve::get_point_left_tangent); + ClassDB::bind_method(D_METHOD("get_point_right_tangent", "index"), &Curve::get_point_left_tangent); + ClassDB::bind_method(D_METHOD("set_point_left_tangent", "index", "tangent"), &Curve::set_point_left_tangent); + ClassDB::bind_method(D_METHOD("set_point_right_tangent", "index", "tangent"), &Curve::set_point_left_tangent); + ClassDB::bind_method(D_METHOD("clean_dupes"), &Curve::clean_dupes); + ClassDB::bind_method(D_METHOD("bake"), &Curve::bake); + ClassDB::bind_method(D_METHOD("get_bake_resolution"), &Curve::get_bake_resolution); + ClassDB::bind_method(D_METHOD("set_bake_resolution", "resolution"), &Curve::set_bake_resolution); + ClassDB::bind_method(D_METHOD("_get_data"), &Curve::get_data); + ClassDB::bind_method(D_METHOD("_set_data", "data"), &Curve::set_data); + + ADD_PROPERTY(PropertyInfo(Variant::INT, "bake_resolution", PROPERTY_HINT_RANGE, "1,1000,1"), "set_bake_resolution", "get_bake_resolution"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "_data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_data", "_get_data"); +} + int Curve2D::get_point_count() const { return points.size(); diff --git a/scene/resources/curve.h b/scene/resources/curve.h index 17c0ac9f5e..63b9a07f07 100644 --- a/scene/resources/curve.h +++ b/scene/resources/curve.h @@ -82,6 +82,78 @@ public: #endif +// y(x) curve +class Curve : public Resource { + GDCLASS(Curve, Resource) +public: + static const int MIN_X = 0.f; + static const int MAX_X = 1.f; + +#ifdef TOOLS_ENABLED + bool _disable_set_data; +#endif + + struct Point { + Vector2 pos; + real_t left_tangent; + real_t right_tangent; + + Point() { + left_tangent = 0; + right_tangent = 0; + } + + Point(Vector2 p, real_t left = 0, real_t right = 0) { + pos = p; + left_tangent = left; + right_tangent = right; + } + }; + + Curve(); + + int get_point_count() const { return _points.size(); } + + int add_point(Vector2 p_pos, real_t left_tangent = 0, real_t right_tangent = 0); + void remove_point(int p_index); + void clear_points(); + + int get_index(real_t offset) const; + + void set_point_value(int p_index, real_t pos); + int set_point_offset(int p_index, float offset); + Vector2 get_point_pos(int p_index) const; + + real_t interpolate(real_t offset) const; + real_t interpolate_local_nocheck(int index, real_t local_offset) const; + + void clean_dupes(); + + void set_point_left_tangent(int i, real_t tangent); + void set_point_right_tangent(int i, real_t tangent); + real_t get_point_left_tangent(int i) const; + real_t get_point_right_tangent(int i) const; + + Array get_data() const; + void set_data(Array input); + + void bake(); + int get_bake_resolution() const { return _bake_resolution; } + void set_bake_resolution(int p_interval); + real_t interpolate_baked(real_t offset); + +protected: + static void _bind_methods(); + +private: + void mark_dirty(); + + Vector<Point> _points; + bool _baked_cache_dirty; + Vector<real_t> _baked_cache; + int _bake_resolution; +}; + class Curve2D : public Resource { GDCLASS(Curve2D, Resource); diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index a435ba06cc..24e3977de8 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -959,7 +959,6 @@ void Environment::_bind_methods() { ADD_GROUP("SS Reflections", "ss_reflections_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ss_reflections_enabled"), "set_ssr_enabled", "is_ssr_enabled"); ADD_PROPERTY(PropertyInfo(Variant::INT, "ss_reflections_max_steps", PROPERTY_HINT_RANGE, "1,512,1"), "set_ssr_max_steps", "get_ssr_max_steps"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "ss_reflections_accel", PROPERTY_HINT_RANGE, "0,4,0.01"), "set_ssr_accel", "get_ssr_accel"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "ss_reflections_fade_in", PROPERTY_HINT_EXP_EASING), "set_ssr_fade_in", "get_ssr_fade_in"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "ss_reflections_fade_out", PROPERTY_HINT_EXP_EASING), "set_ssr_fade_out", "get_ssr_fade_out"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "ss_reflections_depth_tolerance", PROPERTY_HINT_RANGE, "0.1,128,0.1"), "set_ssr_depth_tolerance", "get_ssr_depth_tolerance"); @@ -1040,7 +1039,7 @@ void Environment::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "dof_blur_far_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_dof_blur_far_amount", "get_dof_blur_far_amount"); ADD_PROPERTY(PropertyInfo(Variant::INT, "dof_blur_far_quality", PROPERTY_HINT_ENUM, "Low,Medium,High"), "set_dof_blur_far_quality", "get_dof_blur_far_quality"); - ADD_GROUP("DOF Far Near", "dof_blur_near_"); + ADD_GROUP("DOF Near Blur", "dof_blur_near_"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dof_blur_near_enabled"), "set_dof_blur_near_enabled", "is_dof_blur_near_enabled"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "dof_blur_near_distance", PROPERTY_HINT_EXP_RANGE, "0.01,8192,0.01"), "set_dof_blur_near_distance", "get_dof_blur_near_distance"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "dof_blur_near_transition", PROPERTY_HINT_EXP_RANGE, "0.01,8192,0.01"), "set_dof_blur_near_transition", "get_dof_blur_near_transition"); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index ce88325539..0912c70144 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -1232,17 +1232,17 @@ void SpatialMaterial::_bind_methods() { ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "albedo_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_ALBEDO); ADD_GROUP("Metallic", "metallic_"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "metallic_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_metallic", "get_metallic"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "metallic", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_metallic", "get_metallic"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "metallic_specular", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_specular", "get_specular"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "metallic_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_METALLIC); ADD_GROUP("Roughness", "roughness_"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "roughness_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_roughness", "get_roughness"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "roughness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_roughness", "get_roughness"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "roughness_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_ROUGHNESS); ADD_GROUP("Emission", "emission_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "emission_enabled"), "set_feature", "get_feature", FEATURE_EMISSION); - ADD_PROPERTY(PropertyInfo(Variant::COLOR, "emission_color", PROPERTY_HINT_COLOR_NO_ALPHA), "set_emission", "get_emission"); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "emission", PROPERTY_HINT_COLOR_NO_ALPHA), "set_emission", "get_emission"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "emission_energy", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_emission_energy", "get_emission_energy"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "emission_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_EMISSION); @@ -1253,19 +1253,19 @@ void SpatialMaterial::_bind_methods() { ADD_GROUP("Rim", "rim_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "rim_enabled"), "set_feature", "get_feature", FEATURE_RIM); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "rim_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_rim", "get_rim"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "rim", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_rim", "get_rim"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "rim_tint", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_rim_tint", "get_rim_tint"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "rim_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_RIM); ADD_GROUP("Clearcoat", "clearcoat_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "clearcoat_enabled"), "set_feature", "get_feature", FEATURE_CLEARCOAT); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "clearcoat_amount", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat", "get_clearcoat"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "clearcoat", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat", "get_clearcoat"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "clearcoat_gloss", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_clearcoat_gloss", "get_clearcoat_gloss"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "clearcoat_texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_CLEARCOAT); ADD_GROUP("Anisotropy", "anisotropy_"); ADD_PROPERTYI(PropertyInfo(Variant::BOOL, "anisotropy_enabled"), "set_feature", "get_feature", FEATURE_ANISOTROPY); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "anisotropy_anisotropy", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_anisotropy", "get_anisotropy"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "anisotropy", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_anisotropy", "get_anisotropy"); ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "anisotropy_flowmap", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", TEXTURE_FLOWMAP); ADD_GROUP("Ambient Occlusion", "ao_"); diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index a3180ee1df..ef7011b2af 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -668,7 +668,11 @@ void ArrayMesh::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::DICTIONARY, "surfaces/" + itos(i), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR)); p_list->push_back(PropertyInfo(Variant::STRING, "surface_" + itos(i + 1) + "/name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); - p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "Material", PROPERTY_USAGE_EDITOR)); + if (surfaces[i].is_2d) { + p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,CanvasItemMaterial", PROPERTY_USAGE_EDITOR)); + } else { + p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,SpatialMaterial", PROPERTY_USAGE_EDITOR)); + } } p_list->push_back(PropertyInfo(Variant::RECT3, "custom_aabb/custom_aabb")); @@ -692,6 +696,7 @@ void ArrayMesh::add_surface(uint32_t p_format, PrimitiveType p_primitive, const Surface s; s.aabb = p_aabb; + s.is_2d = p_format & ARRAY_FLAG_USE_2D_VERTICES; surfaces.push_back(s); _recompute_aabb(); @@ -709,7 +714,8 @@ void ArrayMesh::add_surface_from_arrays(PrimitiveType p_primitive, const Array & /* make aABB? */ { - PoolVector<Vector3> vertices = p_arrays[ARRAY_VERTEX]; + Variant arr = p_arrays[ARRAY_VERTEX]; + PoolVector<Vector3> vertices = arr; int len = vertices.size(); ERR_FAIL_COND(len == 0); PoolVector<Vector3>::Read r = vertices.read(); @@ -726,6 +732,7 @@ void ArrayMesh::add_surface_from_arrays(PrimitiveType p_primitive, const Array & } surfaces[surfaces.size() - 1].aabb = aabb; + surfaces[surfaces.size() - 1].is_2d = arr.get_type() == Variant::POOL_VECTOR2_ARRAY; _recompute_aabb(); } diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index 37fddf3aa6..f716b59fe9 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -147,6 +147,7 @@ private: String name; Rect3 aabb; Ref<Material> material; + bool is_2d; }; Vector<Surface> surfaces; RID mesh; diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index 60fb97c792..b2822ca0c4 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -28,7 +28,7 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "surface_tool.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" #define _VERTEX_SNAP 0.0001 #define EQ_VERTEX_DIST 0.00001 diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 2120b37497..0bd8c41228 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -28,9 +28,11 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #include "texture.h" -#include "core/method_bind_ext.inc" +#include "core/method_bind_ext.gen.inc" #include "core/os/os.h" +#include "core_string_names.h" #include "io/image_loader.h" + Size2 Texture::get_size() const { return Size2(get_width(), get_height()); @@ -1376,254 +1378,126 @@ void CurveTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("set_width", "width"), &CurveTexture::set_width); - ClassDB::bind_method(D_METHOD("set_points", "points"), &CurveTexture::set_points); - ClassDB::bind_method(D_METHOD("get_points"), &CurveTexture::get_points); + ClassDB::bind_method(D_METHOD("set_curve", "curve:Curve"), &CurveTexture::set_curve); + ClassDB::bind_method(D_METHOD("get_curve:Curve"), &CurveTexture::get_curve); + + ClassDB::bind_method(D_METHOD("_update"), &CurveTexture::_update); ADD_PROPERTY(PropertyInfo(Variant::REAL, "min", PROPERTY_HINT_RANGE, "-1024,1024"), "set_min", "get_min"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "max", PROPERTY_HINT_RANGE, "-1024,1024"), "set_max", "get_max"); ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "32,4096"), "set_width", "get_width"); - ADD_PROPERTY(PropertyInfo(Variant::POOL_VECTOR2_ARRAY, "points"), "set_points", "get_points"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_curve", "get_curve"); } void CurveTexture::set_max(float p_max) { - max = p_max; + _max = p_max; emit_changed(); } float CurveTexture::get_max() const { - return max; + return _max; } void CurveTexture::set_min(float p_min) { - min = p_min; + _min = p_min; emit_changed(); } float CurveTexture::get_min() const { - return min; + return _min; } void CurveTexture::set_width(int p_width) { ERR_FAIL_COND(p_width < 32 || p_width > 4096); - width = p_width; - if (points.size()) - set_points(points); + _width = p_width; + _update(); } int CurveTexture::get_width() const { - return width; + return _width; } -static void _plot_curve(const Vector2 &p_a, const Vector2 &p_b, const Vector2 &p_c, const Vector2 &p_d, float *p_heights, bool *p_useds, int p_width, float p_min, float p_max) { - - float geometry[4][4]; - float tmp1[4][4]; - float tmp2[4][4]; - float deltas[4][4]; - double x, dx, dx2, dx3; - double y, dy, dy2, dy3; - double d, d2, d3; - int lastx; - int newx; - float lasty; - float newy; - int ntimes; - int i, j; - - int xmax = p_width; - - /* construct the geometry matrix from the segment */ - for (i = 0; i < 4; i++) { - geometry[i][2] = 0; - geometry[i][3] = 0; - } +void CurveTexture::ensure_default_setup() { - geometry[0][0] = (p_a[0] * xmax); - geometry[1][0] = (p_b[0] * xmax); - geometry[2][0] = (p_c[0] * xmax); - geometry[3][0] = (p_d[0] * xmax); - - geometry[0][1] = (p_a[1]); - geometry[1][1] = (p_b[1]); - geometry[2][1] = (p_c[1]); - geometry[3][1] = (p_d[1]); - - /* subdivide the curve ntimes (1000) times */ - ntimes = 4 * xmax; - /* ntimes can be adjusted to give a finer or coarser curve */ - d = 1.0 / ntimes; - d2 = d * d; - d3 = d * d * d; - - /* construct a temporary matrix for determining the forward differencing deltas */ - tmp2[0][0] = 0; - tmp2[0][1] = 0; - tmp2[0][2] = 0; - tmp2[0][3] = 1; - tmp2[1][0] = d3; - tmp2[1][1] = d2; - tmp2[1][2] = d; - tmp2[1][3] = 0; - tmp2[2][0] = 6 * d3; - tmp2[2][1] = 2 * d2; - tmp2[2][2] = 0; - tmp2[2][3] = 0; - tmp2[3][0] = 6 * d3; - tmp2[3][1] = 0; - tmp2[3][2] = 0; - tmp2[3][3] = 0; - - /* compose the basis and geometry matrices */ - - static const float CR_basis[4][4] = { - { -0.5, 1.5, -1.5, 0.5 }, - { 1.0, -2.5, 2.0, -0.5 }, - { -0.5, 0.0, 0.5, 0.0 }, - { 0.0, 1.0, 0.0, 0.0 }, - }; - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - tmp1[i][j] = (CR_basis[i][0] * geometry[0][j] + - CR_basis[i][1] * geometry[1][j] + - CR_basis[i][2] * geometry[2][j] + - CR_basis[i][3] * geometry[3][j]); - } + if (_curve.is_null()) { + Ref<Curve> curve = Ref<Curve>(memnew(Curve)); + curve->add_point(Vector2(0, 1)); + curve->add_point(Vector2(1, 1)); + set_curve(curve); } - /* compose the above results to get the deltas matrix */ - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - deltas[i][j] = (tmp2[i][0] * tmp1[0][j] + - tmp2[i][1] * tmp1[1][j] + - tmp2[i][2] * tmp1[2][j] + - tmp2[i][3] * tmp1[3][j]); - } + + if (get_min() == 0 && get_max() == 1) { + set_max(32); } +} - /* extract the x deltas */ - x = deltas[0][0]; - dx = deltas[1][0]; - dx2 = deltas[2][0]; - dx3 = deltas[3][0]; - - /* extract the y deltas */ - y = deltas[0][1]; - dy = deltas[1][1]; - dy2 = deltas[2][1]; - dy3 = deltas[3][1]; - - lastx = CLAMP(x, 0, xmax); - lasty = y; - - p_heights[lastx] = lasty; - p_useds[lastx] = true; - - /* loop over the curve */ - for (i = 0; i < ntimes; i++) { - /* increment the x values */ - x += dx; - dx += dx2; - dx2 += dx3; - - /* increment the y values */ - y += dy; - dy += dy2; - dy2 += dy3; - - newx = CLAMP((Math::round(x)), 0, xmax); - newy = CLAMP(y, p_min, p_max); - - /* if this point is different than the last one...then draw it */ - if ((lastx != newx) || (lasty != newy)) { - p_useds[newx] = true; - p_heights[newx] = newy; +void CurveTexture::set_curve(Ref<Curve> p_curve) { + if (_curve != p_curve) { + if (_curve.is_valid()) { + _curve->disconnect(CoreStringNames::get_singleton()->changed, this, "_update"); } - - lastx = newx; - lasty = newy; + _curve = p_curve; + if (_curve.is_valid()) { + _curve->connect(CoreStringNames::get_singleton()->changed, this, "_update"); + } + _update(); } } -void CurveTexture::set_points(const PoolVector<Vector2> &p_points) { - - points = p_points; +void CurveTexture::_update() { PoolVector<uint8_t> data; - PoolVector<bool> used; - data.resize(width * sizeof(float)); - used.resize(width); + data.resize(_width * sizeof(float)); + + // The array is locked in that scope { PoolVector<uint8_t>::Write wd8 = data.write(); float *wd = (float *)wd8.ptr(); - PoolVector<bool>::Write wu = used.write(); - int pc = p_points.size(); - PoolVector<Vector2>::Read pr = p_points.read(); - - for (int i = 0; i < width; i++) { - wd[i] = 0.0; - wu[i] = false; - } - - Vector2 prev = Vector2(0, 0); - Vector2 prev2 = Vector2(0, 0); - - for (int i = -1; i < pc; i++) { - Vector2 next; - Vector2 next2; - if (i + 1 >= pc) { - next = Vector2(1, 0); - } else { - next = Vector2(pr[i + 1].x, pr[i + 1].y); + if (_curve.is_valid()) { + Curve &curve = **_curve; + float height = _max - _min; + for (int i = 0; i < _width; ++i) { + float t = i / static_cast<float>(_width); + float v = curve.interpolate_baked(t); + wd[i] = CLAMP(_min + v * height, _min, _max); } - if (i + 2 >= pc) { - next2 = Vector2(1, 0); - } else { - next2 = Vector2(pr[i + 2].x, pr[i + 2].y); + } else { + for (int i = 0; i < _width; ++i) { + wd[i] = 0; } - - /*if (i==-1 && prev.offset==next.offset) { - prev=next; - continue; - }*/ - - _plot_curve(prev2, prev, next, next2, wd, wu.ptr(), width, min, max); - - prev2 = prev; - prev = next; } } - Ref<Image> image = memnew(Image(width, 1, false, Image::FORMAT_RF, data)); + Ref<Image> image = memnew(Image(_width, 1, false, Image::FORMAT_RF, data)); - VS::get_singleton()->texture_allocate(texture, width, 1, Image::FORMAT_RF, VS::TEXTURE_FLAG_FILTER); - VS::get_singleton()->texture_set_data(texture, image); + VS::get_singleton()->texture_allocate(_texture, _width, 1, Image::FORMAT_RF, VS::TEXTURE_FLAG_FILTER); + VS::get_singleton()->texture_set_data(_texture, image); emit_changed(); } -PoolVector<Vector2> CurveTexture::get_points() const { +Ref<Curve> CurveTexture::get_curve() const { - return points; + return _curve; } RID CurveTexture::get_rid() const { - return texture; + return _texture; } CurveTexture::CurveTexture() { - max = 1; - min = 0; - width = 2048; - texture = VS::get_singleton()->texture_create(); + _max = 1; + _min = 0; + _width = 2048; + _texture = VS::get_singleton()->texture_create(); } CurveTexture::~CurveTexture() { - VS::get_singleton()->free(texture); + VS::get_singleton()->free(_texture); } ////////////////// @@ -1634,13 +1508,6 @@ CurveTexture::~CurveTexture() { #define COLOR_RAMP_SET_COLORS "set_colors" GradientTexture::GradientTexture() { - //Set initial color ramp transition from black to white - points.resize(2); - points[0].color = Color(0, 0, 0, 1); - points[0].offset = 0; - points[1].color = Color(1, 1, 1, 1); - points[1].offset = 1; - is_sorted = true; update_pending = false; width = 2048; @@ -1654,32 +1521,33 @@ GradientTexture::~GradientTexture() { void GradientTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_point", "offset", "color"), &GradientTexture::add_point); - ClassDB::bind_method(D_METHOD("remove_point", "offset", "color"), &GradientTexture::remove_point); - - ClassDB::bind_method(D_METHOD("set_offset", "point", "offset"), &GradientTexture::set_offset); - ClassDB::bind_method(D_METHOD("get_offset", "point"), &GradientTexture::get_offset); - - ClassDB::bind_method(D_METHOD("set_color", "point", "color"), &GradientTexture::set_color); - ClassDB::bind_method(D_METHOD("get_color", "point"), &GradientTexture::get_color); + ClassDB::bind_method(D_METHOD("set_gradient", "gradient:Gradient"), &GradientTexture::set_gradient); + ClassDB::bind_method(D_METHOD("get_gradient:Gradient"), &GradientTexture::get_gradient); ClassDB::bind_method(D_METHOD("set_width", "width"), &GradientTexture::set_width); - ClassDB::bind_method(D_METHOD("interpolate", "offset"), &GradientTexture::get_color_at_offset); - - ClassDB::bind_method(D_METHOD("get_point_count"), &GradientTexture::get_points_count); - ClassDB::bind_method(D_METHOD("_update"), &GradientTexture::_update); - ClassDB::bind_method(D_METHOD(COLOR_RAMP_SET_OFFSETS, "offsets"), &GradientTexture::set_offsets); - ClassDB::bind_method(D_METHOD(COLOR_RAMP_GET_OFFSETS), &GradientTexture::get_offsets); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_gradient", "get_gradient"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "width"), "set_width", "get_width"); +} - ClassDB::bind_method(D_METHOD(COLOR_RAMP_SET_COLORS, "colors"), &GradientTexture::set_colors); - ClassDB::bind_method(D_METHOD(COLOR_RAMP_GET_COLORS), &GradientTexture::get_colors); +void GradientTexture::set_gradient(Ref<Gradient> p_gradient) { + if (p_gradient == gradient) + return; + if (gradient.is_valid()) { + gradient->disconnect(CoreStringNames::get_singleton()->changed, this, "_update"); + } + gradient = p_gradient; + if (gradient.is_valid()) { + gradient->connect(CoreStringNames::get_singleton()->changed, this, "_update"); + } + _update(); + emit_changed(); +} - ADD_PROPERTY(PropertyInfo(Variant::INT, "width"), "set_width", "get_width"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "offsets"), COLOR_RAMP_SET_OFFSETS, COLOR_RAMP_GET_OFFSETS); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "colors"), COLOR_RAMP_SET_COLORS, COLOR_RAMP_GET_COLORS); +Ref<Gradient> GradientTexture::get_gradient() const { + return gradient; } void GradientTexture::_queue_update() { @@ -1692,16 +1560,22 @@ void GradientTexture::_queue_update() { void GradientTexture::_update() { + if (gradient.is_null()) + return; + update_pending = false; PoolVector<uint8_t> data; data.resize(width * 4); { PoolVector<uint8_t>::Write wd8 = data.write(); + Gradient &g = **gradient; + for (int i = 0; i < width; i++) { + float ofs = float(i) / (width - 1); + Color color = g.get_color_at_offset(ofs); - Color color = get_color_at_offset(ofs); wd8[i * 4 + 0] = uint8_t(CLAMP(color.r * 255.0, 0, 255)); wd8[i * 4 + 1] = uint8_t(CLAMP(color.g * 255.0, 0, 255)); wd8[i * 4 + 2] = uint8_t(CLAMP(color.b * 255.0, 0, 255)); @@ -1727,112 +1601,6 @@ int GradientTexture::get_width() const { return width; } -Vector<float> GradientTexture::get_offsets() const { - Vector<float> offsets; - offsets.resize(points.size()); - for (int i = 0; i < points.size(); i++) { - offsets[i] = points[i].offset; - } - return offsets; -} - -Vector<Color> GradientTexture::get_colors() const { - Vector<Color> colors; - colors.resize(points.size()); - for (int i = 0; i < points.size(); i++) { - colors[i] = points[i].color; - } - return colors; -} - -void GradientTexture::set_offsets(const Vector<float> &p_offsets) { - points.resize(p_offsets.size()); - for (int i = 0; i < points.size(); i++) { - points[i].offset = p_offsets[i]; - } - is_sorted = false; - emit_changed(); - _queue_update(); -} - -void GradientTexture::set_colors(const Vector<Color> &p_colors) { - if (points.size() < p_colors.size()) - is_sorted = false; - points.resize(p_colors.size()); - for (int i = 0; i < points.size(); i++) { - points[i].color = p_colors[i]; - } - emit_changed(); - _queue_update(); -} - -Vector<GradientTexture::Point> &GradientTexture::get_points() { - return points; -} - -void GradientTexture::add_point(float p_offset, const Color &p_color) { - - Point p; - p.offset = p_offset; - p.color = p_color; - is_sorted = false; - points.push_back(p); - - emit_changed(); - _queue_update(); -} - -void GradientTexture::remove_point(int p_index) { - - ERR_FAIL_INDEX(p_index, points.size()); - ERR_FAIL_COND(points.size() <= 2); - points.remove(p_index); - emit_changed(); - _queue_update(); -} - -void GradientTexture::set_points(Vector<GradientTexture::Point> &p_points) { - points = p_points; - is_sorted = false; - emit_changed(); - _queue_update(); -} - -void GradientTexture::set_offset(int pos, const float offset) { - if (points.size() <= pos) - points.resize(pos + 1); - points[pos].offset = offset; - is_sorted = false; - emit_changed(); - _queue_update(); -} - -float GradientTexture::get_offset(int pos) const { - if (points.size() > pos) - return points[pos].offset; - return 0; //TODO: Maybe throw some error instead? -} - Ref<Image> GradientTexture::get_data() const { return VisualServer::get_singleton()->texture_get_data(texture); } - -void GradientTexture::set_color(int pos, const Color &color) { - if (points.size() <= pos) { - points.resize(pos + 1); - is_sorted = false; - } - points[pos].color = color; - emit_changed(); - _queue_update(); -} - -Color GradientTexture::get_color(int pos) const { - if (points.size() > pos) - return points[pos].color; - return Color(0, 0, 0, 1); //TODO: Maybe throw some error instead? -} - -int GradientTexture::get_points_count() const { - return points.size(); -} diff --git a/scene/resources/texture.h b/scene/resources/texture.h index 2b82dbd21f..ff5a58c221 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -30,9 +30,11 @@ #ifndef TEXTURE_H #define TEXTURE_H +#include "curve.h" #include "io/resource_loader.h" #include "math_2d.h" #include "resource.h" +#include "scene/resources/color_ramp.h" #include "servers/visual_server.h" /** @@ -389,20 +391,22 @@ public: ~CubeMap(); }; -VARIANT_ENUM_CAST(CubeMap::Flags); -VARIANT_ENUM_CAST(CubeMap::Side); -VARIANT_ENUM_CAST(CubeMap::Storage); +VARIANT_ENUM_CAST(CubeMap::Flags) +VARIANT_ENUM_CAST(CubeMap::Side) +VARIANT_ENUM_CAST(CubeMap::Storage) class CurveTexture : public Texture { - GDCLASS(CurveTexture, Texture); - RES_BASE_EXTENSION("curvetex"); + GDCLASS(CurveTexture, Texture) + RES_BASE_EXTENSION("curvetex") private: - RID texture; - PoolVector<Vector2> points; - float min, max; - int width; + RID _texture; + Ref<Curve> _curve; + float _min, _max; + int _width; + + void _update(); protected: static void _bind_methods(); @@ -417,8 +421,10 @@ public: void set_width(int p_width); int get_width() const; - void set_points(const PoolVector<Vector2> &p_points); - PoolVector<Vector2> get_points() const; + void ensure_default_setup(); + + void set_curve(Ref<Curve> p_curve); + Ref<Curve> get_curve() const; virtual RID get_rid() const; @@ -446,7 +452,7 @@ public: //VARIANT_ENUM_CAST( Texture::CubeMapSide ); class GradientTexture : public Texture { - GDCLASS(GradientTexture, Texture); + GDCLASS(GradientTexture, Texture) public: struct Point { @@ -459,8 +465,7 @@ public: }; private: - Vector<Point> points; - bool is_sorted; + Ref<Gradient> gradient; bool update_pending; RID texture; int width; @@ -472,23 +477,8 @@ protected: static void _bind_methods(); public: - void add_point(float p_offset, const Color &p_color); - void remove_point(int p_index); - - void set_points(Vector<Point> &points); - Vector<Point> &get_points(); - - void set_offset(int pos, const float offset); - float get_offset(int pos) const; - - void set_color(int pos, const Color &color); - Color get_color(int pos) const; - - void set_offsets(const Vector<float> &offsets); - Vector<float> get_offsets() const; - - void set_colors(const Vector<Color> &colors); - Vector<Color> get_colors() const; + void set_gradient(Ref<Gradient> p_gradient); + Ref<Gradient> get_gradient() const; void set_width(int p_width); int get_width() const; @@ -500,52 +490,8 @@ public: virtual void set_flags(uint32_t p_flags) {} virtual uint32_t get_flags() const { return FLAG_FILTER; } - _FORCE_INLINE_ Color get_color_at_offset(float p_offset) { - - if (points.empty()) - return Color(0, 0, 0, 1); - - if (!is_sorted) { - points.sort(); - is_sorted = true; - } - - //binary search - int low = 0; - int high = points.size() - 1; - int middle; - - while (low <= high) { - middle = (low + high) / 2; - Point &point = points[middle]; - if (point.offset > p_offset) { - high = middle - 1; //search low end of array - } else if (point.offset < p_offset) { - low = middle + 1; //search high end of array - } else { - return point.color; - } - } - - //return interpolated value - if (points[middle].offset > p_offset) { - middle--; - } - int first = middle; - int second = middle + 1; - if (second >= points.size()) - return points[points.size() - 1].color; - if (first < 0) - return points[0].color; - Point &pointFirst = points[first]; - Point &pointSecond = points[second]; - return pointFirst.color.linear_interpolate(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset)); - } - virtual Ref<Image> get_data() const; - int get_points_count() const; - GradientTexture(); virtual ~GradientTexture(); }; diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 76bb1daf94..b9d2c503e1 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -45,18 +45,22 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { tile_set_name(id, p_value); else if (what == "texture") tile_set_texture(id, p_value); + else if (what == "normal_map") + tile_set_normal_map(id, p_value); else if (what == "tex_offset") tile_set_texture_offset(id, p_value); else if (what == "material") tile_set_material(id, p_value); else if (what == "modulate") tile_set_modulate(id, p_value); - else if (what == "shape_offset") - tile_set_shape_offset(id, p_value); else if (what == "region") tile_set_region(id, p_value); else if (what == "shape") - tile_set_shape(id, p_value); + tile_set_shape(id, 0, p_value); + else if (what == "shape_offset") + tile_set_shape_offset(id, 0, p_value); + else if (what == "shape_one_way") + tile_set_shape_one_way(id, 0, p_value); else if (what == "shapes") _tile_set_shapes(id, p_value); else if (what == "occluder") @@ -89,18 +93,22 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { r_ret = tile_get_name(id); else if (what == "texture") r_ret = tile_get_texture(id); + else if (what == "normal_map") + r_ret = tile_get_normal_map(id); else if (what == "tex_offset") r_ret = tile_get_texture_offset(id); else if (what == "material") r_ret = tile_get_material(id); else if (what == "modulate") r_ret = tile_get_modulate(id); - else if (what == "shape_offset") - r_ret = tile_get_shape_offset(id); else if (what == "region") r_ret = tile_get_region(id); else if (what == "shape") - r_ret = tile_get_shape(id); + r_ret = tile_get_shape(id, 0); + else if (what == "shape_offset") + r_ret = tile_get_shape_offset(id, 0); + else if (what == "shape_one_way") + r_ret = tile_get_shape_one_way(id, 0); else if (what == "shapes") r_ret = _tile_get_shapes(id); else if (what == "occluder") @@ -119,12 +127,13 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { - for (Map<int, Data>::Element *E = tile_map.front(); E; E = E->next()) { + for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { int id = E->key(); String pre = itos(id) + "/"; p_list->push_back(PropertyInfo(Variant::STRING, pre + "name")); p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture")); + p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "normal_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture")); p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "tex_offset")); p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial")); p_list->push_back(PropertyInfo(Variant::COLOR, pre + "modulate")); @@ -133,8 +142,9 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "occluder", PROPERTY_HINT_RESOURCE_TYPE, "OccluderPolygon2D")); p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "navigation_offset")); p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "navigation", PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon")); - p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "shape_offset")); + p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "shape_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); p_list->push_back(PropertyInfo(Variant::OBJECT, pre + "shape", PROPERTY_HINT_RESOURCE_TYPE, "Shape2D", PROPERTY_USAGE_EDITOR)); + p_list->push_back(PropertyInfo(Variant::BOOL, pre + "shape_one_way", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "shapes", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR)); } } @@ -142,7 +152,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { void TileSet::create_tile(int p_id) { ERR_FAIL_COND(tile_map.has(p_id)); - tile_map[p_id] = Data(); + tile_map[p_id] = TileData(); _change_notify(""); emit_changed(); } @@ -160,6 +170,19 @@ Ref<Texture> TileSet::tile_get_texture(int p_id) const { return tile_map[p_id].texture; } +void TileSet::tile_set_normal_map(int p_id, const Ref<Texture> &p_normal_map) { + + ERR_FAIL_COND(!tile_map.has(p_id)); + tile_map[p_id].normal_map = p_normal_map; + emit_changed(); +} + +Ref<Texture> TileSet::tile_get_normal_map(int p_id) const { + + ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<Texture>()); + return tile_map[p_id].normal_map; +} + void TileSet::tile_set_material(int p_id, const Ref<ShaderMaterial> &p_material) { ERR_FAIL_COND(!tile_map.has(p_id)); @@ -199,19 +222,6 @@ Vector2 TileSet::tile_get_texture_offset(int p_id) const { return tile_map[p_id].offset; } -void TileSet::tile_set_shape_offset(int p_id, const Vector2 &p_offset) { - - ERR_FAIL_COND(!tile_map.has(p_id)); - tile_map[p_id].shape_offset = p_offset; - emit_changed(); -} - -Vector2 TileSet::tile_get_shape_offset(int p_id) const { - - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); - return tile_map[p_id].shape_offset; -} - void TileSet::tile_set_region(int p_id, const Rect2 &p_region) { ERR_FAIL_COND(!tile_map.has(p_id)); @@ -238,23 +248,82 @@ String TileSet::tile_get_name(int p_id) const { return tile_map[p_id].name; } -void TileSet::tile_set_shape(int p_id, const Ref<Shape2D> &p_shape) { +void TileSet::tile_clear_shapes(int p_id) { + tile_map[p_id].shapes_data.clear(); +} + +void TileSet::tile_add_shape(int p_id, const Ref<Shape2D> &p_shape, const Vector2 &p_offset, bool p_one_way) { ERR_FAIL_COND(!tile_map.has(p_id)); - tile_map[p_id].shapes.resize(1); - tile_map[p_id].shapes[0] = p_shape; + + ShapeData new_data = ShapeData(); + new_data.shape = p_shape; + new_data.shape_offset = p_offset; + new_data.one_way_collision = p_one_way; + + tile_map[p_id].shapes_data.push_back(new_data); +}; +int TileSet::tile_get_shape_count(int p_id) const { + + ERR_FAIL_COND_V(!tile_map.has(p_id), 0); + + return tile_map[p_id].shapes_data.size(); +}; + +void TileSet::tile_set_shape(int p_id, int p_shape_id, const Ref<Shape2D> &p_shape) { + + ERR_FAIL_COND(!tile_map.has(p_id)); + if (tile_map[p_id].shapes_data.size() <= p_shape_id) + tile_map[p_id].shapes_data.resize(p_shape_id + 1); + tile_map[p_id].shapes_data[p_shape_id].shape = p_shape; emit_changed(); } -Ref<Shape2D> TileSet::tile_get_shape(int p_id) const { +Ref<Shape2D> TileSet::tile_get_shape(int p_id, int p_shape_id) const { ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<Shape2D>()); - if (tile_map[p_id].shapes.size() > 0) - return tile_map[p_id].shapes[0]; + if (tile_map[p_id].shapes_data.size() > p_shape_id) + return tile_map[p_id].shapes_data[p_shape_id].shape; return Ref<Shape2D>(); } +void TileSet::tile_set_shape_offset(int p_id, int p_shape_id, const Vector2 &p_offset) { + + ERR_FAIL_COND(!tile_map.has(p_id)); + if (tile_map[p_id].shapes_data.size() <= p_shape_id) + tile_map[p_id].shapes_data.resize(p_shape_id + 1); + tile_map[p_id].shapes_data[p_shape_id].shape_offset = p_offset; + emit_changed(); +} + +Vector2 TileSet::tile_get_shape_offset(int p_id, int p_shape_id) const { + + ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); + if (tile_map[p_id].shapes_data.size() > p_shape_id) + return tile_map[p_id].shapes_data[p_shape_id].shape_offset; + + return Vector2(); +} + +void TileSet::tile_set_shape_one_way(int p_id, int p_shape_id, const bool p_one_way) { + + ERR_FAIL_COND(!tile_map.has(p_id)); + if (tile_map[p_id].shapes_data.size() <= p_shape_id) + tile_map[p_id].shapes_data.resize(p_shape_id + 1); + tile_map[p_id].shapes_data[p_shape_id].one_way_collision = p_one_way; + emit_changed(); +} + +bool TileSet::tile_get_shape_one_way(int p_id, int p_shape_id) const { + + ERR_FAIL_COND_V(!tile_map.has(p_id), false); + if (tile_map[p_id].shapes_data.size() > p_shape_id) + return tile_map[p_id].shapes_data[p_shape_id].one_way_collision; + + return false; +} + void TileSet::tile_set_light_occluder(int p_id, const Ref<OccluderPolygon2D> &p_light_occluder) { ERR_FAIL_COND(!tile_map.has(p_id)); @@ -301,31 +370,63 @@ Vector2 TileSet::tile_get_occluder_offset(int p_id) const { return tile_map[p_id].occluder_offset; } -void TileSet::tile_set_shapes(int p_id, const Vector<Ref<Shape2D> > &p_shapes) { +void TileSet::tile_set_shapes(int p_id, const Vector<ShapeData> &p_shapes) { ERR_FAIL_COND(!tile_map.has(p_id)); - tile_map[p_id].shapes = p_shapes; + tile_map[p_id].shapes_data = p_shapes; emit_changed(); } -Vector<Ref<Shape2D> > TileSet::tile_get_shapes(int p_id) const { +Vector<TileSet::ShapeData> TileSet::tile_get_shapes(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector<Ref<Shape2D> >()); - return tile_map[p_id].shapes; + ERR_FAIL_COND_V(!tile_map.has(p_id), Vector<ShapeData>()); + + return tile_map[p_id].shapes_data; } void TileSet::_tile_set_shapes(int p_id, const Array &p_shapes) { ERR_FAIL_COND(!tile_map.has(p_id)); - Vector<Ref<Shape2D> > shapes; + Vector<ShapeData> shapes_data; + Vector2 default_offset = tile_get_shape_offset(p_id, 0); + bool default_one_way = tile_get_shape_one_way(p_id, 0); for (int i = 0; i < p_shapes.size(); i++) { - - Ref<Shape2D> s = p_shapes[i]; - if (s.is_valid()) - shapes.push_back(s); + ShapeData s = ShapeData(); + + if (p_shapes[i].get_type() == Variant::OBJECT) { + Ref<Shape2D> shape = p_shapes[i]; + if (shape.is_null()) continue; + + s.shape = shape; + s.shape_offset = default_offset; + s.one_way_collision = default_one_way; + } else if (p_shapes[i].get_type() == Variant::DICTIONARY) { + Dictionary d = p_shapes[i]; + + if (d.has("shape") && d["shape"].get_type() == Variant::OBJECT) + s.shape = d["shape"]; + else + continue; + + if (d.has("shape_offset") && d["shape_offset"].get_type() == Variant::VECTOR2) + s.shape_offset = d["shape_offset"]; + else + s.shape_offset = default_offset; + + if (d.has("one_way") && d["one_way"].get_type() == Variant::BOOL) + s.one_way_collision = d["one_way"]; + else + s.one_way_collision = default_one_way; + + } else { + ERR_EXPLAIN("Expected an array of objects or dictionaries for tile_set_shapes"); + ERR_CONTINUE(true); + } + + shapes_data.push_back(s); } - tile_set_shapes(p_id, shapes); + tile_map[p_id].shapes_data = shapes_data; } Array TileSet::_tile_get_shapes(int p_id) const { @@ -333,9 +434,14 @@ Array TileSet::_tile_get_shapes(int p_id) const { ERR_FAIL_COND_V(!tile_map.has(p_id), Array()); Array arr; - Vector<Ref<Shape2D> > shp = tile_map[p_id].shapes; - for (int i = 0; i < shp.size(); i++) - arr.push_back(shp[i]); + Vector<ShapeData> data = tile_map[p_id].shapes_data; + for (int i = 0; i < data.size(); i++) { + Dictionary shape_data; + shape_data["shape"] = data[i].shape; + shape_data["shape_offset"] = data[i].shape_offset; + shape_data["one_way"] = data[i].one_way_collision; + arr.push_back(shape_data); + } return arr; } @@ -344,7 +450,7 @@ Array TileSet::_get_tiles_ids() const { Array arr; - for (Map<int, Data>::Element *E = tile_map.front(); E; E = E->next()) { + for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { arr.push_back(E->key()); } @@ -353,7 +459,7 @@ Array TileSet::_get_tiles_ids() const { void TileSet::get_tile_list(List<int> *p_tiles) const { - for (Map<int, Data>::Element *E = tile_map.front(); E; E = E->next()) { + for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { p_tiles->push_back(E->key()); } @@ -382,7 +488,7 @@ int TileSet::get_last_unused_tile_id() const { int TileSet::find_tile_by_name(const String &p_name) const { - for (Map<int, Data>::Element *E = tile_map.front(); E; E = E->next()) { + for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { if (p_name == E->get().name) return E->key(); @@ -404,16 +510,22 @@ void TileSet::_bind_methods() { ClassDB::bind_method(D_METHOD("tile_get_name", "id"), &TileSet::tile_get_name); ClassDB::bind_method(D_METHOD("tile_set_texture", "id", "texture:Texture"), &TileSet::tile_set_texture); ClassDB::bind_method(D_METHOD("tile_get_texture:Texture", "id"), &TileSet::tile_get_texture); + ClassDB::bind_method(D_METHOD("tile_set_normal_map", "id", "normal_map:Texture"), &TileSet::tile_set_normal_map); + ClassDB::bind_method(D_METHOD("tile_get_normal_map:Texture", "id"), &TileSet::tile_get_normal_map); ClassDB::bind_method(D_METHOD("tile_set_material", "id", "material:ShaderMaterial"), &TileSet::tile_set_material); ClassDB::bind_method(D_METHOD("tile_get_material:ShaderMaterial", "id"), &TileSet::tile_get_material); ClassDB::bind_method(D_METHOD("tile_set_texture_offset", "id", "texture_offset"), &TileSet::tile_set_texture_offset); ClassDB::bind_method(D_METHOD("tile_get_texture_offset", "id"), &TileSet::tile_get_texture_offset); - ClassDB::bind_method(D_METHOD("tile_set_shape_offset", "id", "shape_offset"), &TileSet::tile_set_shape_offset); - ClassDB::bind_method(D_METHOD("tile_get_shape_offset", "id"), &TileSet::tile_get_shape_offset); ClassDB::bind_method(D_METHOD("tile_set_region", "id", "region"), &TileSet::tile_set_region); ClassDB::bind_method(D_METHOD("tile_get_region", "id"), &TileSet::tile_get_region); - ClassDB::bind_method(D_METHOD("tile_set_shape", "id", "shape:Shape2D"), &TileSet::tile_set_shape); - ClassDB::bind_method(D_METHOD("tile_get_shape:Shape2D", "id"), &TileSet::tile_get_shape); + ClassDB::bind_method(D_METHOD("tile_set_shape", "id", "shape_id", "shape:Shape2D"), &TileSet::tile_set_shape); + ClassDB::bind_method(D_METHOD("tile_get_shape:Shape2D", "id", "shape_id"), &TileSet::tile_get_shape); + ClassDB::bind_method(D_METHOD("tile_set_shape_offset", "id", "shape_id", "shape_offset"), &TileSet::tile_set_shape_offset); + ClassDB::bind_method(D_METHOD("tile_get_shape_offset", "id", "shape_id"), &TileSet::tile_get_shape_offset); + ClassDB::bind_method(D_METHOD("tile_set_shape_one_way", "id", "shape_id", "one_way"), &TileSet::tile_set_shape_one_way); + ClassDB::bind_method(D_METHOD("tile_get_shape_one_way", "id", "shape_id"), &TileSet::tile_get_shape_one_way); + ClassDB::bind_method(D_METHOD("tile_add_shape", "id", "shape:Shape2D", "shape_offset", "one_way"), &TileSet::tile_add_shape, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("tile_get_shape_count", "id"), &TileSet::tile_get_shape_count); ClassDB::bind_method(D_METHOD("tile_set_shapes", "id", "shapes"), &TileSet::_tile_set_shapes); ClassDB::bind_method(D_METHOD("tile_get_shapes", "id"), &TileSet::_tile_get_shapes); ClassDB::bind_method(D_METHOD("tile_set_navigation_polygon", "id", "navigation_polygon:NavigationPolygon"), &TileSet::tile_set_navigation_polygon); diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 448444d34a..c07d82c75a 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -40,14 +40,26 @@ class TileSet : public Resource { GDCLASS(TileSet, Resource); - struct Data { +public: + struct ShapeData { + Ref<Shape2D> shape; + Vector2 shape_offset; + bool one_way_collision; + + ShapeData() { + one_way_collision = false; + } + }; + +private: + struct TileData { String name; Ref<Texture> texture; + Ref<Texture> normal_map; Vector2 offset; - Vector2 shape_offset; Rect2i region; - Vector<Ref<Shape2D> > shapes; + Vector<ShapeData> shapes_data; Vector2 occluder_offset; Ref<OccluderPolygon2D> occluder; Vector2 navigation_polygon_offset; @@ -56,11 +68,11 @@ class TileSet : public Resource { Color modulate; // Default modulate for back-compat - explicit Data() + explicit TileData() : modulate(1, 1, 1) {} }; - Map<int, Data> tile_map; + Map<int, TileData> tile_map; protected: bool _set(const StringName &p_name, const Variant &p_value); @@ -81,17 +93,30 @@ public: void tile_set_texture(int p_id, const Ref<Texture> &p_texture); Ref<Texture> tile_get_texture(int p_id) const; + void tile_set_normal_map(int p_id, const Ref<Texture> &p_normal_map); + Ref<Texture> tile_get_normal_map(int p_id) const; + void tile_set_texture_offset(int p_id, const Vector2 &p_offset); Vector2 tile_get_texture_offset(int p_id) const; - void tile_set_shape_offset(int p_id, const Vector2 &p_offset); - Vector2 tile_get_shape_offset(int p_id) const; - void tile_set_region(int p_id, const Rect2 &p_region); Rect2 tile_get_region(int p_id) const; - void tile_set_shape(int p_id, const Ref<Shape2D> &p_shape); - Ref<Shape2D> tile_get_shape(int p_id) const; + void tile_set_shape(int p_id, int p_shape_id, const Ref<Shape2D> &p_shape); + Ref<Shape2D> tile_get_shape(int p_id, int p_shape_id) const; + + void tile_set_shape_offset(int p_id, int p_shape_id, const Vector2 &p_offset); + Vector2 tile_get_shape_offset(int p_id, int p_shape_id) const; + + void tile_set_shape_one_way(int p_id, int p_shape_id, bool p_one_way); + bool tile_get_shape_one_way(int p_id, int p_shape_id) const; + + void tile_clear_shapes(int p_id); + void tile_add_shape(int p_id, const Ref<Shape2D> &p_shape, const Vector2 &p_offset, bool p_one_way = false); + int tile_get_shape_count(int p_id) const; + + void tile_set_shapes(int p_id, const Vector<ShapeData> &p_shapes); + Vector<ShapeData> tile_get_shapes(int p_id) const; void tile_set_material(int p_id, const Ref<ShaderMaterial> &p_material); Ref<ShaderMaterial> tile_get_material(int p_id) const; @@ -111,9 +136,6 @@ public: void tile_set_navigation_polygon(int p_id, const Ref<NavigationPolygon> &p_navigation_polygon); Ref<NavigationPolygon> tile_get_navigation_polygon(int p_id) const; - void tile_set_shapes(int p_id, const Vector<Ref<Shape2D> > &p_shapes); - Vector<Ref<Shape2D> > tile_get_shapes(int p_id) const; - void remove_tile(int p_id); bool has_tile(int p_id) const; diff --git a/servers/physics/joints/cone_twist_joint_sw.cpp b/servers/physics/joints/cone_twist_joint_sw.cpp index 7e13909592..51bc27ea7d 100644 --- a/servers/physics/joints/cone_twist_joint_sw.cpp +++ b/servers/physics/joints/cone_twist_joint_sw.cpp @@ -100,6 +100,7 @@ ConeTwistJointSW::ConeTwistJointSW(BodySW *rbA, BodySW *rbB, const Transform &rb m_biasFactor = 0.3f; m_relaxationFactor = 1.0f; + m_angularOnly = false; m_solveTwistLimit = false; m_solveSwingLimit = false; diff --git a/servers/physics_2d/area_pair_2d_sw.cpp b/servers/physics_2d/area_pair_2d_sw.cpp index c98375fc44..184db944da 100644 --- a/servers/physics_2d/area_pair_2d_sw.cpp +++ b/servers/physics_2d/area_pair_2d_sw.cpp @@ -32,7 +32,13 @@ bool AreaPair2DSW::setup(real_t p_step) { - bool result = area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), Vector2(), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), Vector2(), NULL, this); + bool result = false; + + if (area->is_shape_set_as_disabled(area_shape) || body->is_shape_set_as_disabled(body_shape)) { + result = false; + } else if (area->test_collision_mask(body) && CollisionSolver2DSW::solve(body->get_shape(body_shape), body->get_transform() * body->get_shape_transform(body_shape), Vector2(), area->get_shape(area_shape), area->get_transform() * area->get_shape_transform(area_shape), Vector2(), NULL, this)) { + result = true; + } if (result != colliding) { @@ -90,7 +96,12 @@ AreaPair2DSW::~AreaPair2DSW() { bool Area2Pair2DSW::setup(real_t p_step) { - bool result = area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), Vector2(), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), Vector2(), NULL, this); + bool result = false; + if (area_a->is_shape_set_as_disabled(shape_a) || area_b->is_shape_set_as_disabled(shape_b)) { + result = false; + } else if (area_a->test_collision_mask(area_b) && CollisionSolver2DSW::solve(area_a->get_shape(shape_a), area_a->get_transform() * area_a->get_shape_transform(shape_a), Vector2(), area_b->get_shape(shape_b), area_b->get_transform() * area_b->get_shape_transform(shape_b), Vector2(), NULL, this)) { + result = true; + } if (result != colliding) { diff --git a/servers/physics_2d/body_2d_sw.cpp b/servers/physics_2d/body_2d_sw.cpp index 03ad66d4e9..538ea10211 100644 --- a/servers/physics_2d/body_2d_sw.cpp +++ b/servers/physics_2d/body_2d_sw.cpp @@ -676,8 +676,6 @@ Body2DSW::Body2DSW() area_linear_damp = 0; contact_count = 0; gravity_scale = 1.0; - using_one_way_cache = false; - one_way_collision_max_depth = 0.1; first_integration = false; still_time = 0; diff --git a/servers/physics_2d/body_2d_sw.h b/servers/physics_2d/body_2d_sw.h index 23adebbad6..9e5deef3f2 100644 --- a/servers/physics_2d/body_2d_sw.h +++ b/servers/physics_2d/body_2d_sw.h @@ -67,9 +67,6 @@ class Body2DSW : public CollisionObject2DSW { Vector2 applied_force; real_t applied_torque; - Vector2 one_way_collision_direction; - real_t one_way_collision_max_depth; - SelfList<Body2DSW> active_list; SelfList<Body2DSW> inertia_update_list; SelfList<Body2DSW> direct_state_query_list; @@ -81,7 +78,6 @@ class Body2DSW : public CollisionObject2DSW { bool can_sleep; bool first_time_kinematic; bool first_integration; - bool using_one_way_cache; void _update_inertia(); virtual void _shapes_changed(); Transform2D new_transform; @@ -246,17 +242,6 @@ public: _FORCE_INLINE_ void set_continuous_collision_detection_mode(Physics2DServer::CCDMode p_mode) { continuous_cd_mode = p_mode; } _FORCE_INLINE_ Physics2DServer::CCDMode get_continuous_collision_detection_mode() const { return continuous_cd_mode; } - void set_one_way_collision_direction(const Vector2 &p_dir) { - one_way_collision_direction = p_dir; - using_one_way_cache = one_way_collision_direction != Vector2(); - } - Vector2 get_one_way_collision_direction() const { return one_way_collision_direction; } - - void set_one_way_collision_max_depth(real_t p_depth) { one_way_collision_max_depth = p_depth; } - real_t get_one_way_collision_max_depth() const { return one_way_collision_max_depth; } - - _FORCE_INLINE_ bool is_using_one_way_collision() const { return using_one_way_cache; } - void set_space(Space2DSW *p_space); void update_inertias(); diff --git a/servers/physics_2d/body_pair_2d_sw.cpp b/servers/physics_2d/body_pair_2d_sw.cpp index 47e9afbde6..484d4503d0 100644 --- a/servers/physics_2d/body_pair_2d_sw.cpp +++ b/servers/physics_2d/body_pair_2d_sw.cpp @@ -225,6 +225,11 @@ bool BodyPair2DSW::setup(real_t p_step) { return false; } + if (A->is_shape_set_as_disabled(shape_A) || B->is_shape_set_as_disabled(shape_B)) { + collided = false; + return false; + } + //use local A coordinates to avoid numerical issues on collision detection offset_B = B->get_transform().get_origin() - A->get_transform().get_origin(); @@ -280,8 +285,8 @@ bool BodyPair2DSW::setup(real_t p_step) { //if (!prev_collided) { { - if (A->is_using_one_way_collision()) { - Vector2 direction = A->get_one_way_collision_direction(); + if (A->is_shape_set_as_one_way_collision(shape_A)) { + Vector2 direction = xform_A.get_axis(1).normalized(); bool valid = false; if (B->get_linear_velocity().dot(direction) >= 0) { for (int i = 0; i < contact_count; i++) { @@ -303,8 +308,8 @@ bool BodyPair2DSW::setup(real_t p_step) { } } - if (B->is_using_one_way_collision()) { - Vector2 direction = B->get_one_way_collision_direction(); + if (B->is_shape_set_as_one_way_collision(shape_B)) { + Vector2 direction = xform_B.get_axis(1).normalized(); bool valid = false; if (A->get_linear_velocity().dot(direction) >= 0) { for (int i = 0; i < contact_count; i++) { @@ -390,7 +395,7 @@ bool BodyPair2DSW::setup(real_t p_step) { } } - if (A->is_shape_set_as_trigger(shape_A) || B->is_shape_set_as_trigger(shape_B) || (A->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC)) { + if ((A->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC && B->get_mode() <= Physics2DServer::BODY_MODE_KINEMATIC)) { c.active = false; collided = false; continue; diff --git a/servers/physics_2d/collision_object_2d_sw.cpp b/servers/physics_2d/collision_object_2d_sw.cpp index 0163a18850..8f13f1130a 100644 --- a/servers/physics_2d/collision_object_2d_sw.cpp +++ b/servers/physics_2d/collision_object_2d_sw.cpp @@ -37,7 +37,8 @@ void CollisionObject2DSW::add_shape(Shape2DSW *p_shape, const Transform2D &p_tra s.xform = p_transform; s.xform_inv = s.xform.affine_inverse(); s.bpid = 0; //needs update - s.trigger = false; + s.disabled = false; + s.one_way_collision = false; shapes.push_back(s); p_shape->add_owner(this); _update_shapes(); diff --git a/servers/physics_2d/collision_object_2d_sw.h b/servers/physics_2d/collision_object_2d_sw.h index f2059e8618..5e29132e8d 100644 --- a/servers/physics_2d/collision_object_2d_sw.h +++ b/servers/physics_2d/collision_object_2d_sw.h @@ -58,8 +58,12 @@ private: Rect2 aabb_cache; //for rayqueries Shape2DSW *shape; Variant metadata; - bool trigger; - Shape() { trigger = false; } + bool disabled; + bool one_way_collision; + Shape() { + disabled = false; + one_way_collision = false; + } }; Vector<Shape> shapes; @@ -116,8 +120,11 @@ public: _FORCE_INLINE_ Transform2D get_inv_transform() const { return inv_transform; } _FORCE_INLINE_ Space2DSW *get_space() const { return space; } - _FORCE_INLINE_ void set_shape_as_trigger(int p_idx, bool p_enable) { shapes[p_idx].trigger = p_enable; } - _FORCE_INLINE_ bool is_shape_set_as_trigger(int p_idx) const { return shapes[p_idx].trigger; } + _FORCE_INLINE_ void set_shape_as_disabled(int p_idx, bool p_disabled) { shapes[p_idx].disabled = p_disabled; } + _FORCE_INLINE_ bool is_shape_set_as_disabled(int p_idx) const { return shapes[p_idx].disabled; } + + _FORCE_INLINE_ void set_shape_as_one_way_collision(int p_idx, bool p_one_way_collision) { shapes[p_idx].one_way_collision = p_one_way_collision; } + _FORCE_INLINE_ bool is_shape_set_as_one_way_collision(int p_idx) const { return shapes[p_idx].one_way_collision; } void set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; } _FORCE_INLINE_ uint32_t get_collision_mask() const { return collision_mask; } diff --git a/servers/physics_2d/physics_2d_server_sw.cpp b/servers/physics_2d/physics_2d_server_sw.cpp index 9a31fa49b0..1d88710f1a 100644 --- a/servers/physics_2d/physics_2d_server_sw.cpp +++ b/servers/physics_2d/physics_2d_server_sw.cpp @@ -352,6 +352,15 @@ void Physics2DServerSW::area_set_shape_transform(RID p_area, int p_shape_idx, co area->set_shape_transform(p_shape_idx, p_transform); } +void Physics2DServerSW::area_set_shape_disabled(RID p_area, int p_shape, bool p_disabled) { + + Area2DSW *area = area_owner.get(p_area); + ERR_FAIL_COND(!area); + + ERR_FAIL_INDEX(p_shape, area->get_shape_count()); + area->set_shape_as_disabled(p_shape, p_disabled); +} + int Physics2DServerSW::area_get_shape_count(RID p_area) const { Area2DSW *area = area_owner.get(p_area); @@ -640,24 +649,23 @@ void Physics2DServerSW::body_clear_shapes(RID p_body) { body->remove_shape(0); } -void Physics2DServerSW::body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) { +void Physics2DServerSW::body_set_shape_disabled(RID p_body, int p_shape_idx, bool p_disabled) { Body2DSW *body = body_owner.get(p_body); ERR_FAIL_COND(!body); ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count()); - body->set_shape_as_trigger(p_shape_idx, p_enable); + body->set_shape_as_disabled(p_shape_idx, p_disabled); } +void Physics2DServerSW::body_set_shape_as_one_way_collision(RID p_body, int p_shape_idx, bool p_enable) { -bool Physics2DServerSW::body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const { - - const Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body, false); + Body2DSW *body = body_owner.get(p_body); + ERR_FAIL_COND(!body); - ERR_FAIL_INDEX_V(p_shape_idx, body->get_shape_count(), false); + ERR_FAIL_INDEX(p_shape_idx, body->get_shape_count()); - return body->is_shape_set_as_trigger(p_shape_idx); + body->set_shape_as_one_way_collision(p_shape_idx, p_enable); } void Physics2DServerSW::body_set_continuous_collision_detection_mode(RID p_body, CCDMode p_mode) { @@ -887,34 +895,6 @@ int Physics2DServerSW::body_get_max_contacts_reported(RID p_body) const { return body->get_max_contacts_reported(); } -void Physics2DServerSW::body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction) { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND(!body); - body->set_one_way_collision_direction(p_direction); -} - -Vector2 Physics2DServerSW::body_get_one_way_collision_direction(RID p_body) const { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body, Vector2()); - return body->get_one_way_collision_direction(); -} - -void Physics2DServerSW::body_set_one_way_collision_max_depth(RID p_body, real_t p_max_depth) { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND(!body); - body->set_one_way_collision_max_depth(p_max_depth); -} - -real_t Physics2DServerSW::body_get_one_way_collision_max_depth(RID p_body) const { - - Body2DSW *body = body_owner.get(p_body); - ERR_FAIL_COND_V(!body, 0); - return body->get_one_way_collision_max_depth(); -} - void Physics2DServerSW::body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata) { Body2DSW *body = body_owner.get(p_body); diff --git a/servers/physics_2d/physics_2d_server_sw.h b/servers/physics_2d/physics_2d_server_sw.h index be67e3157d..9cbdfc598f 100644 --- a/servers/physics_2d/physics_2d_server_sw.h +++ b/servers/physics_2d/physics_2d_server_sw.h @@ -123,6 +123,8 @@ public: virtual RID area_get_shape(RID p_area, int p_shape_idx) const; virtual Transform2D area_get_shape_transform(RID p_area, int p_shape_idx) const; + virtual void area_set_shape_disabled(RID p_area, int p_shape, bool p_disabled); + virtual void area_remove_shape(RID p_area, int p_shape_idx); virtual void area_clear_shapes(RID p_area); @@ -167,8 +169,8 @@ public: virtual void body_remove_shape(RID p_body, int p_shape_idx); virtual void body_clear_shapes(RID p_body); - virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable); - virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const; + virtual void body_set_shape_disabled(RID p_body, int p_shape, bool p_disabled); + virtual void body_set_shape_as_one_way_collision(RID p_body, int p_shape, bool p_enabled); virtual void body_attach_object_instance_ID(RID p_body, uint32_t p_ID); virtual uint32_t body_get_object_instance_ID(RID p_body) const; @@ -212,12 +214,6 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts); virtual int body_get_max_contacts_reported(RID p_body) const; - virtual void body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction); - virtual Vector2 body_get_one_way_collision_direction(RID p_body) const; - - virtual void body_set_one_way_collision_max_depth(RID p_body, real_t p_max_depth); - virtual real_t body_get_one_way_collision_max_depth(RID p_body) const; - virtual void body_set_force_integration_callback(RID p_body, Object *p_receiver, const StringName &p_method, const Variant &p_udata = Variant()); virtual bool body_collide_shape(RID p_body, int p_body_shape, RID p_shape, const Transform2D &p_shape_xform, const Vector2 &p_motion, Vector2 *r_results, int p_result_max, int &r_result_count); diff --git a/servers/physics_2d/physics_2d_server_wrap_mt.h b/servers/physics_2d/physics_2d_server_wrap_mt.h index 1026d84fd9..9fcfebef6b 100644 --- a/servers/physics_2d/physics_2d_server_wrap_mt.h +++ b/servers/physics_2d/physics_2d_server_wrap_mt.h @@ -145,6 +145,7 @@ public: FUNC3(area_add_shape, RID, RID, const Transform2D &); FUNC3(area_set_shape, RID, int, RID); FUNC3(area_set_shape_transform, RID, int, const Transform2D &); + FUNC3(area_set_shape_disabled, RID, int, bool); FUNC1RC(int, area_get_shape_count, RID); FUNC2RC(RID, area_get_shape, RID, int); @@ -191,8 +192,8 @@ public: FUNC2RC(Variant, body_get_shape_metadata, RID, int); FUNC2RC(RID, body_get_shape, RID, int); - FUNC3(body_set_shape_as_trigger, RID, int, bool); - FUNC2RC(bool, body_is_shape_set_as_trigger, RID, int); + FUNC3(body_set_shape_disabled, RID, int, bool); + FUNC3(body_set_shape_as_one_way_collision, RID, int, bool); FUNC2(body_remove_shape, RID, int); FUNC1(body_clear_shapes, RID); @@ -232,12 +233,6 @@ public: FUNC2(body_set_max_contacts_reported, RID, int); FUNC1RC(int, body_get_max_contacts_reported, RID); - FUNC2(body_set_one_way_collision_direction, RID, const Vector2 &); - FUNC1RC(Vector2, body_get_one_way_collision_direction, RID); - - FUNC2(body_set_one_way_collision_max_depth, RID, real_t); - FUNC1RC(real_t, body_get_one_way_collision_max_depth, RID); - FUNC2(body_set_contacts_reported_depth_treshold, RID, real_t); FUNC1RC(real_t, body_get_contacts_reported_depth_treshold, RID); diff --git a/servers/physics_2d/space_2d_sw.cpp b/servers/physics_2d/space_2d_sw.cpp index fd94fc01cd..0b31ff144b 100644 --- a/servers/physics_2d/space_2d_sw.cpp +++ b/servers/physics_2d/space_2d_sw.cpp @@ -265,14 +265,6 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transfor //test initial overlap if (CollisionSolver2DSW::solve(shape, p_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, p_margin)) { - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - //if one way collision direction ignore initial overlap - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - if (body->get_one_way_collision_direction() != Vector2()) { - continue; - } - } - return false; } @@ -297,27 +289,6 @@ bool Physics2DDirectSpaceStateSW::cast_motion(const RID &p_shape, const Transfor } } - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - if (body->get_one_way_collision_direction() != Vector2()) { - - Vector2 cd[2]; - Physics2DServerSW::CollCbkData cbk; - cbk.max = 1; - cbk.amount = 0; - cbk.ptr = cd; - cbk.valid_dir = body->get_one_way_collision_direction(); - cbk.valid_depth = body->get_one_way_collision_max_depth(); - - Vector2 sep = mnormal; //important optimization for this to work fast enough - bool collided = CollisionSolver2DSW::solve(shape, p_xform, p_motion * (hi + space->contact_max_allowed_penetration), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), Physics2DServerSW::_shape_col_cbk, &cbk, &sep, p_margin); - if (!collided || cbk.amount == 0) { - continue; - } - } - } - if (low < best_safe) { best_safe = low; best_unsafe = hi; @@ -369,15 +340,9 @@ bool Physics2DDirectSpaceStateSW::collide_shape(RID p_shape, const Transform2D & if (p_exclude.has(col_obj->get_self())) continue; - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - cbk.valid_dir = body->get_one_way_collision_direction(); - cbk.valid_depth = body->get_one_way_collision_max_depth(); - } else { - cbk.valid_dir = Vector2(); - cbk.valid_depth = 0; - } + cbk.valid_dir = Vector2(); + cbk.valid_depth = 0; if (CollisionSolver2DSW::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), cbkres, cbkptr, NULL, p_margin)) { collided = p_result_max == 0 || cbk.amount > 0; @@ -407,13 +372,10 @@ static void _rest_cbk_result(const Vector2 &p_point_A, const Vector2 &p_point_B, _RestCallbackData2D *rd = (_RestCallbackData2D *)p_userdata; if (rd->valid_dir != Vector2()) { - - if (rd->valid_dir != Vector2()) { - if (p_point_A.distance_squared_to(p_point_B) > rd->valid_depth * rd->valid_depth) - return; - if (rd->valid_dir.dot((p_point_A - p_point_B).normalized()) < Math_PI * 0.25) - return; - } + if (p_point_A.distance_squared_to(p_point_B) > rd->valid_depth * rd->valid_depth) + return; + if (rd->valid_dir.dot((p_point_A - p_point_B).normalized()) < Math_PI * 0.25) + return; } Vector2 contact_rel = p_point_B - p_point_A; @@ -455,16 +417,8 @@ bool Physics2DDirectSpaceStateSW::rest_info(RID p_shape, const Transform2D &p_sh if (p_exclude.has(col_obj->get_self())) continue; - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - rcd.valid_dir = body->get_one_way_collision_direction(); - rcd.valid_depth = body->get_one_way_collision_max_depth(); - } else { - rcd.valid_dir = Vector2(); - rcd.valid_depth = 0; - } - + rcd.valid_dir = Vector2(); + rcd.valid_depth = 0; rcd.object = col_obj; rcd.shape = shape_idx; bool sc = CollisionSolver2DSW::solve(shape, p_shape_xform, p_motion, col_obj->get_shape(shape_idx), col_obj->get_transform() * col_obj->get_shape_transform(shape_idx), Vector2(), _rest_cbk_result, &rcd, NULL, p_margin); @@ -517,7 +471,7 @@ int Space2DSW::_cull_aabb_for_body(Body2DSW *p_body, const Rect2 &p_aabb) { keep = false; else if (static_cast<Body2DSW *>(intersection_query_results[i])->has_exception(p_body->get_self()) || p_body->has_exception(intersection_query_results[i]->get_self())) keep = false; - else if (static_cast<Body2DSW *>(intersection_query_results[i])->is_shape_set_as_trigger(intersection_query_subindex_results[i])) + else if (static_cast<Body2DSW *>(intersection_query_results[i])->is_shape_set_as_disabled(intersection_query_subindex_results[i])) keep = false; if (!keep) { @@ -589,7 +543,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co int amount = _cull_aabb_for_body(p_body, body_aabb); for (int j = 0; j < p_body->get_shape_count(); j++) { - if (p_body->is_shape_set_as_trigger(j)) + if (p_body->is_shape_set_as_disabled(j)) continue; Transform2D body_shape_xform = body_transform * p_body->get_shape_transform(j); @@ -599,18 +553,10 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co const CollisionObject2DSW *col_obj = intersection_query_results[i]; int shape_idx = intersection_query_subindex_results[i]; - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - - Vector2 cdir = body->get_one_way_collision_direction(); - /* - if (cdir!=Vector2() && p_motion.dot(cdir)<0) - continue; - */ + if (col_obj->is_shape_set_as_one_way_collision(j)) { - cbk.valid_dir = cdir; - cbk.valid_depth = body->get_one_way_collision_max_depth(); + cbk.valid_dir = body_shape_xform.get_axis(1).normalized(); + cbk.valid_depth = p_margin; //only valid depth is the collision margin } else { cbk.valid_dir = Vector2(); cbk.valid_depth = 0; @@ -678,7 +624,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co for (int j = 0; j < p_body->get_shape_count(); j++) { - if (p_body->is_shape_set_as_trigger(j)) + if (p_body->is_shape_set_as_disabled(j)) continue; Transform2D body_shape_xform = body_transform * p_body->get_shape_transform(j); @@ -703,12 +649,8 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co //test initial overlap if (CollisionSolver2DSW::solve(body_shape, body_shape_xform, Vector2(), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), NULL, NULL, NULL, 0)) { - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { - //if one way collision direction ignore initial overlap - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - if (body->get_one_way_collision_direction() != Vector2()) { - continue; - } + if (col_obj->is_shape_set_as_one_way_collision(j)) { + continue; } stuck = true; @@ -720,7 +662,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co real_t hi = 1; Vector2 mnormal = p_motion.normalized(); - for (int i = 0; i < 8; i++) { //steps should be customizable.. + for (int k = 0; k < 8; k++) { //steps should be customizable.. real_t ofs = (low + hi) * 0.5; @@ -739,15 +681,16 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - if (body->get_one_way_collision_direction() != Vector2()) { + if (col_obj->is_shape_set_as_one_way_collision(j)) { Vector2 cd[2]; Physics2DServerSW::CollCbkData cbk; cbk.max = 1; cbk.amount = 0; cbk.ptr = cd; - cbk.valid_dir = body->get_one_way_collision_direction(); - cbk.valid_depth = body->get_one_way_collision_max_depth(); + cbk.valid_dir = body_shape_xform.get_axis(1).normalized(); + ; + cbk.valid_depth = 10e20; Vector2 sep = mnormal; //important optimization for this to work fast enough bool collided = CollisionSolver2DSW::solve(body_shape, body_shape_xform, p_motion * (hi + contact_max_allowed_penetration), col_obj->get_shape(shape_idx), col_obj_xform, Vector2(), Physics2DServerSW::_shape_col_cbk, &cbk, &sep, 0); @@ -816,11 +759,10 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co const CollisionObject2DSW *col_obj = intersection_query_results[i]; int shape_idx = intersection_query_subindex_results[i]; - if (col_obj->get_type() == CollisionObject2DSW::TYPE_BODY) { + if (col_obj->is_shape_set_as_one_way_collision(shape_idx)) { - const Body2DSW *body = static_cast<const Body2DSW *>(col_obj); - rcd.valid_dir = body->get_one_way_collision_direction(); - rcd.valid_depth = body->get_one_way_collision_max_depth(); + rcd.valid_dir = body_shape_xform.get_axis(1).normalized(); + rcd.valid_depth = 10e20; } else { rcd.valid_dir = Vector2(); rcd.valid_depth = 0; @@ -839,6 +781,7 @@ bool Space2DSW::test_body_motion(Body2DSW *p_body, const Transform2D &p_from, co r_result->collider = rcd.best_object->get_self(); r_result->collider_id = rcd.best_object->get_instance_id(); r_result->collider_shape = rcd.best_shape; + r_result->collision_local_shape = best_shape; r_result->collision_normal = rcd.best_normal; r_result->collision_point = rcd.best_contact; r_result->collider_metadata = rcd.best_object->get_shape_metadata(rcd.best_shape); diff --git a/servers/physics_2d_server.cpp b/servers/physics_2d_server.cpp index 8ffa82214c..55ea2b41e7 100644 --- a/servers/physics_2d_server.cpp +++ b/servers/physics_2d_server.cpp @@ -496,6 +496,7 @@ void Physics2DServer::_bind_methods() { ClassDB::bind_method(D_METHOD("area_add_shape", "area", "shape", "transform"), &Physics2DServer::area_add_shape, DEFVAL(Transform2D())); ClassDB::bind_method(D_METHOD("area_set_shape", "area", "shape_idx", "shape"), &Physics2DServer::area_set_shape); ClassDB::bind_method(D_METHOD("area_set_shape_transform", "area", "shape_idx", "transform"), &Physics2DServer::area_set_shape_transform); + ClassDB::bind_method(D_METHOD("area_set_shape_disabled", "area", "shape_idx", "disable"), &Physics2DServer::area_set_shape_disabled); ClassDB::bind_method(D_METHOD("area_get_shape_count", "area"), &Physics2DServer::area_get_shape_count); ClassDB::bind_method(D_METHOD("area_get_shape", "area", "shape_idx"), &Physics2DServer::area_get_shape); @@ -539,8 +540,8 @@ void Physics2DServer::_bind_methods() { ClassDB::bind_method(D_METHOD("body_remove_shape", "body", "shape_idx"), &Physics2DServer::body_remove_shape); ClassDB::bind_method(D_METHOD("body_clear_shapes", "body"), &Physics2DServer::body_clear_shapes); - ClassDB::bind_method(D_METHOD("body_set_shape_as_trigger", "body", "shape_idx", "enable"), &Physics2DServer::body_set_shape_as_trigger); - ClassDB::bind_method(D_METHOD("body_is_shape_set_as_trigger", "body", "shape_idx"), &Physics2DServer::body_is_shape_set_as_trigger); + ClassDB::bind_method(D_METHOD("body_set_shape_disabled", "body", "shape_idx", "disable"), &Physics2DServer::body_set_shape_disabled); + ClassDB::bind_method(D_METHOD("body_set_shape_as_one_way_collision", "body", "shape_idx", "enable"), &Physics2DServer::body_set_shape_as_one_way_collision); ClassDB::bind_method(D_METHOD("body_attach_object_instance_ID", "body", "id"), &Physics2DServer::body_attach_object_instance_ID); ClassDB::bind_method(D_METHOD("body_get_object_instance_ID", "body"), &Physics2DServer::body_get_object_instance_ID); @@ -571,12 +572,6 @@ void Physics2DServer::_bind_methods() { ClassDB::bind_method(D_METHOD("body_set_max_contacts_reported", "body", "amount"), &Physics2DServer::body_set_max_contacts_reported); ClassDB::bind_method(D_METHOD("body_get_max_contacts_reported", "body"), &Physics2DServer::body_get_max_contacts_reported); - ClassDB::bind_method(D_METHOD("body_set_one_way_collision_direction", "body", "normal"), &Physics2DServer::body_set_one_way_collision_direction); - ClassDB::bind_method(D_METHOD("body_get_one_way_collision_direction", "body"), &Physics2DServer::body_get_one_way_collision_direction); - - ClassDB::bind_method(D_METHOD("body_set_one_way_collision_max_depth", "body", "depth"), &Physics2DServer::body_set_one_way_collision_max_depth); - ClassDB::bind_method(D_METHOD("body_get_one_way_collision_max_depth", "body"), &Physics2DServer::body_get_one_way_collision_max_depth); - ClassDB::bind_method(D_METHOD("body_set_omit_force_integration", "body", "enable"), &Physics2DServer::body_set_omit_force_integration); ClassDB::bind_method(D_METHOD("body_is_omitting_force_integration", "body"), &Physics2DServer::body_is_omitting_force_integration); diff --git a/servers/physics_2d_server.h b/servers/physics_2d_server.h index 80113dd7d6..f50faa42eb 100644 --- a/servers/physics_2d_server.h +++ b/servers/physics_2d_server.h @@ -332,6 +332,8 @@ public: virtual void area_remove_shape(RID p_area, int p_shape_idx) = 0; virtual void area_clear_shapes(RID p_area) = 0; + virtual void area_set_shape_disabled(RID p_area, int p_shape, bool p_disabled) = 0; + virtual void area_attach_object_instance_ID(RID p_area, ObjectID p_ID) = 0; virtual ObjectID area_get_object_instance_ID(RID p_area) const = 0; @@ -380,8 +382,8 @@ public: virtual Transform2D body_get_shape_transform(RID p_body, int p_shape_idx) const = 0; virtual Variant body_get_shape_metadata(RID p_body, int p_shape_idx) const = 0; - virtual void body_set_shape_as_trigger(RID p_body, int p_shape_idx, bool p_enable) = 0; - virtual bool body_is_shape_set_as_trigger(RID p_body, int p_shape_idx) const = 0; + virtual void body_set_shape_disabled(RID p_body, int p_shape, bool p_disabled) = 0; + virtual void body_set_shape_as_one_way_collision(RID p_body, int p_shape, bool p_enabled) = 0; virtual void body_remove_shape(RID p_body, int p_shape_idx) = 0; virtual void body_clear_shapes(RID p_body) = 0; @@ -451,12 +453,6 @@ public: virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) = 0; virtual int body_get_max_contacts_reported(RID p_body) const = 0; - virtual void body_set_one_way_collision_direction(RID p_body, const Vector2 &p_direction) = 0; - virtual Vector2 body_get_one_way_collision_direction(RID p_body) const = 0; - - virtual void body_set_one_way_collision_max_depth(RID p_body, float p_max_depth) = 0; - virtual float body_get_one_way_collision_max_depth(RID p_body) const = 0; - //missing remove virtual void body_set_contacts_reported_depth_treshold(RID p_body, float p_treshold) = 0; virtual float body_get_contacts_reported_depth_treshold(RID p_body) const = 0; @@ -478,6 +474,7 @@ public: Vector2 collision_point; Vector2 collision_normal; Vector2 collider_velocity; + int collision_local_shape; ObjectID collider_id; RID collider; int collider_shape; diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h index 07d6542b62..5b60a46ade 100644 --- a/servers/visual/rasterizer.h +++ b/servers/visual/rasterizer.h @@ -75,6 +75,10 @@ public: virtual void environment_set_fog_depth(RID p_env, bool p_enable, float p_depth_begin, float p_depth_curve, bool p_transmit, float p_transmit_curve) = 0; virtual void environment_set_fog_height(RID p_env, bool p_enable, float p_min_height, float p_max_height, float p_height_curve) = 0; + virtual bool is_environment(RID p_env) = 0; + virtual VS::EnvironmentBG environment_get_background(RID p_env) = 0; + virtual int environment_get_canvas_max_layer(RID p_env) = 0; + struct InstanceBase : RID_Data { VS::InstanceType base_type; @@ -444,6 +448,7 @@ public: virtual void particles_set_emitting(RID p_particles, bool p_emitting) = 0; virtual void particles_set_amount(RID p_particles, int p_amount) = 0; virtual void particles_set_lifetime(RID p_particles, float p_lifetime) = 0; + virtual void particles_set_one_shot(RID p_particles, bool p_one_shot) = 0; virtual void particles_set_pre_process_time(RID p_particles, float p_time) = 0; virtual void particles_set_explosiveness_ratio(RID p_particles, float p_ratio) = 0; virtual void particles_set_randomness_ratio(RID p_particles, float p_ratio) = 0; @@ -453,6 +458,7 @@ public: virtual void particles_set_process_material(RID p_particles, RID p_material) = 0; virtual void particles_set_fixed_fps(RID p_particles, int p_fps) = 0; virtual void particles_set_fractional_delta(RID p_particles, bool p_enable) = 0; + virtual void particles_restart(RID p_particles) = 0; virtual void particles_set_draw_order(RID p_particles, VS::ParticlesDrawOrder p_order) = 0; @@ -612,6 +618,7 @@ public: TYPE_POLYGON, TYPE_MESH, TYPE_MULTIMESH, + TYPE_PARTICLES, TYPE_CIRCLE, TYPE_TRANSFORM, TYPE_CLIP_IGNORE, @@ -707,6 +714,16 @@ public: CommandMultiMesh() { type = TYPE_MULTIMESH; } }; + struct CommandParticles : public Command { + + RID particles; + RID texture; + RID normal_map; + int h_frames; + int v_frames; + CommandParticles() { type = TYPE_PARTICLES; } + }; + struct CommandCircle : public Command { Point2 pos; @@ -845,6 +862,15 @@ public: r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y); } break; + case Item::Command::TYPE_PARTICLES: { + + const Item::CommandParticles *particles_cmd = static_cast<const Item::CommandParticles *>(c); + if (particles_cmd->particles.is_valid()) { + Rect3 aabb = RasterizerStorage::base_singleton->particles_get_aabb(particles_cmd->particles); + r = Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y); + } + + } break; case Item::Command::TYPE_CIRCLE: { const Item::CommandCircle *circle = static_cast<const Item::CommandCircle *>(c); diff --git a/servers/visual/shader_types.cpp b/servers/visual/shader_types.cpp index 81139ecc1c..42f1a98826 100644 --- a/servers/visual/shader_types.cpp +++ b/servers/visual/shader_types.cpp @@ -212,6 +212,7 @@ ShaderTypes::ShaderTypes() { shader_modes[VS::SHADER_PARTICLES].functions["vertex"]["NUMBER"] = ShaderLanguage::TYPE_UINT; shader_modes[VS::SHADER_PARTICLES].functions["vertex"]["INDEX"] = ShaderLanguage::TYPE_INT; shader_modes[VS::SHADER_PARTICLES].functions["vertex"]["EMISSION_TRANSFORM"] = ShaderLanguage::TYPE_MAT4; + shader_modes[VS::SHADER_PARTICLES].functions["vertex"]["RANDOM_SEED"] = ShaderLanguage::TYPE_UINT; shader_modes[VS::SHADER_PARTICLES].modes.insert("billboard"); shader_modes[VS::SHADER_PARTICLES].modes.insert("disable_force"); diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp index 2ef1fd417b..1227863b72 100644 --- a/servers/visual/visual_server_canvas.cpp +++ b/servers/visual/visual_server_canvas.cpp @@ -58,6 +58,12 @@ void VisualServerCanvas::_render_canvas_item(Item *p_canvas_item, const Transfor if (!ci->visible) return; + if (p_canvas_item->children_order_dirty) { + + p_canvas_item->child_items.sort_custom<ItemIndexSort>(); + p_canvas_item->children_order_dirty = false; + } + Rect2 rect = ci->get_rect(); Transform2D xform = p_transform * ci->xform; Rect2 global_rect = xform.xform(rect); @@ -171,6 +177,12 @@ void VisualServerCanvas::render_canvas(Canvas *p_canvas, const Transform2D &p_tr VSG::canvas_render->canvas_begin(); + if (p_canvas->children_order_dirty) { + + p_canvas->child_items.sort(); + p_canvas->children_order_dirty = false; + } + int l = p_canvas->child_items.size(); Canvas::ChildItem *ci = p_canvas->child_items.ptr(); @@ -637,6 +649,25 @@ void VisualServerCanvas::canvas_item_add_mesh(RID p_item, const RID &p_mesh, RID canvas_item->commands.push_back(m); } +void VisualServerCanvas::canvas_item_add_particles(RID p_item, RID p_particles, RID p_texture, RID p_normal, int p_h_frames, int p_v_frames) { + + Item *canvas_item = canvas_item_owner.getornull(p_item); + ERR_FAIL_COND(!canvas_item); + + Item::CommandParticles *part = memnew(Item::CommandParticles); + ERR_FAIL_COND(!part); + part->particles = p_particles; + part->texture = p_texture; + part->normal_map = p_normal; + part->h_frames = p_h_frames; + part->v_frames = p_v_frames; + + //take the chance and request processing for them, at least once until they become visible again + VSG::storage->particles_request_process(p_particles); + + canvas_item->commands.push_back(part); +} + void VisualServerCanvas::canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p_skeleton) { Item *canvas_item = canvas_item_owner.getornull(p_item); diff --git a/servers/visual/visual_server_canvas.h b/servers/visual/visual_server_canvas.h index 2c86b14c70..57c7515367 100644 --- a/servers/visual/visual_server_canvas.h +++ b/servers/visual/visual_server_canvas.h @@ -63,6 +63,14 @@ public: } }; + struct ItemIndexSort { + + _FORCE_INLINE_ bool operator()(const Item *p_left, const Item *p_right) const { + + return p_left->index < p_right->index; + } + }; + struct ItemPtrSort { _FORCE_INLINE_ bool operator()(const Item *p_left, const Item *p_right) const { @@ -173,6 +181,7 @@ public: void canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID(), int p_count = -1, RID p_normal_map = RID()); void canvas_item_add_mesh(RID p_item, const RID &p_mesh, RID p_skeleton = RID()); void canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p_skeleton = RID()); + void canvas_item_add_particles(RID p_item, RID p_particles, RID p_texture, RID p_normal, int p_h_frames, int p_v_frames); void canvas_item_add_set_transform(RID p_item, const Transform2D &p_transform); void canvas_item_add_clip_ignore(RID p_item, bool p_ignore); void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable); diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index c48bee7fa4..e201f6a8c0 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -862,6 +862,7 @@ public: BIND2(particles_set_emitting, RID, bool) BIND2(particles_set_amount, RID, int) BIND2(particles_set_lifetime, RID, float) + BIND2(particles_set_one_shot, RID, bool) BIND2(particles_set_pre_process_time, RID, float) BIND2(particles_set_explosiveness_ratio, RID, float) BIND2(particles_set_randomness_ratio, RID, float) @@ -871,13 +872,15 @@ public: BIND2(particles_set_process_material, RID, RID) BIND2(particles_set_fixed_fps, RID, int) BIND2(particles_set_fractional_delta, RID, bool) + BIND1(particles_restart, RID) BIND2(particles_set_draw_order, RID, VS::ParticlesDrawOrder) BIND2(particles_set_draw_passes, RID, int) BIND3(particles_set_draw_pass_mesh, RID, int, RID) - BIND1R(Rect3, particles_get_current_aabb, RID); + BIND1R(Rect3, particles_get_current_aabb, RID) + BIND2(particles_set_emission_transform, RID, const Transform &) #undef BINDBASE //from now on, calls forwarded to this singleton @@ -1049,6 +1052,7 @@ public: BIND8(canvas_item_add_triangle_array, RID, const Vector<int> &, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID, int, RID) BIND3(canvas_item_add_mesh, RID, const RID &, RID) BIND3(canvas_item_add_multimesh, RID, RID, RID) + BIND6(canvas_item_add_particles, RID, RID, RID, RID, int, int) BIND2(canvas_item_add_set_transform, RID, const Transform2D &) BIND2(canvas_item_add_clip_ignore, RID, bool) BIND2(canvas_item_set_sort_children_by_y, RID, bool) diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index 6d1f698a5c..fb1c66d0b9 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -2162,6 +2162,18 @@ void VisualServerScene::_render_scene(const Transform p_cam_transform, const Cam VSG::scene_render->render_scene(p_cam_transform, p_cam_projection, p_cam_orthogonal, (RasterizerScene::InstanceBase **)instance_cull_result, cull_count, light_instance_cull_result, light_cull_count + directional_light_count, reflection_probe_instance_cull_result, reflection_probe_cull_count, environment, p_shadow_atlas, scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass); } +void VisualServerScene::render_empty_scene(RID p_scenario, RID p_shadow_atlas) { + + Scenario *scenario = scenario_owner.getornull(p_scenario); + + RID environment; + if (scenario->environment.is_valid()) + environment = scenario->environment; + else + environment = scenario->fallback_environment; + VSG::scene_render->render_scene(Transform(), CameraMatrix(), true, NULL, 0, NULL, 0, NULL, 0, environment, p_shadow_atlas, scenario->reflection_atlas, RID(), 0); +} + bool VisualServerScene::_render_reflection_probe_step(Instance *p_instance, int p_step) { InstanceReflectionProbeData *reflection_probe = static_cast<InstanceReflectionProbeData *>(p_instance->base_data); diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h index 92c6421987..d13c24ae24 100644 --- a/servers/visual/visual_server_scene.h +++ b/servers/visual/visual_server_scene.h @@ -519,6 +519,7 @@ public: _FORCE_INLINE_ void _light_instance_update_shadow(Instance *p_instance, const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_shadow_atlas, Scenario *p_scenario); void _render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, bool p_cam_orthogonal, RID p_force_environment, uint32_t p_visible_layers, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass); + void render_empty_scene(RID p_scenario, RID p_shadow_atlas); void render_camera(RID p_camera, RID p_scenario, Size2 p_viewport_size, RID p_shadow_atlas); void update_dirty_instances(); diff --git a/servers/visual/visual_server_viewport.cpp b/servers/visual/visual_server_viewport.cpp index 2fbbcd225f..2c2bd2b167 100644 --- a/servers/visual/visual_server_viewport.cpp +++ b/servers/visual/visual_server_viewport.cpp @@ -35,23 +35,24 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) { -/* Camera should always be BEFORE any other 3D */ -#if 0 - bool scenario_draw_canvas_bg=false; - int scenario_canvas_max_layer=0; + /* Camera should always be BEFORE any other 3D */ - if (!p_viewport->hide_canvas && !p_viewport->disable_environment && scenario_owner.owns(p_viewport->scenario)) { + bool scenario_draw_canvas_bg = false; //draw canvas, or some layer of it, as BG for 3D instead of in front + int scenario_canvas_max_layer = 0; - Scenario *scenario=scenario_owner.get(p_viewport->scenario); - if (scenario->environment.is_valid()) { - if (rasterizer->is_environment(scenario->environment)) { - scenario_draw_canvas_bg=rasterizer->environment_get_background(scenario->environment)==VS::ENV_BG_CANVAS; - scenario_canvas_max_layer=rasterizer->environment_get_background_param(scenario->environment,VS::ENV_BG_PARAM_CANVAS_MAX_LAYER); - } + if (!p_viewport->hide_canvas && !p_viewport->disable_environment && VSG::scene->scenario_owner.owns(p_viewport->scenario)) { + + VisualServerScene::Scenario *scenario = VSG::scene->scenario_owner.get(p_viewport->scenario); + if (VSG::scene_render->is_environment(scenario->environment)) { + scenario_draw_canvas_bg = VSG::scene_render->environment_get_background(scenario->environment) == VS::ENV_BG_CANVAS; + + scenario_canvas_max_layer = VSG::scene_render->environment_get_canvas_max_layer(scenario->environment); } } - bool can_draw_3d=!p_viewport->hide_scenario && camera_owner.owns(p_viewport->camera) && scenario_owner.owns(p_viewport->scenario); + bool can_draw_3d = !p_viewport->disable_3d && !p_viewport->disable_3d_by_usage && VSG::scene->camera_owner.owns(p_viewport->camera); +#if 0 + if (scenario_draw_canvas_bg) { @@ -88,7 +89,7 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) { } } - if (!p_viewport->disable_3d && !p_viewport->disable_3d_by_usage && p_viewport->camera.is_valid()) { + if (!scenario_draw_canvas_bg && can_draw_3d) { VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); } @@ -199,14 +200,15 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) { VSG::rasterizer->restore_render_target(); -#if 0 - if (scenario_draw_canvas_bg && canvas_map.front() && canvas_map.front()->key().layer>scenario_canvas_max_layer) { - - _draw_viewport_camera(p_viewport,!can_draw_3d); - scenario_draw_canvas_bg=false; + if (scenario_draw_canvas_bg && canvas_map.front() && canvas_map.front()->key().layer > scenario_canvas_max_layer) { + if (can_draw_3d) { + VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); + } else { + VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas); + } + scenario_draw_canvas_bg = false; } -#endif for (Map<Viewport::CanvasKey, Viewport::CanvasData *>::Element *E = canvas_map.front(); E; E = E->next()) { @@ -229,19 +231,29 @@ void VisualServerViewport::_draw_viewport(Viewport *p_viewport) { VSG::canvas->render_canvas(canvas, xform, canvas_lights, lights_with_mask, clip_rect); i++; -#if 0 - if (scenario_draw_canvas_bg && E->key().layer>=scenario_canvas_max_layer) { - _draw_viewport_camera(p_viewport,!can_draw_3d); - scenario_draw_canvas_bg=false; + + if (scenario_draw_canvas_bg && E->key().layer >= scenario_canvas_max_layer) { + + if (can_draw_3d) { + VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); + } else { + VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas); + } + + scenario_draw_canvas_bg = false; } -#endif } -#if 0 + if (scenario_draw_canvas_bg) { - _draw_viewport_camera(p_viewport,!can_draw_3d); - scenario_draw_canvas_bg=false; + + if (can_draw_3d) { + VSG::scene->render_camera(p_viewport->camera, p_viewport->scenario, p_viewport->size, p_viewport->shadow_atlas); + } else { + VSG::scene->render_empty_scene(p_viewport->scenario, p_viewport->shadow_atlas); + } + + scenario_draw_canvas_bg = false; } -#endif //VSG::canvas_render->canvas_debug_viewport_shadows(lights_with_shadow); } diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index 94cbfc815e..9f49377fa8 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -306,6 +306,7 @@ public: FUNC2(particles_set_emitting, RID, bool) FUNC2(particles_set_amount, RID, int) FUNC2(particles_set_lifetime, RID, float) + FUNC2(particles_set_one_shot, RID, bool) FUNC2(particles_set_pre_process_time, RID, float) FUNC2(particles_set_explosiveness_ratio, RID, float) FUNC2(particles_set_randomness_ratio, RID, float) @@ -315,11 +316,13 @@ public: FUNC2(particles_set_process_material, RID, RID) FUNC2(particles_set_fixed_fps, RID, int) FUNC2(particles_set_fractional_delta, RID, bool) + FUNC1(particles_restart, RID) FUNC2(particles_set_draw_order, RID, VS::ParticlesDrawOrder) FUNC2(particles_set_draw_passes, RID, int) FUNC3(particles_set_draw_pass_mesh, RID, int, RID) + FUNC2(particles_set_emission_transform, RID, const Transform &) FUNC1R(Rect3, particles_get_current_aabb, RID) @@ -476,6 +479,7 @@ public: FUNC8(canvas_item_add_triangle_array, RID, const Vector<int> &, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID, int, RID) FUNC3(canvas_item_add_mesh, RID, const RID &, RID) FUNC3(canvas_item_add_multimesh, RID, RID, RID) + FUNC6(canvas_item_add_particles, RID, RID, RID, RID, int, int) FUNC2(canvas_item_add_set_transform, RID, const Transform2D &) FUNC2(canvas_item_add_clip_ignore, RID, bool) FUNC2(canvas_item_set_sort_children_by_y, RID, bool) diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index 6c57275b3a..eb0848ff50 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -29,7 +29,7 @@ /*************************************************************************/ #include "visual_server.h" #include "global_config.h" -#include "method_bind_ext.inc" +#include "method_bind_ext.gen.inc" VisualServer *VisualServer::singleton = NULL; VisualServer *(*VisualServer::create_func)() = NULL; @@ -137,7 +137,7 @@ void VisualServer::_free_internal_rids() { if (test_material.is_valid()) free(test_material); - for (int i = 0; i < 16; i++) { + for (int i = 0; i < 32; i++) { if (material_2d[i].is_valid()) free(material_2d[i]); } @@ -284,7 +284,7 @@ RID VisualServer::make_sphere_mesh(int p_lats, int p_lons, float p_radius) { return mesh; } -RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_alpha, bool p_opaque_prepass) { +RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass) { int version = 0; if (p_shaded) @@ -295,6 +295,8 @@ RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_ version |= 4; if (p_opaque_prepass) version |= 8; + if (p_double_sided) + version |= 16; if (material_2d[version].is_valid()) return material_2d[version]; @@ -305,7 +307,7 @@ RID VisualServer::material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_ fixed_material_set_flag(material_2d[version],FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY,true); fixed_material_set_flag(material_2d[version],FIXED_MATERIAL_FLAG_DISCARD_ALPHA,p_cut_alpha); material_set_flag(material_2d[version],MATERIAL_FLAG_UNSHADED,!p_shaded); - material_set_flag(material_2d[version],MATERIAL_FLAG_DOUBLE_SIDED,true); + material_set_flag(material_2d[version], MATERIAL_FLAG_DOUBLE_SIDED, p_double_sided); material_set_depth_draw_mode(material_2d[version],p_opaque_prepass?MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA:MATERIAL_DEPTH_DRAW_OPAQUE_ONLY); fixed_material_set_texture(material_2d[version],FIXED_MATERIAL_PARAM_DIFFUSE,get_white_texture()); //material cut alpha?*/ diff --git a/servers/visual_server.h b/servers/visual_server.h index a27b32f54f..4d2a983751 100644 --- a/servers/visual_server.h +++ b/servers/visual_server.h @@ -60,7 +60,7 @@ protected: RID test_texture; RID white_texture; RID test_material; - RID material_2d[16]; + RID material_2d[32]; Error _surface_set_data(Array p_arrays, uint32_t p_format, uint32_t *p_offsets, uint32_t p_stride, PoolVector<uint8_t> &r_vertex_array, int p_vertex_array_len, PoolVector<uint8_t> &r_index_array, int p_index_array_len, Rect3 &r_aabb, Vector<Rect3> r_bone_aabb); @@ -478,6 +478,7 @@ public: virtual void particles_set_emitting(RID p_particles, bool p_emitting) = 0; virtual void particles_set_amount(RID p_particles, int p_amount) = 0; virtual void particles_set_lifetime(RID p_particles, float p_lifetime) = 0; + virtual void particles_set_one_shot(RID p_particles, bool p_one_shot) = 0; virtual void particles_set_pre_process_time(RID p_particles, float p_time) = 0; virtual void particles_set_explosiveness_ratio(RID p_particles, float p_ratio) = 0; virtual void particles_set_randomness_ratio(RID p_particles, float p_ratio) = 0; @@ -487,6 +488,7 @@ public: virtual void particles_set_process_material(RID p_particles, RID p_material) = 0; virtual void particles_set_fixed_fps(RID p_particles, int p_fps) = 0; virtual void particles_set_fractional_delta(RID p_particles, bool p_enable) = 0; + virtual void particles_restart(RID p_particles) = 0; enum ParticlesDrawOrder { PARTICLES_DRAW_ORDER_INDEX, @@ -501,6 +503,8 @@ public: virtual Rect3 particles_get_current_aabb(RID p_particles) = 0; + virtual void particles_set_emission_transform(RID p_particles, const Transform &p_transform) = 0; //this is only used for 2D, in 3D it's automatic + /* CAMERA API */ virtual RID camera_create() = 0; @@ -793,6 +797,7 @@ public: virtual void canvas_item_add_triangle_array(RID p_item, const Vector<int> &p_indices, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs = Vector<Point2>(), RID p_texture = RID(), int p_count = -1, RID p_normal_map = RID()) = 0; virtual void canvas_item_add_mesh(RID p_item, const RID &p_mesh, RID p_skeleton = RID()) = 0; virtual void canvas_item_add_multimesh(RID p_item, RID p_mesh, RID p_skeleton = RID()) = 0; + virtual void canvas_item_add_particles(RID p_item, RID p_particles, RID p_texture, RID p_normal_map, int p_h_frames, int p_v_frames) = 0; virtual void canvas_item_add_set_transform(RID p_item, const Transform2D &p_transform) = 0; virtual void canvas_item_add_clip_ignore(RID p_item, bool p_ignore) = 0; virtual void canvas_item_set_sort_children_by_y(RID p_item, bool p_enable) = 0; @@ -909,7 +914,7 @@ public: /* Materials for 2D on 3D */ - RID material_2d_get(bool p_shaded, bool p_transparent, bool p_cut_alpha, bool p_opaque_prepass); + RID material_2d_get(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass); /* TESTING */ diff --git a/thirdparty/README.md b/thirdparty/README.md index c846094a6a..ef4f83d4ad 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -59,7 +59,7 @@ TODO. ## freetype - Upstream: https://www.freetype.org -- Version: 2.6.5 +- Version: 2.8 - License: FreeType License (BSD-like) Files extracted from upstream source: diff --git a/thirdparty/freetype/include/freetype/config/ftconfig.h b/thirdparty/freetype/include/freetype/config/ftconfig.h index 157a704fa8..889aebf5ab 100644 --- a/thirdparty/freetype/include/freetype/config/ftconfig.h +++ b/thirdparty/freetype/include/freetype/config/ftconfig.h @@ -4,7 +4,7 @@ /* */ /* ANSI-specific configuration file (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -143,6 +143,14 @@ FT_BEGIN_HEADER #endif + /* Fix compiler warning with sgi compiler */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + /*************************************************************************/ /* */ /* <Section> */ @@ -325,6 +333,15 @@ FT_BEGIN_HEADER #endif +#ifdef _WIN64 + /* only 64bit Windows uses the LLP64 data model, i.e., */ + /* 32bit integers, 64bit pointers */ +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x) +#else +#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x) +#endif + + /*************************************************************************/ /* */ /* miscellaneous */ @@ -338,10 +355,11 @@ FT_BEGIN_HEADER /* typeof condition taken from gnulib's `intprops.h' header file */ -#if ( __GNUC__ >= 2 || \ - defined( __IBM__TYPEOF__ ) || \ - ( __SUNPRO_C >= 0x5110 && !__STDC__ ) ) -#define FT_TYPEOF( type ) (__typeof__ (type)) +#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 ) || \ + ( defined( __IBMC__ ) && __IBMC__ >= 1210 && \ + defined( __IBM__TYPEOF__ ) ) || \ + ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) ) +#define FT_TYPEOF( type ) ( __typeof__ ( type ) ) #else #define FT_TYPEOF( type ) /* empty */ #endif diff --git a/thirdparty/freetype/include/freetype/config/ftheader.h b/thirdparty/freetype/include/freetype/config/ftheader.h index 68e14834d4..d491af57c3 100644 --- a/thirdparty/freetype/include/freetype/config/ftheader.h +++ b/thirdparty/freetype/include/freetype/config/ftheader.h @@ -4,7 +4,7 @@ /* */ /* Build macros of the FreeType 2 library. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -357,6 +357,19 @@ /************************************************************************* * * @macro: + * FT_PCF_DRIVER_H + * + * @description: + * A macro used in #include statements to name the file containing + * structures and macros related to the PCF driver module. + * + */ +#define FT_PCF_DRIVER_H <freetype/ftpcfdrv.h> + + + /************************************************************************* + * + * @macro: * FT_TYPE1_TABLES_H * * @description: diff --git a/thirdparty/freetype/include/freetype/config/ftoption.h b/thirdparty/freetype/include/freetype/config/ftoption.h index afd32f1cda..1bf6e8f534 100644 --- a/thirdparty/freetype/include/freetype/config/ftoption.h +++ b/thirdparty/freetype/include/freetype/config/ftoption.h @@ -4,7 +4,7 @@ /* */ /* User-selectable configuration macros (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -77,6 +77,36 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ + /* If you enable this configuration option, FreeType recognizes an */ + /* environment variable called `FREETYPE_PROPERTIES', which can be used */ + /* to control the various font drivers and modules. The controllable */ + /* properties are listed in the section `Controlling FreeType Modules' */ + /* in the reference's table of contents; currently there are properties */ + /* for the auto-hinter (file `ftautoh.h'), CFF (file `ftcffdrv.h'), */ + /* TrueType (file `ftttdrv.h'), and PCF (file `ftpcfdrv.h'). */ + /* */ + /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */ + /* multiple lines for better readability). */ + /* */ + /* <optional whitespace> */ + /* <module-name1> ':' */ + /* <property-name1> '=' <property-value1> */ + /* <whitespace> */ + /* <module-name2> ':' */ + /* <property-name2> '=' <property-value2> */ + /* ... */ + /* */ + /* Example: */ + /* */ + /* FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ */ + /* cff:no-stem-darkening=1 \ */ + /* autofitter:warping=1 */ + /* */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + + /*************************************************************************/ + /* */ /* Uncomment the line below if you want to activate sub-pixel rendering */ /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ /* */ @@ -148,7 +178,7 @@ FT_BEGIN_HEADER /* */ /* Define this macro if you want to enable this `feature'. */ /* */ -/* #define FT_CONFIG_OPTION_USE_LZW */ // -GODOT- +#define FT_CONFIG_OPTION_USE_LZW /*************************************************************************/ @@ -163,7 +193,7 @@ FT_BEGIN_HEADER /* Define this macro if you want to enable this `feature'. See also */ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ -/* #define FT_CONFIG_OPTION_USE_ZLIB */ // -GODOT- +#define FT_CONFIG_OPTION_USE_ZLIB /*************************************************************************/ @@ -492,7 +522,21 @@ FT_BEGIN_HEADER /* code will be used. */ /* */ /* Setting this macro is needed for systems that prohibit address */ - /* fixups, such as BREW. */ + /* fixups, such as BREW. [Note that standard compilers like gcc or */ + /* clang handle PIC generation automatically; you don't have to set */ + /* FT_CONFIG_OPTION_PIC, which is only necessary for very special */ + /* compilers.] */ + /* */ + /* Note that FT_CONFIG_OPTION_PIC support is not available for all */ + /* modules (see `modules.cfg' for a complete list). For building with */ + /* FT_CONFIG_OPTION_PIC support, do the following. */ + /* */ + /* 0. Clone the repository. */ + /* 1. Define FT_CONFIG_OPTION_PIC. */ + /* 2. Remove all subdirectories in `src' that don't have */ + /* FT_CONFIG_OPTION_PIC support. */ + /* 3. Comment out the corresponding modules in `modules.cfg'. */ + /* 4. Compile. */ /* */ /* #define FT_CONFIG_OPTION_PIC */ @@ -596,17 +640,21 @@ FT_BEGIN_HEADER /* [1] for a technical overview on what this means. See `ttinterp.h' */ /* for more details on the LEAN option. */ /* */ - /* There are three options. */ + /* There are three possible values. */ /* */ - /* 1. This option is associated with the `Infinality' moniker. */ - /* Contributed by an individual nicknamed Infinality with the goal of */ + /* Value 1: */ + /* This value is associated with the `Infinality' moniker, */ + /* contributed by an individual nicknamed Infinality with the goal of */ /* making TrueType fonts render better than on Windows. A high */ /* amount of configurability and flexibility, down to rules for */ /* single glyphs in fonts, but also very slow. Its experimental and */ /* slow nature and the original developer losing interest meant that */ /* this option was never enabled in default builds. */ /* */ - /* 2. The new default mode for the TrueType driver. The Infinality code */ + /* The corresponding interpreter version is v38. */ + /* */ + /* Value 2: */ + /* The new default mode for the TrueType driver. The Infinality code */ /* base was stripped to the bare minimum and all configurability */ /* removed in the name of speed and simplicity. The configurability */ /* was mainly aimed at legacy fonts like Arial, Times New Roman, or */ @@ -616,14 +664,19 @@ FT_BEGIN_HEADER /* that modern and web fonts render well while legacy fonts render */ /* okay. */ /* */ - /* 3. Compile both. */ + /* The corresponding interpreter version is v40. */ + /* */ + /* Value 3: */ + /* Compile both, making both v38 and v40 available (the latter is the */ + /* default). */ /* */ /* By undefining these, you get rendering behavior like on Windows */ /* without ClearType, i.e., Windows XP without ClearType enabled and */ /* Win9x (interpreter version v35). Or not, depending on how much */ /* hinting blood and testing tears the font designer put into a given */ /* font. If you define one or both subpixel hinting options, you can */ - /* switch between between v35 and the ones you define. */ + /* switch between between v35 and the ones you define (using */ + /* `FT_Property_Set'). */ /* */ /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */ /* defined. */ @@ -631,7 +684,7 @@ FT_BEGIN_HEADER /* [1] http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ /* */ /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ @@ -791,6 +844,33 @@ FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* There are many PCF fonts just called `Fixed' which look completely */ + /* different, and which have nothing to do with each other. When */ + /* selecting `Fixed' in KDE or Gnome one gets results that appear rather */ + /* random, the style changes often if one changes the size and one */ + /* cannot select some fonts at all. This option makes the PCF module */ + /* prepend the foundry name (plus a space) to the family name. */ + /* */ + /* We also check whether we have `wide' characters; all put together, we */ + /* get family names like `Sony Fixed' or `Misc Fixed Wide'. */ + /* */ + /* If this option is activated, it can be controlled with the */ + /* `no-long-family-names' property of the pcf driver module. */ + /* */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ /**** ****/ /*************************************************************************/ @@ -806,7 +886,9 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ - /* Compile autofit module with Indic script support. */ + /* Compile autofit module with fallback Indic script support, covering */ + /* some scripts that the `latin' submodule of the autofit module doesn't */ + /* (yet) handle. */ /* */ #define AF_CONFIG_OPTION_INDIC @@ -825,6 +907,26 @@ FT_BEGIN_HEADER /* */ #define AF_CONFIG_OPTION_USE_WARPER + /*************************************************************************/ + /* */ + /* Use TrueType-like size metrics for `light' auto-hinting. */ + /* */ + /* It is strongly recommended to avoid this option, which exists only to */ + /* help some legacy applications retain its appearance and behaviour */ + /* with respect to auto-hinted TrueType fonts. */ + /* */ + /* The very reason this option exists at all are GNU/Linux distributions */ + /* like Fedora that did not un-patch the following change (which was */ + /* present in FreeType between versions 2.4.6 and 2.7.1, inclusive). */ + /* */ + /* 2011-07-16 Steven Chu <steven.f.chu@gmail.com> */ + /* */ + /* [truetype] Fix metrics on size request for scalable fonts. */ + /* */ + /* This problematic commit is now reverted (more or less). */ + /* */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + /* */ @@ -842,6 +944,7 @@ FT_BEGIN_HEADER #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER #define TT_USE_BYTECODE_INTERPRETER +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 #define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY #endif @@ -850,6 +953,7 @@ FT_BEGIN_HEADER #define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL #endif #endif +#endif /* diff --git a/thirdparty/freetype/include/freetype/config/ftstdlib.h b/thirdparty/freetype/include/freetype/config/ftstdlib.h index 562e255810..05a4845fd5 100644 --- a/thirdparty/freetype/include/freetype/config/ftstdlib.h +++ b/thirdparty/freetype/include/freetype/config/ftstdlib.h @@ -5,7 +5,7 @@ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -142,7 +142,8 @@ /**********************************************************************/ -#define ft_atol atol +#define ft_strtol strtol +#define ft_getenv getenv /**********************************************************************/ diff --git a/thirdparty/freetype/include/freetype/freetype.h b/thirdparty/freetype/include/freetype/freetype.h index 45e10c48a2..2989fbb5e1 100644 --- a/thirdparty/freetype/include/freetype/freetype.h +++ b/thirdparty/freetype/include/freetype/freetype.h @@ -4,7 +4,7 @@ /* */ /* FreeType high-level API and common types (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -175,6 +175,7 @@ FT_BEGIN_HEADER /* FT_Done_Face */ /* FT_Reference_Face */ /* FT_New_Memory_Face */ + /* FT_Face_Properties */ /* FT_Open_Face */ /* FT_Open_Args */ /* FT_Parameter */ @@ -265,8 +266,8 @@ FT_BEGIN_HEADER /* FT_Glyph_Metrics */ /* */ /* <Description> */ - /* A structure used to model the metrics of a single glyph. The */ - /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* A structure to model the metrics of a single glyph. The values */ + /* are expressed in 26.6 fractional pixel format; if the flag */ /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ /* are expressed in font units instead. */ /* */ @@ -305,6 +306,11 @@ FT_BEGIN_HEADER /* `horiAdvance' or `vertAdvance'; you have to manually adjust these */ /* values to account for the added width and height. */ /* */ + /* FreeType doesn't use the `VORG' table data for CFF fonts because */ + /* it doesn't have an interface to quickly retrieve the glyph height. */ + /* The y~coordinate of the vertical origin can be simply computed as */ + /* `vertBearingY + height' after loading a glyph. */ + /* */ typedef struct FT_Glyph_Metrics_ { FT_Pos width; @@ -349,10 +355,10 @@ FT_BEGIN_HEADER /* */ /* <Note> */ /* Windows FNT: */ - /* The nominal size given in a FNT font is not reliable. Thus when */ - /* the driver finds it incorrect, it sets `size' to some calculated */ - /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ - /* height given in the font, respectively. */ + /* The nominal size given in a FNT font is not reliable. If the */ + /* driver finds it incorrect, it sets `size' to some calculated */ + /* values, and `x_ppem' and `y_ppem' to the pixel width and height */ + /* given in the font, respectively. */ /* */ /* TrueType embedded bitmaps: */ /* `size', `width', and `height' values are not contained in the */ @@ -421,9 +427,9 @@ FT_BEGIN_HEADER /* FT_Module */ /* */ /* <Description> */ - /* A handle to a given FreeType module object. Each module can be a */ + /* A handle to a given FreeType module object. A module can be a */ /* font driver, a renderer, or anything else that provides services */ - /* to the formers. */ + /* to the former. */ /* */ typedef struct FT_ModuleRec_* FT_Module; @@ -434,8 +440,8 @@ FT_BEGIN_HEADER /* FT_Driver */ /* */ /* <Description> */ - /* A handle to a given FreeType font driver object. Each font driver */ - /* is a special module capable of creating faces from font files. */ + /* A handle to a given FreeType font driver object. A font driver */ + /* is a module capable of creating faces from font files. */ /* */ typedef struct FT_DriverRec_* FT_Driver; @@ -446,10 +452,10 @@ FT_BEGIN_HEADER /* FT_Renderer */ /* */ /* <Description> */ - /* A handle to a given FreeType renderer. A renderer is a special */ - /* module in charge of converting a glyph image to a bitmap, when */ - /* necessary. Each renderer supports a given glyph image format, and */ - /* one or more target surface depths. */ + /* A handle to a given FreeType renderer. A renderer is a module in */ + /* charge of converting a glyph's outline image to a bitmap. It */ + /* supports a single glyph image format, and one or more target */ + /* surface depths. */ /* */ typedef struct FT_RendererRec_* FT_Renderer; @@ -467,15 +473,15 @@ FT_BEGIN_HEADER /* FT_Face */ /* */ /* <Description> */ - /* A handle to a given typographic face object. A face object models */ - /* a given typeface, in a given style. */ + /* A handle to a typographic face object. A face object models a */ + /* given typeface, in a given style. */ /* */ /* <Note> */ - /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* A face object also owns a single @FT_GlyphSlot object, as well */ /* as one or more @FT_Size objects. */ /* */ /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ - /* a given filepathname or a custom input stream. */ + /* a given filepath or a custom input stream. */ /* */ /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ /* */ @@ -500,11 +506,11 @@ FT_BEGIN_HEADER /* FT_Size */ /* */ /* <Description> */ - /* A handle to an object used to model a face scaled to a given */ + /* A handle to an object that models a face scaled to a given */ /* character size. */ /* */ /* <Note> */ - /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* An @FT_Face has one _active_ @FT_Size object that is used by */ /* functions like @FT_Load_Glyph to determine the scaling */ /* transformation that in turn is used to load and hint glyphs and */ /* metrics. */ @@ -531,9 +537,8 @@ FT_BEGIN_HEADER /* FT_GlyphSlot */ /* */ /* <Description> */ - /* A handle to a given `glyph slot'. A slot is a container where it */ - /* is possible to load any of the glyphs contained in its parent */ - /* face. */ + /* A handle to a given `glyph slot'. A slot is a container that can */ + /* hold any of the glyphs contained in its parent face. */ /* */ /* In other words, each time you call @FT_Load_Glyph or */ /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ @@ -552,13 +557,14 @@ FT_BEGIN_HEADER /* FT_CharMap */ /* */ /* <Description> */ - /* A handle to a given character map. A charmap is used to translate */ - /* character codes in a given encoding into glyph indexes for its */ - /* parent's face. Some font formats may provide several charmaps per */ - /* font. */ + /* A handle to a character map (usually abbreviated to `charmap'). A */ + /* charmap is used to translate character codes in a given encoding */ + /* into glyph indexes for its parent's face. Some font formats may */ + /* provide several charmaps per font. */ /* */ /* Each face object owns zero or more charmaps, but only one of them */ - /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* can be `active', providing the data used by @FT_Get_Char_Index or */ + /* @FT_Load_Char. */ /* */ /* The list of available charmaps in a face is available through the */ /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ @@ -615,8 +621,8 @@ FT_BEGIN_HEADER /* FT_Encoding */ /* */ /* <Description> */ - /* An enumeration used to specify character sets supported by */ - /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* An enumeration to specify character sets supported by charmaps. */ + /* Used in the @FT_Select_Charmap API function. */ /* */ /* <Note> */ /* Despite the name, this enumeration lists specific character */ @@ -630,18 +636,17 @@ FT_BEGIN_HEADER /* The encoding value~0 is reserved. */ /* */ /* FT_ENCODING_UNICODE :: */ - /* Corresponds to the Unicode character set. This value covers */ - /* all versions of the Unicode repertoire, including ASCII and */ - /* Latin-1. Most fonts include a Unicode charmap, but not all */ - /* of them. */ + /* The Unicode character set. This value covers all versions of */ + /* the Unicode repertoire, including ASCII and Latin-1. Most fonts */ + /* include a Unicode charmap, but not all of them. */ /* */ /* For example, if you want to access Unicode value U+1F028 (and */ /* the font contains it), use value 0x1F028 as the input value for */ /* @FT_Get_Char_Index. */ /* */ /* FT_ENCODING_MS_SYMBOL :: */ - /* Corresponds to the Microsoft Symbol encoding, used to encode */ - /* mathematical symbols and wingdings. For more information, see */ + /* Microsoft Symbol encoding, used to encode mathematical symbols */ + /* and wingdings. For more information, see */ /* `http://www.microsoft.com/typography/otspec/recom.htm', */ /* `http://www.kostis.net/charsets/symbol.htm', and */ /* `http://www.kostis.net/charsets/wingding.htm'. */ @@ -650,60 +655,60 @@ FT_BEGIN_HEADER /* Area) in the range U+F020-U+F0FF. */ /* */ /* FT_ENCODING_SJIS :: */ - /* Corresponds to Japanese SJIS encoding. More info at */ - /* `http://en.wikipedia.org/wiki/Shift_JIS'. */ - /* See note on multi-byte encodings below. */ + /* Shift JIS encoding for Japanese. More info at */ + /* `http://en.wikipedia.org/wiki/Shift_JIS'. See note on */ + /* multi-byte encodings below. */ /* */ - /* FT_ENCODING_GB2312 :: */ - /* Corresponds to an encoding system for Simplified Chinese as */ - /* used in mainland China. */ + /* FT_ENCODING_PRC :: */ + /* Corresponds to encoding systems mainly for Simplified Chinese as */ + /* used in People's Republic of China (PRC). The encoding layout */ + /* is based on GB~2312 and its supersets GBK and GB~18030. */ /* */ /* FT_ENCODING_BIG5 :: */ /* Corresponds to an encoding system for Traditional Chinese as */ /* used in Taiwan and Hong Kong. */ /* */ /* FT_ENCODING_WANSUNG :: */ - /* Corresponds to the Korean encoding system known as Wansung. */ + /* Corresponds to the Korean encoding system known as Extended */ + /* Wansung (MS Windows code page 949). */ /* For more information see */ - /* `https://msdn.microsoft.com/en-US/goglobal/cc305154'. */ + /* `http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. */ /* */ /* FT_ENCODING_JOHAB :: */ /* The Korean standard character set (KS~C 5601-1992), which */ /* corresponds to MS Windows code page 1361. This character set */ - /* includes all possible Hangeul character combinations. */ + /* includes all possible Hangul character combinations. */ /* */ /* FT_ENCODING_ADOBE_LATIN_1 :: */ /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ /* PostScript font. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_ADOBE_STANDARD :: */ - /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ + /* Adobe Standard encoding, as found in Type~1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_ADOBE_EXPERT :: */ - /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ - /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ - /* codes. */ + /* Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF */ + /* fonts. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_ADOBE_CUSTOM :: */ /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ /* OpenType/CFF fonts. It is limited to 256 character codes. */ /* */ /* FT_ENCODING_APPLE_ROMAN :: */ - /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ - /* and OpenType fonts contain a charmap for this encoding, since */ - /* older versions of Mac OS are able to use it. */ + /* Apple roman encoding. Many TrueType and OpenType fonts contain */ + /* a charmap for this 8-bit encoding, since older versions of Mac */ + /* OS are able to use it. */ /* */ /* FT_ENCODING_OLD_LATIN_2 :: */ - /* This value is deprecated and was never used nor reported by */ + /* This value is deprecated and was neither used nor reported by */ /* FreeType. Don't use or test for it. */ /* */ /* FT_ENCODING_MS_SJIS :: */ /* Same as FT_ENCODING_SJIS. Deprecated. */ /* */ /* FT_ENCODING_MS_GB2312 :: */ - /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* Same as FT_ENCODING_PRC. Deprecated. */ /* */ /* FT_ENCODING_MS_BIG5 :: */ /* Same as FT_ENCODING_BIG5. Deprecated. */ @@ -716,7 +721,7 @@ FT_BEGIN_HEADER /* */ /* <Note> */ /* By default, FreeType automatically synthesizes a Unicode charmap */ - /* for PostScript fonts, using their glyph names dictionaries. */ + /* for PostScript fonts, using their glyph name dictionaries. */ /* However, it also reports the encodings defined explicitly in the */ /* font file, for the cases when they are needed, with the Adobe */ /* values as well. */ @@ -736,7 +741,7 @@ FT_BEGIN_HEADER /* Russian). */ /* */ /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ - /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* and `encoding_id' is not `TT_MAC_ID_ROMAN' (otherwise it is set to */ /* FT_ENCODING_APPLE_ROMAN). */ /* */ /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ @@ -748,9 +753,9 @@ FT_BEGIN_HEADER /* to get an idea how to do that. Basically, if the language ID */ /* is~0, don't use it, otherwise subtract 1 from the language ID. */ /* Then examine `encoding_id'. If, for example, `encoding_id' is */ - /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ + /* `TT_MAC_ID_ROMAN' and the language ID (minus~1) is */ /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ - /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* `TT_MAC_ID_ARABIC' with `TT_MAC_LANGID_FARSI' means the Farsi */ /* variant the Arabic encoding. */ /* */ typedef enum FT_Encoding_ @@ -761,14 +766,15 @@ FT_BEGIN_HEADER FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), - FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_PRC, 'g', 'b', ' ', ' ' ), FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), - /* for backwards compatibility */ + /* for backward compatibility */ + FT_ENCODING_GB2312 = FT_ENCODING_PRC, FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, - FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_GB2312 = FT_ENCODING_PRC, FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, @@ -793,7 +799,7 @@ FT_BEGIN_HEADER #define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 #define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 #define ft_encoding_sjis FT_ENCODING_SJIS -#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_gb2312 FT_ENCODING_PRC #define ft_encoding_big5 FT_ENCODING_BIG5 #define ft_encoding_wansung FT_ENCODING_WANSUNG #define ft_encoding_johab FT_ENCODING_JOHAB @@ -820,11 +826,11 @@ FT_BEGIN_HEADER /* */ /* platform_id :: An ID number describing the platform for the */ /* following encoding ID. This comes directly from */ - /* the TrueType specification and should be emulated */ - /* for other formats. */ + /* the TrueType specification and gets emulated for */ + /* other formats. */ /* */ /* encoding_id :: A platform specific encoding number. This also */ - /* comes from the TrueType specification and should be */ + /* comes from the TrueType specification and gets */ /* emulated similarly. */ /* */ typedef struct FT_CharMapRec_ @@ -852,8 +858,8 @@ FT_BEGIN_HEADER /* FT_Face_Internal */ /* */ /* <Description> */ - /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ - /* model private data of a given @FT_Face object. */ + /* An opaque handle to an `FT_Face_InternalRec' structure that models */ + /* the private data of a given @FT_Face object. */ /* */ /* This structure might change between releases of FreeType~2 and is */ /* not generally available to client applications. */ @@ -873,7 +879,7 @@ FT_BEGIN_HEADER /* <Fields> */ /* num_faces :: The number of faces in the font file. Some */ /* font formats can have multiple faces in */ - /* a font file. */ + /* a single font file. */ /* */ /* face_index :: This field holds two different values. */ /* Bits 0-15 are the index of the face in the */ @@ -881,14 +887,15 @@ FT_BEGIN_HEADER /* are set to~0 if there is only one face in */ /* the font file. */ /* */ - /* Bits 16-30 are relevant to GX variation */ - /* fonts only, holding the named instance */ - /* index for the current face index (starting */ - /* with value~1; value~0 indicates font access */ - /* without GX variation data). For non-GX */ - /* fonts, bits 16-30 are ignored. If we have */ - /* the third named instance of face~4, say, */ - /* `face_index' is set to 0x00030004. */ + /* Bits 16-30 are relevant to GX and OpenType */ + /* variation fonts only, holding the named */ + /* instance index for the current face index */ + /* (starting with value~1; value~0 indicates */ + /* font access without a named instance). For */ + /* non-variation fonts, bits 16-30 are */ + /* ignored. If we have the third named */ + /* instance of face~4, say, `face_index' is */ + /* set to 0x00030004. */ /* */ /* Bit 31 is always zero (this is, */ /* `face_index' is always a positive value). */ @@ -902,17 +909,21 @@ FT_BEGIN_HEADER /* @FT_STYLE_FLAG_XXX for the details. Bits */ /* 16-30 hold the number of named instances */ /* available for the current face if we have a */ - /* GX variation (sub)font. Bit 31 is always */ - /* zero (this is, `style_flags' is always a */ - /* positive value). */ + /* GX or OpenType variation (sub)font. Bit 31 */ + /* is always zero (this is, `style_flags' is */ + /* always a positive value). Note that a */ + /* variation font has always at least one */ + /* named instance, namely the default */ + /* instance. */ /* */ /* num_glyphs :: The number of glyphs in the face. If the */ /* face is scalable and has sbits (see */ /* `num_fixed_sizes'), it is set to the number */ /* of outline glyphs. */ /* */ - /* For CID-keyed fonts, this value gives the */ - /* highest CID used in the font. */ + /* For CID-keyed fonts (not in an SFNT */ + /* wrapper) this value gives the highest CID */ + /* used in the font. */ /* */ /* family_name :: The face's family name. This is an ASCII */ /* string, usually in English, that describes */ @@ -951,6 +962,10 @@ FT_BEGIN_HEADER /* strikes in the face. It is set to NULL if */ /* there is no bitmap strike. */ /* */ + /* Note that FreeType tries to sanitize the */ + /* strike data since they are sometimes sloppy */ + /* or incorrect, but this can easily fail. */ + /* */ /* num_charmaps :: The number of charmaps in the face. */ /* */ /* charmaps :: An array of the charmaps of the face. */ @@ -986,8 +1001,8 @@ FT_BEGIN_HEADER /* expressed in font units. For font formats */ /* not having this information, it is set to */ /* `bbox.yMin'. Note that this field is */ - /* usually negative. Only relevant for */ - /* scalable formats. */ + /* negative for values below the baseline. */ + /* Only relevant for scalable formats. */ /* */ /* height :: This value is the vertical distance */ /* between two consecutive baselines, */ @@ -1030,6 +1045,12 @@ FT_BEGIN_HEADER /* Fields may be changed after a call to @FT_Attach_File or */ /* @FT_Attach_Stream. */ /* */ + /* For an OpenType variation font, the values of the following fields */ + /* can change after a call to @FT_Set_Var_Design_Coordinates (and */ + /* friends) if the font contains an `MVAR' table: `ascender', */ + /* `descender', `height', `underline_position', and */ + /* `underline_thickness'. */ + /* */ typedef struct FT_FaceRec_ { FT_Long num_faces; @@ -1101,49 +1122,51 @@ FT_BEGIN_HEADER /* */ /* <Values> */ /* FT_FACE_FLAG_SCALABLE :: */ - /* Indicates that the face contains outline glyphs. This doesn't */ - /* prevent bitmap strikes, i.e., a face can have both this and */ + /* The face contains outline glyphs. Note that a face can contain */ + /* bitmap strikes also, i.e., a face can have both this flag and */ /* @FT_FACE_FLAG_FIXED_SIZES set. */ /* */ /* FT_FACE_FLAG_FIXED_SIZES :: */ - /* Indicates that the face contains bitmap strikes. See also the */ + /* The face contains bitmap strikes. See also the */ /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ /* */ /* FT_FACE_FLAG_FIXED_WIDTH :: */ - /* Indicates that the face contains fixed-width characters (like */ - /* Courier, Lucido, MonoType, etc.). */ + /* The face contains fixed-width characters (like Courier, Lucida, */ + /* MonoType, etc.). */ /* */ /* FT_FACE_FLAG_SFNT :: */ - /* Indicates that the face uses the `sfnt' storage scheme. For */ - /* now, this means TrueType and OpenType. */ + /* The face uses the SFNT storage scheme. For now, this means */ + /* TrueType and OpenType. */ /* */ /* FT_FACE_FLAG_HORIZONTAL :: */ - /* Indicates that the face contains horizontal glyph metrics. This */ - /* should be set for all common formats. */ + /* The face contains horizontal glyph metrics. This should be set */ + /* for all common formats. */ /* */ /* FT_FACE_FLAG_VERTICAL :: */ - /* Indicates that the face contains vertical glyph metrics. This */ - /* is only available in some formats, not all of them. */ + /* The face contains vertical glyph metrics. This is only */ + /* available in some formats, not all of them. */ /* */ /* FT_FACE_FLAG_KERNING :: */ - /* Indicates that the face contains kerning information. If set, */ - /* the kerning distance can be retrieved through the function */ - /* @FT_Get_Kerning. Otherwise the function always return the */ - /* vector (0,0). Note that FreeType doesn't handle kerning data */ - /* from the `GPOS' table (as present in some OpenType fonts). */ + /* The face contains kerning information. If set, the kerning */ + /* distance can be retrieved using the function @FT_Get_Kerning. */ + /* Otherwise the function always return the vector (0,0). Note */ + /* that FreeType doesn't handle kerning data from the SFNT `GPOS' */ + /* table (as present in many OpenType fonts). */ /* */ /* FT_FACE_FLAG_FAST_GLYPHS :: */ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ /* */ /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ - /* Indicates that the font contains multiple masters and is capable */ - /* of interpolating between them. See the multiple-masters */ - /* specific API for details. */ + /* The face contains multiple masters and is capable of */ + /* interpolating between them. Supported formats are Adobe MM, */ + /* TrueType GX, and OpenType variation fonts. */ + /* */ + /* See the multiple-masters specific API for details. */ /* */ /* FT_FACE_FLAG_GLYPH_NAMES :: */ - /* Indicates that the font contains glyph names that can be */ - /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ - /* fonts contain broken glyph name tables. Use the function */ + /* The face contains glyph names, which can be retrieved using */ + /* @FT_Get_Glyph_Name. Note that some TrueType fonts contain */ + /* broken glyph name tables. Use the function */ /* @FT_Has_PS_Glyph_Names when needed. */ /* */ /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ @@ -1152,31 +1175,31 @@ FT_BEGIN_HEADER /* when @FT_Done_Face is called. Don't read or test this flag. */ /* */ /* FT_FACE_FLAG_HINTER :: */ - /* Set if the font driver has a hinting machine of its own. For */ - /* example, with TrueType fonts, it makes sense to use data from */ - /* the SFNT `gasp' table only if the native TrueType hinting engine */ - /* (with the bytecode interpreter) is available and active. */ + /* The font driver has a hinting machine of its own. For example, */ + /* with TrueType fonts, it makes sense to use data from the SFNT */ + /* `gasp' table only if the native TrueType hinting engine (with */ + /* the bytecode interpreter) is available and active. */ /* */ /* FT_FACE_FLAG_CID_KEYED :: */ - /* Set if the font is CID-keyed. In that case, the font is not */ - /* accessed by glyph indices but by CID values. For subsetted */ - /* CID-keyed fonts this has the consequence that not all index */ - /* values are a valid argument to FT_Load_Glyph. Only the CID */ - /* values for which corresponding glyphs in the subsetted font */ - /* exist make FT_Load_Glyph return successfully; in all other cases */ - /* you get an `FT_Err_Invalid_Argument' error. */ - /* */ - /* Note that CID-keyed fonts that are in an SFNT wrapper don't */ - /* have this flag set since the glyphs are accessed in the normal */ - /* way (using contiguous indices); the `CID-ness' isn't visible to */ - /* the application. */ + /* The face is CID-keyed. In that case, the face is not accessed */ + /* by glyph indices but by CID values. For subsetted CID-keyed */ + /* fonts this has the consequence that not all index values are a */ + /* valid argument to @FT_Load_Glyph. Only the CID values for which */ + /* corresponding glyphs in the subsetted font exist make */ + /* `FT_Load_Glyph' return successfully; in all other cases you get */ + /* an `FT_Err_Invalid_Argument' error. */ + /* */ + /* Note that CID-keyed fonts that are in an SFNT wrapper (this is, */ + /* all OpenType/CFF fonts) don't have this flag set since the */ + /* glyphs are accessed in the normal way (using contiguous */ + /* indices); the `CID-ness' isn't visible to the application. */ /* */ /* FT_FACE_FLAG_TRICKY :: */ - /* Set if the font is `tricky', this is, it always needs the */ - /* font format's native hinting engine to get a reasonable result. */ - /* A typical example is the Chinese font `mingli.ttf' that uses */ - /* TrueType bytecode instructions to move and scale all of its */ - /* subglyphs. */ + /* The face is `tricky', this is, it always needs the font format's */ + /* native hinting engine to get a reasonable result. A typical */ + /* example is the old Chinese font `mingli.ttf' (but not */ + /* `mingliu.ttc') that uses TrueType bytecode instructions to move */ + /* and scale all of its subglyphs. */ /* */ /* It is not possible to auto-hint such fonts using */ /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ @@ -1188,8 +1211,8 @@ FT_BEGIN_HEADER /* tricky fonts; they are hard-coded in file `ttobjs.c'. */ /* */ /* FT_FACE_FLAG_COLOR :: */ - /* Set if the font has color glyph tables. To access color glyphs */ - /* use @FT_LOAD_COLOR. */ + /* The face has color glyph tables. To access color glyphs use */ + /* @FT_LOAD_COLOR. */ /* */ #define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) #define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) @@ -1261,7 +1284,7 @@ FT_BEGIN_HEADER * @description: * A macro that returns true whenever a face object contains a scalable * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, - * and PFR font formats. + * and PFR font formats). * */ #define FT_IS_SCALABLE( face ) \ @@ -1361,6 +1384,20 @@ FT_BEGIN_HEADER /************************************************************************* * * @macro: + * FT_IS_NAMED_INSTANCE( face ) + * + * @description: + * A macro that returns true whenever a face object is a named instance + * of a GX or OpenType variation font. + * + */ +#define FT_IS_NAMED_INSTANCE( face ) \ + ( (face)->face_index & 0x7FFF0000L ) + + + /************************************************************************* + * + * @macro: * FT_IS_CID_KEYED( face ) * * @description: @@ -1410,15 +1447,15 @@ FT_BEGIN_HEADER /* FT_STYLE_FLAG_XXX */ /* */ /* <Description> */ - /* A list of bit flags used to indicate the style of a given face. */ - /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* A list of bit flags to indicate the style of a given face. These */ + /* are used in the `style_flags' field of @FT_FaceRec. */ /* */ /* <Values> */ /* FT_STYLE_FLAG_ITALIC :: */ - /* Indicates that a given face style is italic or oblique. */ + /* The face style is italic or oblique. */ /* */ /* FT_STYLE_FLAG_BOLD :: */ - /* Indicates that a given face is bold. */ + /* The face is bold. */ /* */ /* <Note> */ /* The style information as provided by FreeType is very basic. More */ @@ -1459,43 +1496,50 @@ FT_BEGIN_HEADER /* hence the term `ppem' (pixels per EM). It is also */ /* referred to as `nominal height'. */ /* */ - /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* x_scale :: A 16.16 fractional scaling value to convert */ /* horizontal metrics from font units to 26.6 */ /* fractional pixels. Only relevant for scalable */ /* font formats. */ /* */ - /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* y_scale :: A 16.16 fractional scaling value to convert */ /* vertical metrics from font units to 26.6 */ /* fractional pixels. Only relevant for scalable */ /* font formats. */ /* */ - /* ascender :: The ascender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ + /* ascender :: The ascender in 26.6 fractional pixels, rounded up */ + /* to an integer value. See @FT_FaceRec for the */ + /* details. */ /* */ - /* descender :: The descender in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ + /* descender :: The descender in 26.6 fractional pixels, rounded */ + /* down to an integer value. See @FT_FaceRec for the */ + /* details. */ /* */ - /* height :: The height in 26.6 fractional pixels. See */ - /* @FT_FaceRec for the details. */ + /* height :: The height in 26.6 fractional pixels, rounded to */ + /* an integer value. See @FT_FaceRec for the */ + /* details. */ /* */ /* max_advance :: The maximum advance width in 26.6 fractional */ - /* pixels. See @FT_FaceRec for the details. */ + /* pixels, rounded to an integer value. See */ + /* @FT_FaceRec for the details. */ /* */ /* <Note> */ /* The scaling values, if relevant, are determined first during a */ /* size changing operation. The remaining fields are then set by the */ /* driver. For scalable formats, they are usually set to scaled */ - /* values of the corresponding fields in @FT_FaceRec. */ + /* values of the corresponding fields in @FT_FaceRec. Some values */ + /* like ascender or descender are rounded for historical reasons; */ + /* more precise values (for outline fonts) can be derived by scaling */ + /* the corresponding @FT_FaceRec values manually. */ /* */ - /* Note that due to glyph hinting, these values might not be exact */ - /* for certain fonts. Thus they must be treated as unreliable */ - /* with an error margin of at least one pixel! */ + /* Note that due to glyph hinting and the selected rendering mode */ + /* these values are usually not exact; consequently, they must be */ + /* treated as unreliable with an error margin of at least one pixel! */ /* */ /* Indeed, the only way to get the exact metrics is to render _all_ */ /* glyphs. As this would be a definite performance hit, it is up to */ /* client applications to perform such computations. */ /* */ - /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* The `FT_Size_Metrics' structure is valid for bitmap fonts also. */ /* */ typedef struct FT_Size_Metrics_ { @@ -1635,8 +1679,8 @@ FT_BEGIN_HEADER /* contained in the glyph slot. Typically */ /* @FT_GLYPH_FORMAT_BITMAP, */ /* @FT_GLYPH_FORMAT_OUTLINE, or */ - /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ - /* possible. */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but other values */ + /* are possible. */ /* */ /* bitmap :: This field is used as a bitmap descriptor */ /* when the slot format is */ @@ -1651,16 +1695,15 @@ FT_BEGIN_HEADER /* glyph slot contains a bitmap. */ /* */ /* bitmap_top :: The bitmap's top bearing expressed in integer */ - /* pixels. Remember that this is the distance */ - /* from the baseline to the top-most glyph */ - /* scanline, upwards y~coordinates being */ - /* *positive*. */ + /* pixels. This is the distance from the */ + /* baseline to the top-most glyph scanline, */ + /* upwards y~coordinates being *positive*. */ /* */ /* outline :: The outline descriptor for the current glyph */ /* image if its format is */ /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ /* loaded, `outline' can be transformed, */ - /* distorted, embolded, etc. However, it must */ + /* distorted, emboldened, etc. However, it must */ /* not be freed. */ /* */ /* num_subglyphs :: The number of subglyphs in a composite glyph. */ @@ -1676,15 +1719,13 @@ FT_BEGIN_HEADER /* control_data :: Certain font drivers can also return the */ /* control data for a given glyph image (e.g. */ /* TrueType bytecode, Type~1 charstrings, etc.). */ - /* This field is a pointer to such data. */ + /* This field is a pointer to such data; it is */ + /* currently internal to FreeType. */ /* */ /* control_len :: This is the length in bytes of the control */ - /* data. */ + /* data. Currently internal to FreeType. */ /* */ - /* other :: Really wicked formats can use this pointer to */ - /* present their own glyph image to client */ - /* applications. Note that the application */ - /* needs to know about the image format. */ + /* other :: Reserved. */ /* */ /* lsb_delta :: The difference between hinted and unhinted */ /* left side bearing while auto-hinting is */ @@ -1701,7 +1742,7 @@ FT_BEGIN_HEADER /* formats). */ /* */ /* This image can later be converted into a bitmap by calling */ - /* @FT_Render_Glyph. This function finds the current renderer for */ + /* @FT_Render_Glyph. This function searches the current renderer for */ /* the native image's format, then invokes it. */ /* */ /* The renderer is in charge of transforming the native image through */ @@ -1713,34 +1754,65 @@ FT_BEGIN_HEADER /* position (e.g., coordinates (0,0) on the baseline). Of course, */ /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ /* */ - /* <Note> */ /* Here is a small pseudo code fragment that shows how to use */ - /* `lsb_delta' and `rsb_delta': */ + /* `lsb_delta' and `rsb_delta' to do fractional positioning of */ + /* glyphs: */ + /* */ + /* { */ + /* FT_GlyphSlot slot = face->glyph; */ + /* FT_Pos origin_x = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* FT_Outline_Translate( slot->outline, origin_x & 63, 0 ); */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* <compute kern between current and next glyph */ + /* and add it to `origin_x'> */ + /* */ + /* origin_x += slot->advance.x; */ + /* origin_x += slot->rsb_delta - slot->lsb_relta; */ + /* endfor */ + /* } */ + /* */ + /* Here is another small pseudo code fragment that shows how to use */ + /* `lsb_delta' and `rsb_delta' to improve integer positioning of */ + /* glyphs: */ /* */ /* { */ - /* FT_Pos origin_x = 0; */ - /* FT_Pos prev_rsb_delta = 0; */ + /* FT_GlyphSlot slot = face->glyph; */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ /* */ /* */ /* for all glyphs do */ - /* <compute kern between current and previous glyph and add it to */ - /* `origin_x'> */ + /* <compute kern between current and previous glyph */ + /* and add it to `origin_x'> */ /* */ /* <load glyph with `FT_Load_Glyph'> */ /* */ - /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* if ( prev_rsb_delta - slot->lsb_delta >= 32 ) */ /* origin_x -= 64; */ - /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* else if ( prev_rsb_delta - slot->lsb_delta < -32 ) */ /* origin_x += 64; */ /* */ - /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* prev_rsb_delta = slot->rsb_delta; */ /* */ /* <save glyph image, or render glyph, or ...> */ /* */ - /* origin_x += face->glyph->advance.x; */ + /* origin_x += slot->advance.x; */ /* endfor */ /* } */ /* */ + /* If you use strong auto-hinting, you *must* apply these delta */ + /* values! Otherwise you will experience far too large inter-glyph */ + /* spacing at small rendering sizes in most cases. Note that it */ + /* doesn't harm to use the above code for other hinting modes also, */ + /* since the delta values are zero then. */ + /* */ typedef struct FT_GlyphSlotRec_ { FT_Library library; @@ -1805,7 +1877,8 @@ FT_BEGIN_HEADER /* <Note> */ /* In case you want to provide your own memory allocating routines, */ /* use @FT_New_Library instead, followed by a call to */ - /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ + /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module) */ + /* and @FT_Set_Default_Properties. */ /* */ /* See the documentation of @FT_Library and @FT_Face for */ /* multi-threading issues. */ @@ -1813,6 +1886,11 @@ FT_BEGIN_HEADER /* If you need reference-counting (cf. @FT_Reference_Library), use */ /* @FT_New_Library and @FT_Done_Library. */ /* */ + /* If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is */ + /* set, this function reads the `FREETYPE_PROPERTIES' environment */ + /* variable to control driver properties. See sections @auto_hinter, */ + /* @cff_driver, @pcf_driver, and @tt_driver for more. */ + /* */ FT_EXPORT( FT_Error ) FT_Init_FreeType( FT_Library *alibrary ); @@ -1883,8 +1961,8 @@ FT_BEGIN_HEADER /* FT_Parameter */ /* */ /* <Description> */ - /* A simple structure used to pass more or less generic parameters to */ - /* @FT_Open_Face. */ + /* A simple structure to pass more or less generic parameters to */ + /* @FT_Open_Face and @FT_Face_Properties. */ /* */ /* <Fields> */ /* tag :: A four-byte identification tag. */ @@ -1909,9 +1987,9 @@ FT_BEGIN_HEADER /* FT_Open_Args */ /* */ /* <Description> */ - /* A structure used to indicate how to open a new font file or */ - /* stream. A pointer to such a structure can be used as a parameter */ - /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* A structure to indicate how to open a new font file or stream. A */ + /* pointer to such a structure can be used as a parameter for the */ + /* functions @FT_Open_Face and @FT_Attach_Stream. */ /* */ /* <Fields> */ /* flags :: A set of bit flags indicating how to use the */ @@ -1926,9 +2004,10 @@ FT_BEGIN_HEADER /* stream :: A handle to a source stream object. */ /* */ /* driver :: This field is exclusively used by @FT_Open_Face; */ - /* it simply specifies the font driver to use to open */ - /* the face. If set to~0, FreeType tries to load the */ - /* face with each one of the drivers in its list. */ + /* it simply specifies the font driver to use for */ + /* opening the face. If set to NULL, FreeType tries */ + /* to load the face with each one of the drivers in */ + /* its list. */ /* */ /* num_params :: The number of extra parameters. */ /* */ @@ -1958,7 +2037,7 @@ FT_BEGIN_HEADER /* `num_params' and `params' is used. They are ignored otherwise. */ /* */ /* Ideally, both the `pathname' and `params' fields should be tagged */ - /* as `const'; this is missing for API backwards compatibility. In */ + /* as `const'; this is missing for API backward compatibility. In */ /* other words, applications should treat them as read-only. */ /* */ typedef struct FT_Open_Args_ @@ -1981,7 +2060,7 @@ FT_BEGIN_HEADER /* FT_New_Face */ /* */ /* <Description> */ - /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* Call @FT_Open_Face to open a font by its pathname. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ @@ -2016,8 +2095,8 @@ FT_BEGIN_HEADER /* FT_New_Memory_Face */ /* */ /* <Description> */ - /* This function calls @FT_Open_Face to open a font that has been */ - /* loaded into memory. */ + /* Call @FT_Open_Face to open a font that has been loaded into */ + /* memory. */ /* */ /* <InOut> */ /* library :: A handle to the library resource. */ @@ -2069,20 +2148,21 @@ FT_BEGIN_HEADER /* with value~0). Set it to~0 if there is only one */ /* face in the font file. */ /* */ - /* Bits 16-30 are relevant to GX variation fonts only, */ - /* specifying the named instance index for the current */ - /* face index (starting with value~1; value~0 makes */ - /* FreeType ignore named instances). For non-GX fonts, */ - /* bits 16-30 are ignored. Assuming that you want to */ - /* access the third named instance in face~4, */ - /* `face_index' should be set to 0x00030004. If you */ - /* want to access face~4 without GX variation handling, */ - /* simply set `face_index' to value~4. */ - /* */ - /* FT_Open_Face and its siblings can be used to quickly */ - /* check whether the font format of a given font */ - /* resource is supported by FreeType. In general, if */ - /* the `face_index' argument is negative, the */ + /* Bits 16-30 are relevant to GX and OpenType variation */ + /* fonts only, specifying the named instance index for */ + /* the current face index (starting with value~1; */ + /* value~0 makes FreeType ignore named instances). For */ + /* non-variation fonts, bits 16-30 are ignored. */ + /* Assuming that you want to access the third named */ + /* instance in face~4, `face_index' should be set to */ + /* 0x00030004. If you want to access face~4 without */ + /* variation handling, simply set `face_index' to */ + /* value~4. */ + /* */ + /* `FT_Open_Face' and its siblings can be used to */ + /* quickly check whether the font format of a given */ + /* font resource is supported by FreeType. In general, */ + /* if the `face_index' argument is negative, the */ /* function's return value is~0 if the font format is */ /* recognized, or non-zero otherwise. The function */ /* allocates a more or less empty face handle in */ @@ -2091,10 +2171,10 @@ FT_BEGIN_HEADER /* `face->num_faces' and `face->style_flags'. For any */ /* negative value of `face_index', `face->num_faces' */ /* gives the number of faces within the font file. For */ - /* the negative value `-(N+1)' (with `N' a 16-bit */ - /* value), bits 16-30 in `face->style_flags' give the */ - /* number of named instances in face `N' if we have a */ - /* GX variation font (or zero otherwise). After */ + /* the negative value `-(N+1)' (with `N' a non-negative */ + /* 16-bit value), bits 16-30 in `face->style_flags' */ + /* give the number of named instances in face `N' if we */ + /* have a variation font (or zero otherwise). After */ /* examination, the returned @FT_Face structure should */ /* be deallocated with a call to @FT_Done_Face. */ /* */ @@ -2201,7 +2281,7 @@ FT_BEGIN_HEADER /* FT_Attach_File */ /* */ /* <Description> */ - /* This function calls @FT_Attach_Stream to attach a file. */ + /* Call @FT_Attach_Stream to attach a file. */ /* */ /* <InOut> */ /* face :: The target face object. */ @@ -2245,7 +2325,7 @@ FT_BEGIN_HEADER /* */ /* Client applications are expected to know what they are doing */ /* when invoking this function. Most drivers simply do not implement */ - /* file attachments. */ + /* file or stream attachments. */ /* */ FT_EXPORT( FT_Error ) FT_Attach_Stream( FT_Face face, @@ -2308,7 +2388,10 @@ FT_BEGIN_HEADER /* FT_Select_Size */ /* */ /* <Description> */ - /* Select a bitmap strike. */ + /* Select a bitmap strike. To be more precise, this function sets */ + /* the scaling factors of the active @FT_Size object in a face so */ + /* that bitmaps from this particular strike are taken by */ + /* @FT_Load_Glyph and friends. */ /* */ /* <InOut> */ /* face :: A handle to a target face object. */ @@ -2320,6 +2403,20 @@ FT_BEGIN_HEADER /* <Return> */ /* FreeType error code. 0~means success. */ /* */ + /* <Note> */ + /* For bitmaps embedded in outline fonts it is common that only a */ + /* subset of the available glyphs at a given ppem value is available. */ + /* FreeType silently uses outlines if there is no bitmap for a given */ + /* glyph index. */ + /* */ + /* For GX and OpenType variation fonts, a bitmap strike makes sense */ + /* only if the default instance is active (this is, no glyph */ + /* variation takes place); otherwise, FreeType simply ignores bitmap */ + /* strikes. The same is true for all named instances that are */ + /* different from the default instance. */ + /* */ + /* Don't use this function if you are using the FreeType cache API. */ + /* */ FT_EXPORT( FT_Error ) FT_Select_Size( FT_Face face, FT_Int strike_index ); @@ -2331,16 +2428,25 @@ FT_BEGIN_HEADER /* FT_Size_Request_Type */ /* */ /* <Description> */ - /* An enumeration type that lists the supported size request types. */ + /* An enumeration type that lists the supported size request types, */ + /* i.e., what input size (in font units) maps to the requested output */ + /* size (in pixels, as computed from the arguments of */ + /* @FT_Size_Request). */ /* */ /* <Values> */ /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ /* used to determine both scaling values. */ /* */ + /* This is the standard scaling found in most applications. In */ + /* particular, use this size request type for TrueType fonts if */ + /* they provide optical scaling or something similar. Note, */ + /* however, that `units_per_EM' is a rather abstract value which */ + /* bears no relation to the actual size of the glyphs in a font. */ + /* */ /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ /* The real dimension. The sum of the `ascender' and (minus of) */ - /* the `descender' fields of @FT_FaceRec are used to determine both */ + /* the `descender' fields of @FT_FaceRec is used to determine both */ /* scaling values. */ /* */ /* FT_SIZE_REQUEST_TYPE_BBOX :: */ @@ -2386,27 +2492,36 @@ FT_BEGIN_HEADER /* FT_Size_RequestRec */ /* */ /* <Description> */ - /* A structure used to model a size request. */ + /* A structure to model a size request. */ /* */ /* <Fields> */ /* type :: See @FT_Size_Request_Type. */ /* */ - /* width :: The desired width. */ + /* width :: The desired width, given as a 26.6 fractional */ + /* point value (with 72pt = 1in). */ /* */ - /* height :: The desired height. */ + /* height :: The desired height, given as a 26.6 fractional */ + /* point value (with 72pt = 1in). */ /* */ - /* horiResolution :: The horizontal resolution. If set to zero, */ - /* `width' is treated as a 26.6 fractional pixel */ - /* value. */ + /* horiResolution :: The horizontal resolution (dpi, i.e., pixels per */ + /* inch). If set to zero, `width' is treated as a */ + /* 26.6 fractional *pixel* value, which gets */ + /* internally rounded to an integer. */ /* */ - /* vertResolution :: The vertical resolution. If set to zero, */ - /* `height' is treated as a 26.6 fractional pixel */ - /* value. */ + /* vertResolution :: The vertical resolution (dpi, i.e., pixels per */ + /* inch). If set to zero, `height' is treated as a */ + /* 26.6 fractional *pixel* value, which gets */ + /* internally rounded to an integer. */ /* */ /* <Note> */ - /* If `width' is zero, then the horizontal scaling value is set equal */ + /* If `width' is zero, the horizontal scaling value is set equal */ /* to the vertical scaling value, and vice versa. */ /* */ + /* If `type' is FT_SIZE_REQUEST_TYPE_SCALES, `width' and `height' are */ + /* interpreted directly as 16.16 fractional scaling values, without */ + /* any further modification, and both `horiResolution' and */ + /* `vertResolution' are ignored. */ + /* */ typedef struct FT_Size_RequestRec_ { FT_Size_Request_Type type; @@ -2456,7 +2571,11 @@ FT_BEGIN_HEADER /* size is dependent entirely on how the size is defined in the */ /* source face. The font designer chooses the final size of each */ /* glyph relative to this size. For more information refer to */ - /* `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html' */ + /* `https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'. */ + /* */ + /* Contrary to @FT_Set_Char_Size, this function doesn't have special */ + /* code to normalize zero-valued widths, heights, or resolutions */ + /* (which lead to errors in most cases). */ /* */ /* Don't use this function if you are using the FreeType cache API. */ /* */ @@ -2471,8 +2590,7 @@ FT_BEGIN_HEADER /* FT_Set_Char_Size */ /* */ /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in points). */ + /* Call @FT_Request_Size to request the nominal size (in points). */ /* */ /* <InOut> */ /* face :: A handle to a target face object. */ @@ -2490,6 +2608,10 @@ FT_BEGIN_HEADER /* FreeType error code. 0~means success. */ /* */ /* <Note> */ + /* While this function allows fractional points as input values, the */ + /* resulting ppem value for the given resolution is always rounded to */ + /* the nearest integer. */ + /* */ /* If either the character width or height is zero, it is set equal */ /* to the other value. */ /* */ @@ -2515,8 +2637,7 @@ FT_BEGIN_HEADER /* FT_Set_Pixel_Sizes */ /* */ /* <Description> */ - /* This function calls @FT_Request_Size to request the nominal size */ - /* (in pixels). */ + /* Call @FT_Request_Size to request the nominal size (in pixels). */ /* */ /* <InOut> */ /* face :: A handle to the target face object. */ @@ -2530,8 +2651,8 @@ FT_BEGIN_HEADER /* FreeType error code. 0~means success. */ /* */ /* <Note> */ - /* You should not rely on the resulting glyphs matching, or being */ - /* constrained, to this pixel size. Refer to @FT_Request_Size to */ + /* You should not rely on the resulting glyphs matching or being */ + /* constrained to this pixel size. Refer to @FT_Request_Size to */ /* understand how requested sizes relate to actual sizes. */ /* */ /* Don't use this function if you are using the FreeType cache API. */ @@ -2548,8 +2669,7 @@ FT_BEGIN_HEADER /* FT_Load_Glyph */ /* */ /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object. */ + /* Load a glyph into the glyph slot of a face object. */ /* */ /* <InOut> */ /* face :: A handle to the target face object where the glyph */ @@ -2594,8 +2714,8 @@ FT_BEGIN_HEADER /* FT_Load_Char */ /* */ /* <Description> */ - /* A function used to load a single glyph into the glyph slot of a */ - /* face object, according to its character code. */ + /* Load a glyph into the glyph slot of a face object, accessed by its */ + /* character code. */ /* */ /* <InOut> */ /* face :: A handle to a target face object where the glyph */ @@ -2617,6 +2737,10 @@ FT_BEGIN_HEADER /* <Note> */ /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ /* */ + /* Many fonts contain glyphs that can't be loaded by this function */ + /* since its glyph indices are not listed in any of the font's */ + /* charmaps. */ + /* */ FT_EXPORT( FT_Error ) FT_Load_Char( FT_Face face, FT_ULong char_code, @@ -2629,8 +2753,8 @@ FT_BEGIN_HEADER * FT_LOAD_XXX * * @description: - * A list of bit field constants used with @FT_Load_Glyph to indicate - * what kind of operations to perform during glyph loading. + * A list of bit field constants for @FT_Load_Glyph to indicate what + * kind of operations to perform during glyph loading. * * @values: * FT_LOAD_DEFAULT :: @@ -2642,13 +2766,13 @@ FT_BEGIN_HEADER * The bitmap data can be accessed from the glyph slot (see note * below). * - * 2. If no embedded bitmap is searched or found, FreeType looks for a - * scalable outline. If one is found, it is loaded from the font - * file, scaled to device pixels, then `hinted' to the pixel grid - * in order to optimize it. The outline data can be accessed from - * the glyph slot (see note below). + * 2. If no embedded bitmap is searched for or found, FreeType looks + * for a scalable outline. If one is found, it is loaded from + * the font file, scaled to device pixels, then `hinted' to the + * pixel grid in order to optimize it. The outline data can be + * accessed from the glyph slot (see note below). * - * Note that by default, the glyph loader doesn't render outlines into + * Note that by default the glyph loader doesn't render outlines into * bitmaps. The following flags are used to modify this default * behaviour to more specific and useful cases. * @@ -2695,13 +2819,13 @@ FT_BEGIN_HEADER * various font formats. * * FT_LOAD_FORCE_AUTOHINT :: - * Indicates that the auto-hinter is preferred over the font's native - * hinter. See also the note below. + * Prefer the auto-hinter over the font's native hinter. See also + * the note below. * * FT_LOAD_PEDANTIC :: - * Indicates that the font driver should perform pedantic verifications - * during glyph loading. This is mostly used to detect broken glyphs - * in fonts. By default, FreeType tries to handle broken fonts also. + * Make the font driver perform pedantic verifications during glyph + * loading. This is mostly used to detect broken glyphs in fonts. + * By default, FreeType tries to handle broken fonts also. * * In particular, errors from the TrueType bytecode engine are not * passed to the application if this flag is not set; this might @@ -2709,17 +2833,16 @@ FT_BEGIN_HEADER * bytecode is buggy. * * FT_LOAD_NO_RECURSE :: - * Indicate that the font driver should not load composite glyphs - * recursively. Instead, it should set the `num_subglyph' and - * `subglyphs' values of the glyph slot accordingly, and set - * `glyph->format' to @FT_GLYPH_FORMAT_COMPOSITE. The description of - * subglyphs can then be accessed with @FT_Get_SubGlyph_Info. + * Don't load composite glyphs recursively. Instead, the font + * driver should set the `num_subglyph' and `subglyphs' values of + * the glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. The description of subglyphs can + * then be accessed with @FT_Get_SubGlyph_Info. * * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. * * FT_LOAD_IGNORE_TRANSFORM :: - * Indicates that the transform matrix set by @FT_Set_Transform should - * be ignored. + * Ignore the transform matrix set by @FT_Set_Transform. * * FT_LOAD_MONOCHROME :: * This flag is used with @FT_LOAD_RENDER to indicate that you want to @@ -2731,31 +2854,37 @@ FT_BEGIN_HEADER * monochrome-optimized hinting algorithm is used. * * FT_LOAD_LINEAR_DESIGN :: - * Indicates that the `linearHoriAdvance' and `linearVertAdvance' - * fields of @FT_GlyphSlotRec should be kept in font units. See - * @FT_GlyphSlotRec for details. + * Keep `linearHoriAdvance' and `linearVertAdvance' fields of + * @FT_GlyphSlotRec in font units. See @FT_GlyphSlotRec for + * details. * * FT_LOAD_NO_AUTOHINT :: - * Disable auto-hinter. See also the note below. + * Disable the auto-hinter. See also the note below. * * FT_LOAD_COLOR :: - * This flag is used to request loading of color embedded-bitmap - * images. The resulting color bitmaps, if available, will have the - * @FT_PIXEL_MODE_BGRA format. When the flag is not used and color - * bitmaps are found, they will be converted to 256-level gray - * bitmaps transparently. Those bitmaps will be in the + * Load embedded color bitmap images. The resulting color bitmaps, + * if available, will have the @FT_PIXEL_MODE_BGRA format. If the + * flag is not set and color bitmaps are found, they are converted + * to 256-level gray bitmaps transparently, using the * @FT_PIXEL_MODE_GRAY format. * * FT_LOAD_COMPUTE_METRICS :: - * This flag sets computing glyph metrics without the use of bundled - * metrics tables (for example, the `hdmx' table in TrueType fonts). - * Well-behaving fonts have optimized bundled metrics and these should - * be used. This flag is mainly used by font validating or font + * Compute glyph metrics from the glyph data, without the use of + * bundled metrics tables (for example, the `hdmx' table in TrueType + * fonts). This flag is mainly used by font validating or font * editing applications, which need to ignore, verify, or edit those * tables. * * Currently, this flag is only implemented for TrueType fonts. * + * FT_LOAD_BITMAP_METRICS_ONLY :: + * Request loading of the metrics and bitmap image information of a + * (possibly embedded) bitmap glyph without allocating or copying + * the bitmap image data itself. No effect if the target glyph is + * not a bitmap image. + * + * This flag unsets @FT_LOAD_RENDER. + * * FT_LOAD_CROP_BITMAP :: * Ignored. Deprecated. * @@ -2799,13 +2928,14 @@ FT_BEGIN_HEADER #define FT_LOAD_MONOCHROME ( 1L << 12 ) #define FT_LOAD_LINEAR_DESIGN ( 1L << 13 ) #define FT_LOAD_NO_AUTOHINT ( 1L << 15 ) - /* Bits 16..19 are used by `FT_LOAD_TARGET_' */ + /* Bits 16-19 are used by `FT_LOAD_TARGET_' */ #define FT_LOAD_COLOR ( 1L << 20 ) #define FT_LOAD_COMPUTE_METRICS ( 1L << 21 ) +#define FT_LOAD_BITMAP_METRICS_ONLY ( 1L << 22 ) /* */ - /* used internally only by certain font drivers! */ + /* used internally only by certain font drivers */ #define FT_LOAD_ADVANCE_ONLY ( 1L << 8 ) #define FT_LOAD_SBITS_ONLY ( 1L << 14 ) @@ -2816,37 +2946,48 @@ FT_BEGIN_HEADER * FT_LOAD_TARGET_XXX * * @description: - * A list of values that are used to select a specific hinting algorithm - * to use by the hinter. You should OR one of these values to your - * `load_flags' when calling @FT_Load_Glyph. + * A list of values to select a specific hinting algorithm for the + * hinter. You should OR one of these values to your `load_flags' + * when calling @FT_Load_Glyph. * - * Note that font's native hinters may ignore the hinting algorithm you - * have specified (e.g., the TrueType bytecode interpreter). You can set - * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * Note that a font's native hinters may ignore the hinting algorithm + * you have specified (e.g., the TrueType bytecode interpreter). You + * can set @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is + * used. * * @values: * FT_LOAD_TARGET_NORMAL :: - * This corresponds to the default hinting algorithm, optimized for - * standard gray-level rendering. For monochrome output, use - * @FT_LOAD_TARGET_MONO instead. + * The default hinting algorithm, optimized for standard gray-level + * rendering. For monochrome output, use @FT_LOAD_TARGET_MONO + * instead. * * FT_LOAD_TARGET_LIGHT :: * A lighter hinting algorithm for gray-level modes. Many generated * glyphs are fuzzier but better resemble their original shape. This * is achieved by snapping glyphs to the pixel grid only vertically - * (Y-axis), as is done by Microsoft's ClearType and Adobe's - * proprietary font renderer. This preserves inter-glyph spacing in + * (Y-axis), as is done by FreeType's new CFF engine or Microsoft's + * ClearType font renderer. This preserves inter-glyph spacing in * horizontal text. The snapping is done either by the native font - * driver if the driver itself and the font support it or by the + * driver, if the driver itself and the font support it, or by the * auto-hinter. * + * Advance widths are rounded to integer values; however, using the + * `lsb_delta' and `rsb_delta' fields of @FT_GlyphSlotRec, it is + * possible to get fractional advance widths for sub-pixel positioning + * (which is recommended to use). + * + * If configuration option AF_CONFIG_OPTION_TT_SIZE_METRICS is active, + * TrueType-like metrics are used to make this mode behave similarly + * as in unpatched FreeType versions between 2.4.6 and 2.7.1 + * (inclusive). + * * FT_LOAD_TARGET_MONO :: * Strong hinting algorithm that should only be used for monochrome * output. The result is probably unpleasant if the glyph is rendered * in non-monochrome modes. * * FT_LOAD_TARGET_LCD :: - * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally * decimated LCD displays. * * FT_LOAD_TARGET_LCD_V :: @@ -2874,6 +3015,13 @@ FT_BEGIN_HEADER * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); * } * + * In general, you should stick with one rendering mode. For example, + * switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO + * enforces a lot of recomputation for TrueType fonts, which is slow. + * Another reason is caching: Selecting a different mode usually causes + * changes in both the outlines and the rasterized bitmaps; it is thus + * necessary to empty the cache after a mode switch to avoid false hits. + * */ #define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) @@ -2903,18 +3051,17 @@ FT_BEGIN_HEADER /* FT_Set_Transform */ /* */ /* <Description> */ - /* A function used to set the transformation that is applied to glyph */ - /* images when they are loaded into a glyph slot through */ - /* @FT_Load_Glyph. */ + /* Set the transformation that is applied to glyph images when they */ + /* are loaded into a glyph slot through @FT_Load_Glyph. */ /* */ /* <InOut> */ /* face :: A handle to the source face object. */ /* */ /* <Input> */ - /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ - /* the identity matrix. */ - /* delta :: A pointer to the translation vector. Use~0 for the null */ - /* vector. */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use NULL */ + /* for the identity matrix. */ + /* delta :: A pointer to the translation vector. Use NULL for the */ + /* null vector. */ /* */ /* <Note> */ /* The transformation is only applied to scalable image formats after */ @@ -2937,9 +3084,8 @@ FT_BEGIN_HEADER /* FT_Render_Mode */ /* */ /* <Description> */ - /* An enumeration type that lists the render modes supported by */ - /* FreeType~2. Each mode corresponds to a specific type of scanline */ - /* conversion performed on the outline. */ + /* Render modes supported by FreeType~2. Each mode corresponds to a */ + /* specific type of scanline conversion performed on the outline. */ /* */ /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ /* field in the @FT_GlyphSlotRec structure gives the format of the */ @@ -2952,8 +3098,8 @@ FT_BEGIN_HEADER /* */ /* <Values> */ /* FT_RENDER_MODE_NORMAL :: */ - /* This is the default render mode; it corresponds to 8-bit */ - /* anti-aliased bitmaps. */ + /* Default render mode; it corresponds to 8-bit anti-aliased */ + /* bitmaps. */ /* */ /* FT_RENDER_MODE_LIGHT :: */ /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ @@ -2978,11 +3124,11 @@ FT_BEGIN_HEADER /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ /* */ /* <Note> */ - /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ - /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ - /* (not active in the default builds). It is up to the caller to */ - /* either call @FT_Library_SetLcdFilter (if available) or do the */ - /* filtering itself. */ + /* The LCD-optimized glyph bitmaps produced by `FT_Render_Glyph' can */ + /* be filtered to reduce color-fringes by using */ + /* @FT_Library_SetLcdFilter (not active in the default builds). It */ + /* is up to the caller to either call `FT_Library_SetLcdFilter' (if */ + /* available) or do the filtering itself. */ /* */ /* The selected render mode only affects vector glyphs of a font. */ /* Embedded bitmaps often have a different pixel mode like */ @@ -3023,16 +3169,16 @@ FT_BEGIN_HEADER /* convert. */ /* */ /* <Input> */ - /* render_mode :: This is the render mode used to render the glyph */ - /* image into a bitmap. See @FT_Render_Mode for a */ - /* list of possible values. */ + /* render_mode :: The render mode used to render the glyph image into */ + /* a bitmap. See @FT_Render_Mode for a list of */ + /* possible values. */ /* */ /* <Return> */ /* FreeType error code. 0~means success. */ /* */ /* <Note> */ /* To get meaningful results, font scaling values must be set with */ - /* functions like @FT_Set_Char_Size before calling FT_Render_Glyph. */ + /* functions like @FT_Set_Char_Size before calling `FT_Render_Glyph'. */ /* */ /* When FreeType outputs a bitmap of a glyph, it really outputs an */ /* alpha coverage map. If a pixel is completely covered by a */ @@ -3058,7 +3204,7 @@ FT_BEGIN_HEADER /* this does not translate to 50% brightness for that pixel on our */ /* sRGB and gamma~2.2 screens. Due to their non-linearity, they */ /* dwell longer in the darks and only a pixel value of about 186 */ - /* results in 50% brightness – 128 ends up too dark on both bright */ + /* results in 50% brightness -- 128 ends up too dark on both bright */ /* and dark backgrounds. The net result is that dark text looks */ /* burnt-out, pixely and blotchy on bright background, bright text */ /* too frail on dark backgrounds, and colored text on colored */ @@ -3122,17 +3268,15 @@ FT_BEGIN_HEADER /* FT_Kerning_Mode */ /* */ /* <Description> */ - /* An enumeration used to specify which kerning values to return in */ + /* An enumeration to specify the format of kerning values returned by */ /* @FT_Get_Kerning. */ /* */ /* <Values> */ /* FT_KERNING_DEFAULT :: Return grid-fitted kerning distances in */ - /* pixels (value is~0). Whether they are */ - /* scaled depends on @FT_LOAD_NO_SCALE. */ + /* 26.6 fractional pixels. */ /* */ /* FT_KERNING_UNFITTED :: Return un-grid-fitted kerning distances in */ - /* 26.6 fractional pixels. Whether they are */ - /* scaled depends on @FT_LOAD_NO_SCALE. */ + /* 26.6 fractional pixels. */ /* */ /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ /* units. */ @@ -3142,9 +3286,13 @@ FT_BEGIN_HEADER /* FreeType heuristically scale down kerning distances at small ppem */ /* values so that they don't become too big. */ /* */ + /* Both FT_KERNING_DEFAULT and FT_KERNING_UNFITTED use the current */ + /* horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to */ + /* convert font units to pixels. */ + /* */ typedef enum FT_Kerning_Mode_ { - FT_KERNING_DEFAULT = 0, + FT_KERNING_DEFAULT = 0, FT_KERNING_UNFITTED, FT_KERNING_UNSCALED @@ -3164,7 +3312,7 @@ FT_BEGIN_HEADER /* FT_Get_Kerning */ /* */ /* <Description> */ - /* Return the kerning vector between two glyphs of a same face. */ + /* Return the kerning vector between two glyphs of the same face. */ /* */ /* <Input> */ /* face :: A handle to a source face object. */ @@ -3192,6 +3340,10 @@ FT_BEGIN_HEADER /* kernings, are out of the scope of this API function -- they can be */ /* implemented through format-specific interfaces. */ /* */ + /* Kerning for OpenType fonts implemented in a `GPOS' table is not */ + /* supported; use @FT_HAS_KERNING to find out whether a font has data */ + /* that can be extracted with `FT_Get_Kerning'. */ + /* */ FT_EXPORT( FT_Error ) FT_Get_Kerning( FT_Face face, FT_UInt left_glyph, @@ -3231,7 +3383,7 @@ FT_BEGIN_HEADER /* @FT_Attach_Stream). */ /* */ /* Only very few AFM files come with track kerning data; please refer */ - /* to the Adobe's AFM specification for more details. */ + /* to Adobe's AFM specification for more details. */ /* */ FT_EXPORT( FT_Error ) FT_Get_Track_Kerning( FT_Face face, @@ -3293,7 +3445,7 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* Retrieve the ASCII PostScript name of a given face, if available. */ - /* This only works with PostScript and TrueType fonts. */ + /* This only works with PostScript, TrueType, and OpenType fonts. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ @@ -3305,6 +3457,13 @@ FT_BEGIN_HEADER /* The returned pointer is owned by the face and is destroyed with */ /* it. */ /* */ + /* For variation fonts, this string changes if you select a different */ + /* instance, and you have to call `FT_Get_PostScript_Name' again to */ + /* retrieve it. FreeType follows Adobe TechNote #5902, `Generating */ + /* PostScript Names for Fonts Using OpenType Font Variations'. */ + /* */ + /* http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5902.AdobePSNameGeneration.html */ + /* */ FT_EXPORT( const char* ) FT_Get_Postscript_Name( FT_Face face ); @@ -3364,7 +3523,8 @@ FT_BEGIN_HEADER /* the face (i.e., if it is not listed in the `face->charmaps' */ /* table). */ /* */ - /* It also fails if a type~14 charmap is selected. */ + /* It also fails if an OpenType type~14 charmap is selected (which */ + /* doesn't map character codes to glyph indices at all). */ /* */ FT_EXPORT( FT_Error ) FT_Set_Charmap( FT_Face face, @@ -3399,7 +3559,7 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* Return the glyph index of a given character code. This function */ - /* uses a charmap object to do the mapping. */ + /* uses the currently selected charmap to do the mapping. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ @@ -3433,9 +3593,8 @@ FT_BEGIN_HEADER /* FT_Get_First_Char */ /* */ /* <Description> */ - /* This function is used to return the first character code in the */ - /* current charmap of a given face. It also returns the */ - /* corresponding glyph index. */ + /* Return the first character code in the current charmap of a given */ + /* face, together with its corresponding glyph index. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ @@ -3448,7 +3607,7 @@ FT_BEGIN_HEADER /* The charmap's first character code. */ /* */ /* <Note> */ - /* You should use this function with @FT_Get_Next_Char to be able to */ + /* You should use this function together with @FT_Get_Next_Char to */ /* parse all character codes available in a given charmap. The code */ /* should look like this: */ /* */ @@ -3488,12 +3647,13 @@ FT_BEGIN_HEADER /* FT_Get_Next_Char */ /* */ /* <Description> */ - /* This function is used to return the next character code in the */ - /* current charmap of a given face following the value `char_code', */ - /* as well as the corresponding glyph index. */ + /* Return the next character code in the current charmap of a given */ + /* face following the value `char_code', as well as the corresponding */ + /* glyph index. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ + /* */ /* char_code :: The starting character code. */ /* */ /* <Output> */ @@ -3506,7 +3666,7 @@ FT_BEGIN_HEADER /* <Note> */ /* You should use this function with @FT_Get_First_Char to walk */ /* over all character codes available in a given charmap. See the */ - /* note for this function for a simple code example. */ + /* note for that function for a simple code example. */ /* */ /* Note that `*agindex' is set to~0 when there are no more codes in */ /* the charmap. */ @@ -3517,14 +3677,109 @@ FT_BEGIN_HEADER FT_UInt *agindex ); + /************************************************************************* + * + * @function: + * FT_Face_Properties + * + * @description: + * Set or override certain (library or module-wide) properties on a + * face-by-face basis. Useful for finer-grained control and avoiding + * locks on shared structures (threads can modify their own faces as + * they see fit). + * + * Contrary to @FT_Property_Set, this function uses @FT_Parameter so + * that you can pass multiple properties to the target face in one call. + * Note that only a subset of the available properties can be + * controlled. + * + * * Stem darkening (@FT_PARAM_TAG_STEM_DARKENING, corresponding to the + * property `no-stem-darkening' provided by the `autofit' and `cff' + * modules; see @no-stem-darkening[autofit] and + * @no-stem-darkening[cff]). + * + * * LCD filter weights (@FT_PARAM_TAG_LCD_FILTER_WEIGHTS, corresponding + * to function @FT_Library_SetLcdFilterWeights). + * + * * Seed value for the CFF `random' operator + * (@FT_PARAM_TAG_RANDOM_SEED, corresponding to the `random-seed' + * property provided by the `cff' module; see @random-seed). + * + * Pass NULL as `data' in @FT_Parameter for a given tag to reset the + * option and use the library or module default again. + * + * @input: + * face :: + * A handle to the source face object. + * + * num_properties :: + * The number of properties that follow. + * + * properties :: + * A handle to an @FT_Parameter array with `num_properties' elements. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Here an example that sets three properties. You must define + * FT_CONFIG_OPTION_SUBPIXEL_RENDERING to make the LCD filter examples + * work. + * + * { + * FT_Parameter property1; + * FT_Bool darken_stems = 1; + * + * FT_Parameter property2; + * FT_LcdFiveTapFilter custom_weight = + * { 0x11, 0x44, 0x56, 0x44, 0x11 }; + * + * FT_Parameter property3; + * FT_Int32 random_seed = 314159265; + * + * FT_Parameter properties[3] = { property1, + * property2, + * property3 }; + * + * + * property1.tag = FT_PARAM_TAG_STEM_DARKENING; + * property1.data = &darken_stems; + * + * property2.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property2.data = custom_weight; + * + * property3.tag = FT_PARAM_TAG_RANDOM_SEED; + * property3.data = &random_seed; + * + * FT_Face_Properties( face, 3, properties ); + * } + * + * The next example resets a single property to its default value. + * + * { + * FT_Parameter property; + * + * + * property.tag = FT_PARAM_TAG_LCD_FILTER_WEIGHTS; + * property.data = NULL; + * + * FT_Face_Properties( face, 1, &property ); + * } + * + */ + FT_EXPORT( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ); + + /*************************************************************************/ /* */ /* <Function> */ /* FT_Get_Name_Index */ /* */ /* <Description> */ - /* Return the glyph index of a given glyph name. This function uses */ - /* driver specific objects to do the translation. */ + /* Return the glyph index of a given glyph name. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ @@ -3545,8 +3800,10 @@ FT_BEGIN_HEADER * FT_SUBGLYPH_FLAG_XXX * * @description: - * A list of constants used to describe subglyphs. Please refer to the - * TrueType specification for the meaning of the various flags. + * A list of constants describing subglyphs. Please refer to the + * `glyf' table description in the OpenType specification for the + * meaning of the various flags (which get synthesized for + * non-OpenType subglyphs). * * @values: * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: @@ -3607,7 +3864,7 @@ FT_BEGIN_HEADER * @note: * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be * interpreted depending on the flags returned in `*p_flags'. See the - * TrueType specification for details. + * OpenType specification for details. * */ FT_EXPORT( FT_Error ) @@ -3647,33 +3904,31 @@ FT_BEGIN_HEADER /* the font software copyright owner. */ /* */ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ - /* If this bit is set, the font may be embedded and temporarily */ - /* loaded on the remote system. Documents containing Preview & */ - /* Print fonts must be opened `read-only'; no edits can be applied */ - /* to the document. */ + /* The font may be embedded and temporarily loaded on the remote */ + /* system. Documents containing Preview & Print fonts must be */ + /* opened `read-only'; no edits can be applied to the document. */ /* */ /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ - /* If this bit is set, the font may be embedded but must only be */ - /* installed temporarily on other systems. In contrast to Preview */ - /* & Print fonts, documents containing editable fonts may be opened */ - /* for reading, editing is permitted, and changes may be saved. */ + /* The font may be embedded but must only be installed temporarily */ + /* on other systems. In contrast to Preview & Print fonts, */ + /* documents containing editable fonts may be opened for reading, */ + /* editing is permitted, and changes may be saved. */ /* */ /* FT_FSTYPE_NO_SUBSETTING :: */ - /* If this bit is set, the font may not be subsetted prior to */ - /* embedding. */ + /* The font may not be subsetted prior to embedding. */ /* */ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ - /* If this bit is set, only bitmaps contained in the font may be */ - /* embedded; no outline data may be embedded. If there are no */ - /* bitmaps available in the font, then the font is unembeddable. */ + /* Only bitmaps contained in the font may be embedded; no outline */ + /* data may be embedded. If there are no bitmaps available in the */ + /* font, then the font is unembeddable. */ /* */ /* <Note> */ /* The flags are ORed together, thus more than a single value can be */ /* returned. */ /* */ - /* While the fsType flags can indicate that a font may be embedded, a */ - /* license with the font vendor may be separately required to use the */ - /* font in this way. */ + /* While the `fsType' flags can indicate that a font may be embedded, */ + /* a license with the font vendor may be separately required to use */ + /* the font in this way. */ /* */ #define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 #define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 @@ -3689,13 +3944,13 @@ FT_BEGIN_HEADER /* FT_Get_FSType_Flags */ /* */ /* <Description> */ - /* Return the fsType flags for a font. */ + /* Return the `fsType' flags for a font. */ /* */ /* <Input> */ /* face :: A handle to the source face object. */ /* */ /* <Return> */ - /* The fsType flags, @FT_FSTYPE_XXX. */ + /* The `fsType' flags, see @FT_FSTYPE_XXX. */ /* */ /* <Note> */ /* Use this function rather than directly reading the `fs_type' field */ @@ -3715,39 +3970,51 @@ FT_BEGIN_HEADER /* glyph_variants */ /* */ /* <Title> */ - /* Glyph Variants */ + /* Unicode Variation Sequences */ /* */ /* <Abstract> */ - /* The FreeType~2 interface to Unicode Ideographic Variation */ - /* Sequences (IVS), using the SFNT cmap format~14. */ + /* The FreeType~2 interface to Unicode Variation Sequences (UVS), */ + /* using the SFNT cmap format~14. */ /* */ /* <Description> */ - /* Many CJK characters have variant forms. They are a sort of grey */ - /* area somewhere between being totally irrelevant and semantically */ - /* distinct; for this reason, the Unicode consortium decided to */ - /* introduce Ideographic Variation Sequences (IVS), consisting of a */ - /* Unicode base character and one of 240 variant selectors */ - /* (U+E0100-U+E01EF), instead of further extending the already huge */ - /* code range for CJK characters. */ - /* */ - /* An IVS is registered and unique; for further details please refer */ - /* to Unicode Technical Standard #37, the Ideographic Variation */ - /* Database: */ - /* */ - /* http://www.unicode.org/reports/tr37/ */ - /* */ - /* To date (November 2014), the character with the most variants is */ - /* U+9089, having 32 such IVS. */ - /* */ - /* Adobe and MS decided to support IVS with a new cmap subtable */ - /* (format~14). It is an odd subtable because it is not a mapping of */ - /* input code points to glyphs, but contains lists of all variants */ - /* supported by the font. */ - /* */ - /* A variant may be either `default' or `non-default'. A default */ - /* variant is the one you will get for that code point if you look it */ - /* up in the standard Unicode cmap. A non-default variant is a */ - /* different glyph. */ + /* Many characters, especially for CJK scripts, have variant forms. */ + /* They are a sort of grey area somewhere between being totally */ + /* irrelevant and semantically distinct; for this reason, the Unicode */ + /* consortium decided to introduce Variation Sequences (VS), */ + /* consisting of a Unicode base character and a variation selector */ + /* instead of further extending the already huge number of */ + /* characters. */ + /* */ + /* Unicode maintains two different sets, namely `Standardized */ + /* Variation Sequences' and registered `Ideographic Variation */ + /* Sequences' (IVS), collected in the `Ideographic Variation */ + /* Database' (IVD). */ + /* */ + /* http://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt */ + /* http://unicode.org/reports/tr37/ */ + /* http://unicode.org/ivd/ */ + /* */ + /* To date (January 2017), the character with the most ideographic */ + /* variations is U+9089, having 32 such IVS. */ + /* */ + /* Three Mongolian Variation Selectors have the values U+180B-U+180D; */ + /* 256 generic Variation Selectors are encoded in the ranges */ + /* U+FE00-U+FE0F and U+E0100-U+E01EF. IVS currently use Variation */ + /* Selectors from the range U+E0100-U+E01EF only. */ + /* */ + /* A VS consists of the base character value followed by a single */ + /* Variation Selector. For example, to get the first variation of */ + /* U+9089, you have to write the character sequence `U+9089 U+E0100'. */ + /* */ + /* Adobe and MS decided to support both standardized and ideographic */ + /* VS with a new cmap subtable (format~14). It is an odd subtable */ + /* because it is not a mapping of input code points to glyphs, but */ + /* contains lists of all variations supported by the font. */ + /* */ + /* A variation may be either `default' or `non-default' for a given */ + /* font. A default variation is the one you will get for that code */ + /* point if you look it up in the standard Unicode cmap. A */ + /* non-default variation is a different glyph. */ /* */ /*************************************************************************/ @@ -3803,8 +4070,8 @@ FT_BEGIN_HEADER /* FT_Face_GetCharVariantIsDefault */ /* */ /* <Description> */ - /* Check whether this variant of this Unicode character is the one to */ - /* be found in the `cmap'. */ + /* Check whether this variation of this Unicode character is the one */ + /* to be found in the `cmap'. */ /* */ /* <Input> */ /* face :: */ @@ -3818,7 +4085,7 @@ FT_BEGIN_HEADER /* */ /* <Return> */ /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ - /* variation selector cmap, or -1 if it is not a variant. */ + /* variation selector cmap, or -1 if it is not a variation. */ /* */ /* <Note> */ /* This function is only meaningful if the font has a variation */ @@ -3839,7 +4106,7 @@ FT_BEGIN_HEADER /* FT_Face_GetVariantSelectors */ /* */ /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ + /* Return a zero-terminated list of Unicode variation selectors found */ /* in the font. */ /* */ /* <Input> */ @@ -3848,7 +4115,7 @@ FT_BEGIN_HEADER /* */ /* <Return> */ /* A pointer to an array of selector code points, or NULL if there is */ - /* no valid variant selector cmap subtable. */ + /* no valid variation selector cmap subtable. */ /* */ /* <Note> */ /* The last item in the array is~0; the array is owned by the */ @@ -3868,7 +4135,7 @@ FT_BEGIN_HEADER /* FT_Face_GetVariantsOfChar */ /* */ /* <Description> */ - /* Return a zero-terminated list of Unicode variant selectors found */ + /* Return a zero-terminated list of Unicode variation selectors found */ /* for the specified character code. */ /* */ /* <Input> */ @@ -3879,7 +4146,7 @@ FT_BEGIN_HEADER /* The character codepoint in Unicode. */ /* */ /* <Return> */ - /* A pointer to an array of variant selector code points that are */ + /* A pointer to an array of variation selector code points that are */ /* active for the given character, or NULL if the corresponding list */ /* is empty. */ /* */ @@ -3903,19 +4170,19 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* Return a zero-terminated list of Unicode character codes found for */ - /* the specified variant selector. */ + /* the specified variation selector. */ /* */ /* <Input> */ /* face :: */ /* A handle to the source face object. */ /* */ /* variantSelector :: */ - /* The variant selector code point in Unicode. */ + /* The variation selector code point in Unicode. */ /* */ /* <Return> */ /* A list of all the code points that are specified by this selector */ /* (both default and non-default codes are returned) or NULL if there */ - /* is no valid cmap or the variant selector is invalid. */ + /* is no valid cmap or the variation selector is invalid. */ /* */ /* <Note> */ /* The last item in the array is~0; the array is owned by the */ @@ -3965,16 +4232,17 @@ FT_BEGIN_HEADER /* FT_MulDiv */ /* */ /* <Description> */ - /* A very simple function used to perform the computation `(a*b)/c' */ - /* with maximum accuracy (it uses a 64-bit intermediate integer */ - /* whenever necessary). */ + /* Compute `(a*b)/c' with maximum accuracy, using a 64-bit */ + /* intermediate integer whenever necessary. */ /* */ /* This function isn't necessarily as fast as some processor specific */ /* operations, but is at least completely portable. */ /* */ /* <Input> */ /* a :: The first multiplier. */ + /* */ /* b :: The second multiplier. */ + /* */ /* c :: The divisor. */ /* */ /* <Return> */ @@ -3994,12 +4262,12 @@ FT_BEGIN_HEADER /* FT_MulFix */ /* */ /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */ - /* used to multiply a given value by a 16.16 fixed-point factor. */ + /* Compute `(a*b)/0x10000' with maximum accuracy. Its main use is to */ + /* multiply a given value by a 16.16 fixed-point factor. */ /* */ /* <Input> */ /* a :: The first multiplier. */ + /* */ /* b :: The second multiplier. Use a 16.16 factor here whenever */ /* possible (see note below). */ /* */ @@ -4028,12 +4296,12 @@ FT_BEGIN_HEADER /* FT_DivFix */ /* */ /* <Description> */ - /* A very simple function used to perform the computation */ - /* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */ - /* used to divide a given value by a 16.16 fixed-point factor. */ + /* Compute `(a*0x10000)/b' with maximum accuracy. Its main use is to */ + /* divide a given value by a 16.16 fixed-point factor. */ /* */ /* <Input> */ /* a :: The numerator. */ + /* */ /* b :: The denominator. Use a 16.16 factor here. */ /* */ /* <Return> */ @@ -4050,13 +4318,13 @@ FT_BEGIN_HEADER /* FT_RoundFix */ /* */ /* <Description> */ - /* A very simple function used to round a 16.16 fixed number. */ + /* Round a 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number to be rounded. */ /* */ /* <Return> */ - /* `a' rounded to nearest 16.16 fixed integer, halfway cases away */ + /* `a' rounded to the nearest 16.16 fixed integer, halfway cases away */ /* from zero. */ /* */ FT_EXPORT( FT_Fixed ) @@ -4069,8 +4337,7 @@ FT_BEGIN_HEADER /* FT_CeilFix */ /* */ /* <Description> */ - /* A very simple function used to compute the ceiling function of a */ - /* 16.16 fixed number. */ + /* Compute the smallest following integer of a 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number for which the ceiling function is to be computed. */ @@ -4088,8 +4355,7 @@ FT_BEGIN_HEADER /* FT_FloorFix */ /* */ /* <Description> */ - /* A very simple function used to compute the floor function of a */ - /* 16.16 fixed number. */ + /* Compute the largest previous integer of a 16.16 fixed number. */ /* */ /* <Input> */ /* a :: The number for which the floor function is to be computed. */ @@ -4175,8 +4441,8 @@ FT_BEGIN_HEADER * */ #define FREETYPE_MAJOR 2 -#define FREETYPE_MINOR 6 -#define FREETYPE_PATCH 5 +#define FREETYPE_MINOR 8 +#define FREETYPE_PATCH 0 /*************************************************************************/ diff --git a/thirdparty/freetype/include/freetype/ftadvanc.h b/thirdparty/freetype/include/freetype/ftadvanc.h index 023dd84b7a..dea96e0db4 100644 --- a/thirdparty/freetype/include/freetype/ftadvanc.h +++ b/thirdparty/freetype/include/freetype/ftadvanc.h @@ -4,7 +4,7 @@ /* */ /* Quick computation of advance widths (specification only). */ /* */ -/* Copyright 2008-2016 by */ +/* Copyright 2008-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftautoh.h b/thirdparty/freetype/include/freetype/ftautoh.h index 40c8003c4a..abd540f0b5 100644 --- a/thirdparty/freetype/include/freetype/ftautoh.h +++ b/thirdparty/freetype/include/freetype/ftautoh.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for controlling the auto-hinter (specification only). */ /* */ -/* Copyright 2012-2016 by */ +/* Copyright 2012-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -428,6 +428,9 @@ FT_BEGIN_HEADER * @note: * This property can be used with @FT_Property_Get also. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable (using values 1 and 0 for `on' and `off', respectively). + * * The warping code can also change advance widths. Have a look at the * `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure * for details on improving inter-glyph distances while rendering. @@ -445,7 +448,7 @@ FT_BEGIN_HEADER * no-stem-darkening[autofit] * * @description: - * *Experimental* *only,* *requires* *linear* *alpha* *blending* *and* + * *Experimental* *only*, *requires* *linear* *alpha* *blending* *and* * *gamma* *correction* * * Stem darkening emboldens glyphs at smaller sizes to make them more @@ -473,7 +476,32 @@ FT_BEGIN_HEADER * The smaller the size (especially 9ppem and down), the higher the loss * of emboldening versus the CFF driver. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable similar to the CFF driver. It can also be set per face + * using @FT_Face_Properties with @FT_PARAM_TAG_STEM_DARKENING. + * + */ + + + /************************************************************************** + * + * @constant: + * FT_PARAM_TAG_STEM_DARKENING + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding Boolean argument specifies whether to apply stem + * darkening, overriding the global default values or the values set up + * with @FT_Property_Set (see @no-stem-darkening[autofit] and + * @no-stem-darkening[cff]). + * + * This is a passive setting that only takes effect if the font driver + * or autohinter honors it, which the CFF driver always does, but the + * autohinter only in `light' hinting mode (as of version 2.7.0). + * */ +#define FT_PARAM_TAG_STEM_DARKENING \ + FT_MAKE_TAG( 'd', 'a', 'r', 'k' ) /************************************************************************** @@ -489,6 +517,8 @@ FT_BEGIN_HEADER * CFF_CONFIG_OPTION_DARKENING_PARAMETER_* #defines for consistency. * Note the differences described in @no-stem-darkening[autofit]. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable similar to the CFF driver. */ diff --git a/thirdparty/freetype/include/freetype/ftbbox.h b/thirdparty/freetype/include/freetype/ftbbox.h index 2a4d214416..f03bdc1e1e 100644 --- a/thirdparty/freetype/include/freetype/ftbbox.h +++ b/thirdparty/freetype/include/freetype/ftbbox.h @@ -4,7 +4,7 @@ /* */ /* FreeType exact bbox computation (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftbdf.h b/thirdparty/freetype/include/freetype/ftbdf.h index 016dba086d..3d3106bad0 100644 --- a/thirdparty/freetype/include/freetype/ftbdf.h +++ b/thirdparty/freetype/include/freetype/ftbdf.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing BDF-specific strings (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftbitmap.h b/thirdparty/freetype/include/freetype/ftbitmap.h index 0eac7b9d7d..04b2402ad0 100644 --- a/thirdparty/freetype/include/freetype/ftbitmap.h +++ b/thirdparty/freetype/include/freetype/ftbitmap.h @@ -4,7 +4,7 @@ /* */ /* FreeType utility functions for bitmaps (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftbzip2.h b/thirdparty/freetype/include/freetype/ftbzip2.h index b7f2eee87d..9147a790a4 100644 --- a/thirdparty/freetype/include/freetype/ftbzip2.h +++ b/thirdparty/freetype/include/freetype/ftbzip2.h @@ -4,7 +4,7 @@ /* */ /* Bzip2-compressed stream support. */ /* */ -/* Copyright 2010-2016 by */ +/* Copyright 2010-2017 by */ /* Joel Klinghed. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftcache.h b/thirdparty/freetype/include/freetype/ftcache.h index 883c88d5d2..5ff3ccf404 100644 --- a/thirdparty/freetype/include/freetype/ftcache.h +++ b/thirdparty/freetype/include/freetype/ftcache.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache subsystem (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftcffdrv.h b/thirdparty/freetype/include/freetype/ftcffdrv.h index ad34541fdb..477b6ddb18 100644 --- a/thirdparty/freetype/include/freetype/ftcffdrv.h +++ b/thirdparty/freetype/include/freetype/ftcffdrv.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for controlling the CFF driver (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -113,6 +113,7 @@ FT_BEGIN_HEADER * hinting-engine[cff] * no-stem-darkening[cff] * darkening-parameters[cff] + * random-seed * */ @@ -148,6 +149,8 @@ FT_BEGIN_HEADER * @note: * This property can be used with @FT_Property_Get also. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable (using values `adobe' or `freetype'). */ @@ -199,6 +202,11 @@ FT_BEGIN_HEADER * @note: * This property can be used with @FT_Property_Get also. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable (using values 1 and 0 for `on' and `off', respectively). + * It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_STEM_DARKENING. + * */ @@ -248,7 +256,58 @@ FT_BEGIN_HEADER * @note: * This property can be used with @FT_Property_Get also. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable, using eight comma-separated integers without spaces. Here + * the above example, using `\' to break the line for readability. + * + * { + * FREETYPE_PROPERTIES=\ + * cff:darkening-parameters=500,300,1000,200,1500,100,2000,0 + * } + */ + + + /************************************************************************** + * + * @property: + * random-seed + * + * @description: + * By default, the seed value for the CFF `random' operator is set to a + * random value. However, mainly for debugging purposes, it is often + * necessary to use a known value as a seed so that the pseudo-random + * number sequences generated by `random' are repeatable. + * + * The `random-seed' property does that. Its argument is a signed 32bit + * integer; if the value is zero or negative, the seed given by the + * `intitialRandomSeed' private DICT operator in a CFF file gets used + * (or a default value if there is no such operator). If the value is + * positive, use it instead of `initialRandomSeed', which is + * consequently ignored. + * + * @note: + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable. It can also be set per face using @FT_Face_Properties with + * @FT_PARAM_TAG_RANDOM_SEED. + * + */ + + + /************************************************************************** + * + * @constant: + * FT_PARAM_TAG_RANDOM_SEED + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding 32bit signed integer argument overrides the CFF + * module's random seed value with a face-specific one; see + * @random-seed. + * */ +#define FT_PARAM_TAG_RANDOM_SEED \ + FT_MAKE_TAG( 's', 'e', 'e', 'd' ) + /* */ diff --git a/thirdparty/freetype/include/freetype/ftchapters.h b/thirdparty/freetype/include/freetype/ftchapters.h index ab4389530e..a0a121b0a1 100644 --- a/thirdparty/freetype/include/freetype/ftchapters.h +++ b/thirdparty/freetype/include/freetype/ftchapters.h @@ -77,6 +77,7 @@ /* auto_hinter */ /* cff_driver */ /* tt_driver */ +/* pcf_driver */ /* */ /***************************************************************************/ diff --git a/thirdparty/freetype/include/freetype/ftcid.h b/thirdparty/freetype/include/freetype/ftcid.h index e1bc9fe015..4adcbeeda9 100644 --- a/thirdparty/freetype/include/freetype/ftcid.h +++ b/thirdparty/freetype/include/freetype/ftcid.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing CID font information (specification). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* Dereg Clegg and Michael Toftdal. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/fterrdef.h b/thirdparty/freetype/include/freetype/fterrdef.h index 3f53dd5820..cabbac8273 100644 --- a/thirdparty/freetype/include/freetype/fterrdef.h +++ b/thirdparty/freetype/include/freetype/fterrdef.h @@ -4,7 +4,7 @@ /* */ /* FreeType error codes (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -231,6 +231,8 @@ "invalid PostScript (post) table format" ) FT_ERRORDEF_( Invalid_Post_Table, 0x9B, "invalid PostScript (post) table" ) + FT_ERRORDEF_( DEF_In_Glyf_Bytecode, 0x9C, + "found FDEF or IDEF opcode in glyf bytecode" ) /* CFF, CID, and Type 1 errors */ diff --git a/thirdparty/freetype/include/freetype/fterrors.h b/thirdparty/freetype/include/freetype/fterrors.h index e15bfb001e..42769fa7bf 100644 --- a/thirdparty/freetype/include/freetype/fterrors.h +++ b/thirdparty/freetype/include/freetype/fterrors.h @@ -4,7 +4,7 @@ /* */ /* FreeType error code handling (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -106,7 +106,7 @@ /* */ /* #undefine __FTERRORS_H__ */ /* */ - /* work for backwards compatibility. */ + /* work for backward compatibility. */ /* */ #if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) #define FTERRORS_H_ diff --git a/thirdparty/freetype/include/freetype/ftfntfmt.h b/thirdparty/freetype/include/freetype/ftfntfmt.h index bd423247bb..337758328a 100644 --- a/thirdparty/freetype/include/freetype/ftfntfmt.h +++ b/thirdparty/freetype/include/freetype/ftfntfmt.h @@ -4,7 +4,7 @@ /* */ /* Support functions for font formats. */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftgasp.h b/thirdparty/freetype/include/freetype/ftgasp.h index 3f5b3bc695..ce18d64784 100644 --- a/thirdparty/freetype/include/freetype/ftgasp.h +++ b/thirdparty/freetype/include/freetype/ftgasp.h @@ -4,7 +4,7 @@ /* */ /* Access of TrueType's `gasp' table (specification). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -92,8 +92,8 @@ #define FT_GASP_NO_TABLE -1 #define FT_GASP_DO_GRIDFIT 0x01 #define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x04 #define FT_GASP_SYMMETRIC_SMOOTHING 0x08 -#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 /************************************************************************* @@ -102,17 +102,25 @@ * FT_Get_Gasp * * @description: - * Read the `gasp' table from a TrueType or OpenType font file and - * return the entry corresponding to a given character pixel size. + * For a TrueType or OpenType font file, return the rasterizer behaviour + * flags from the font's `gasp' table corresponding to a given + * character pixel size. * * @input: * face :: The source face handle. + * * ppem :: The vertical character pixel size. * * @return: * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no * `gasp' table in the face. * + * @note: + * If you want to use the MM functionality of OpenType variation fonts + * (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this + * function *after* setting an instance since the return values can + * change. + * * @since: * 2.3.0 */ diff --git a/thirdparty/freetype/include/freetype/ftglyph.h b/thirdparty/freetype/include/freetype/ftglyph.h index d9840a81fc..79879a7ac7 100644 --- a/thirdparty/freetype/include/freetype/ftglyph.h +++ b/thirdparty/freetype/include/freetype/ftglyph.h @@ -4,7 +4,7 @@ /* */ /* FreeType convenience functions to handle glyphs (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -453,7 +453,7 @@ FT_BEGIN_HEADER /* */ /* */ /* // load glyph */ - /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); */ /* */ /* // extract glyph image */ /* error = FT_Get_Glyph( face->glyph, &glyph ); */ diff --git a/thirdparty/freetype/include/freetype/ftgxval.h b/thirdparty/freetype/include/freetype/ftgxval.h index a58e86a040..f239c71eb1 100644 --- a/thirdparty/freetype/include/freetype/ftgxval.h +++ b/thirdparty/freetype/include/freetype/ftgxval.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating TrueTypeGX/AAT tables (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO, Redhat K.K, */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/include/freetype/ftgzip.h b/thirdparty/freetype/include/freetype/ftgzip.h index 3932ce6887..bd5ceaab9f 100644 --- a/thirdparty/freetype/include/freetype/ftgzip.h +++ b/thirdparty/freetype/include/freetype/ftgzip.h @@ -4,7 +4,7 @@ /* */ /* Gzip-compressed stream support. */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftimage.h b/thirdparty/freetype/include/freetype/ftimage.h index 28b2704e80..1a049ef16d 100644 --- a/thirdparty/freetype/include/freetype/ftimage.h +++ b/thirdparty/freetype/include/freetype/ftimage.h @@ -5,7 +5,7 @@ /* FreeType glyph image formats and default raster interface */ /* (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -619,7 +619,7 @@ FT_BEGIN_HEADER /* */ /* { */ /* x' = (x << shift) - delta */ - /* y' = (x << shift) - delta */ + /* y' = (y << shift) - delta */ /* } */ /* */ /* Set the values of `shift' and `delta' to~0 to get the original */ @@ -860,16 +860,6 @@ FT_BEGIN_HEADER /* This can be used to write anti-aliased outlines directly to a */ /* given background bitmap, and even perform translucency. */ /* */ - /* Note that the `count' field cannot be greater than a fixed value */ - /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ - /* `ftoption.h'. By default, this value is set to~32, which means */ - /* that if there are more than 32~spans on a given scanline, the */ - /* callback is called several times with the same `y' parameter in */ - /* order to draw all callbacks. */ - /* */ - /* Otherwise, the callback is only called once per scan-line, and */ - /* only for those scanlines that do have `gray' pixels on them. */ - /* */ typedef void (*FT_SpanFunc)( int y, int count, @@ -1190,6 +1180,7 @@ FT_BEGIN_HEADER typedef struct FT_Raster_Funcs_ { FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; FT_Raster_ResetFunc raster_reset; FT_Raster_SetModeFunc raster_set_mode; diff --git a/thirdparty/freetype/include/freetype/ftincrem.h b/thirdparty/freetype/include/freetype/ftincrem.h index 46b58b7917..f6ae2baed6 100644 --- a/thirdparty/freetype/include/freetype/ftincrem.h +++ b/thirdparty/freetype/include/freetype/ftincrem.h @@ -4,7 +4,7 @@ /* */ /* FreeType incremental loading (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftlcdfil.h b/thirdparty/freetype/include/freetype/ftlcdfil.h index e06a8957f5..680bd90c89 100644 --- a/thirdparty/freetype/include/freetype/ftlcdfil.h +++ b/thirdparty/freetype/include/freetype/ftlcdfil.h @@ -5,7 +5,7 @@ /* FreeType API for color filtering of subpixel bitmap glyphs */ /* (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -268,6 +268,9 @@ FT_BEGIN_HEADER * defined in your build of the library, which should correspond to all * default builds of FreeType. * + * LCD filter weights can also be set per face using @FT_Face_Properties + * with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS. + * * @since: * 2.4.0 */ @@ -275,6 +278,38 @@ FT_BEGIN_HEADER FT_Library_SetLcdFilterWeights( FT_Library library, unsigned char *weights ); + + /************************************************************************** + * + * @constant: + * FT_PARAM_TAG_LCD_FILTER_WEIGHTS + * + * @description: + * An @FT_Parameter tag to be used with @FT_Face_Properties. The + * corresponding argument specifies the five LCD filter weights for a + * given face (if using @FT_LOAD_TARGET_LCD, for example), overriding + * the global default values or the values set up with + * @FT_Library_SetLcdFilterWeights. + * + */ +#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \ + FT_MAKE_TAG( 'l', 'c', 'd', 'f' ) + + + /* + * @type: + * FT_LcdFiveTapFilter + * + * @description: + * A typedef for passing the five LCD filter weights to + * @FT_Face_Properties within an @FT_Parameter structure. + * + */ +#define FT_LCD_FILTER_FIVE_TAPS 5 + + typedef FT_Byte FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS]; + + /* */ diff --git a/thirdparty/freetype/include/freetype/ftlist.h b/thirdparty/freetype/include/freetype/ftlist.h index 82f437ac61..5309cb18ba 100644 --- a/thirdparty/freetype/include/freetype/ftlist.h +++ b/thirdparty/freetype/include/freetype/ftlist.h @@ -4,7 +4,7 @@ /* */ /* Generic list support for FreeType (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftlzw.h b/thirdparty/freetype/include/freetype/ftlzw.h index 582e2c1465..a82c95e7c9 100644 --- a/thirdparty/freetype/include/freetype/ftlzw.h +++ b/thirdparty/freetype/include/freetype/ftlzw.h @@ -4,7 +4,7 @@ /* */ /* LZW-compressed stream support. */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftmac.h b/thirdparty/freetype/include/freetype/ftmac.h index adb15cadf3..ad97c6e4c3 100644 --- a/thirdparty/freetype/include/freetype/ftmac.h +++ b/thirdparty/freetype/include/freetype/ftmac.h @@ -4,7 +4,7 @@ /* */ /* Additional Mac-specific API. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftmm.h b/thirdparty/freetype/include/freetype/ftmm.h index 6c05f0c390..c41b80ea67 100644 --- a/thirdparty/freetype/include/freetype/ftmm.h +++ b/thirdparty/freetype/include/freetype/ftmm.h @@ -4,7 +4,7 @@ /* */ /* FreeType Multiple Master font interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,11 +43,10 @@ FT_BEGIN_HEADER /* Master fonts, i.e., the selection of specific design instances by */ /* setting design axis coordinates. */ /* */ - /* George Williams has extended this interface to make it work with */ - /* both Type~1 Multiple Masters fonts and GX distortable (var) */ - /* fonts. Some of these routines only work with MM fonts, others */ - /* will work with both types. They are similar enough that a */ - /* consistent interface makes sense. */ + /* Besides Adobe MM fonts, the interface supports Apple's TrueType GX */ + /* and OpenType variation fonts. Some of the routines only work with */ + /* Adobe MM fonts, others will work with all three types. They are */ + /* similar enough that a consistent interface makes sense. */ /* */ /*************************************************************************/ @@ -58,10 +57,11 @@ FT_BEGIN_HEADER /* FT_MM_Axis */ /* */ /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters fonts. */ + /* A structure to model a given axis in design space for Multiple */ + /* Masters fonts. */ /* */ - /* This structure can't be used for GX var fonts. */ + /* This structure can't be used for TrueType GX or OpenType variation */ + /* fonts. */ /* */ /* <Fields> */ /* name :: The axis's name. */ @@ -85,10 +85,11 @@ FT_BEGIN_HEADER /* FT_Multi_Master */ /* */ /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ + /* A structure to model the axes and space of a Multiple Masters */ /* font. */ /* */ - /* This structure can't be used for GX var fonts. */ + /* This structure can't be used for TrueType GX or OpenType variation */ + /* fonts. */ /* */ /* <Fields> */ /* num_axis :: Number of axes. Cannot exceed~4. */ @@ -115,27 +116,35 @@ FT_BEGIN_HEADER /* FT_Var_Axis */ /* */ /* <Description> */ - /* A simple structure used to model a given axis in design space for */ - /* Multiple Masters and GX var fonts. */ + /* A structure to model a given axis in design space for Multiple */ + /* Masters, TrueType GX, and OpenType variation fonts. */ /* */ /* <Fields> */ /* name :: The axis's name. */ - /* Not always meaningful for GX. */ + /* Not always meaningful for TrueType GX or OpenType */ + /* variation fonts. */ /* */ /* minimum :: The axis's minimum design coordinate. */ /* */ /* def :: The axis's default design coordinate. */ - /* FreeType computes meaningful default values for MM; it */ - /* is then an integer value, not in 16.16 format. */ + /* FreeType computes meaningful default values for Adobe */ + /* MM fonts. */ /* */ /* maximum :: The axis's maximum design coordinate. */ /* */ - /* tag :: The axis's tag (the GX equivalent to `name'). */ - /* FreeType provides default values for MM if possible. */ + /* tag :: The axis's tag (the equivalent to `name' for TrueType */ + /* GX and OpenType variation fonts). FreeType provides */ + /* default values for Adobe MM fonts if possible. */ /* */ - /* strid :: The entry in `name' table (another GX version of */ - /* `name'). */ - /* Not meaningful for MM. */ + /* strid :: The axis name entry in the font's `name' table. This */ + /* is another (and often better) version of the `name' */ + /* field for TrueType GX or OpenType variation fonts. Not */ + /* meaningful for Adobe MM fonts. */ + /* */ + /* <Note> */ + /* The fields `minimum', `def', and `maximum' are 16.16 fractional */ + /* values for TrueType GX and OpenType variation fonts. For Adobe MM */ + /* fonts, the values are integers. */ /* */ typedef struct FT_Var_Axis_ { @@ -157,20 +166,25 @@ FT_BEGIN_HEADER /* FT_Var_Named_Style */ /* */ /* <Description> */ - /* A simple structure used to model a named style in a GX var font. */ + /* A structure to model a named instance in a TrueType GX or OpenType */ + /* variation font. */ /* */ - /* This structure can't be used for MM fonts. */ + /* This structure can't be used for Adobe MM fonts. */ /* */ /* <Fields> */ - /* coords :: The design coordinates for this style. */ + /* coords :: The design coordinates for this instance. */ /* This is an array with one entry for each axis. */ /* */ - /* strid :: The entry in `name' table identifying this style. */ + /* strid :: The entry in `name' table identifying this instance. */ + /* */ + /* psid :: The entry in `name' table identifying a PostScript name */ + /* for this instance. */ /* */ typedef struct FT_Var_Named_Style_ { FT_Fixed* coords; FT_UInt strid; + FT_UInt psid; /* since 2.7.1 */ } FT_Var_Named_Style; @@ -181,35 +195,43 @@ FT_BEGIN_HEADER /* FT_MM_Var */ /* */ /* <Description> */ - /* A structure used to model the axes and space of a Multiple Masters */ - /* or GX var distortable font. */ + /* A structure to model the axes and space of a Adobe MM, TrueType */ + /* GX, or OpenType variation font. */ /* */ - /* Some fields are specific to one format and not to the other. */ + /* Some fields are specific to one format and not to the others. */ /* */ /* <Fields> */ /* num_axis :: The number of axes. The maximum value is~4 for */ - /* MM; no limit in GX. */ + /* Adobe MM fonts; no limit in TrueType GX or */ + /* OpenType variation fonts. */ /* */ /* num_designs :: The number of designs; should be normally */ - /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* 2^num_axis for Adobe MM fonts. Not meaningful */ + /* for TrueType GX or OpenType variation fonts */ /* (where every glyph could have a different */ /* number of designs). */ /* */ - /* num_namedstyles :: The number of named styles; only meaningful for */ - /* GX that allows certain design coordinates to */ - /* have a string ID (in the `name' table) */ - /* associated with them. The font can tell the */ - /* user that, for example, Weight=1.5 is `Bold'. */ + /* num_namedstyles :: The number of named styles; a `named style' is */ + /* a tuple of design coordinates that has a string */ + /* ID (in the `name' table) associated with it. */ + /* The font can tell the user that, for example, */ + /* [Weight=1.5,Width=1.1] is `Bold'. Another name */ + /* for `named style' is `named instance'. */ + /* */ + /* For Adobe Multiple Masters fonts, this value is */ + /* always zero because the format does not support */ + /* named styles. */ /* */ /* axis :: An axis descriptor table. */ - /* GX fonts contain slightly more data than MM. */ + /* TrueType GX and OpenType variation fonts */ + /* contain slightly more data than Adobe MM fonts. */ /* Memory management of this pointer is done */ /* internally by FreeType. */ /* */ - /* namedstyle :: A named style table. */ - /* Only meaningful with GX. */ - /* Memory management of this pointer is done */ - /* internally by FreeType. */ + /* namedstyle :: A named style (instance) table. */ + /* Only meaningful for TrueType GX and OpenType */ + /* variation fonts. Memory management of this */ + /* pointer is done internally by FreeType. */ /* */ typedef struct FT_MM_Var_ { @@ -228,9 +250,10 @@ FT_BEGIN_HEADER /* FT_Get_Multi_Master */ /* */ /* <Description> */ - /* Retrieve the Multiple Master descriptor of a given font. */ + /* Retrieve a variation descriptor of a given Adobe MM font. */ /* */ - /* This function can't be used with GX fonts. */ + /* This function can't be used with TrueType GX or OpenType variation */ + /* fonts. */ /* */ /* <Input> */ /* face :: A handle to the source face. */ @@ -252,13 +275,15 @@ FT_BEGIN_HEADER /* FT_Get_MM_Var */ /* */ /* <Description> */ - /* Retrieve the Multiple Master/GX var descriptor of a given font. */ + /* Retrieve a variation descriptor for a given font. */ + /* */ + /* This function works with all supported variation formats. */ /* */ /* <Input> */ /* face :: A handle to the source face. */ /* */ /* <Output> */ - /* amaster :: The Multiple Masters/GX var descriptor. */ + /* amaster :: The variation descriptor. */ /* Allocates a data structure, which the user must */ /* deallocate with `free' after use. */ /* */ @@ -276,10 +301,11 @@ FT_BEGIN_HEADER /* FT_Set_MM_Design_Coordinates */ /* */ /* <Description> */ - /* For Multiple Masters fonts, choose an interpolated font design */ - /* through design coordinates. */ + /* For Adobe MM fonts, choose an interpolated font design through */ + /* design coordinates. */ /* */ - /* This function can't be used with GX fonts. */ + /* This function can't be used with TrueType GX or OpenType variation */ + /* fonts. */ /* */ /* <InOut> */ /* face :: A handle to the source face. */ @@ -307,8 +333,9 @@ FT_BEGIN_HEADER /* FT_Set_Var_Design_Coordinates */ /* */ /* <Description> */ - /* For Multiple Master or GX Var fonts, choose an interpolated font */ - /* design through design coordinates. */ + /* Choose an interpolated font design through design coordinates. */ + /* */ + /* This function works with all supported variation formats. */ /* */ /* <InOut> */ /* face :: A handle to the source face. */ @@ -333,11 +360,43 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Function> */ + /* FT_Get_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* Get the design coordinates of the currently selected interpolated */ + /* font. */ + /* */ + /* This function works with all supported variation formats. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* num_coords :: The number of design coordinates to retrieve. If it */ + /* is larger than the number of axes, set the excess */ + /* values to~0. */ + /* */ + /* <Output> */ + /* coords :: The design coordinates array. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ /* FT_Set_MM_Blend_Coordinates */ /* */ /* <Description> */ - /* For Multiple Masters and GX var fonts, choose an interpolated font */ - /* design through normalized blend coordinates. */ + /* Choose an interpolated font design through normalized blend */ + /* coordinates. */ + /* */ + /* This function works with all supported variation formats. */ /* */ /* <InOut> */ /* face :: A handle to the source face. */ @@ -349,7 +408,9 @@ FT_BEGIN_HEADER /* use default values for the remaining axes. */ /* */ /* coords :: The design coordinates array (each element must be */ - /* between 0 and 1.0). */ + /* between 0 and 1.0 for Adobe MM fonts, and between */ + /* -1.0 and 1.0 for TrueType GX and OpenType variation */ + /* fonts). */ /* */ /* <Return> */ /* FreeType error code. 0~means success. */ @@ -363,6 +424,37 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Function> */ + /* FT_Get_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* Get the normalized blend coordinates of the currently selected */ + /* interpolated font. */ + /* */ + /* This function works with all supported variation formats. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* num_coords :: The number of normalized blend coordinates to */ + /* retrieve. If it is larger than the number of axes, */ + /* set the excess values to~0.5 for Adobe MM fonts, and */ + /* to~0 for TrueType GX and OpenType variation fonts. */ + /* */ + /* <Output> */ + /* coords :: The normalized blend coordinates array. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ /* FT_Set_Var_Blend_Coordinates */ /* */ /* <Description> */ @@ -373,6 +465,20 @@ FT_BEGIN_HEADER FT_UInt num_coords, FT_Fixed* coords ); + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Get_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + /* */ diff --git a/thirdparty/freetype/include/freetype/ftmodapi.h b/thirdparty/freetype/include/freetype/ftmodapi.h index b4d2758efa..4147aadf8b 100644 --- a/thirdparty/freetype/include/freetype/ftmodapi.h +++ b/thirdparty/freetype/include/freetype/ftmodapi.h @@ -4,7 +4,7 @@ /* */ /* FreeType modules public interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -89,6 +89,7 @@ FT_BEGIN_HEADER /* */ /* FT_Property_Set */ /* FT_Property_Get */ + /* FT_Set_Default_Properties */ /* */ /* FT_New_Library */ /* FT_Done_Library */ @@ -440,6 +441,47 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Function> */ + /* FT_Set_Default_Properties */ + /* */ + /* <Description> */ + /* If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is */ + /* set, this function reads the `FREETYPE_PROPERTIES' environment */ + /* variable to control driver properties. See sections @auto_hinter, */ + /* @cff_driver, @pcf_driver, and @tt_driver for more. */ + /* */ + /* If the compilation option is not set, this function does nothing. */ + /* */ + /* `FREETYPE_PROPERTIES' has the following syntax form (broken here */ + /* into multiple lines for better readability). */ + /* */ + /* { */ + /* <optional whitespace> */ + /* <module-name1> ':' */ + /* <property-name1> '=' <property-value1> */ + /* <whitespace> */ + /* <module-name2> ':' */ + /* <property-name2> '=' <property-value2> */ + /* ... */ + /* } */ + /* */ + /* Example: */ + /* */ + /* { */ + /* FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ */ + /* cff:no-stem-darkening=1 \ */ + /* autofitter:warping=1 */ + /* } */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Set_Default_Properties( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Function> */ /* FT_Reference_Library */ /* */ /* <Description> */ @@ -477,8 +519,9 @@ FT_BEGIN_HEADER /* valid for the life of the @FT_Library object. */ /* */ /* Normally, you would call this function (followed by a call to */ - /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ - /* instead of @FT_Init_FreeType to initialize the FreeType library. */ + /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module, */ + /* and a call to @FT_Set_Default_Properties) instead of */ + /* @FT_Init_FreeType to initialize the FreeType library. */ /* */ /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */ /* library instance. */ diff --git a/thirdparty/freetype/include/freetype/ftmoderr.h b/thirdparty/freetype/include/freetype/ftmoderr.h index 2a7671c816..7f608375e8 100644 --- a/thirdparty/freetype/include/freetype/ftmoderr.h +++ b/thirdparty/freetype/include/freetype/ftmoderr.h @@ -4,7 +4,7 @@ /* */ /* FreeType module error offsets (specification). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftotval.h b/thirdparty/freetype/include/freetype/ftotval.h index 3e6e18d8a6..b5d27cfe74 100644 --- a/thirdparty/freetype/include/freetype/ftotval.h +++ b/thirdparty/freetype/include/freetype/ftotval.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating OpenType tables (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftoutln.h b/thirdparty/freetype/include/freetype/ftoutln.h index 6a6451207c..07f73ebb1b 100644 --- a/thirdparty/freetype/include/freetype/ftoutln.h +++ b/thirdparty/freetype/include/freetype/ftoutln.h @@ -5,7 +5,7 @@ /* Support for the FT_Outline type used to store glyph shapes of */ /* most scalable font formats (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -115,6 +115,10 @@ FT_BEGIN_HEADER /* outline for stroking purposes (otherwise it would result in a */ /* visible dot when round caps are used). */ /* */ + /* Similarly, the function returns success for an empty outline also */ + /* (doing nothing, this is, not calling any emitter); if necessary, */ + /* you should filter this out, too. */ + /* */ FT_EXPORT( FT_Error ) FT_Outline_Decompose( FT_Outline* outline, const FT_Outline_Funcs* func_interface, @@ -213,6 +217,10 @@ FT_BEGIN_HEADER /* <Return> */ /* FreeType error code. 0~means success. */ /* */ + /* <Note> */ + /* An empty outline, or an outline with a single point only is also */ + /* valid. */ + /* */ FT_EXPORT( FT_Error ) FT_Outline_Check( FT_Outline* outline ); diff --git a/thirdparty/freetype/include/freetype/ftpcfdrv.h b/thirdparty/freetype/include/freetype/ftpcfdrv.h new file mode 100644 index 0000000000..6622c936fb --- /dev/null +++ b/thirdparty/freetype/include/freetype/ftpcfdrv.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* ftpcfdrv.h */ +/* */ +/* FreeType API for controlling the PCF driver (specification only). */ +/* */ +/* Copyright 2017 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef FTPCFDRV_H_ +#define FTPCFDRV_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * pcf_driver + * + * @title: + * The PCF driver + * + * @abstract: + * Controlling the PCF driver module. + * + * @description: + * While FreeType's PCF driver doesn't expose API functions by itself, + * it is possible to control its behaviour with @FT_Property_Set and + * @FT_Property_Get. Right now, there is a single property + * `no-long-family-names' available if FreeType is compiled with + * PCF_CONFIG_OPTION_LONG_FAMILY_NAMES. + * + * The PCF driver's module name is `pcf'. + * + */ + + + /************************************************************************** + * + * @property: + * no-long-family-names + * + * @description: + * If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling + * FreeType, the PCF driver constructs long family names. + * + * There are many PCF fonts just called `Fixed' which look completely + * different, and which have nothing to do with each other. When + * selecting `Fixed' in KDE or Gnome one gets results that appear rather + * random, the style changes often if one changes the size and one + * cannot select some fonts at all. The improve this situation, the PCF + * module prepends the foundry name (plus a space) to the family name. + * It also checks whether there are `wide' characters; all put together, + * family names like `Sony Fixed' or `Misc Fixed Wide' are constructed. + * + * If `no-long-family-names' is set, this feature gets switched off. + * + * { + * FT_Library library; + * FT_Bool no_long_family_names = TRUE; + * + * + * FT_Init_FreeType( &library ); + * + * FT_Property_Set( library, "pcf", + * "no-long-family-names", + * &no_long_family_names ); + * } + * + * @note: + * This property can be used with @FT_Property_Get also. + * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable (using values 1 and 0 for `on' and `off', respectively). + * + */ + + +FT_END_HEADER + + +#endif /* FTPCFDRV_H_ */ + + +/* END */ diff --git a/thirdparty/freetype/include/freetype/ftpfr.h b/thirdparty/freetype/include/freetype/ftpfr.h index 2e1bff2f67..f2a6ae9349 100644 --- a/thirdparty/freetype/include/freetype/ftpfr.h +++ b/thirdparty/freetype/include/freetype/ftpfr.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing PFR-specific data (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftrender.h b/thirdparty/freetype/include/freetype/ftrender.h index 9f7ed9e9d9..960837580a 100644 --- a/thirdparty/freetype/include/freetype/ftrender.h +++ b/thirdparty/freetype/include/freetype/ftrender.h @@ -4,7 +4,7 @@ /* */ /* FreeType renderer modules public interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -75,6 +75,7 @@ FT_BEGIN_HEADER { FT_Long glyph_size; FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; FT_Glyph_DoneFunc glyph_done; FT_Glyph_CopyFunc glyph_copy; diff --git a/thirdparty/freetype/include/freetype/ftsizes.h b/thirdparty/freetype/include/freetype/ftsizes.h index 55e0d5ccfd..2f3958a857 100644 --- a/thirdparty/freetype/include/freetype/ftsizes.h +++ b/thirdparty/freetype/include/freetype/ftsizes.h @@ -4,7 +4,7 @@ /* */ /* FreeType size objects management (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftsnames.h b/thirdparty/freetype/include/freetype/ftsnames.h index a7b51c2cba..a316540576 100644 --- a/thirdparty/freetype/include/freetype/ftsnames.h +++ b/thirdparty/freetype/include/freetype/ftsnames.h @@ -2,12 +2,12 @@ /* */ /* ftsnames.h */ /* */ -/* Simple interface to access SFNT name tables (which are used */ +/* Simple interface to access SFNT `name' tables (which are used */ /* to hold font names, copyright info, notices, etc.) (specification). */ /* */ /* This is _not_ used to retrieve glyph names! */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -49,7 +49,7 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* The TrueType and OpenType specifications allow the inclusion of */ - /* a special `names table' in font files. This table contains */ + /* a special names table (`name') in font files. This table contains */ /* textual (and internationalized) information regarding the font, */ /* like family name, copyright, version, etc. */ /* */ @@ -70,30 +70,37 @@ FT_BEGIN_HEADER /* */ /* <Fields> */ /* platform_id :: The platform ID for `string'. */ + /* See @TT_PLATFORM_XXX for possible values. */ /* */ /* encoding_id :: The encoding ID for `string'. */ + /* See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX */ + /* for possible values. */ /* */ /* language_id :: The language ID for `string'. */ + /* See @TT_MAC_LANGID_XXX and @TT_MS_LANGID_XXX for */ + /* possible values. */ + /* */ + /* Registered OpenType values for `language_id' are */ + /* always smaller than 0x8000; values equal or larger */ + /* than 0x8000 usually indicate a language tag string */ + /* (introduced in OpenType version 1.6). Use function */ + /* @FT_Get_Sfnt_LangTag with `language_id' as its */ + /* argument to retrieve the associated language tag. */ /* */ /* name_id :: An identifier for `string'. */ + /* See @TT_NAME_ID_XXX for possible values. */ /* */ /* string :: The `name' string. Note that its format differs */ - /* depending on the (platform,encoding) pair. It can */ - /* be a Pascal String, a UTF-16 one, etc. */ - /* */ - /* Generally speaking, the string is not */ - /* zero-terminated. Please refer to the TrueType */ - /* specification for details. */ + /* depending on the (platform,encoding) pair, being */ + /* either a string of bytes (without a terminating */ + /* NULL byte) or containing UTF-16BE entities. */ /* */ /* string_len :: The length of `string' in bytes. */ /* */ /* <Note> */ - /* Possible values for `platform_id', `encoding_id', `language_id', */ - /* and `name_id' are given in the file `ttnameid.h'. For details */ - /* please refer to the TrueType or OpenType specification. */ - /* */ - /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ - /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* Please refer to the TrueType or OpenType specification for more */ + /* details. */ /* */ typedef struct FT_SfntName_ { @@ -103,7 +110,7 @@ FT_BEGIN_HEADER FT_UShort name_id; FT_Byte* string; /* this string is *not* null-terminated! */ - FT_UInt string_len; /* in bytes */ + FT_UInt string_len; /* in bytes */ } FT_SfntName; @@ -147,47 +154,127 @@ FT_BEGIN_HEADER /* */ /* <Note> */ /* The `string' array returned in the `aname' structure is not */ - /* null-terminated. The application should deallocate it if it is no */ - /* longer in use. */ + /* null-terminated. Note that you don't have to deallocate `string' */ + /* by yourself; FreeType takes care of it if you call @FT_Done_Face. */ /* */ /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ /* `name' table entries, then do a loop until you get the right */ /* platform, encoding, and name ID. */ /* */ + /* `name' table format~1 entries can use language tags also, see */ + /* @FT_Get_Sfnt_LangTag. */ + /* */ FT_EXPORT( FT_Error ) FT_Get_Sfnt_Name( FT_Face face, FT_UInt idx, FT_SfntName *aname ); + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntLangTag */ + /* */ + /* <Description> */ + /* A structure to model a language tag entry from an SFNT `name' */ + /* table. */ + /* */ + /* <Fields> */ + /* string :: The language tag string, encoded in UTF-16BE */ + /* (without trailing NULL bytes). */ + /* */ + /* string_len :: The length of `string' in *bytes*. */ + /* */ + /* <Note> */ + /* Please refer to the TrueType or OpenType specification for more */ + /* details. */ + /* */ + typedef struct FT_SfntLangTag_ + { + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntLangTag; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_LangTag */ + /* */ + /* <Description> */ + /* Retrieve the language tag associated with a language ID of an SFNT */ + /* `name' table entry. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* langID :: The language ID, as returned by @FT_Get_Sfnt_Name. */ + /* This is always a value larger than 0x8000. */ + /* */ + /* <Output> */ + /* alangTag :: The language tag associated with the `name' table */ + /* entry's language ID. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `alangTag' structure is not */ + /* null-terminated. Note that you don't have to deallocate `string' */ + /* by yourself; FreeType takes care of it if you call @FT_Done_Face. */ + /* */ + /* Only `name' table format~1 supports language tags. For format~0 */ + /* tables, this function always returns FT_Err_Invalid_Table. For */ + /* invalid format~1 language ID values, FT_Err_Invalid_Argument is */ + /* returned. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ); + + /*************************************************************************** * * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY * * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred family subfamily names in `name' - * table since OpenType version 1.4. For backwards compatibility with - * legacy systems that have a 4-face-per-family restriction. + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * family names in the `name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. * */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY /*************************************************************************** * * @constant: - * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY + * FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY * * @description: - * A constant used as the tag of @FT_Parameter structures to make - * FT_Open_Face() ignore preferred subfamily names in `name' table since - * OpenType version 1.4. For backwards compatibility with legacy - * systems that have a 4-face-per-family restriction. + * A tag for @FT_Parameter to make @FT_Open_Face ignore typographic + * subfamily names in the `name' table (introduced in OpenType version + * 1.4). Use this for backward compatibility with legacy systems that + * have a four-faces-per-family restriction. * */ -#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) +#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \ + FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + + /* this constant is deprecated */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \ + FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY /* */ diff --git a/thirdparty/freetype/include/freetype/ftstroke.h b/thirdparty/freetype/include/freetype/ftstroke.h index b3b9922dad..4a20667c5e 100644 --- a/thirdparty/freetype/include/freetype/ftstroke.h +++ b/thirdparty/freetype/include/freetype/ftstroke.h @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -136,7 +136,7 @@ FT_BEGIN_HEADER * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for - * backwards compatibility. + * backward compatibility. */ typedef enum FT_Stroker_LineJoin_ { diff --git a/thirdparty/freetype/include/freetype/ftsynth.h b/thirdparty/freetype/include/freetype/ftsynth.h index fdfcb6912b..1863fa2383 100644 --- a/thirdparty/freetype/include/freetype/ftsynth.h +++ b/thirdparty/freetype/include/freetype/ftsynth.h @@ -5,7 +5,7 @@ /* FreeType synthesizing code for emboldening and slanting */ /* (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftsystem.h b/thirdparty/freetype/include/freetype/ftsystem.h index a75f958022..1aa4762ad6 100644 --- a/thirdparty/freetype/include/freetype/ftsystem.h +++ b/thirdparty/freetype/include/freetype/ftsystem.h @@ -4,7 +4,7 @@ /* */ /* FreeType low-level system interface definition (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/fttrigon.h b/thirdparty/freetype/include/freetype/fttrigon.h index f789b524cb..89f0350675 100644 --- a/thirdparty/freetype/include/freetype/fttrigon.h +++ b/thirdparty/freetype/include/freetype/fttrigon.h @@ -4,7 +4,7 @@ /* */ /* FreeType trigonometric functions (specification). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftttdrv.h b/thirdparty/freetype/include/freetype/ftttdrv.h index 0d868bc259..26bc5e966a 100644 --- a/thirdparty/freetype/include/freetype/ftttdrv.h +++ b/thirdparty/freetype/include/freetype/ftttdrv.h @@ -5,7 +5,7 @@ /* FreeType API for controlling the TrueType driver */ /* (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -110,7 +110,7 @@ FT_BEGIN_HEADER * TrueType interpreter fully allows the advance width to be adjusted in * this mode, just the DWrite client will ignore those changes. * - * _ClearType_ _Backwards_ _Compatibility_ + * _ClearType_ _Backward_ _Compatibility_ * * This is a set of exceptions made in the TrueType interpreter to * minimize hinting techniques that were problematic with the extra @@ -118,9 +118,9 @@ FT_BEGIN_HEADER * http://www.beatstamm.com/typography/RTRCh4.htm#Sec1 and * http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx. * This technique is not to be confused with ClearType compatible - * widths. ClearType backwards compatibility has no direct impact on + * widths. ClearType backward compatibility has no direct impact on * changing advance widths, but there might be an indirect impact on - * disabling some deltas. This could be worked around in backwards + * disabling some deltas. This could be worked around in backward * compatibility mode. * * _Native_ _ClearType_ _Mode_ @@ -138,7 +138,6 @@ FT_BEGIN_HEADER * interpreter-version * * @description: - * Currently, three versions are available, two representing the * bytecode interpreter with subpixel hinting support (old `Infinality' * code and new stripped-down and higher performance `minimal' code) and @@ -181,6 +180,8 @@ FT_BEGIN_HEADER * @note: * This property can be used with @FT_Property_Get also. * + * This property can be set via the `FREETYPE_PROPERTIES' environment + * variable (using values `35', `38', or `40'). */ @@ -224,7 +225,7 @@ FT_BEGIN_HEADER * filtering. * * If FreeType has not been compiled with the configuration option - * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 or~40 causes + * TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 or~40 causes * an `FT_Err_Unimplemented_Feature' error. * * Depending on the graphics framework, Microsoft uses different diff --git a/thirdparty/freetype/include/freetype/fttypes.h b/thirdparty/freetype/include/freetype/fttypes.h index 2673e79c3c..eab8adaad4 100644 --- a/thirdparty/freetype/include/freetype/fttypes.h +++ b/thirdparty/freetype/include/freetype/fttypes.h @@ -4,7 +4,7 @@ /* */ /* FreeType simple types definitions (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/ftwinfnt.h b/thirdparty/freetype/include/freetype/ftwinfnt.h index a1a715baa1..1eeef6c8ba 100644 --- a/thirdparty/freetype/include/freetype/ftwinfnt.h +++ b/thirdparty/freetype/include/freetype/ftwinfnt.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing Windows fnt-specific data. */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/autohint.h b/thirdparty/freetype/include/freetype/internal/autohint.h index 7ef82b8f3c..bae83e7384 100644 --- a/thirdparty/freetype/include/freetype/internal/autohint.h +++ b/thirdparty/freetype/include/freetype/internal/autohint.h @@ -4,7 +4,7 @@ /* */ /* High-level `autohint' module-specific interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftcalc.h b/thirdparty/freetype/include/freetype/internal/ftcalc.h index 8a884f680a..c9ac9d8246 100644 --- a/thirdparty/freetype/include/freetype/internal/ftcalc.h +++ b/thirdparty/freetype/include/freetype/internal/ftcalc.h @@ -4,7 +4,7 @@ /* */ /* Arithmetic computations (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftdebug.h b/thirdparty/freetype/include/freetype/internal/ftdebug.h index d110457157..5dcd2b1740 100644 --- a/thirdparty/freetype/include/freetype/internal/ftdebug.h +++ b/thirdparty/freetype/include/freetype/internal/ftdebug.h @@ -4,7 +4,7 @@ /* */ /* Debugging and logging component (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftdriver.h b/thirdparty/freetype/include/freetype/internal/ftdriver.h index 3e1e66e979..e82fa8d41f 100644 --- a/thirdparty/freetype/include/freetype/internal/ftdriver.h +++ b/thirdparty/freetype/include/freetype/internal/ftdriver.h @@ -4,7 +4,7 @@ /* */ /* FreeType font driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -67,15 +67,6 @@ FT_BEGIN_HEADER FT_Int32 load_flags ); - typedef FT_UInt - (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, - FT_Long charcode ); - - typedef FT_Long - (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, - FT_Long charcode ); - - typedef FT_Error (*FT_Face_GetKerningFunc)( FT_Face face, FT_UInt left_glyph, diff --git a/thirdparty/freetype/include/freetype/internal/ftgloadr.h b/thirdparty/freetype/include/freetype/internal/ftgloadr.h index bebf5dbba2..f41c3df554 100644 --- a/thirdparty/freetype/include/freetype/internal/ftgloadr.h +++ b/thirdparty/freetype/include/freetype/internal/ftgloadr.h @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph loader (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftmemory.h b/thirdparty/freetype/include/freetype/internal/ftmemory.h index 8c06fc21a5..59e5b58a57 100644 --- a/thirdparty/freetype/include/freetype/internal/ftmemory.h +++ b/thirdparty/freetype/include/freetype/internal/ftmemory.h @@ -4,7 +4,7 @@ /* */ /* The FreeType memory management macros (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -108,10 +108,12 @@ extern "C++" /* * The allocation functions return a pointer, and the error code - * is written to through the `p_error' parameter. See below for - * for documentation. + * is written to through the `p_error' parameter. */ + /* The `q' variants of the functions below (`q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + FT_BASE( FT_Pointer ) ft_mem_alloc( FT_Memory memory, FT_Long size, @@ -143,6 +145,9 @@ extern "C++" const void* P ); + /* The `Q' variants of the macros below (`Q' for `quick') don't fill */ + /* the allocated or reallocated memory with zero bytes. */ + #define FT_MEM_ALLOC( ptr, size ) \ FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, \ (FT_Long)(size), \ diff --git a/thirdparty/freetype/include/freetype/internal/ftobjs.h b/thirdparty/freetype/include/freetype/internal/ftobjs.h index e3fa32083b..558409166d 100644 --- a/thirdparty/freetype/include/freetype/internal/ftobjs.h +++ b/thirdparty/freetype/include/freetype/internal/ftobjs.h @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -193,6 +193,7 @@ FT_BEGIN_HEADER typedef struct FT_CMap_ClassRec_ { FT_ULong size; + FT_CMap_InitFunc init; FT_CMap_DoneFunc done; FT_CMap_CharIndexFunc char_index; @@ -341,6 +342,20 @@ FT_BEGIN_HEADER /* this data when first opened. This field exists only if */ /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ /* */ + /* no_stem_darkening :: */ + /* Overrides the module-level default, see @stem-darkening[cff], */ + /* for example. FALSE and TRUE toggle stem darkening on and off, */ + /* respectively, value~-1 means to use the module/driver default. */ + /* */ + /* random_seed :: */ + /* If positive, override the seed value for the CFF `random' */ + /* operator. Value~0 means to use the font's value. Value~-1 */ + /* means to use the CFF driver's default. */ + /* */ + /* lcd_weights :: */ + /* Overrides the library default with custom weights for the 5-tap */ + /* FIR filter. `{0, 0, 0, 0, 0}' means to use the library default. */ + /* */ /* refcount :: */ /* A counter initialized to~1 at the time an @FT_Face structure is */ /* created. @FT_Reference_Face increments this counter, and */ @@ -349,9 +364,9 @@ FT_BEGIN_HEADER /* */ typedef struct FT_Face_InternalRec_ { - FT_Matrix transform_matrix; - FT_Vector transform_delta; - FT_Int transform_flags; + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; FT_ServiceCacheRec services; @@ -359,7 +374,13 @@ FT_BEGIN_HEADER FT_Incremental_InterfaceRec* incremental_interface; #endif - FT_Int refcount; + FT_Char no_stem_darkening; + FT_Int32 random_seed; +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFiveTapFilter lcd_weights; /* preset or custom filter weights */ +#endif + + FT_Int refcount; } FT_Face_InternalRec; @@ -412,8 +433,6 @@ FT_BEGIN_HEADER } FT_GlyphSlot_InternalRec; -#if 0 - /*************************************************************************/ /* */ /* <Struct> */ @@ -421,17 +440,25 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* This structure contains the internal fields of each FT_Size */ - /* object. Currently, it's empty. */ + /* object. */ + /* */ + /* <Fields> */ + /* module_data :: Data specific to a driver module. */ + /* */ + /* autohint_mode :: The used auto-hinting mode. */ + /* */ + /* autohint_metrics :: Metrics used by the auto-hinter. */ /* */ /*************************************************************************/ typedef struct FT_Size_InternalRec_ { - /* empty */ + void* module_data; - } FT_Size_InternalRec; + FT_Render_Mode autohint_mode; + FT_Size_Metrics autohint_metrics; -#endif + } FT_Size_InternalRec; /*************************************************************************/ @@ -530,7 +557,16 @@ FT_BEGIN_HEADER FT_BASE( FT_Pointer ) ft_module_get_service( FT_Module module, - const char* service_id ); + const char* service_id, + FT_Bool global ); + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_BASE( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ); +#endif /* */ @@ -765,12 +801,19 @@ FT_BEGIN_HEADER /* This hook is used by the TrueType debugger. It must be set to an */ /* alternate truetype bytecode interpreter function. */ -#define FT_DEBUG_HOOK_TRUETYPE 0 +#define FT_DEBUG_HOOK_TRUETYPE 0 typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, FT_Render_Mode render_mode, - FT_Library library ); + FT_Byte* weights ); + + + /* This is the default LCD filter, an in-place, 5-tap FIR filter. */ + FT_BASE( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_LcdFiveTapFilter weights ); /*************************************************************************/ @@ -811,14 +854,17 @@ FT_BEGIN_HEADER /* handle to the current renderer for the */ /* FT_GLYPH_FORMAT_OUTLINE format. */ /* */ - /* auto_hinter :: XXX */ + /* auto_hinter :: The auto-hinter module interface. */ /* */ /* raster_pool :: The raster object's render pool. This can */ /* ideally be changed dynamically at run-time. */ /* */ /* raster_pool_size :: The size of the render pool in bytes. */ /* */ - /* debug_hooks :: XXX */ + /* debug_hooks :: An array of four function pointers that allow */ + /* debuggers to hook into a font format's */ + /* interpreter. Currently, only the TrueType */ + /* bytecode debugger uses this. */ /* */ /* lcd_filter :: If subpixel rendering is activated, the */ /* selected LCD filter mode. */ @@ -866,7 +912,7 @@ FT_BEGIN_HEADER #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING FT_LcdFilter lcd_filter; FT_Int lcd_extra; /* number of extra pixels */ - FT_Byte lcd_weights[7]; /* filter weights, if any */ + FT_LcdFiveTapFilter lcd_weights; /* filter weights, if any */ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ #endif diff --git a/thirdparty/freetype/include/freetype/internal/ftpic.h b/thirdparty/freetype/include/freetype/internal/ftpic.h index 6d800a08a1..0d43ed20f7 100644 --- a/thirdparty/freetype/include/freetype/internal/ftpic.h +++ b/thirdparty/freetype/include/freetype/internal/ftpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services (declaration). */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftrfork.h b/thirdparty/freetype/include/freetype/internal/ftrfork.h index b923401e68..25a44a4487 100644 --- a/thirdparty/freetype/include/freetype/internal/ftrfork.h +++ b/thirdparty/freetype/include/freetype/internal/ftrfork.h @@ -4,7 +4,7 @@ /* */ /* Embedded resource forks accessor (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO and Redhat K.K. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,11 +43,12 @@ FT_BEGIN_HEADER typedef struct FT_RFork_Ref_ { - FT_UShort res_id; - FT_Long offset; + FT_Short res_id; + FT_Long offset; } FT_RFork_Ref; + #ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK typedef FT_Error (*ft_raccess_guess_func)( FT_Library library, diff --git a/thirdparty/freetype/include/freetype/internal/ftserv.h b/thirdparty/freetype/include/freetype/internal/ftserv.h index 91897177ba..71ef9cac3a 100644 --- a/thirdparty/freetype/include/freetype/internal/ftserv.h +++ b/thirdparty/freetype/include/freetype/internal/ftserv.h @@ -4,7 +4,7 @@ /* */ /* The FreeType services (specification only). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -109,27 +109,27 @@ FT_BEGIN_HEADER */ #ifdef __cplusplus -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - *_pptr_ = _tmp_; \ +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + *_pptr_ = _tmp_; \ FT_END_STMNT #else /* !C++ */ -#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ - FT_BEGIN_STMNT \ - FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ - FT_Pointer _tmp_; \ - \ - \ - _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ - ptr = _tmp_; \ +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \ + ptr = _tmp_; \ FT_END_STMNT #endif /* !C++ */ @@ -167,6 +167,7 @@ FT_BEGIN_HEADER /* FT_DEFINE_SERVICEDESCREC5 */ /* FT_DEFINE_SERVICEDESCREC6 */ /* FT_DEFINE_SERVICEDESCREC7 */ + /* FT_DEFINE_SERVICEDESCREC8 */ /* */ /* <Description> */ /* Used to initialize an array of FT_ServiceDescRec structures. */ @@ -283,6 +284,52 @@ FT_BEGIN_HEADER { NULL, NULL } \ }; +#define FT_DEFINE_SERVICEDESCREC8( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { NULL, NULL } \ + }; + +#define FT_DEFINE_SERVICEDESCREC9( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9 ) \ + static const FT_ServiceDescRec class_[] = \ + { \ + { serv_id_1, serv_data_1 }, \ + { serv_id_2, serv_data_2 }, \ + { serv_id_3, serv_data_3 }, \ + { serv_id_4, serv_data_4 }, \ + { serv_id_5, serv_data_5 }, \ + { serv_id_6, serv_data_6 }, \ + { serv_id_7, serv_data_7 }, \ + { serv_id_8, serv_data_8 }, \ + { serv_id_9, serv_data_9 }, \ + { NULL, NULL } \ + }; + #else /* FT_CONFIG_OPTION_PIC */ #define FT_DEFINE_SERVICEDESCREC1( class_, \ @@ -593,6 +640,121 @@ FT_BEGIN_HEADER return FT_Err_Ok; \ } +#define FT_DEFINE_SERVICEDESCREC8( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 9 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = serv_id_7; \ + clazz[6].serv_data = serv_data_7; \ + clazz[7].serv_id = serv_id_8; \ + clazz[7].serv_data = serv_data_8; \ + clazz[8].serv_id = NULL; \ + clazz[8].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC9( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 10 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = serv_id_7; \ + clazz[6].serv_data = serv_data_7; \ + clazz[7].serv_id = serv_id_8; \ + clazz[7].serv_data = serv_data_8; \ + clazz[8].serv_id = serv_id_9; \ + clazz[8].serv_data = serv_data_9; \ + clazz[9].serv_id = NULL; \ + clazz[9].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + #endif /* FT_CONFIG_OPTION_PIC */ @@ -635,6 +797,7 @@ FT_BEGIN_HEADER { FT_Pointer service_POSTSCRIPT_FONT_NAME; FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_METRICS_VARIATIONS; FT_Pointer service_GLYPH_DICT; FT_Pointer service_PFR_METRICS; FT_Pointer service_WINFNT; @@ -655,7 +818,7 @@ FT_BEGIN_HEADER * FT_FACE_LOOKUP_SERVICE * * @description: - * This macro is used to lookup a service from a face's driver module + * This macro is used to look up a service from a face's driver module * using its cache. * * @input: @@ -739,6 +902,7 @@ FT_BEGIN_HEADER #define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> #define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> #define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> +#define FT_SERVICE_METRICS_VARIATIONS_H <freetype/internal/services/svmetric.h> #define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> #define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> #define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> diff --git a/thirdparty/freetype/include/freetype/internal/ftstream.h b/thirdparty/freetype/include/freetype/internal/ftstream.h index 6d04875657..3e2c07b269 100644 --- a/thirdparty/freetype/include/freetype/internal/ftstream.h +++ b/thirdparty/freetype/include/freetype/internal/ftstream.h @@ -4,7 +4,7 @@ /* */ /* Stream handling (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -502,7 +502,7 @@ FT_BEGIN_HEADER #define FT_STREAM_READ_AT( position, buffer, count ) \ FT_SET_ERROR( FT_Stream_ReadAt( stream, \ (FT_ULong)(position), \ - (FT_Byte*)buffer, \ + (FT_Byte*)(buffer), \ (FT_ULong)(count) ) ) #define FT_STREAM_READ_FIELDS( fields, object ) \ diff --git a/thirdparty/freetype/include/freetype/internal/fttrace.h b/thirdparty/freetype/include/freetype/internal/fttrace.h index efb3355954..caf5fc9460 100644 --- a/thirdparty/freetype/include/freetype/internal/fttrace.h +++ b/thirdparty/freetype/include/freetype/internal/fttrace.h @@ -4,7 +4,7 @@ /* */ /* Tracing handling (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/ftvalid.h b/thirdparty/freetype/include/freetype/internal/ftvalid.h index aac92c9af8..df6f7c5778 100644 --- a/thirdparty/freetype/include/freetype/internal/ftvalid.h +++ b/thirdparty/freetype/include/freetype/internal/ftvalid.h @@ -4,7 +4,7 @@ /* */ /* FreeType validation support (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/internal.h b/thirdparty/freetype/include/freetype/internal/internal.h index 8c3c14c12a..02046813a3 100644 --- a/thirdparty/freetype/include/freetype/internal/internal.h +++ b/thirdparty/freetype/include/freetype/internal/internal.h @@ -4,7 +4,7 @@ /* */ /* Internal header files (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/psaux.h b/thirdparty/freetype/include/freetype/internal/psaux.h index 15dedfd28e..935eb1a9c7 100644 --- a/thirdparty/freetype/include/freetype/internal/psaux.h +++ b/thirdparty/freetype/include/freetype/internal/psaux.h @@ -5,7 +5,7 @@ /* Auxiliary functions and data structures related to PostScript fonts */ /* (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -817,7 +817,7 @@ FT_BEGIN_HEADER } PSAux_ServiceRec, *PSAux_Service; - /* backwards-compatible type definition */ + /* backward compatible type definition */ typedef PSAux_ServiceRec PSAux_Interface; diff --git a/thirdparty/freetype/include/freetype/internal/pshints.h b/thirdparty/freetype/include/freetype/internal/pshints.h index e60dc9cd55..49116eb443 100644 --- a/thirdparty/freetype/include/freetype/internal/pshints.h +++ b/thirdparty/freetype/include/freetype/internal/pshints.h @@ -6,7 +6,7 @@ /* recorders (specification only). These are used to support native */ /* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svbdf.h b/thirdparty/freetype/include/freetype/internal/services/svbdf.h index c24475fc20..eeebf67da1 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svbdf.h +++ b/thirdparty/freetype/include/freetype/internal/services/svbdf.h @@ -4,7 +4,7 @@ /* */ /* The FreeType BDF services (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svcid.h b/thirdparty/freetype/include/freetype/internal/services/svcid.h index dbbe6044a4..cce94d8df6 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svcid.h +++ b/thirdparty/freetype/include/freetype/internal/services/svcid.h @@ -4,7 +4,7 @@ /* */ /* The FreeType CID font services (specification). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* Derek Clegg and Michael Toftdal. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svfntfmt.h b/thirdparty/freetype/include/freetype/internal/services/svfntfmt.h index bd295c9c6b..376d9255bb 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svfntfmt.h +++ b/thirdparty/freetype/include/freetype/internal/services/svfntfmt.h @@ -4,7 +4,7 @@ /* */ /* The FreeType font format service (specification only). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svgldict.h b/thirdparty/freetype/include/freetype/internal/services/svgldict.h index fff29bc40c..0cd13618d8 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svgldict.h +++ b/thirdparty/freetype/include/freetype/internal/services/svgldict.h @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph dictionary services (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svgxval.h b/thirdparty/freetype/include/freetype/internal/services/svgxval.h index fb8ffba83c..71bfa97af8 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svgxval.h +++ b/thirdparty/freetype/include/freetype/internal/services/svgxval.h @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating TrueTypeGX/AAT tables (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svkern.h b/thirdparty/freetype/include/freetype/internal/services/svkern.h index a636f1af1c..b8344e96e9 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svkern.h +++ b/thirdparty/freetype/include/freetype/internal/services/svkern.h @@ -4,7 +4,7 @@ /* */ /* The FreeType Kerning service (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svmetric.h b/thirdparty/freetype/include/freetype/internal/services/svmetric.h new file mode 100644 index 0000000000..1f7d5ddd0c --- /dev/null +++ b/thirdparty/freetype/include/freetype/internal/services/svmetric.h @@ -0,0 +1,153 @@ +/***************************************************************************/ +/* */ +/* svmetric.h */ +/* */ +/* The FreeType services for metrics variations (specification). */ +/* */ +/* Copyright 2016-2017 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef SVMETRIC_H_ +#define SVMETRIC_H_ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service to manage the `HVAR, `MVAR', and `VVAR' OpenType tables. + * + */ + +#define FT_SERVICE_ID_METRICS_VARIATIONS "metrics-variations" + + + /* HVAR */ + + typedef FT_Error + (*FT_HAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_LSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_RSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* VVAR */ + + typedef FT_Error + (*FT_VAdvance_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_TSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_BSB_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + typedef FT_Error + (*FT_VOrg_Adjust_Func)( FT_Face face, + FT_UInt gindex, + FT_Int *avalue ); + + /* MVAR */ + + typedef void + (*FT_Metrics_Adjust_Func)( FT_Face face ); + + + FT_DEFINE_SERVICE( MetricsVariations ) + { + FT_HAdvance_Adjust_Func hadvance_adjust; + FT_LSB_Adjust_Func lsb_adjust; + FT_RSB_Adjust_Func rsb_adjust; + + FT_VAdvance_Adjust_Func vadvance_adjust; + FT_TSB_Adjust_Func tsb_adjust; + FT_BSB_Adjust_Func bsb_adjust; + FT_VOrg_Adjust_Func vorg_adjust; + + FT_Metrics_Adjust_Func metrics_adjust; + }; + + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ ) \ + static const FT_Service_MetricsVariationsRec class_ = \ + { \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_MetricsVariationsRec* clazz ) \ + { \ + clazz->hadvance_adjust = hadvance_adjust_; \ + clazz->lsb_adjust = lsb_adjust_; \ + clazz->rsb_adjust = rsb_adjust_; \ + clazz->vadvance_adjust = vadvance_adjust_; \ + clazz->tsb_adjust = tsb_adjust_; \ + clazz->bsb_adjust = bsb_adjust_; \ + clazz->vorg_adjust = vorg_adjust_; \ + clazz->metrics_adjust = metrics_adjust_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* SVMETRIC_H_ */ + + +/* END */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svmm.h b/thirdparty/freetype/include/freetype/internal/services/svmm.h index b78a19f8e0..1d51cd9090 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svmm.h +++ b/thirdparty/freetype/include/freetype/internal/services/svmm.h @@ -4,7 +4,7 @@ /* */ /* The FreeType Multiple Masters and GX var services (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -58,46 +58,92 @@ FT_BEGIN_HEADER FT_UInt num_coords, FT_Long* coords ); + typedef FT_Error + (*FT_Get_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Get_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Get_Var_Blend_Func)( FT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + typedef void + (*FT_Done_Blend_Func)( FT_Face ); + FT_DEFINE_SERVICE( MultiMasters ) { FT_Get_MM_Func get_mm; FT_Set_MM_Design_Func set_mm_design; FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Blend_Func get_mm_blend; FT_Get_MM_Var_Func get_mm_var; FT_Set_Var_Design_Func set_var_design; + FT_Get_Var_Design_Func get_var_design; + + /* for internal use; only needed for code sharing between modules */ + FT_Get_Var_Blend_Func get_var_blend; + FT_Done_Blend_Func done_blend; }; #ifndef FT_CONFIG_OPTION_PIC -#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_var_, \ - set_var_design_ ) \ - static const FT_Service_MultiMastersRec class_ = \ - { \ - get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \ +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + get_var_blend_, \ + done_blend_ ) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + get_var_blend_, \ + done_blend_ \ }; #else /* FT_CONFIG_OPTION_PIC */ -#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ - get_mm_, \ - set_mm_design_, \ - set_mm_blend_, \ - get_mm_var_, \ - set_var_design_ ) \ - void \ - FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \ - { \ - clazz->get_mm = get_mm_; \ - clazz->set_mm_design = set_mm_design_; \ - clazz->set_mm_blend = set_mm_blend_; \ - clazz->get_mm_var = get_mm_var_; \ - clazz->set_var_design = set_var_design_; \ +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + get_var_blend_, \ + done_blend_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \ + { \ + clazz->get_mm = get_mm_; \ + clazz->set_mm_design = set_mm_design_; \ + clazz->set_mm_blend = set_mm_blend_; \ + clazz->get_mm_blend = get_mm_blend_; \ + clazz->get_mm_var = get_mm_var_; \ + clazz->set_var_design = set_var_design_; \ + clazz->get_var_design = get_var_design_; \ + clazz->get_var_blend = get_var_blend_; \ + clazz->done_blend = done_blend_; \ } #endif /* FT_CONFIG_OPTION_PIC */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svotval.h b/thirdparty/freetype/include/freetype/internal/services/svotval.h index bc929d4bd9..ac84abee46 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svotval.h +++ b/thirdparty/freetype/include/freetype/internal/services/svotval.h @@ -4,7 +4,7 @@ /* */ /* The FreeType OpenType validation service (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svpfr.h b/thirdparty/freetype/include/freetype/internal/services/svpfr.h index d0f7c4df95..c9a182fe39 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svpfr.h +++ b/thirdparty/freetype/include/freetype/internal/services/svpfr.h @@ -4,7 +4,7 @@ /* */ /* Internal PFR service functions (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svpostnm.h b/thirdparty/freetype/include/freetype/internal/services/svpostnm.h index f124380050..022cdec195 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svpostnm.h +++ b/thirdparty/freetype/include/freetype/internal/services/svpostnm.h @@ -4,7 +4,7 @@ /* */ /* The FreeType PostScript name services (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svprop.h b/thirdparty/freetype/include/freetype/internal/services/svprop.h index 870e90ed7c..eb2d4eed15 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svprop.h +++ b/thirdparty/freetype/include/freetype/internal/services/svprop.h @@ -4,7 +4,7 @@ /* */ /* The FreeType property service (specification). */ /* */ -/* Copyright 2012-2016 by */ +/* Copyright 2012-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,7 +29,8 @@ FT_BEGIN_HEADER typedef FT_Error (*FT_Properties_SetFunc)( FT_Module module, const char* property_name, - const void* value ); + const void* value, + FT_Bool value_is_string ); typedef FT_Error (*FT_Properties_GetFunc)( FT_Module module, diff --git a/thirdparty/freetype/include/freetype/internal/services/svpscmap.h b/thirdparty/freetype/include/freetype/internal/services/svpscmap.h index 9acc21690f..b32122e5d6 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svpscmap.h +++ b/thirdparty/freetype/include/freetype/internal/services/svpscmap.h @@ -4,7 +4,7 @@ /* */ /* The FreeType PostScript charmap service (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svpsinfo.h b/thirdparty/freetype/include/freetype/internal/services/svpsinfo.h index f2c8060440..0220ce529c 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svpsinfo.h +++ b/thirdparty/freetype/include/freetype/internal/services/svpsinfo.h @@ -4,7 +4,7 @@ /* */ /* The FreeType PostScript info service (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svsfnt.h b/thirdparty/freetype/include/freetype/internal/services/svsfnt.h index 0f38cf195f..49d18e43e0 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svsfnt.h +++ b/thirdparty/freetype/include/freetype/internal/services/svsfnt.h @@ -4,7 +4,7 @@ /* */ /* The FreeType SFNT table loading service (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svttcmap.h b/thirdparty/freetype/include/freetype/internal/services/svttcmap.h index 772c72189e..30f7feec71 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svttcmap.h +++ b/thirdparty/freetype/include/freetype/internal/services/svttcmap.h @@ -4,7 +4,7 @@ /* */ /* The FreeType TrueType/sfnt cmap extra information service. */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* Masatake YAMATO, Redhat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svtteng.h b/thirdparty/freetype/include/freetype/internal/services/svtteng.h index c55061a034..e4b368ad40 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svtteng.h +++ b/thirdparty/freetype/include/freetype/internal/services/svtteng.h @@ -4,7 +4,7 @@ /* */ /* The FreeType TrueType engine query service (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svttglyf.h b/thirdparty/freetype/include/freetype/internal/services/svttglyf.h index c33edd46de..b7793059fd 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svttglyf.h +++ b/thirdparty/freetype/include/freetype/internal/services/svttglyf.h @@ -4,7 +4,7 @@ /* */ /* The FreeType TrueType glyph service. */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* David Turner. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/services/svwinfnt.h b/thirdparty/freetype/include/freetype/internal/services/svwinfnt.h index c2f6d4c6d3..c94b7e1073 100644 --- a/thirdparty/freetype/include/freetype/internal/services/svwinfnt.h +++ b/thirdparty/freetype/include/freetype/internal/services/svwinfnt.h @@ -4,7 +4,7 @@ /* */ /* The FreeType Windows FNT/FONT service (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/sfnt.h b/thirdparty/freetype/include/freetype/internal/sfnt.h index e139315a1f..b8667a003a 100644 --- a/thirdparty/freetype/include/freetype/internal/sfnt.h +++ b/thirdparty/freetype/include/freetype/internal/sfnt.h @@ -4,7 +4,7 @@ /* */ /* High-level `sfnt' driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -458,6 +458,37 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <FuncType> */ + /* TT_Get_Name_ID_Func */ + /* */ + /* <Description> */ + /* Search whether an ENGLISH version for a given name ID is in the */ + /* `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* nameid :: The name id of the name record to return. */ + /* */ + /* <Out> */ + /* win :: If non-negative, an index into the `name' table with */ + /* the corresponding (3,1) or (3,0) Windows entry. */ + /* */ + /* apple :: If non-negative, an index into the `name' table with */ + /* the corresponding (1,0) Apple entry. */ + /* */ + /* <Return> */ + /* 1 if there is either a win or apple entry (or both), 0 otheriwse. */ + /* */ + typedef FT_Bool + (*TT_Get_Name_ID_Func)( TT_Face face, + FT_UShort nameid, + FT_Int *win, + FT_Int *apple ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ /* TT_Load_Table_Func */ /* */ /* <Description> */ @@ -588,6 +619,7 @@ FT_BEGIN_HEADER TT_Get_Metrics_Func get_metrics; TT_Get_Name_Func get_name; + TT_Get_Name_ID_Func get_name_id; } SFNT_Interface; @@ -628,7 +660,8 @@ FT_BEGIN_HEADER set_sbit_strike_, \ load_strike_metrics_, \ get_metrics_, \ - get_name_ ) \ + get_name_, \ + get_name_id_ ) \ static const SFNT_Interface class_ = \ { \ goto_table_, \ @@ -661,6 +694,7 @@ FT_BEGIN_HEADER load_strike_metrics_, \ get_metrics_, \ get_name_, \ + get_name_id_ \ }; #else /* FT_CONFIG_OPTION_PIC */ @@ -699,7 +733,8 @@ FT_BEGIN_HEADER set_sbit_strike_, \ load_strike_metrics_, \ get_metrics_, \ - get_name_ ) \ + get_name_, \ + get_name_id_ ) \ void \ FT_Init_Class_ ## class_( FT_Library library, \ SFNT_Interface* clazz ) \ @@ -736,6 +771,7 @@ FT_BEGIN_HEADER clazz->load_strike_metrics = load_strike_metrics_; \ clazz->get_metrics = get_metrics_; \ clazz->get_name = get_name_; \ + clazz->get_name_id = get_name_id_; \ } #endif /* FT_CONFIG_OPTION_PIC */ diff --git a/thirdparty/freetype/include/freetype/internal/t1types.h b/thirdparty/freetype/include/freetype/internal/t1types.h index 494c011fc7..b2e35d42d1 100644 --- a/thirdparty/freetype/include/freetype/internal/t1types.h +++ b/thirdparty/freetype/include/freetype/internal/t1types.h @@ -5,7 +5,7 @@ /* Basic Type1/Type2 type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/include/freetype/internal/tttypes.h b/thirdparty/freetype/include/freetype/internal/tttypes.h index 4110d50285..c0758e25fc 100644 --- a/thirdparty/freetype/include/freetype/internal/tttypes.h +++ b/thirdparty/freetype/include/freetype/internal/tttypes.h @@ -5,7 +5,7 @@ /* Basic SFNT/TrueType type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -243,7 +243,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* <Struct> */ - /* TT_NameEntryRec */ + /* TT_NameRec */ /* */ /* <Description> */ /* A structure modeling TrueType name records. Name records are used */ @@ -267,7 +267,7 @@ FT_BEGIN_HEADER /* string :: A pointer to the string's bytes. Note that these */ /* are usually UTF-16 encoded characters. */ /* */ - typedef struct TT_NameEntryRec_ + typedef struct TT_NameRec_ { FT_UShort platformID; FT_UShort encodingID; @@ -279,9 +279,39 @@ FT_BEGIN_HEADER /* this last field is not defined in the spec */ /* but used by the FreeType engine */ - FT_Byte* string; + FT_Byte* string; - } TT_NameEntryRec, *TT_NameEntry; + } TT_NameRec, *TT_Name; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_LangTagRec */ + /* */ + /* <Description> */ + /* A structure modeling language tag records in SFNT `name' tables, */ + /* introduced in OpenType version 1.6. */ + /* */ + /* <Fields> */ + /* stringLength :: The length of the string in bytes. */ + /* */ + /* stringOffset :: The offset to the string in the `name' table. */ + /* */ + /* string :: A pointer to the string's bytes. Note that these */ + /* are UTF-16BE encoded characters. */ + /* */ + typedef struct TT_LangTagRec_ + { + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_LangTagRec, *TT_LangTag; /*************************************************************************/ @@ -293,24 +323,30 @@ FT_BEGIN_HEADER /* A structure modeling the TrueType name table. */ /* */ /* <Fields> */ - /* format :: The format of the name table. */ + /* format :: The format of the name table. */ + /* */ + /* numNameRecords :: The number of names in table. */ /* */ - /* numNameRecords :: The number of names in table. */ + /* storageOffset :: The offset of the name table in the `name' */ + /* TrueType table. */ /* */ - /* storageOffset :: The offset of the name table in the `name' */ - /* TrueType table. */ + /* names :: An array of name records. */ /* */ - /* names :: An array of name records. */ + /* numLangTagRecords :: The number of language tags in table. */ /* */ - /* stream :: the file's input stream. */ + /* langTags :: An array of language tag records. */ + /* */ + /* stream :: The file's input stream. */ /* */ typedef struct TT_NameTableRec_ { - FT_UShort format; - FT_UInt numNameRecords; - FT_UInt storageOffset; - TT_NameEntryRec* names; - FT_Stream stream; + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameRec* names; + FT_UInt numLangTagRecords; + TT_LangTagRec* langTags; + FT_Stream stream; } TT_NameTableRec, *TT_NameTable; @@ -1060,6 +1096,34 @@ FT_BEGIN_HEADER } TT_SbitTableType; + /* OpenType 1.8 brings new tables for variation font support; */ + /* to make the old MM and GX fonts still work we need to check */ + /* the presence (and validity) of the functionality provided */ + /* by those tables. The following flag macros are for the */ + /* field `variation_support'. */ + /* */ + /* Note that `fvar' gets checked immediately at font loading, */ + /* while the other features are only loaded if MM support is */ + /* actually requested. */ + + /* FVAR */ +#define TT_FACE_FLAG_VAR_FVAR ( 1 << 0 ) + + /* HVAR */ +#define TT_FACE_FLAG_VAR_HADVANCE ( 1 << 1 ) +#define TT_FACE_FLAG_VAR_LSB ( 1 << 2 ) +#define TT_FACE_FLAG_VAR_RSB ( 1 << 3 ) + + /* VVAR */ +#define TT_FACE_FLAG_VAR_VADVANCE ( 1 << 4 ) +#define TT_FACE_FLAG_VAR_TSB ( 1 << 5 ) +#define TT_FACE_FLAG_VAR_BSB ( 1 << 6 ) +#define TT_FACE_FLAG_VAR_VORG ( 1 << 7 ) + + /* MVAR */ +#define TT_FACE_FLAG_VAR_MVAR ( 1 << 8 ) + + /*************************************************************************/ /* */ /* TrueType Face Type */ @@ -1161,6 +1225,11 @@ FT_BEGIN_HEADER /* */ /* psnames :: A pointer to the PostScript names service. */ /* */ + /* mm :: A pointer to the Multiple Masters service. */ + /* */ + /* var :: A pointer to the Metrics Variations */ + /* service. */ + /* */ /* hdmx :: The face's horizontal device metrics */ /* (`hdmx' table). This table is optional in */ /* TrueType/OpenType fonts. */ @@ -1182,18 +1251,6 @@ FT_BEGIN_HEADER /* file `ttconfig.h' for comments on the */ /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ /* */ - /* num_locations :: The number of glyph locations in this */ - /* TrueType file. This should be */ - /* identical to the number of glyphs. */ - /* Ignored for Type 2 fonts. */ - /* */ - /* glyph_locations :: An array of longs. These are offsets to */ - /* glyph data within the `glyf' table. */ - /* Ignored for Type 2 font faces. */ - /* */ - /* glyf_len :: The length of the `glyf' table. Needed */ - /* for malformed `loca' tables. */ - /* */ /* font_program_size :: Size in bytecodes of the face's font */ /* program. 0 if none defined. Ignored for */ /* Type 2 fonts. */ @@ -1219,20 +1276,22 @@ FT_BEGIN_HEADER /* units. Comes from the `cvt ' table. */ /* Ignored for Type 2 fonts. */ /* */ - /* num_kern_pairs :: The number of kerning pairs present in the */ - /* font file. The engine only loads the */ - /* first horizontal format 0 kern table it */ - /* finds in the font file. Ignored for */ - /* Type 2 fonts. */ - /* */ - /* kern_table_index :: The index of the kerning table in the font */ - /* kerning directory. Ignored for Type 2 */ - /* fonts. */ - /* */ /* interpreter :: A pointer to the TrueType bytecode */ /* interpreters field is also used to hook */ /* the debugger in `ttdebug'. */ /* */ + /* extra :: Reserved for third-party font drivers. */ + /* */ + /* postscript_name :: The PS name of the font. Used by the */ + /* postscript name service. */ + /* */ + /* glyf_len :: The length of the `glyf' table. Needed */ + /* for malformed `loca' tables. */ + /* */ + /* glyf_offset :: The file offset of the `glyf' table. */ + /* */ + /* is_cff2 :: Set if the font format is CFF2. */ + /* */ /* doblend :: A boolean which is set if the font should */ /* be blended (this is for GX var). */ /* */ @@ -1240,10 +1299,98 @@ FT_BEGIN_HEADER /* variation tables (rather like Multiple */ /* Master data). */ /* */ - /* extra :: Reserved for third-party font drivers. */ + /* is_default_instance :: Set if the glyph outlines can be used */ + /* unmodified (i.e., without applying glyph */ + /* variation deltas). */ /* */ - /* postscript_name :: The PS name of the font. Used by the */ - /* postscript name service. */ + /* variation_support :: Flags that indicate which OpenType */ + /* functionality related to font variation */ + /* support is present, valid, and usable. */ + /* For example, TT_FACE_FLAG_VAR_FVAR is only */ + /* set if we have at least one design axis. */ + /* */ + /* var_postscript_prefix :: */ + /* The PostScript name prefix needed for */ + /* constructing a variation font instance's */ + /* PS name . */ + /* */ + /* var_postscript_prefix_len :: */ + /* The length of the `var_postscript_prefix' */ + /* string. */ + /* */ + /* horz_metrics_size :: The size of the `hmtx' table. */ + /* */ + /* vert_metrics_size :: The size of the `vmtx' table. */ + /* */ + /* num_locations :: The number of glyph locations in this */ + /* TrueType file. This should be */ + /* identical to the number of glyphs. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* glyph_locations :: An array of longs. These are offsets to */ + /* glyph data within the `glyf' table. */ + /* Ignored for Type 2 font faces. */ + /* */ + /* hdmx_table :: A pointer to the `hdmx' table. */ + /* */ + /* hdmx_table_size :: The size of the `hdmx' table. */ + /* */ + /* hdmx_record_count :: The number of hdmx records. */ + /* */ + /* hdmx_record_size :: The size of a single hdmx record. */ + /* */ + /* hdmx_record_sizes :: An array holding the ppem sizes available */ + /* in the `hdmx' table. */ + /* */ + /* sbit_table :: A pointer to the font's embedded bitmap */ + /* location table. */ + /* */ + /* sbit_table_size :: The size of `sbit_table'. */ + /* */ + /* sbit_table_type :: The sbit table type (CBLC, sbix, etc.). */ + /* */ + /* sbit_num_strikes :: The number of sbit strikes exposed by */ + /* FreeType's API, omitting invalid strikes. */ + /* */ + /* sbit_strike_map :: A mapping between the strike indices */ + /* exposed by the API and the indices used in */ + /* the font's sbit table. */ + /* */ + /* kern_table :: A pointer to the `kern' table. */ + /* */ + /* kern_table_size :: The size of the `kern' table. */ + /* */ + /* num_kern_tables :: The number of supported kern subtables */ + /* (up to 32; FreeType recognizes only */ + /* horizontal ones with format 0). */ + /* */ + /* kern_avail_bits :: The availability status of kern subtables; */ + /* if bit n is set, table n is available. */ + /* */ + /* kern_order_bits :: The sortedness status of kern subtables; */ + /* if bit n is set, table n is sorted. */ + /* */ + /* bdf :: Data related to an SFNT font's `bdf' */ + /* table; see `tttypes.h'. */ + /* */ + /* horz_metrics_offset :: The file offset of the `hmtx' table. */ + /* */ + /* vert_metrics_offset :: The file offset of the `vmtx' table. */ + /* */ + /* sph_found_func_flags :: Flags identifying special bytecode */ + /* functions (used by the v38 implementation */ + /* of the bytecode interpreter). */ + /* */ + /* sph_compatibility_mode :: */ + /* This flag is set if we are in ClearType */ + /* backward compatibility mode (used by the */ + /* v38 implementation of the bytecode */ + /* interpreter). */ + /* */ + /* ebdt_start :: The file offset of the sbit data table */ + /* (CBDT, bdat, etc.). */ + /* */ + /* ebdt_size :: The size of the sbit data table. */ /* */ typedef struct TT_FaceRec_ { @@ -1288,6 +1435,16 @@ FT_BEGIN_HEADER /* handle glyph names <-> unicode & Mac values */ void* psnames; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* a typeless pointer to the FT_Service_MultiMasters table used to */ + /* handle variation fonts */ + void* mm; + + /* a typeless pointer to the FT_Service_MetricsVariationsRec table */ + /* used to handle the HVAR, VVAR, and MVAR OpenType tables */ + void* var; +#endif + /***********************************************************************/ /* */ @@ -1311,7 +1468,7 @@ FT_BEGIN_HEADER /***********************************************************************/ /* */ - /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* TrueType-specific fields (ignored by the CFF driver) */ /* */ /***********************************************************************/ @@ -1344,18 +1501,25 @@ FT_BEGIN_HEADER const char* postscript_name; FT_ULong glyf_len; + FT_ULong glyf_offset; /* since 2.7.1 */ + + FT_Bool is_cff2; /* since 2.7.1 */ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_Bool doblend; GX_Blend blend; + + FT_Bool is_default_instance; /* since 2.7.1 */ + FT_UInt32 variation_support; /* since 2.7.1 */ + + const char* var_postscript_prefix; /* since 2.7.2 */ + FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ + #endif /* since version 2.2 */ - FT_Byte* horz_metrics; FT_ULong horz_metrics_size; - - FT_Byte* vert_metrics; FT_ULong vert_metrics_size; FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ @@ -1371,6 +1535,7 @@ FT_BEGIN_HEADER FT_ULong sbit_table_size; TT_SbitTableType sbit_table_type; FT_UInt sbit_num_strikes; + FT_UInt* sbit_strike_map; FT_Byte* kern_table; FT_ULong kern_table_size; @@ -1393,6 +1558,12 @@ FT_BEGIN_HEADER FT_Bool sph_compatibility_mode; #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + /* since 2.7 */ + FT_ULong ebdt_start; /* either `CBDT', `EBDT', or `bdat' */ + FT_ULong ebdt_size; +#endif + } TT_FaceRec; @@ -1485,8 +1656,6 @@ FT_BEGIN_HEADER FT_Vector pp1; FT_Vector pp2; - FT_ULong glyf_offset; - /* the zone where we load our glyphs */ TT_GlyphZoneRec base; TT_GlyphZoneRec zone; diff --git a/thirdparty/freetype/include/freetype/t1tables.h b/thirdparty/freetype/include/freetype/t1tables.h index e272324ba2..3f6b36e108 100644 --- a/thirdparty/freetype/include/freetype/t1tables.h +++ b/thirdparty/freetype/include/freetype/t1tables.h @@ -5,7 +5,7 @@ /* Basic Type 1/Type 2 tables definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -291,7 +291,7 @@ FT_BEGIN_HEADER } PS_DesignMapRec, *PS_DesignMap; - /* backwards-compatible definition */ + /* backward compatible definition */ typedef PS_DesignMapRec T1_DesignMap; @@ -326,7 +326,7 @@ FT_BEGIN_HEADER } PS_BlendRec, *PS_Blend; - /* backwards-compatible definition */ + /* backward compatible definition */ typedef PS_BlendRec T1_Blend; diff --git a/thirdparty/freetype/include/freetype/ttnameid.h b/thirdparty/freetype/include/freetype/ttnameid.h index ce707f1645..494d677186 100644 --- a/thirdparty/freetype/include/freetype/ttnameid.h +++ b/thirdparty/freetype/include/freetype/ttnameid.h @@ -4,7 +4,7 @@ /* */ /* TrueType name ID definitions (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -36,7 +36,7 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ /* Possible values for the `platform' identifier code in the name */ - /* records of the TTF `name' table. */ + /* records of an SFNT `name' table. */ /* */ /*************************************************************************/ @@ -119,14 +119,19 @@ FT_BEGIN_HEADER * TT_APPLE_ID_VARIANT_SELECTOR :: * From Adobe, not Apple. Not a normal cmap. Specifies variations * on a real cmap. + * + * TT_APPLE_ID_FULL_UNICODE :: + * Used for fallback fonts that provide complete Unicode coverage with + * a type~13 cmap. */ -#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ -#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ -#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ -#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ #define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ -#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ +#define TT_APPLE_ID_FULL_UNICODE 6 /* used with type 13 cmaps */ /*********************************************************************** @@ -137,42 +142,6 @@ FT_BEGIN_HEADER * @description: * A list of valid values for the `encoding_id' for * @TT_PLATFORM_MACINTOSH charmaps and name entries. - * - * @values: - * TT_MAC_ID_ROMAN :: - * TT_MAC_ID_JAPANESE :: - * TT_MAC_ID_TRADITIONAL_CHINESE :: - * TT_MAC_ID_KOREAN :: - * TT_MAC_ID_ARABIC :: - * TT_MAC_ID_HEBREW :: - * TT_MAC_ID_GREEK :: - * TT_MAC_ID_RUSSIAN :: - * TT_MAC_ID_RSYMBOL :: - * TT_MAC_ID_DEVANAGARI :: - * TT_MAC_ID_GURMUKHI :: - * TT_MAC_ID_GUJARATI :: - * TT_MAC_ID_ORIYA :: - * TT_MAC_ID_BENGALI :: - * TT_MAC_ID_TAMIL :: - * TT_MAC_ID_TELUGU :: - * TT_MAC_ID_KANNADA :: - * TT_MAC_ID_MALAYALAM :: - * TT_MAC_ID_SINHALESE :: - * TT_MAC_ID_BURMESE :: - * TT_MAC_ID_KHMER :: - * TT_MAC_ID_THAI :: - * TT_MAC_ID_LAOTIAN :: - * TT_MAC_ID_GEORGIAN :: - * TT_MAC_ID_ARMENIAN :: - * TT_MAC_ID_MALDIVIAN :: - * TT_MAC_ID_SIMPLIFIED_CHINESE :: - * TT_MAC_ID_TIBETAN :: - * TT_MAC_ID_MONGOLIAN :: - * TT_MAC_ID_GEEZ :: - * TT_MAC_ID_SLAVIC :: - * TT_MAC_ID_VIETNAMESE :: - * TT_MAC_ID_SINDHI :: - * TT_MAC_ID_UNINTERP :: */ #define TT_MAC_ID_ROMAN 0 @@ -247,44 +216,47 @@ FT_BEGIN_HEADER * * @values: * TT_MS_ID_SYMBOL_CS :: - * Corresponds to Microsoft symbol encoding. See - * @FT_ENCODING_MS_SYMBOL. + * Microsoft symbol encoding. See @FT_ENCODING_MS_SYMBOL. * * TT_MS_ID_UNICODE_CS :: - * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * Microsoft WGL4 charmap, matching Unicode. See * @FT_ENCODING_UNICODE. * * TT_MS_ID_SJIS :: - * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * Shift JIS Japanese encoding. See @FT_ENCODING_SJIS. * - * TT_MS_ID_GB2312 :: - * Corresponds to Simplified Chinese as used in Mainland China. See - * @FT_ENCODING_GB2312. + * TT_MS_ID_PRC :: + * Chinese encodings as used in the People's Republic of China (PRC). + * This means the encodings GB~2312 and its supersets GBK and + * GB~18030. See @FT_ENCODING_PRC. * * TT_MS_ID_BIG_5 :: - * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. - * See @FT_ENCODING_BIG5. + * Traditional Chinese as used in Taiwan and Hong Kong. See + * @FT_ENCODING_BIG5. * * TT_MS_ID_WANSUNG :: - * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * Korean Extended Wansung encoding. See @FT_ENCODING_WANSUNG. * * TT_MS_ID_JOHAB :: - * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * Korean Johab encoding. See @FT_ENCODING_JOHAB. * * TT_MS_ID_UCS_4 :: - * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to - * the OpenType specification version 1.4 (mid-2001.) + * UCS-4 or UTF-32 charmaps. This has been added to the OpenType + * specification version 1.4 (mid-2001). */ #define TT_MS_ID_SYMBOL_CS 0 #define TT_MS_ID_UNICODE_CS 1 #define TT_MS_ID_SJIS 2 -#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_PRC 3 #define TT_MS_ID_BIG_5 4 #define TT_MS_ID_WANSUNG 5 #define TT_MS_ID_JOHAB 6 #define TT_MS_ID_UCS_4 10 + /* this value is deprecated */ +#define TT_MS_ID_GB2312 TT_MS_ID_PRC + /*********************************************************************** * @@ -312,17 +284,22 @@ FT_BEGIN_HEADER #define TT_ADOBE_ID_LATIN_1 3 - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MACINTOSH. These values are also used as return values */ - /* for function @FT_Get_CMap_Language_ID. */ - /* */ - /* The canonical source for the Apple assigned Language ID's is at */ - /* */ - /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html */ - /* */ + /*********************************************************************** + * + * @enum: + * TT_MAC_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT `name' table if the `platform' identifier code is + * @TT_PLATFORM_MACINTOSH. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Apple's IDs is + * + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + */ + #define TT_MAC_LANGID_ENGLISH 0 #define TT_MAC_LANGID_FRENCH 1 #define TT_MAC_LANGID_GERMAN 2 @@ -433,15 +410,6 @@ FT_BEGIN_HEADER #define TT_MAC_LANGID_JAVANESE 138 #define TT_MAC_LANGID_SUNDANESE 139 - -#if 0 /* these seem to be errors that have been dropped */ - -#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 -#define TT_MAC_LANGID_IRISH_GAELIC 141 - -#endif - - /* The following codes are new as of 2000-03-10 */ #define TT_MAC_LANGID_GALICIAN 140 #define TT_MAC_LANGID_AFRIKAANS 141 @@ -456,18 +424,30 @@ FT_BEGIN_HEADER #define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 - /*************************************************************************/ - /* */ - /* Possible values of the language identifier field in the name records */ - /* of the TTF `name' table if the `platform' identifier code is */ - /* TT_PLATFORM_MICROSOFT. */ - /* */ - /* The canonical source for the MS assigned LCIDs is */ - /* */ - /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ - /* */ + /*********************************************************************** + * + * @enum: + * TT_MS_LANGID_XXX + * + * @description: + * Possible values of the language identifier field in the name records + * of the SFNT `name' table if the `platform' identifier code is + * @TT_PLATFORM_MICROSOFT. These values are also used as return values + * for function @FT_Get_CMap_Language_ID. + * + * The canonical source for Microsoft's IDs is + * + * http://www.microsoft.com/globaldev/reference/lcid-all.mspx , + * + * however, we only provide macros for language identifiers present in + * the OpenType specification: Microsoft has abandoned the concept of + * LCIDs (language code identifiers), and format~1 of the `name' table + * provides a better mechanism for languages not covered here. + * + * More legacy values not listed in the reference can be found in the + * @FT_TRUETYPE_IDS_H header file. + */ -#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 #define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 #define TT_MS_LANGID_ARABIC_IRAQ 0x0801 #define TT_MS_LANGID_ARABIC_EGYPT 0x0C01 @@ -485,39 +465,20 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_ARABIC_BAHRAIN 0x3C01 #define TT_MS_LANGID_ARABIC_QATAR 0x4001 #define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 -#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 -#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CATALAN_CATALAN 0x0403 #define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 #define TT_MS_LANGID_CHINESE_PRC 0x0804 #define TT_MS_LANGID_CHINESE_HONG_KONG 0x0C04 #define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 - -#if 1 /* this looks like the correct value */ -#define TT_MS_LANGID_CHINESE_MACAU 0x1404 -#else /* but beware, Microsoft may change its mind... - the most recent Word reference has the following: */ -#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG -#endif - -#if 0 /* used only with .NET `cultures'; commented out */ -#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 -#endif - +#define TT_MS_LANGID_CHINESE_MACAO 0x1404 #define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 #define TT_MS_LANGID_DANISH_DENMARK 0x0406 #define TT_MS_LANGID_GERMAN_GERMANY 0x0407 #define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 #define TT_MS_LANGID_GERMAN_AUSTRIA 0x0C07 #define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 -#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN 0x1407 #define TT_MS_LANGID_GREEK_GREECE 0x0408 - - /* don't ask what this one means... It is commented out currently. */ -#if 0 -#define TT_MS_LANGID_GREEK_GREECE2 0x2008 -#endif - -#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 #define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 #define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 #define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0C09 @@ -531,14 +492,12 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2C09 #define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 #define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 -#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 -#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 #define TT_MS_LANGID_ENGLISH_INDIA 0x4009 #define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 #define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 #define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040A #define TT_MS_LANGID_SPANISH_MEXICO 0x080A -#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0C0A +#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT 0x0C0A #define TT_MS_LANGID_SPANISH_GUATEMALA 0x100A #define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140A #define TT_MS_LANGID_SPANISH_PANAMA 0x180A @@ -557,9 +516,6 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_SPANISH_NICARAGUA 0x4C0A #define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500A #define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540A - /* The following ID blatantly violate MS specs by using a */ - /* sublanguage > 0x1F. */ -#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU #define TT_MS_LANGID_FINNISH_FINLAND 0x040B #define TT_MS_LANGID_FRENCH_FRANCE 0x040C #define TT_MS_LANGID_FRENCH_BELGIUM 0x080C @@ -567,27 +523,13 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100C #define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140C #define TT_MS_LANGID_FRENCH_MONACO 0x180C -#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C -#define TT_MS_LANGID_FRENCH_REUNION 0x200C -#define TT_MS_LANGID_FRENCH_CONGO 0x240C - /* which was formerly: */ -#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO -#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C -#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C -#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C -#define TT_MS_LANGID_FRENCH_MALI 0x340C -#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C -#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C - /* and another violation of the spec (see 0xE40AU) */ -#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU #define TT_MS_LANGID_HEBREW_ISRAEL 0x040D #define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040E #define TT_MS_LANGID_ICELANDIC_ICELAND 0x040F #define TT_MS_LANGID_ITALIAN_ITALY 0x0410 #define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 #define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 -#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 -#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_KOREAN_KOREA 0x0412 #define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 #define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 #define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 @@ -595,26 +537,17 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_POLISH_POLAND 0x0415 #define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 #define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 -#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANSH_SWITZERLAND 0x0417 #define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 -#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 #define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 -#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 #define TT_MS_LANGID_CROATIAN_CROATIA 0x041A #define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081A #define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0C1A - -#if 0 /* this used to be this value, but it looks like we were wrong */ -#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101A -#else /* current sources say */ #define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101A #define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141A - /* and XPsp2 Platform SDK added (2004-07-26) */ - /* Names are shortened to be significant within 40 chars. */ #define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181A -#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181A -#endif - +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x1C1A +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC 0x201A #define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041B #define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041C #define TT_MS_LANGID_SWEDISH_SWEDEN 0x041D @@ -622,36 +555,30 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_THAI_THAILAND 0x041E #define TT_MS_LANGID_TURKISH_TURKEY 0x041F #define TT_MS_LANGID_URDU_PAKISTAN 0x0420 -#define TT_MS_LANGID_URDU_INDIA 0x0820 #define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 #define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 #define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 -#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_SLOVENIAN_SLOVENIA 0x0424 #define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 #define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 #define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 -#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 #define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 -#define TT_MS_LANGID_FARSI_IRAN 0x0429 #define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042A #define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042B #define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042C #define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082C -#define TT_MS_LANGID_BASQUE_SPAIN 0x042D -#define TT_MS_LANGID_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_BASQUE_BASQUE 0x042D +#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY 0x042E +#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY 0x082E #define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042F -#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 -#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 -#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 -#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 -#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 -#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA 0x0435 #define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 #define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 #define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 #define TT_MS_LANGID_HINDI_INDIA 0x0439 #define TT_MS_LANGID_MALTESE_MALTA 0x043A - /* Added by XPsp2 Platform SDK (2004-07-26) */ #define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043B #define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083B #define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3B @@ -661,37 +588,21 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3B #define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203B #define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243B - /* ... and we also keep our old identifier... */ -#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B - -#if 0 /* this seems to be a previous inversion */ -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C -#else -#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C -#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C -#endif - -#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_IRISH_IRELAND 0x083C #define TT_MS_LANGID_MALAY_MALAYSIA 0x043E #define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083E -#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043F -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ - TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN - -#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN 0x043F +#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic*/ 0x0440 +#define TT_MS_LANGID_KISWAHILI_KENYA 0x0441 #define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 -#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_TATAR_RUSSIA 0x0444 #define TT_MS_LANGID_BENGALI_INDIA 0x0445 #define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 #define TT_MS_LANGID_PUNJABI_INDIA 0x0446 -#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 #define TT_MS_LANGID_GUJARATI_INDIA 0x0447 -#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_ODIA_INDIA 0x0448 #define TT_MS_LANGID_TAMIL_INDIA 0x0449 #define TT_MS_LANGID_TELUGU_INDIA 0x044A #define TT_MS_LANGID_KANNADA_INDIA 0x044B @@ -700,142 +611,241 @@ FT_BEGIN_HEADER #define TT_MS_LANGID_MARATHI_INDIA 0x044E #define TT_MS_LANGID_SANSKRIT_INDIA 0x044F #define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 -#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 -#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 - /* Don't use the next constant! It has */ - /* (1) the wrong spelling (Dzonghka) */ - /* (2) Microsoft doesn't officially define it -- */ - /* at least it is not in the List of Local */ - /* ID Values. */ - /* (3) Dzongkha is not the same language as */ - /* Tibetan, so merging it is wrong anyway. */ - /* */ - /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ -#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 - -#if 0 - /* the following used to be defined */ -#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 - /* ... but it was changed; */ -#else - /* So we will continue to #define it, but with the correct value */ -#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN -#endif - -#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_MONGOLIAN_PRC 0x0850 +#define TT_MS_LANGID_TIBETAN_PRC 0x0451 +#define TT_MS_LANGID_WELSH_UNITED_KINGDOM 0x0452 #define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 #define TT_MS_LANGID_LAO_LAOS 0x0454 -#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 -#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_GALICIAN_GALICIAN 0x0456 #define TT_MS_LANGID_KONKANI_INDIA 0x0457 -#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 -#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 -#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 - /* Missing a LCID for Sindhi in Devanagari script */ #define TT_MS_LANGID_SYRIAC_SYRIA 0x045A -#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045B -#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_SINHALA_SRI_LANKA 0x045B #define TT_MS_LANGID_INUKTITUT_CANADA 0x045D +#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN 0x085D #define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045E -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F -#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085F - /* Missing a LCID for Tifinagh script */ -#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 - /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ - /* script is yet unclear... might be Arabic, Nagari or Sharada */ -#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 - /* ... and aliased (by MS) for compatibility reasons. */ -#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_TAMAZIGHT_ALGERIA 0x085F #define TT_MS_LANGID_NEPALI_NEPAL 0x0461 -#define TT_MS_LANGID_NEPALI_INDIA 0x0861 #define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 #define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 #define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 #define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 - /* alias declared in Windows 2000 */ -#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES -#define TT_MS_LANGID_EDO_NIGERIA 0x0466 -#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 #define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 -#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 #define TT_MS_LANGID_YORUBA_NIGERIA 0x046A #define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046B #define TT_MS_LANGID_QUECHUA_ECUADOR 0x086B #define TT_MS_LANGID_QUECHUA_PERU 0x0C6B -#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046C - /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ -#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ - TT_MS_LANGID_SEPEDI_SOUTH_AFRICA - /* language codes 0x046D, 0x046E and 0x046F are (still) unknown. */ +#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA 0x046C +#define TT_MS_LANGID_BASHKIR_RUSSIA 0x046D +#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG 0x046E +#define TT_MS_LANGID_GREENLANDIC_GREENLAND 0x046F #define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_YI_PRC 0x0478 +#define TT_MS_LANGID_MAPUDUNGUN_CHILE 0x047A +#define TT_MS_LANGID_MOHAWK_MOHAWK 0x047C +#define TT_MS_LANGID_BRETON_FRANCE 0x047E +#define TT_MS_LANGID_UIGHUR_PRC 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_OCCITAN_FRANCE 0x0482 +#define TT_MS_LANGID_CORSICAN_FRANCE 0x0483 +#define TT_MS_LANGID_ALSATIAN_FRANCE 0x0484 +#define TT_MS_LANGID_YAKUT_RUSSIA 0x0485 +#define TT_MS_LANGID_KICHE_GUATEMALA 0x0486 +#define TT_MS_LANGID_KINYARWANDA_RWANDA 0x0487 +#define TT_MS_LANGID_WOLOF_SENEGAL 0x0488 +#define TT_MS_LANGID_DARI_AFGHANISTAN 0x048C + + /* */ + + + /* legacy macro definitions not present in OpenType 1.8.1 */ +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_CATALAN_SPAIN \ + TT_MS_LANGID_CATALAN_CATALAN +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_MACAU \ + TT_MS_LANGID_CHINESE_MACAO +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \ + TT_MS_LANGID_GERMAN_LIECHTENSTEIN +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3C09 +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \ + TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40AU +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1C0C +#define TT_MS_LANGID_FRENCH_REUNION 0x200C +#define TT_MS_LANGID_FRENCH_CONGO 0x240C + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE \ + TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280C +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2C0C +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300C +#define TT_MS_LANGID_FRENCH_MALI 0x340C +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380C +#define TT_MS_LANGID_FRENCH_HAITI 0x3C0C +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40CU +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \ + TT_MS_LANGID_KOREAN_KOREA +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \ + TT_MS_LANGID_ROMANSH_SWITZERLAND +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_SLOVENE_SLOVENIA \ + TT_MS_LANGID_SLOVENIAN_SLOVENIA +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_BASQUE_SPAIN \ + TT_MS_LANGID_BASQUE_BASQUE +#define TT_MS_LANGID_SORBIAN_GERMANY \ + TT_MS_LANGID_UPPER_SORBIAN_GERMANY +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \ + TT_MS_LANGID_SETSWANA_SOUTH_AFRICA +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \ + TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \ + TT_MS_LANGID_ISIZULU_SOUTH_AFRICA +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043B + /* the next two values are incorrectly inverted */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043C +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083C +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043D +#define TT_MS_LANGID_KAZAK_KAZAKSTAN \ + TT_MS_LANGID_KAZAKH_KAZAKHSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \ + TT_MS_LANGID_KYRGYZ_KYRGYZSTAN +#define TT_MS_LANGID_SWAHILI_KENYA \ + TT_MS_LANGID_KISWAHILI_KENYA +#define TT_MS_LANGID_TATAR_TATARSTAN \ + TT_MS_LANGID_TATAR_RUSSIA +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_ORIYA_INDIA \ + TT_MS_LANGID_ODIA_INDIA +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \ + TT_MS_LANGID_MONGOLIAN_PRC +#define TT_MS_LANGID_TIBETAN_CHINA \ + TT_MS_LANGID_TIBETAN_PRC +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 +#define TT_MS_LANGID_TIBETAN_BHUTAN \ + TT_MS_LANGID_DZONGHKA_BHUTAN +#define TT_MS_LANGID_WELSH_WALES \ + TT_MS_LANGID_WELSH_UNITED_KINGDOM +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN \ + TT_MS_LANGID_GALICIAN_GALICIAN +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 +#define TT_MS_LANGID_SINHALESE_SRI_LANKA \ + TT_MS_LANGID_SINHALA_SRI_LANKA +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045C +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045F +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \ + TT_MS_LANGID_TAMAZIGHT_ALGERIA +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 +#define TT_MS_LANGID_KASHMIRI_INDIA \ + TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_DIVEHI_MALDIVES \ + TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA #define TT_MS_LANGID_KANURI_NIGERIA 0x0471 #define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 #define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 #define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 - /* also spelled in the `Passport SDK' list as: */ -#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_TIGRIGNA_ERYTREA \ + TT_MS_LANGID_TIGRIGNA_ERYTHREA #define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 #define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 #define TT_MS_LANGID_LATIN 0x0476 #define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 - /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ - /* not written (but OTOH the peculiar writing system is worth */ - /* studying). */ -#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_YI_CHINA \ + TT_MS_LANGID_YI_PRC #define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 - /* language codes from 0x047A to 0x047F are (still) unknown. */ -#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 -#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 +#define TT_MS_LANGID_UIGHUR_CHINA \ + TT_MS_LANGID_UIGHUR_PRC -#if 0 /* not deemed useful for fonts */ -#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04FF -#endif + /*********************************************************************** + * + * @enum: + * TT_NAME_ID_XXX + * + * @description: + * Possible values of the `name' identifier field in the name records of + * an SFNT `name' table. These values are platform independent. + */ - /*************************************************************************/ - /* */ - /* Possible values of the `name' identifier field in the name records of */ - /* the TTF `name' table. These values are platform independent. */ - /* */ -#define TT_NAME_ID_COPYRIGHT 0 -#define TT_NAME_ID_FONT_FAMILY 1 -#define TT_NAME_ID_FONT_SUBFAMILY 2 -#define TT_NAME_ID_UNIQUE_ID 3 -#define TT_NAME_ID_FULL_NAME 4 -#define TT_NAME_ID_VERSION_STRING 5 -#define TT_NAME_ID_PS_NAME 6 -#define TT_NAME_ID_TRADEMARK 7 +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 /* the following values are from the OpenType spec */ -#define TT_NAME_ID_MANUFACTURER 8 -#define TT_NAME_ID_DESIGNER 9 -#define TT_NAME_ID_DESCRIPTION 10 -#define TT_NAME_ID_VENDOR_URL 11 -#define TT_NAME_ID_DESIGNER_URL 12 -#define TT_NAME_ID_LICENSE 13 -#define TT_NAME_ID_LICENSE_URL 14 +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 /* number 15 is reserved */ -#define TT_NAME_ID_PREFERRED_FAMILY 16 -#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 -#define TT_NAME_ID_MAC_FULL_NAME 18 +#define TT_NAME_ID_TYPOGRAPHIC_FAMILY 16 +#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 /* The following code is new as of 2000-01-21 */ -#define TT_NAME_ID_SAMPLE_TEXT 19 +#define TT_NAME_ID_SAMPLE_TEXT 19 /* This is new in OpenType 1.3 */ -#define TT_NAME_ID_CID_FINDFONT_NAME 20 +#define TT_NAME_ID_CID_FINDFONT_NAME 20 /* This is new in OpenType 1.5 */ -#define TT_NAME_ID_WWS_FAMILY 21 -#define TT_NAME_ID_WWS_SUBFAMILY 22 +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + /* This is new in OpenType 1.7 */ +#define TT_NAME_ID_LIGHT_BACKGROUND 23 +#define TT_NAME_ID_DARK_BACKGROUND 24 - /*************************************************************************/ - /* */ - /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ - /* */ - /* Updated 08-Nov-2008. */ - /* */ + /* This is new in OpenType 1.8 */ +#define TT_NAME_ID_VARIATIONS_PREFIX 25 + + /* these two values are deprecated */ +#define TT_NAME_ID_PREFERRED_FAMILY TT_NAME_ID_TYPOGRAPHIC_FAMILY +#define TT_NAME_ID_PREFERRED_SUBFAMILY TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY + + + /*********************************************************************** + * + * @enum: + * TT_UCR_XXX + * + * @description: + * Possible bit mask values for the `ulUnicodeRangeX' fields in an SFNT + * `OS/2' table. + */ + + /* ulUnicodeRange1 */ + /* --------------- */ /* Bit 0 Basic Latin */ #define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ @@ -857,7 +867,7 @@ FT_BEGIN_HEADER /* U+A700-U+A71F */ /* Bit 6 Combining Diacritical Marks */ /* Combining Diacritical Marks Supplement */ -#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1L << 6) /* U+0300-U+036F */ /* U+1DC0-U+1DFF */ /* Bit 7 Greek and Coptic */ #define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ @@ -925,12 +935,17 @@ FT_BEGIN_HEADER /* Supplemental Punctuation */ #define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ /* U+2E00-U+2E7F */ + + /* ulUnicodeRange2 */ + /* --------------- */ + /* Bit 32 Superscripts And Subscripts */ #define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ /* Bit 33 Currency Symbols */ #define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ /* Bit 34 Combining Diacritical Marks For Symbols */ -#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + (1L << 2) /* U+20D0-U+20FF */ /* Bit 35 Letterlike Symbols */ #define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ /* Bit 36 Number Forms */ @@ -996,13 +1011,13 @@ FT_BEGIN_HEADER /* Bit 57 High Surrogates */ /* High Private Use Surrogates */ /* Low Surrogates */ - /* */ + /* According to OpenType specs v.1.3+, */ /* setting bit 57 implies that there is */ /* at least one codepoint beyond the */ /* Basic Multilingual Plane that is */ /* supported by this font. So it really */ - /* means >= U+10000 */ + /* means >= U+10000. */ #define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ /* U+DB80-U+DBFF */ /* U+DC00-U+DFFF */ @@ -1034,7 +1049,11 @@ FT_BEGIN_HEADER /* Bit 62 Alphabetic Presentation Forms */ #define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ /* Bit 63 Arabic Presentation Forms-A */ -#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1L << 31) /* U+FB50-U+FDFF */ + + /* ulUnicodeRange3 */ + /* --------------- */ + /* Bit 64 Combining Half Marks */ #define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ /* Bit 65 Vertical forms */ @@ -1044,7 +1063,7 @@ FT_BEGIN_HEADER /* Bit 66 Small Form Variants */ #define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ /* Bit 67 Arabic Presentation Forms-B */ -#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1L << 3) /* U+FE70-U+FEFE */ /* Bit 68 Halfwidth and Fullwidth Forms */ #define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ /* Bit 69 Specials */ @@ -1123,6 +1142,10 @@ FT_BEGIN_HEADER #define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ /* Bit 95 New Tai Lue */ #define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + + /* ulUnicodeRange4 */ + /* --------------- */ + /* Bit 96 Buginese */ #define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ /* Bit 97 Glagolitic */ @@ -1191,42 +1214,18 @@ FT_BEGIN_HEADER /*U+1F000-U+1F02F*/ /* Bit 123-127 Reserved for process-internal usage */ + /* */ - /*************************************************************************/ - /* */ - /* Some compilers have a very limited length of identifiers. */ - /* */ -#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) -#define HAVE_LIMIT_ON_IDENTS -#endif - - -#ifndef HAVE_LIMIT_ON_IDENTS - - - /*************************************************************************/ - /* */ - /* Here some alias #defines in order to be clearer. */ - /* */ - /* These are not always #defined to stay within the 31~character limit, */ - /* which some compilers have. */ - /* */ - /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ - /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ - /* If you get a warning with such a compiler, use the -i40 switch. */ - /* */ -#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ - TT_UCR_ARABIC_PRESENTATIONS_A -#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ - TT_UCR_ARABIC_PRESENTATIONS_B - -#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ - TT_UCR_COMBINING_DIACRITICS -#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ - TT_UCR_COMBINING_DIACRITICS_SYMB - + /* for backward compatibility with older FreeType versions */ +#define TT_UCR_ARABIC_PRESENTATION_A \ + TT_UCR_ARABIC_PRESENTATION_FORMS_A +#define TT_UCR_ARABIC_PRESENTATION_B \ + TT_UCR_ARABIC_PRESENTATION_FORMS_B -#endif /* !HAVE_LIMIT_ON_IDENTS */ +#define TT_UCR_COMBINING_DIACRITICS \ + TT_UCR_COMBINING_DIACRITICAL_MARKS +#define TT_UCR_COMBINING_DIACRITICS_SYMB \ + TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB FT_END_HEADER diff --git a/thirdparty/freetype/include/freetype/tttables.h b/thirdparty/freetype/include/freetype/tttables.h index 1c075dcf66..58312044ca 100644 --- a/thirdparty/freetype/include/freetype/tttables.h +++ b/thirdparty/freetype/include/freetype/tttables.h @@ -5,7 +5,7 @@ /* Basic SFNT/TrueType tables definitions and interface */ /* (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -45,8 +45,9 @@ FT_BEGIN_HEADER /* TrueType specific table types and functions. */ /* */ /* <Description> */ - /* This section contains the definition of TrueType-specific tables */ - /* as well as some routines used to access and process them. */ + /* This section contains definitions of some basic tables specific to */ + /* TrueType and OpenType as well as some routines used to access and */ + /* process them. */ /* */ /* <Order> */ /* TT_Header */ @@ -76,8 +77,8 @@ FT_BEGIN_HEADER /* TT_Header */ /* */ /* <Description> */ - /* A structure used to model a TrueType font header table. All */ - /* fields follow the TrueType specification. */ + /* A structure to model a TrueType font header table. All fields */ + /* follow the OpenType specification. */ /* */ typedef struct TT_Header_ { @@ -114,9 +115,9 @@ FT_BEGIN_HEADER /* TT_HoriHeader */ /* */ /* <Description> */ - /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* A structure to model a TrueType horizontal header, the `hhea' */ /* table, as well as the corresponding horizontal metrics table, */ - /* i.e., the `hmtx' table. */ + /* `hmtx'. */ /* */ /* <Fields> */ /* Version :: The table version. */ @@ -131,7 +132,7 @@ FT_BEGIN_HEADER /* glyphs found in the font (maybe ASCII). */ /* */ /* You should use the `sTypoAscender' field */ - /* of the OS/2 table instead if you want */ + /* of the `OS/2' table instead if you want */ /* the correct one. */ /* */ /* Descender :: The font's descender, i.e., the distance */ @@ -145,7 +146,7 @@ FT_BEGIN_HEADER /* glyphs found in the font (maybe ASCII). */ /* */ /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ + /* field of the `OS/2' table instead if you */ /* want the correct one. */ /* */ /* Line_Gap :: The font's line gap, i.e., the distance */ @@ -175,6 +176,8 @@ FT_BEGIN_HEADER /* caret_Slope_Run :: The run coefficient of the cursor's */ /* slope. */ /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* */ /* Reserved :: 8~reserved bytes. */ /* */ /* metric_Data_Format :: Always~0. */ @@ -188,13 +191,10 @@ FT_BEGIN_HEADER /* short_metrics :: A pointer into the `hmtx' table. */ /* */ /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields, */ - /* which are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ + /* For an OpenType variation font, the values of the following fields */ + /* can change after a call to @FT_Set_Var_Design_Coordinates (and */ + /* friends) if the font contains an `MVAR' table: `caret_Slope_Rise', */ + /* `caret_Slope_Run', and `caret_Offset'. */ /* */ typedef struct TT_HoriHeader_ { @@ -217,9 +217,9 @@ FT_BEGIN_HEADER FT_Short metric_Data_Format; FT_UShort number_Of_HMetrics; - /* The following fields are not defined by the TrueType specification */ + /* The following fields are not defined by the OpenType specification */ /* but they are used to connect the metrics header to the relevant */ - /* `HMTX' table. */ + /* `hmtx' table. */ void* long_metrics; void* short_metrics; @@ -234,8 +234,8 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* A structure used to model a TrueType vertical header, the `vhea' */ - /* table, as well as the corresponding vertical metrics table, i.e., */ - /* the `vmtx' table. */ + /* table, as well as the corresponding vertical metrics table, */ + /* `vmtx'. */ /* */ /* <Fields> */ /* Version :: The table version. */ @@ -251,8 +251,8 @@ FT_BEGIN_HEADER /* ASCII). */ /* */ /* You should use the `sTypoAscender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ + /* field of the `OS/2' table instead if */ + /* you want the correct one. */ /* */ /* Descender :: The font's descender, i.e., the */ /* distance from the baseline to the */ @@ -266,8 +266,8 @@ FT_BEGIN_HEADER /* ASCII). */ /* */ /* You should use the `sTypoDescender' */ - /* field of the OS/2 table instead if you */ - /* want the correct one. */ + /* field of the `OS/2' table instead if */ + /* you want the correct one. */ /* */ /* Line_Gap :: The font's line gap, i.e., the distance */ /* to add to the ascender and descender to */ @@ -297,30 +297,26 @@ FT_BEGIN_HEADER /* slope. */ /* */ /* caret_Offset :: The cursor's offset for slanted fonts. */ - /* This value is `reserved' in vmtx */ - /* version 1.0. */ /* */ /* Reserved :: 8~reserved bytes. */ /* */ /* metric_Data_Format :: Always~0. */ /* */ - /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* number_Of_VMetrics :: Number of VMetrics entries in the */ /* `vmtx' table -- this value can be */ /* smaller than the total number of glyphs */ /* in the font. */ /* */ - /* long_metrics :: A pointer into the `vmtx' table. */ + /* long_metrics :: A pointer into the `vmtx' table. */ /* */ - /* short_metrics :: A pointer into the `vmtx' table. */ + /* short_metrics :: A pointer into the `vmtx' table. */ /* */ /* <Note> */ - /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ - /* be identical except for the names of their fields, */ - /* which are different. */ - /* */ - /* This ensures that a single function in the `ttload' */ - /* module is able to read both the horizontal and vertical */ - /* headers. */ + /* For an OpenType variation font, the values of the following fields */ + /* can change after a call to @FT_Set_Var_Design_Coordinates (and */ + /* friends) if the font contains an `MVAR' table: `Ascender', */ + /* `Descender', `Line_Gap', `caret_Slope_Rise', `caret_Slope_Run', */ + /* and `caret_Offset'. */ /* */ typedef struct TT_VertHeader_ { @@ -331,9 +327,9 @@ FT_BEGIN_HEADER FT_UShort advance_Height_Max; /* advance height maximum */ - FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ - FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ - FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short min_Top_Side_Bearing; /* minimum top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum bottom-sb */ + FT_Short yMax_Extent; /* ymax extents */ FT_Short caret_Slope_Rise; FT_Short caret_Slope_Run; FT_Short caret_Offset; @@ -343,9 +339,9 @@ FT_BEGIN_HEADER FT_Short metric_Data_Format; FT_UShort number_Of_VMetrics; - /* The following fields are not defined by the TrueType specification */ - /* but they're used to connect the metrics header to the relevant */ - /* `HMTX' or `VMTX' table. */ + /* The following fields are not defined by the OpenType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `vmtx' table. */ void* long_metrics; void* short_metrics; @@ -359,12 +355,28 @@ FT_BEGIN_HEADER /* TT_OS2 */ /* */ /* <Description> */ - /* A structure used to model a TrueType OS/2 table. All fields */ - /* comply to the OpenType specification. */ + /* A structure to model a TrueType `OS/2' table. All fields comply */ + /* to the OpenType specification. */ + /* */ + /* Note that we now support old Mac fonts that do not include an */ + /* `OS/2' table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ /* */ - /* Note that we now support old Mac fonts that do not include an OS/2 */ - /* table. In this case, the `version' field is always set to 0xFFFF. */ + /* <Note> */ + /* For an OpenType variation font, the values of the following fields */ + /* can change after a call to @FT_Set_Var_Design_Coordinates (and */ + /* friends) if the font contains an `MVAR' table: `sCapHeight', */ + /* `sTypoAscender', `sTypoDescender', `sTypoLineGap', `sxHeight', */ + /* `usWinAscent', `usWinDescent', `yStrikeoutPosition', */ + /* `yStrikeoutSize', `ySubscriptXOffset', `ySubScriptXSize', */ + /* `ySubscriptYOffset', `ySubscriptYSize', `ySuperscriptXOffset', */ + /* `ySuperscriptXSize', `ySuperscriptYOffset', and */ + /* `ySuperscriptYSize'. */ + /* */ + /* Possible values for bits in the `ulUnicodeRangeX' fields are given */ + /* by the @TT_UCR_XXX macros. */ /* */ + typedef struct TT_OS2_ { FT_UShort version; /* 0x0001 - more or 0xFFFF */ @@ -429,10 +441,16 @@ FT_BEGIN_HEADER /* TT_Postscript */ /* */ /* <Description> */ - /* A structure used to model a TrueType PostScript table. All fields */ - /* comply to the TrueType specification. This structure does not */ - /* reference the PostScript glyph names, which can be nevertheless */ - /* accessed with the `ttpost' module. */ + /* A structure to model a TrueType `post' table. All fields comply */ + /* to the OpenType specification. This structure does not reference */ + /* a font's PostScript glyph names; use @FT_Get_Glyph_Name to */ + /* retrieve them. */ + /* */ + /* <Note> */ + /* For an OpenType variation font, the values of the following fields */ + /* can change after a call to @FT_Set_Var_Design_Coordinates (and */ + /* friends) if the font contains an `MVAR' table: `underlinePosition' */ + /* and `underlineThickness'. */ /* */ typedef struct TT_Postscript_ { @@ -446,8 +464,8 @@ FT_BEGIN_HEADER FT_ULong minMemType1; FT_ULong maxMemType1; - /* Glyph names follow in the file, but we don't */ - /* load them by default. See the ttpost.c file. */ + /* Glyph names follow in the `post' table, but we don't */ + /* load them by default. */ } TT_Postscript; @@ -458,8 +476,8 @@ FT_BEGIN_HEADER /* TT_PCLT */ /* */ /* <Description> */ - /* A structure used to model a TrueType PCLT table. All fields */ - /* comply to the TrueType specification. */ + /* A structure to model a TrueType `PCLT' table. All fields comply */ + /* to the OpenType specification. */ /* */ typedef struct TT_PCLT_ { @@ -488,9 +506,9 @@ FT_BEGIN_HEADER /* TT_MaxProfile */ /* */ /* <Description> */ - /* The maximum profile is a table containing many max values, which */ - /* can be used to pre-allocate arrays. This ensures that no memory */ - /* allocation occurs during a glyph load. */ + /* The maximum profile (`maxp') table contains many max values, which */ + /* can be used to pre-allocate arrays for speeding up glyph loading */ + /* and hinting. */ /* */ /* <Fields> */ /* version :: The version number. */ @@ -500,21 +518,19 @@ FT_BEGIN_HEADER /* */ /* maxPoints :: The maximum number of points in a */ /* non-composite TrueType glyph. See also */ - /* the structure element */ /* `maxCompositePoints'. */ /* */ /* maxContours :: The maximum number of contours in a */ /* non-composite TrueType glyph. See also */ - /* the structure element */ /* `maxCompositeContours'. */ /* */ /* maxCompositePoints :: The maximum number of points in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxPoints'. */ + /* composite TrueType glyph. See also */ + /* `maxPoints'. */ /* */ /* maxCompositeContours :: The maximum number of contours in a */ - /* composite TrueType glyph. See also the */ - /* structure element `maxContours'. */ + /* composite TrueType glyph. See also */ + /* `maxContours'. */ /* */ /* maxZones :: The maximum number of zones used for */ /* glyph hinting. */ @@ -575,8 +591,9 @@ FT_BEGIN_HEADER /* FT_Sfnt_Tag */ /* */ /* <Description> */ - /* An enumeration used to specify the index of an SFNT table. */ - /* Used in the @FT_Get_Sfnt_Table API function. */ + /* An enumeration to specify indices of SFNT tables loaded and parsed */ + /* by FreeType during initialization of an SFNT font. Used in the */ + /* @FT_Get_Sfnt_Table API function. */ /* */ /* <Values> */ /* FT_SFNT_HEAD :: To access the font's @TT_Header structure. */ @@ -624,7 +641,7 @@ FT_BEGIN_HEADER /* FT_Get_Sfnt_Table */ /* */ /* <Description> */ - /* Return a pointer to a given SFNT table within a face. */ + /* Return a pointer to a given SFNT table stored within a face. */ /* */ /* <Input> */ /* face :: A handle to the source. */ @@ -632,7 +649,7 @@ FT_BEGIN_HEADER /* tag :: The index of the SFNT table. */ /* */ /* <Return> */ - /* A type-less pointer to the table. This will be~0 in case of */ + /* A type-less pointer to the table. This will be NULL in case of */ /* error, or if the corresponding table was not found *OR* loaded */ /* from the file. */ /* */ @@ -661,70 +678,70 @@ FT_BEGIN_HEADER FT_Sfnt_Tag tag ); - /************************************************************************** - * - * @function: - * FT_Load_Sfnt_Table - * - * @description: - * Load any font table into client memory. - * - * @input: - * face :: - * A handle to the source face. - * - * tag :: - * The four-byte tag of the table to load. Use the value~0 if you want - * to access the whole font file. Otherwise, you can use one of the - * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new - * one with @FT_MAKE_TAG. - * - * offset :: - * The starting offset in the table (or file if tag == 0). - * - * @output: - * buffer :: - * The target buffer address. The client must ensure that the memory - * array is big enough to hold the data. - * - * @inout: - * length :: - * If the `length' parameter is NULL, then try to load the whole table. - * Return an error code if it fails. - * - * Else, if `*length' is~0, exit immediately while returning the - * table's (or file) full size in it. - * - * Else the number of bytes to read from the table or file, from the - * starting offset. - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * If you need to determine the table's length you should first call this - * function with `*length' set to~0, as in the following example: - * - * { - * FT_ULong length = 0; - * - * - * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); - * if ( error ) { ... table does not exist ... } - * - * buffer = malloc( length ); - * if ( buffer == NULL ) { ... not enough memory ... } - * - * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); - * if ( error ) { ... could not load table ... } - * } - * - * Note that structures like @TT_Header or @TT_OS2 can't be used with - * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that - * those structures depend on the processor architecture, with varying - * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). - * - */ + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any SFNT font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use value~0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag~==~0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to~0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + * + * Note that structures like @TT_Header or @TT_OS2 can't be used with + * this function; they are limited to @FT_Get_Sfnt_Table. Reason is that + * those structures depend on the processor architecture, with varying + * size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian). + * + */ FT_EXPORT( FT_Error ) FT_Load_Sfnt_Table( FT_Face face, FT_ULong tag, @@ -733,41 +750,41 @@ FT_BEGIN_HEADER FT_ULong* length ); - /************************************************************************** - * - * @function: - * FT_Sfnt_Table_Info - * - * @description: - * Return information on an SFNT table. - * - * @input: - * face :: - * A handle to the source face. - * - * table_index :: - * The index of an SFNT table. The function returns - * FT_Err_Table_Missing for an invalid value. - * - * @inout: - * tag :: - * The name tag of the SFNT table. If the value is NULL, `table_index' - * is ignored, and `length' returns the number of SFNT tables in the - * font. - * - * @output: - * length :: - * The length of the SFNT table (or the number of SFNT tables, depending - * on `tag'). - * - * @return: - * FreeType error code. 0~means success. - * - * @note: - * While parsing fonts, FreeType handles SFNT tables with length zero as - * missing. - * - */ + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @inout: + * tag :: + * The name tag of the SFNT table. If the value is NULL, `table_index' + * is ignored, and `length' returns the number of SFNT tables in the + * font. + * + * @output: + * length :: + * The length of the SFNT table (or the number of SFNT tables, depending + * on `tag'). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * While parsing fonts, FreeType handles SFNT tables with length zero as + * missing. + * + */ FT_EXPORT( FT_Error ) FT_Sfnt_Table_Info( FT_Face face, FT_UInt table_index, @@ -781,16 +798,16 @@ FT_BEGIN_HEADER /* FT_Get_CMap_Language_ID */ /* */ /* <Description> */ - /* Return TrueType/sfnt specific cmap language ID. Definitions of */ - /* language ID values are in `ttnameid.h'. */ + /* Return cmap language ID as specified in the OpenType standard. */ + /* Definitions of language ID values are in file @FT_TRUETYPE_IDS_H. */ /* */ /* <Input> */ /* charmap :: */ /* The target charmap. */ /* */ /* <Return> */ - /* The language ID of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, just return~0 as the default value. */ + /* The language ID of `charmap'. If `charmap' doesn't belong to an */ + /* SFNT face, just return~0 as the default value. */ /* */ /* For a format~14 cmap (to access Unicode IVS), the return value is */ /* 0xFFFFFFFF. */ @@ -805,15 +822,15 @@ FT_BEGIN_HEADER /* FT_Get_CMap_Format */ /* */ /* <Description> */ - /* Return TrueType/sfnt specific cmap format. */ + /* Return the format of an SFNT `cmap' table. */ /* */ /* <Input> */ /* charmap :: */ /* The target charmap. */ /* */ /* <Return> */ - /* The format of `charmap'. If `charmap' doesn't belong to a */ - /* TrueType/sfnt face, return -1. */ + /* The format of `charmap'. If `charmap' doesn't belong to an SFNT */ + /* face, return -1. */ /* */ FT_EXPORT( FT_Long ) FT_Get_CMap_Format( FT_CharMap charmap ); diff --git a/thirdparty/freetype/include/freetype/tttags.h b/thirdparty/freetype/include/freetype/tttags.h index f3c9aa5fc7..32eb2fdc26 100644 --- a/thirdparty/freetype/include/freetype/tttags.h +++ b/thirdparty/freetype/include/freetype/tttags.h @@ -4,7 +4,7 @@ /* */ /* Tags for TrueType and OpenType tables (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -43,6 +43,7 @@ FT_BEGIN_HEADER #define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' ) #define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' ) #define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CFF2 FT_MAKE_TAG( 'C', 'F', 'F', '2' ) #define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) #define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) #define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) @@ -61,6 +62,7 @@ FT_BEGIN_HEADER #define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) #define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) #define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_HVAR FT_MAKE_TAG( 'H', 'V', 'A', 'R' ) #define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) #define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) #define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) @@ -79,6 +81,7 @@ FT_BEGIN_HEADER #define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) #define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) #define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_MVAR FT_MAKE_TAG( 'M', 'V', 'A', 'R' ) #define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) #define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) #define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) @@ -100,6 +103,7 @@ FT_BEGIN_HEADER #define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) #define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) #define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) +#define TTAG_VVAR FT_MAKE_TAG( 'V', 'V', 'A', 'R' ) #define TTAG_wOFF FT_MAKE_TAG( 'w', 'O', 'F', 'F' ) diff --git a/thirdparty/freetype/include/freetype/ttunpat.h b/thirdparty/freetype/include/freetype/ttunpat.h index ca4676baf8..f5e417089e 100644 --- a/thirdparty/freetype/include/freetype/ttunpat.h +++ b/thirdparty/freetype/include/freetype/ttunpat.h @@ -3,9 +3,9 @@ /* ttunpat.h */ /* */ /* Definitions for the unpatented TrueType hinting system. */ -/* Obsolete, retained for backwards compatibility. */ +/* Obsolete, retained for backward compatibility. */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* Written by Graham Asher <graham.asher@btinternet.com> */ diff --git a/thirdparty/freetype/include/ft2build.h b/thirdparty/freetype/include/ft2build.h index 1e8a9b4994..e7d808f3f4 100644 --- a/thirdparty/freetype/include/ft2build.h +++ b/thirdparty/freetype/include/ft2build.h @@ -4,7 +4,7 @@ /* */ /* FreeType 2 build and setup macros. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -34,7 +34,6 @@ #ifndef FT2BUILD_H_ #define FT2BUILD_H_ -#define FT2_BUILD_LIBRARY #include <freetype/config/ftheader.h> #endif /* FT2BUILD_H_ */ diff --git a/thirdparty/freetype/src/autofit/afangles.c b/thirdparty/freetype/src/autofit/afangles.c index b856e57a8b..ccdae84136 100644 --- a/thirdparty/freetype/src/autofit/afangles.c +++ b/thirdparty/freetype/src/autofit/afangles.c @@ -5,7 +5,7 @@ /* Routines used to compute vector angles with limited accuracy */ /* and very high speed. It also contains sorting routines (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afblue.c b/thirdparty/freetype/src/autofit/afblue.c index 95786ed6f2..a00c3a0765 100644 --- a/thirdparty/freetype/src/autofit/afblue.c +++ b/thirdparty/freetype/src/autofit/afblue.c @@ -7,7 +7,7 @@ /* */ /* Auto-fitter data for blue strings (body). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,30 +26,76 @@ af_blue_strings[] = { /* */ + '\xF0', '\x9E', '\xA4', '\x8C', ' ', '\xF0', '\x9E', '\xA4', '\x85', ' ', '\xF0', '\x9E', '\xA4', '\x88', ' ', '\xF0', '\x9E', '\xA4', '\x8F', ' ', '\xF0', '\x9E', '\xA4', '\x94', ' ', '\xF0', '\x9E', '\xA4', '\x9A', /* 𞤌 𞤅 𞤈 𞤠𞤔 𞤚 */ + '\0', + '\xF0', '\x9E', '\xA4', '\x82', ' ', '\xF0', '\x9E', '\xA4', '\x96', /* 𞤂 𞤖 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xAC', ' ', '\xF0', '\x9E', '\xA4', '\xAE', ' ', '\xF0', '\x9E', '\xA4', '\xBB', ' ', '\xF0', '\x9E', '\xA4', '\xBC', ' ', '\xF0', '\x9E', '\xA4', '\xBE', /* 𞤬 𞤮 𞤻 𞤼 𞤾 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xA4', ' ', '\xF0', '\x9E', '\xA4', '\xA8', ' ', '\xF0', '\x9E', '\xA4', '\xA9', ' ', '\xF0', '\x9E', '\xA4', '\xAD', ' ', '\xF0', '\x9E', '\xA4', '\xB4', ' ', '\xF0', '\x9E', '\xA4', '\xB8', ' ', '\xF0', '\x9E', '\xA4', '\xBA', ' ', '\xF0', '\x9E', '\xA5', '\x80', /* 𞤤 𞤨 𞤩 𞤠𞤴 𞤸 𞤺 𞥀 */ + '\0', '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', /* ا Ø¥ Ù„ Ùƒ Ø· ظ */ '\0', '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83', /* ت Ø« Ø· ظ Ùƒ */ '\0', '\xD9', '\x80', /* Ù€ */ '\0', - '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x93', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95', /* Ô± Õ„ Õ’ Õ“ Ô² Ô³ Ô´ Õ• */ + '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x8D', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95', /* Ô± Õ„ Õ’ Õ Ô² Ô³ Ô´ Õ• */ '\0', - '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD5', '\x93', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95', /* Õ’ Õˆ Õ“ Õƒ Õ‡ Õ Õ Õ• */ + '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95', /* Õ’ Õˆ Ô´ Õƒ Õ‡ Õ Õ Õ• */ '\0', - '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x83', ' ', '\xD6', '\x86', ' ', '\xD6', '\x83', /* Õ¥ Õ§ Õ« Õ´ Õ¾ Öƒ Ö† Öƒ */ + '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x86', ' ', '\xD5', '\xB3', /* Õ¥ Õ§ Õ« Õ´ Õ¾ Ö† Õ³ */ '\0', - '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xBB', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85', /* Õ¡ Õµ Ö‚ Õ½ Õ£ Õ» Ö€ Ö… */ + '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xB7', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85', /* Õ¡ Õµ Ö‚ Õ½ Õ£ Õ· Ö€ Ö… */ '\0', '\xD5', '\xB0', ' ', '\xD5', '\xB8', ' ', '\xD5', '\xB3', ' ', '\xD5', '\xA1', ' ', '\xD5', '\xA5', ' ', '\xD5', '\xAE', ' ', '\xD5', '\xBD', ' ', '\xD6', '\x85', /* Õ° Õ¸ Õ³ Õ¡ Õ¥ Õ® Õ½ Ö… */ '\0', '\xD5', '\xA2', ' ', '\xD5', '\xA8', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xAC', ' ', '\xD5', '\xB2', ' ', '\xD5', '\xBA', ' ', '\xD6', '\x83', ' ', '\xD6', '\x81', /* Õ¢ Õ¨ Õ« Õ¬ Õ² Õº Öƒ Ö */ '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', ' ', '\xF0', '\x90', '\xAC', '\x90', ' ', '\xF0', '\x90', '\xAC', '\x9B', /* 𬀠ð¬ ð¬ 𬛠*/ + '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', /* 𬀠ð¬ */ + '\0', + '\xEA', '\x9A', '\xA7', ' ', '\xEA', '\x9A', '\xA8', ' ', '\xEA', '\x9B', '\x9B', ' ', '\xEA', '\x9B', '\x89', ' ', '\xEA', '\x9B', '\x81', ' ', '\xEA', '\x9B', '\x88', ' ', '\xEA', '\x9B', '\xAB', ' ', '\xEA', '\x9B', '\xAF', /* êš§ ꚨ ê›› ꛉ ê› ê›ˆ ꛫ ꛯ */ + '\0', + '\xEA', '\x9A', '\xAD', ' ', '\xEA', '\x9A', '\xB3', ' ', '\xEA', '\x9A', '\xB6', ' ', '\xEA', '\x9B', '\xAC', ' ', '\xEA', '\x9A', '\xA2', ' ', '\xEA', '\x9A', '\xBD', ' ', '\xEA', '\x9B', '\xAF', ' ', '\xEA', '\x9B', '\xB2', /* êš êš³ êš¶ ꛬ ꚢ êš½ ꛯ ꛲ */ + '\0', '\xE0', '\xA6', '\x85', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xAD', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* অ ড ত ন ব ঠল ক */ '\0', '\xE0', '\xA6', '\x87', ' ', '\xE0', '\xA6', '\x9F', ' ', '\xE0', '\xA6', '\xA0', ' ', '\xE0', '\xA6', '\xBF', ' ', '\xE0', '\xA7', '\x80', ' ', '\xE0', '\xA7', '\x88', ' ', '\xE0', '\xA7', '\x97', /* ই ট ঠি à§€ ৈ à§— */ '\0', '\xE0', '\xA6', '\x93', ' ', '\xE0', '\xA6', '\x8F', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* ও ঠড ত ন ব ল ক */ '\0', + '\xE1', '\x9D', '\x90', ' ', '\xE1', '\x9D', '\x88', /* á ሠ*/ + '\0', + '\xE1', '\x9D', '\x85', ' ', '\xE1', '\x9D', '\x8A', ' ', '\xE1', '\x9D', '\x8E', /* á… áŠ áŽ */ + '\0', + '\xE1', '\x9D', '\x82', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8C', /* Ⴀრበጠ*/ + '\0', + '\xE1', '\x9D', '\x80', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x86', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8B', ' ', '\xE1', '\x9D', '\x8F', ' ', '\xE1', '\x9D', '\x91', /* ဠრᆠበዠá á‘ */ + '\0', + '\xE1', '\x97', '\x9C', ' ', '\xE1', '\x96', '\xB4', ' ', '\xE1', '\x90', '\x81', ' ', '\xE1', '\x92', '\xA3', ' ', '\xE1', '\x91', '\xAB', ' ', '\xE1', '\x91', '\x8E', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xB0', /* á—œ á–´ á á’£ á‘« ᑎ ᔑ á—° */ + '\0', + '\xE1', '\x97', '\xB6', ' ', '\xE1', '\x96', '\xB5', ' ', '\xE1', '\x92', '\xA7', ' ', '\xE1', '\x90', '\x83', ' ', '\xE1', '\x91', '\x8C', ' ', '\xE1', '\x92', '\x8D', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xA2', /* á—¶ á–µ á’§ რᑌ ᒠᔑ á—¢ */ + '\0', + '\xE1', '\x93', '\x93', ' ', '\xE1', '\x93', '\x95', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x84', ' ', '\xE1', '\x95', '\x84', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* á““ á“• á“€ á“‚ á“„ á•„ ᕆ ᘣ */ + '\0', + '\xE1', '\x95', '\x83', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x95', '\x82', ' ', '\xE1', '\x93', '\x97', ' ', '\xE1', '\x93', '\x9A', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᕃ á“‚ á“€ á•‚ á“— ᓚ ᕆ ᘣ */ + '\0', + '\xE1', '\x90', '\xAA', ' ', '\xE1', '\x99', '\x86', ' ', '\xE1', '\xA3', '\x98', ' ', '\xE1', '\x90', '\xA2', ' ', '\xE1', '\x92', '\xBE', ' ', '\xE1', '\xA3', '\x97', ' ', '\xE1', '\x94', '\x86', /* ᪠ᙆ ᣘ ᢠᒾ ᣗ ᔆ */ + '\0', + '\xE1', '\x99', '\x86', ' ', '\xE1', '\x97', '\xAE', ' ', '\xE1', '\x92', '\xBB', ' ', '\xE1', '\x90', '\x9E', ' ', '\xE1', '\x94', '\x86', ' ', '\xE1', '\x92', '\xA1', ' ', '\xE1', '\x92', '\xA2', ' ', '\xE1', '\x93', '\x91', /* ᙆ á—® á’» ហᔆ á’¡ á’¢ á“‘ */ + '\0', + '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xAC', ' ', '\xF0', '\x90', '\x8A', '\xAD', ' ', '\xF0', '\x90', '\x8A', '\xB1', ' ', '\xF0', '\x90', '\x8A', '\xBA', ' ', '\xF0', '\x90', '\x8A', '\xBC', ' ', '\xF0', '\x90', '\x8A', '\xBF', /* ðŠ§ ðŠ« ðŠ¬ ðŠ ðŠ± ðŠº ðŠ¼ ðŠ¿ */ + '\0', + '\xF0', '\x90', '\x8A', '\xA3', ' ', '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xB7', ' ', '\xF0', '\x90', '\x8B', '\x80', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xB8', ' ', '\xF0', '\x90', '\x8B', '\x89', /* ðŠ£ ðŠ§ ðŠ· ð‹€ ðŠ« ðŠ¸ ð‹‰ */ + '\0', + '\xF0', '\x91', '\x84', '\x83', ' ', '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x89', ' ', '\xF0', '\x91', '\x84', '\x99', ' ', '\xF0', '\x91', '\x84', '\x97', /* 𑄃 ð‘„… 𑄉 ð‘„™ ð‘„— */ + '\0', + '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x9B', ' ', '\xF0', '\x91', '\x84', '\x9D', ' ', '\xF0', '\x91', '\x84', '\x97', ' ', '\xF0', '\x91', '\x84', '\x93', /* ð‘„… ð‘„› ð‘„ ð‘„— ð‘„“ */ + '\0', + '\xF0', '\x91', '\x84', '\x96', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x98', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x99', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA4', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA5', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', /* 𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢 */ + '\0', '\xE1', '\x8F', '\x86', ' ', '\xE1', '\x8E', '\xBB', ' ', '\xE1', '\x8E', '\xAC', ' ', '\xE1', '\x8F', '\x83', ' ', '\xE1', '\x8E', '\xA4', ' ', '\xE1', '\x8F', '\xA3', ' ', '\xE1', '\x8E', '\xA6', ' ', '\xE1', '\x8F', '\x95', /* ᆠᎻ Ꭼ რᎤ ᣠᎦ á• */ '\0', '\xEA', '\xAE', '\x92', ' ', '\xEA', '\xAE', '\xA4', ' ', '\xEA', '\xAE', '\xB6', ' ', '\xEA', '\xAD', '\xB4', ' ', '\xEA', '\xAD', '\xBE', ' ', '\xEA', '\xAE', '\x97', ' ', '\xEA', '\xAE', '\x9D', ' ', '\xEA', '\xAE', '\xBF', /* ê®’ ꮤ ê®¶ ê´ ê¾ ê®— ê® ê®¿ */ @@ -58,6 +104,20 @@ '\0', '\xE1', '\x8F', '\xB8', ' ', '\xEA', '\xAE', '\x90', ' ', '\xEA', '\xAD', '\xB9', ' ', '\xEA', '\xAD', '\xBB', /* á¸ ê® ê¹ ê» */ '\0', + '\xE2', '\xB2', '\x8C', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\xA0', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB2', '\xA4', ' ', '\xE2', '\xB3', '\x8A', /* Ⲍ Ⲏ ⲠⳞ Ⲟ ⲠⲤ Ⳋ */ + '\0', + '\xE2', '\xB3', '\x90', ' ', '\xE2', '\xB3', '\x98', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB3', '\x9C', ' ', '\xE2', '\xB2', '\xB0', /* ⳠⳘ Ⳟ Ⲏ Ⲟ ⲠⳜ â²° */ + '\0', + '\xE2', '\xB2', '\x8D', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\xA1', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB2', '\xA5', ' ', '\xE2', '\xB3', '\x8B', /* ⲠⲠⲡ ⳟ ⲟ ⲑ â²¥ ⳋ */ + '\0', + '\xE2', '\xB3', '\x91', ' ', '\xE2', '\xB3', '\x99', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB3', '\x9D', ' ', '\xE2', '\xB3', '\x92', /* ⳑ â³™ ⳟ Ⲡⲟ ⲑ â³ â³’ */ + '\0', + '\xF0', '\x90', '\xA0', '\x8D', ' ', '\xF0', '\x90', '\xA0', '\x99', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB1', ' ', '\xF0', '\x90', '\xA0', '\x85', ' ', '\xF0', '\x90', '\xA0', '\x93', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xA6', /* ð ð ™ ð ³ ð ± ð … ð “ ð £ ð ¦ */ + '\0', + '\xF0', '\x90', '\xA0', '\x83', ' ', '\xF0', '\x90', '\xA0', '\x8A', ' ', '\xF0', '\x90', '\xA0', '\x9B', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB5', ' ', '\xF0', '\x90', '\xA0', '\x90', /* ð ƒ ð Š ð › ð £ ð ³ ð µ ð */ + '\0', + '\xF0', '\x90', '\xA0', '\x88', ' ', '\xF0', '\x90', '\xA0', '\x8F', ' ', '\xF0', '\x90', '\xA0', '\x96', /* ð ˆ ð ð – */ + '\0', '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б Ð’ Е П З О С Ð */ '\0', '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б Ð’ Е Ш З О С Ð */ @@ -66,6 +126,14 @@ '\0', '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84', /* Ñ€ у Ñ„ */ '\0', + '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x8B', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x91', /* ð‚ ð„ ð‹ ð— ð‘ */ + '\0', + '\xF0', '\x90', '\x90', '\x80', ' ', '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x9B', /* ð€ ð‚ ð„ ð— ð› */ + '\0', + '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xB3', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x90', '\xB9', /* ðª ð¬ ð³ ð¿ ð¹ */ + '\0', + '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83', /* ð¨ ðª ð¬ ð¿ 𑃠*/ + '\0', '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध ठश */ '\0', '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ठओ औ ि ी ो ौ */ @@ -98,6 +166,18 @@ '\0', '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x98', ' ', '\xE2', '\xB4', '\x9D', /* â´„ â´… â´” â´• â´ â´‚ â´˜ â´ */ '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x94', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\xAB', ' ', '\xE2', '\xB0', '\x8B', /* â°… â°” â°ª â°„ â°‚ â°Š â°« â°‹ */ + '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x9E', ' ', '\xE2', '\xB0', '\xA1', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\x94', /* â°… â°„ â°‚ â°ª â°ž â°¡ â°Š â°” */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB1', '\x84', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x9B', ' ', '\xE2', '\xB0', '\xBB', /* â°µ ⱄ ⱚ â°´ â°² â°º â±› â°» */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB1', '\x8E', ' ', '\xE2', '\xB1', '\x91', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x84', /* â°µ â°´ â°² ⱚ ⱎ ⱑ â°º ⱄ */ + '\0', + '\xF0', '\x90', '\x8C', '\xB2', ' ', '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8D', '\x80', ' ', '\xF0', '\x90', '\x8D', '\x84', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', ' ', '\xF0', '\x90', '\x8C', '\xBE', /* ðŒ² ðŒ¶ ð€ ð„ ðŒ´ ðƒ ðˆ ðŒ¾ */ + '\0', + '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', /* ðŒ¶ ðŒ´ ðƒ ðˆ */ + '\0', '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9', /* Γ Î’ Ε Ζ Θ Ο Ω */ '\0', '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', /* Î’ Δ Ζ Ξ Θ Ο */ @@ -138,6 +218,16 @@ '\0', '\xE0', '\xB2', '\x85', ' ', '\xE0', '\xB2', '\x89', ' ', '\xE0', '\xB2', '\x8E', ' ', '\xE0', '\xB2', '\xB2', ' ', '\xE0', '\xB3', '\xA6', ' ', '\xE0', '\xB3', '\xA8', ' ', '\xE0', '\xB3', '\xAC', ' ', '\xE0', '\xB3', '\xAD', /* ಅ ಉ ಎ ಲ ೦ ೨ ೬ à³ */ '\0', + '\xEA', '\xA4', '\x85', ' ', '\xEA', '\xA4', '\x8F', ' ', '\xEA', '\xA4', '\x81', ' ', '\xEA', '\xA4', '\x8B', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', /* ꤅ ê¤ ê¤ ê¤‹ ꤀ ê¤ */ + '\0', + '\xEA', '\xA4', '\x88', ' ', '\xEA', '\xA4', '\x98', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', ' ', '\xEA', '\xA4', '\xA2', /* ꤈ ꤘ ꤀ ê¤ ê¤¢ */ + '\0', + '\xEA', '\xA4', '\x96', ' ', '\xEA', '\xA4', '\xA1', /* ꤖ ꤡ */ + '\0', + '\xEA', '\xA4', '\x91', ' ', '\xEA', '\xA4', '\x9C', ' ', '\xEA', '\xA4', '\x9E', /* ꤑ ꤜ ꤞ */ + '\0', + '\xEA', '\xA4', '\x91', '\xEA', '\xA4', '\xAC', ' ', '\xEA', '\xA4', '\x9C', '\xEA', '\xA4', '\xAD', ' ', '\xEA', '\xA4', '\x94', '\xEA', '\xA4', '\xAC', /* ꤑ꤬ ê¤œê¤ ê¤”ê¤¬ */ + '\0', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x91', ' ', '\xE1', '\x9E', '\x93', ' ', '\xE1', '\x9E', '\xA7', ' ', '\xE1', '\x9E', '\xA9', ' ', '\xE1', '\x9E', '\xB6', /* áž áž‘ áž“ áž§ áž© áž¶ */ '\0', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x80', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x82', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x90', /* ក្ក ក្ហក្គ ក្ហ*/ @@ -168,7 +258,9 @@ '\0', 'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h', /* f i j k d b h */ '\0', - 'x', ' ', 'z', ' ', 'r', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* x z r o e s c */ + 'u', ' ', 'v', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* u v x z o e s c */ + '\0', + 'n', ' ', 'r', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* n r x z o e s c */ '\0', 'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y', /* p q g j y */ '\0', @@ -192,6 +284,10 @@ '\0', '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D', /* áµ– ʸ áµ */ '\0', + '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\xA7', ' ', '\xEA', '\x93', '\xB1', ' ', '\xEA', '\x93', '\xB6', ' ', '\xEA', '\x93', '\xA9', ' ', '\xEA', '\x93', '\x9A', ' ', '\xEA', '\x93', '\xB5', ' ', '\xEA', '\x93', '\xB3', /* ê“¡ ê“§ ꓱ ê“¶ ê“© ꓚ ꓵ ꓳ */ + '\0', + '\xEA', '\x93', '\x95', ' ', '\xEA', '\x93', '\x9C', ' ', '\xEA', '\x93', '\x9E', ' ', '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\x9B', ' ', '\xEA', '\x93', '\xA2', ' ', '\xEA', '\x93', '\xB3', ' ', '\xEA', '\x93', '\xB4', /* ê“• ꓜ ꓞ ê“¡ ê“› ê“¢ ꓳ ê“´ */ + '\0', '\xE0', '\xB4', '\x92', ' ', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xB1', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', ' ', '\xE0', '\xB4', '\x9A', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\xAA', /* à´’ à´Ÿ à´ à´± à´š à´ª à´šàµà´š à´ªàµà´ª */ '\0', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* à´Ÿ à´ à´§ à´¶ à´˜ à´š à´¥ à´² */ @@ -204,12 +300,68 @@ '\0', '\xE1', '\x80', '\x89', ' ', '\xE1', '\x80', '\x8A', ' ', '\xE1', '\x80', '\xA5', ' ', '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xA8', ' ', '\xE1', '\x81', '\x82', ' ', '\xE1', '\x81', '\x85', ' ', '\xE1', '\x81', '\x89', /* ဉ ည ဥ ဩ ဨ á‚ á… á‰ */ '\0', + '\xDF', '\x90', ' ', '\xDF', '\x89', ' ', '\xDF', '\x92', ' ', '\xDF', '\x9F', ' ', '\xDF', '\x96', ' ', '\xDF', '\x9C', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ß ß‰ ß’ ߟ ß– ßœ ß ß¥ */ + '\0', + '\xDF', '\x80', ' ', '\xDF', '\x98', ' ', '\xDF', '\xA1', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߀ ߘ ß¡ ß ß¥ */ + '\0', + '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ß ß› ß‹ */ + '\0', + '\xDF', '\x8E', ' ', '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߎ ß ß› ß‹ */ + '\0', + '\xE1', '\xB1', '\x9B', ' ', '\xE1', '\xB1', '\x9C', ' ', '\xE1', '\xB1', '\x9D', ' ', '\xE1', '\xB1', '\xA1', ' ', '\xE1', '\xB1', '\xA2', ' ', '\xE1', '\xB1', '\xA5', /* á±› ᱜ ᱠᱡ á±¢ á±¥ */ + '\0', + '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\x98', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* ð°— ð°˜ ð°§ */ + '\0', + '\xF0', '\x90', '\xB0', '\x89', ' ', '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\xA6', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* ð°‰ ð°— ð°¦ ð°§ */ + '\0', + '\xF0', '\x90', '\x92', '\xBE', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x92', ' ', '\xF0', '\x90', '\x93', '\x93', ' ', '\xF0', '\x90', '\x92', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xB5', ' ', '\xF0', '\x90', '\x93', '\x86', /* ð’¾ ð“ 𓒠𓓠𒻠𓂠𒵠𓆠*/ + '\0', + '\xF0', '\x90', '\x92', '\xB0', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xBF', ' ', '\xF0', '\x90', '\x93', '\x8E', ' ', '\xF0', '\x90', '\x92', '\xB9', /* ð’° ð“ 𓂠𒿠𓎠𒹠*/ + '\0', + '\xF0', '\x90', '\x92', '\xBC', ' ', '\xF0', '\x90', '\x92', '\xBD', ' ', '\xF0', '\x90', '\x92', '\xBE', /* ð’¼ ð’½ ð’¾ */ + '\0', + '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xB6', ' ', '\xF0', '\x90', '\x93', '\xBA', ' ', '\xF0', '\x90', '\x93', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x9D', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xAE', /* 𓵠𓶠𓺠𓻠ð“ 𓣠𓪠𓮠*/ + '\0', + '\xF0', '\x90', '\x93', '\x98', ' ', '\xF0', '\x90', '\x93', '\x9A', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xA1', ' ', '\xF0', '\x90', '\x93', '\xA7', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xB6', /* 𓘠𓚠𓣠𓵠𓡠𓧠𓪠𓶠*/ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA6', ' ', '\xF0', '\x90', '\x93', '\xB8', ' ', '\xF0', '\x90', '\x93', '\xB9', ' ', '\xF0', '\x90', '\x93', '\x9B', /* 𓤠𓦠𓸠𓹠𓛠*/ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA5', ' ', '\xF0', '\x90', '\x93', '\xA6', /* 𓤠𓥠𓦠*/ + '\0', + '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x89', ' ', '\xF0', '\x90', '\x92', '\x90', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\x98', ' ', '\xF0', '\x90', '\x92', '\x9B', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA3', /* ð’† ð’‰ ð’ ð’’ ð’˜ ð’› ð’ ð’£ */ + '\0', + '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9', /* ð’€ ð’‚ ð’† ð’ˆ ð’Š ð’’ ð’ ð’© */ + '\0', + '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B', /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ê¢ ê¢› */ + '\0', + '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E', /* ꢂ ꢨ ꢺ ꢤ ꢎ */ + '\0', + '\xF0', '\x90', '\x91', '\x95', ' ', '\xF0', '\x90', '\x91', '\x99', /* ð‘• ð‘™ */ + '\0', + '\xF0', '\x90', '\x91', '\x94', ' ', '\xF0', '\x90', '\x91', '\x96', ' ', '\xF0', '\x90', '\x91', '\x97', ' ', '\xF0', '\x90', '\x91', '\xB9', ' ', '\xF0', '\x90', '\x91', '\xBB', /* 𑔠𑖠𑗠𑹠𑻠*/ + '\0', + '\xF0', '\x90', '\x91', '\x9F', ' ', '\xF0', '\x90', '\x91', '\xA3', /* 𑟠𑣠*/ + '\0', + '\xF0', '\x90', '\x91', '\xB1', ' ', '\xF0', '\x90', '\x91', '\xB2', ' ', '\xF0', '\x90', '\x91', '\xB3', ' ', '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xB8', ' ', '\xF0', '\x90', '\x91', '\xBA', ' ', '\xF0', '\x90', '\x91', '\xBC', /* 𑱠𑲠𑳠𑴠𑸠𑺠𑼠*/ + '\0', + '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xBB', ' ', '\xF0', '\x90', '\x91', '\xB9', /* 𑴠𑻠𑹠*/ + '\0', '\xE0', '\xB6', '\x89', ' ', '\xE0', '\xB6', '\x9A', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\xB4', ' ', '\xE0', '\xB6', '\xBA', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB7', '\x86', /* ඉ à¶š à¶ à¶³ à¶´ ය à¶½ à·† */ '\0', '\xE0', '\xB6', '\x91', ' ', '\xE0', '\xB6', '\x94', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xA2', ' ', '\xE0', '\xB6', '\xA7', ' ', '\xE0', '\xB6', '\xAE', ' ', '\xE0', '\xB6', '\xB0', ' ', '\xE0', '\xB6', '\xBB', /* à¶‘ à¶” à¶ à¶¢ à¶§ à¶® à¶° à¶» */ '\0', '\xE0', '\xB6', '\xAF', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\x8B', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x96', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xB6', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xAF', '\xE0', '\xB7', '\x94', /* ද à¶³ à¶‹ à¶½ à¶à·– à¶à·” à¶¶à·” දු */ '\0', + '\xE1', '\xAE', '\x8B', ' ', '\xE1', '\xAE', '\x9E', ' ', '\xE1', '\xAE', '\xAE', ' ', '\xE1', '\xAE', '\xBD', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x88', /* ᮋ ᮞ á®® ᮽ á®° ᮈ */ + '\0', + '\xE1', '\xAE', '\x84', ' ', '\xE1', '\xAE', '\x94', ' ', '\xE1', '\xAE', '\x95', ' ', '\xE1', '\xAE', '\x97', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x86', ' ', '\xE1', '\xAE', '\x88', ' ', '\xE1', '\xAE', '\x89', /* ᮄ á®” ᮕ á®— á®° ᮆ ᮈ ᮉ */ + '\0', + '\xE1', '\xAE', '\xBC', ' ', '\xE1', '\xB3', '\x84', /* ᮼ ᳄ */ + '\0', + '\xEA', '\xAA', '\x86', ' ', '\xEA', '\xAA', '\x94', ' ', '\xEA', '\xAA', '\x92', ' ', '\xEA', '\xAA', '\x96', ' ', '\xEA', '\xAA', '\xAB', /* ꪆ ꪔ ꪒ ꪖ ꪫ */ + '\0', + '\xEA', '\xAA', '\x89', ' ', '\xEA', '\xAA', '\xAB', ' ', '\xEA', '\xAA', '\xAE', /* ꪉ ꪫ ꪮ */ + '\0', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x92', ' ', '\xE0', '\xAE', '\x93', ' ', '\xE0', '\xAE', '\xB1', ' ', '\xE0', '\xAE', '\x88', ' ', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9A', /* உ à®’ ஓ à®± ஈ க à®™ ச */ '\0', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x9A', ' ', '\xE0', '\xAE', '\xB2', ' ', '\xE0', '\xAE', '\xB6', ' ', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9F', ' ', '\xE0', '\xAE', '\xAA', /* க ச ல à®¶ உ à®™ ட ப */ @@ -231,6 +383,12 @@ '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90', /* ภภ*/ '\0', '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93', /* ๠๑ ๓ */ + '\0', + '\xE2', '\xB5', '\x94', ' ', '\xE2', '\xB5', '\x99', ' ', '\xE2', '\xB5', '\x9B', ' ', '\xE2', '\xB5', '\x9E', ' ', '\xE2', '\xB4', '\xB5', ' ', '\xE2', '\xB4', '\xBC', ' ', '\xE2', '\xB4', '\xB9', ' ', '\xE2', '\xB5', '\x8E', /* âµ” âµ™ âµ› ⵞ â´µ â´¼ â´¹ ⵎ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x98', '\x9C', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x96', '\x9D', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', /* ê— ê˜– ꘙ ꘜ ê–œ ê– ê”… ê•¢ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x97', '\x9E', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x94', '\x86', /* ê— ê˜– ꘙ ê—ž ê”… ê•¢ ê–œ ꔆ */ #ifdef AF_CONFIG_OPTION_CJK '\0', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* ä»– 们 ä½ ä¾† 們 到 å’Œ 地 */ @@ -281,6 +439,12 @@ af_blue_stringsets[] = { /* */ + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_ARABIC_BOTTOM, 0 }, { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, @@ -293,6 +457,12 @@ { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 }, { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | @@ -300,6 +470,27 @@ AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, { AF_BLUE_STRING_BENGALI_BASE, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_BUHID_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 }, + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 }, { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, @@ -308,6 +499,17 @@ { AF_BLUE_STRING_CHEROKEE_SMALL, 0 }, { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 }, + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }, { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | @@ -323,6 +525,12 @@ { AF_BLUE_STRING_DEVANAGARI_BASE, 0 }, { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -340,6 +548,15 @@ { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }, { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, @@ -368,6 +585,13 @@ { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 }, + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 }, + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -392,9 +616,9 @@ { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }, { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, - { AF_BLUE_STRING_LATIN_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, - { AF_BLUE_STRING_LATIN_SMALL, 0 }, + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 }, { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, @@ -413,6 +637,9 @@ { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }, { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LISU_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -422,14 +649,55 @@ { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_NKO_BOTTOM, 0 }, + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OL_CHIKI, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }, + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_SINHALA_BOTTOM, 0 }, { AF_BLUE_STRING_SINHALA_DESCENDER, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 }, + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_TAMIL_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, { AF_BLUE_STRING_MAX, 0 }, @@ -442,6 +710,12 @@ { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TIFINAGH, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_VAI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, #ifdef AF_CONFIG_OPTION_CJK { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP }, { AF_BLUE_STRING_CJK_BOTTOM, 0 }, diff --git a/thirdparty/freetype/src/autofit/afblue.cin b/thirdparty/freetype/src/autofit/afblue.cin index 0c3cae818f..f9080c54d4 100644 --- a/thirdparty/freetype/src/autofit/afblue.cin +++ b/thirdparty/freetype/src/autofit/afblue.cin @@ -4,7 +4,7 @@ /* */ /* Auto-fitter data for blue strings (body). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afblue.dat b/thirdparty/freetype/src/autofit/afblue.dat index 0734ec71f0..454923e9ca 100644 --- a/thirdparty/freetype/src/autofit/afblue.dat +++ b/thirdparty/freetype/src/autofit/afblue.dat @@ -2,7 +2,7 @@ // // Auto-fitter data for blue strings. // -// Copyright 2013-2016 by +// Copyright 2013-2017 by // David Turner, Robert Wilhelm, and Werner Lemberg. // // This file is part of the FreeType project, and may only be used, @@ -74,6 +74,15 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: + AF_BLUE_STRING_ADLAM_CAPITAL_TOP + "𞤌 𞤅 𞤈 𞤠𞤔 𞤚" + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM + "𞤂 𞤖" + AF_BLUE_STRING_ADLAM_SMALL_TOP + "𞤬 𞤮 𞤻 𞤼 𞤾" + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM + "𞤤 𞤨 𞤩 𞤠𞤴 𞤸 𞤺 𞥀" + AF_BLUE_STRING_ARABIC_TOP "ا Ø¥ Ù„ Ùƒ Ø· ظ" AF_BLUE_STRING_ARABIC_BOTTOM @@ -87,18 +96,28 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: "Ù€" AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP - "Ô± Õ„ Õ’ Õ“ Ô² Ô³ Ô´ Õ•" + "Ô± Õ„ Õ’ Õ Ô² Ô³ Ô´ Õ•" AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM - "Õ’ Õˆ Õ“ Õƒ Õ‡ Õ Õ Õ•" + "Õ’ Õˆ Ô´ Õƒ Õ‡ Õ Õ Õ•" AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER - "Õ¥ Õ§ Õ« Õ´ Õ¾ Öƒ Ö† Öƒ" + "Õ¥ Õ§ Õ« Õ´ Õ¾ Ö† Õ³" AF_BLUE_STRING_ARMENIAN_SMALL_TOP - "Õ¡ Õµ Ö‚ Õ½ Õ£ Õ» Ö€ Ö…" + "Õ¡ Õµ Ö‚ Õ½ Õ£ Õ· Ö€ Ö…" AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM "Õ° Õ¸ Õ³ Õ¡ Õ¥ Õ® Õ½ Ö…" AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER "Õ¢ Õ¨ Õ« Õ¬ Õ² Õº Öƒ Ö" + AF_BLUE_STRING_AVESTAN_TOP + "𬀠ð¬ ð¬ ð¬›" + AF_BLUE_STRING_AVESTAN_BOTTOM + "𬀠ð¬" + + AF_BLUE_STRING_BAMUM_TOP + "êš§ ꚨ ê›› ꛉ ê› ê›ˆ ꛫ ꛯ" + AF_BLUE_STRING_BAMUM_BOTTOM + "êš êš³ êš¶ ꛬ ꚢ êš½ ꛯ ꛲" + AF_BLUE_STRING_BENGALI_BASE "অ ড ত ন ব ঠল ক" AF_BLUE_STRING_BENGALI_TOP @@ -106,6 +125,40 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_BENGALI_HEAD "ও ঠড ত ন ব ল ক" + AF_BLUE_STRING_BUHID_TOP + "á áˆ" + AF_BLUE_STRING_BUHID_LARGE + "á… áŠ áŽ" + AF_BLUE_STRING_BUHID_SMALL + "ႠრበáŒ" + AF_BLUE_STRING_BUHID_BOTTOM + "ဠრᆠበዠá á‘" + + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP + "á—œ á–´ á á’£ á‘« ᑎ ᔑ á—°" + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM + "á—¶ á–µ á’§ რᑌ ᒠᔑ á—¢" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP + "á““ á“• á“€ á“‚ á“„ á•„ ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM + "ᕃ á“‚ á“€ á•‚ á“— ᓚ ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP + "᪠ᙆ ᣘ ᢠᒾ ᣗ ᔆ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM + "ᙆ á—® á’» ហᔆ á’¡ á’¢ á“‘" + + AF_BLUE_STRING_CARIAN_TOP + "ðŠ§ ðŠ« ðŠ¬ ðŠ ðŠ± ðŠº ðŠ¼ ðŠ¿" + AF_BLUE_STRING_CARIAN_BOTTOM + "ðŠ£ ðŠ§ ðŠ· ð‹€ ðŠ« ðŠ¸ ð‹‰" + + AF_BLUE_STRING_CHAKMA_TOP + "𑄃 ð‘„… 𑄉 ð‘„™ ð‘„—" + AF_BLUE_STRING_CHAKMA_BOTTOM + "ð‘„… ð‘„› ð‘„ ð‘„— ð‘„“" + AF_BLUE_STRING_CHAKMA_DESCENDER + "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢" + AF_BLUE_STRING_CHEROKEE_CAPITAL "ᆠᎻ Ꭼ რᎤ ᣠᎦ á•" AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER @@ -115,6 +168,22 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER "á¸ ê® ê¹ ê»" + AF_BLUE_STRING_COPTIC_CAPITAL_TOP + "Ⲍ Ⲏ ⲠⳞ Ⲟ ⲠⲤ Ⳋ" + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM + "ⳠⳘ Ⳟ Ⲏ Ⲟ ⲠⳜ â²°" + AF_BLUE_STRING_COPTIC_SMALL_TOP + "ⲠⲠⲡ ⳟ ⲟ ⲑ â²¥ ⳋ" + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM + "ⳑ â³™ ⳟ Ⲡⲟ ⲑ â³ â³’" + + AF_BLUE_STRING_CYPRIOT_TOP + "ð ð ™ ð ³ ð ± ð … ð “ ð £ ð ¦" + AF_BLUE_STRING_CYPRIOT_BOTTOM + "ð ƒ ð Š ð › ð £ ð ³ ð µ ð " + AF_BLUE_STRING_CYPRIOT_SMALL + "ð ˆ ð ð –" + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP "Б Ð’ Е П З О С Ð" AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM @@ -124,6 +193,15 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER "Ñ€ у Ñ„" + AF_BLUE_STRING_DESERET_CAPITAL_TOP + "ð‚ ð„ ð‹ ð— ð‘" + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM + "ð€ ð‚ ð„ ð— ð›" + AF_BLUE_STRING_DESERET_SMALL_TOP + "ðª ð¬ ð³ ð¿ ð¹" + AF_BLUE_STRING_DESERET_SMALL_BOTTOM + "ð¨ ðª ð¬ ð¿ ð‘ƒ" + AF_BLUE_STRING_DEVANAGARI_BASE "क म अ आ थ ध ठश" AF_BLUE_STRING_DEVANAGARI_TOP @@ -164,6 +242,20 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER "â´„ â´… â´” â´• â´ â´‚ â´˜ â´" + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP + "â°… â°” â°ª â°„ â°‚ â°Š â°« â°‹" + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM + "â°… â°„ â°‚ â°ª â°ž â°¡ â°Š â°”" + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP + "â°µ ⱄ ⱚ â°´ â°² â°º â±› â°»" + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM + "â°µ â°´ â°² ⱚ ⱎ ⱑ â°º ⱄ" + + AF_BLUE_STRING_GOTHIC_TOP + "ðŒ² ðŒ¶ ð€ ð„ ðŒ´ ðƒ ðˆ ðŒ¾" + AF_BLUE_STRING_GOTHIC_BOTTOM + "ðŒ¶ ðŒ´ ðƒ ðˆ" + AF_BLUE_STRING_GREEK_CAPITAL_TOP "Γ Î’ Ε Ζ Θ Ο Ω" AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM @@ -209,6 +301,17 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_KANNADA_BOTTOM "ಅ ಉ ಎ ಲ ೦ ೨ ೬ à³" + AF_BLUE_STRING_KAYAH_LI_TOP + "꤅ ê¤ ê¤ ê¤‹ ꤀ ê¤" + AF_BLUE_STRING_KAYAH_LI_BOTTOM + "꤈ ꤘ ꤀ ê¤ ê¤¢" + AF_BLUE_STRING_KAYAH_LI_ASCENDER + "ꤖ ꤡ" + AF_BLUE_STRING_KAYAH_LI_DESCENDER + "ꤑ ꤜ ꤞ" + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER + "ꤑ꤬ ê¤œê¤ ê¤”ê¤¬" + AF_BLUE_STRING_KHMER_TOP "áž áž‘ áž“ áž§ áž© áž¶" AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP @@ -242,8 +345,10 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: "H E Z L O C U S" AF_BLUE_STRING_LATIN_SMALL_F_TOP "f i j k d b h" - AF_BLUE_STRING_LATIN_SMALL - "x z r o e s c" + AF_BLUE_STRING_LATIN_SMALL_TOP + "u v x z o e s c" + AF_BLUE_STRING_LATIN_SMALL_BOTTOM + "n r x z o e s c" AF_BLUE_STRING_LATIN_SMALL_DESCENDER "p q g j y" @@ -272,6 +377,11 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER "áµ– ʸ áµ" + AF_BLUE_STRING_LISU_TOP + "ê“¡ ê“§ ꓱ ê“¶ ê“© ꓚ ꓵ ꓳ" + AF_BLUE_STRING_LISU_BOTTOM + "ê“• ꓜ ꓞ ê“¡ ê“› ê“¢ ꓳ ê“´" + AF_BLUE_STRING_MALAYALAM_TOP "à´’ à´Ÿ à´ à´± à´š à´ª à´šàµà´š à´ªàµà´ª" AF_BLUE_STRING_MALAYALAM_BOTTOM @@ -286,6 +396,59 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_MYANMAR_DESCENDER "ဉ ည ဥ ဩ ဨ á‚ á… á‰" + AF_BLUE_STRING_NKO_TOP + "ß ß‰ ß’ ߟ ß– ßœ ß ß¥" + AF_BLUE_STRING_NKO_BOTTOM + "߀ ߘ ß¡ ß ß¥" + AF_BLUE_STRING_NKO_SMALL_TOP + "ß ß› ß‹" + AF_BLUE_STRING_NKO_SMALL_BOTTOM + "ߎ ß ß› ß‹" + + AF_BLUE_STRING_OL_CHIKI + "á±› ᱜ ᱠᱡ á±¢ á±¥" + + AF_BLUE_STRING_OLD_TURKIC_TOP + "ð°— ð°˜ ð°§" + AF_BLUE_STRING_OLD_TURKIC_BOTTOM + "ð°‰ ð°— ð°¦ ð°§" + + AF_BLUE_STRING_OSAGE_CAPITAL_TOP + "ð’¾ ð“ ð“’ ð““ ð’» ð“‚ ð’µ ð“†" + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM + "ð’° ð“ 𓂠𒿠𓎠ð’¹" + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER + "ð’¼ ð’½ ð’¾" + AF_BLUE_STRING_OSAGE_SMALL_TOP + "𓵠𓶠𓺠𓻠ð“ 𓣠𓪠ð“®" + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM + "𓘠𓚠𓣠𓵠𓡠𓧠𓪠ð“¶" + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER + "𓤠𓦠𓸠𓹠ð“›" + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER + "𓤠𓥠ð“¦" + + AF_BLUE_STRING_OSMANYA_TOP + "ð’† ð’‰ ð’ ð’’ ð’˜ ð’› ð’ ð’£" + AF_BLUE_STRING_OSMANYA_BOTTOM + "ð’€ ð’‚ ð’† ð’ˆ ð’Š ð’’ ð’ ð’©" + + AF_BLUE_STRING_SAURASHTRA_TOP + "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ê¢ ê¢›" + AF_BLUE_STRING_SAURASHTRA_BOTTOM + "ꢂ ꢨ ꢺ ꢤ ꢎ" + + AF_BLUE_STRING_SHAVIAN_TOP + "ð‘• ð‘™" + AF_BLUE_STRING_SHAVIAN_BOTTOM + "𑔠𑖠𑗠𑹠ð‘»" + AF_BLUE_STRING_SHAVIAN_DESCENDER + "𑟠ð‘£" + AF_BLUE_STRING_SHAVIAN_SMALL_TOP + "𑱠𑲠𑳠𑴠𑸠𑺠ð‘¼" + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM + "ð‘´ ð‘» ð‘¹" + AF_BLUE_STRING_SINHALA_TOP "ඉ à¶š à¶ à¶³ à¶´ ය à¶½ à·†" AF_BLUE_STRING_SINHALA_BOTTOM @@ -293,6 +456,18 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_SINHALA_DESCENDER "ද à¶³ à¶‹ à¶½ à¶à·– à¶à·” à¶¶à·” දු" + AF_BLUE_STRING_SUNDANESE_TOP + "ᮋ ᮞ á®® ᮽ á®° ᮈ" + AF_BLUE_STRING_SUNDANESE_BOTTOM + "ᮄ á®” ᮕ á®— á®° ᮆ ᮈ ᮉ" + AF_BLUE_STRING_SUNDANESE_DESCENDER + "ᮼ ᳄" + + AF_BLUE_STRING_TAI_VIET_TOP + "ꪆ ꪔ ꪒ ꪖ ꪫ" + AF_BLUE_STRING_TAI_VIET_BOTTOM + "ꪉ ꪫ ꪮ" + AF_BLUE_STRING_TAMIL_TOP "உ à®’ ஓ à®± ஈ க à®™ ச" AF_BLUE_STRING_TAMIL_BOTTOM @@ -318,6 +493,14 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRING_THAI_DIGIT_TOP "๠๑ ๓" + AF_BLUE_STRING_TIFINAGH + "âµ” âµ™ âµ› ⵞ â´µ â´¼ â´¹ ⵎ" + + AF_BLUE_STRING_VAI_TOP + "ê— ê˜– ꘙ ꘜ ê–œ ê– ê”… ê•¢" + AF_BLUE_STRING_VAI_BOTTOM + "ê— ê˜– ꘙ ê—ž ê”… ê•¢ ê–œ ꔆ" + #ifdef AF_CONFIG_OPTION_CJK @@ -483,6 +666,14 @@ AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: + AF_BLUE_STRINGSET_ADLM + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_ARAB { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } @@ -499,6 +690,16 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_AVST + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BAMU + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_BENG { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } @@ -508,6 +709,35 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_BENGALI_BASE, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_BUHD + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_BUHID_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CAKM + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 } + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CANS + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CARI + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_CHER { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 } @@ -518,6 +748,21 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_COPT + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CPRT + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 } + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_CYRL { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } @@ -537,6 +782,14 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_DSRT + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_ETHI { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 } @@ -561,6 +814,19 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_GLAG + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GOTH + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_GREK { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } @@ -597,6 +863,15 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_KALI + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 } + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 } + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_KNDA { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } @@ -630,9 +905,9 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } - { AF_BLUE_STRING_LATIN_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | AF_BLUE_PROPERTY_LATIN_X_HEIGHT } - { AF_BLUE_STRING_LATIN_SMALL, 0 } + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 } { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } @@ -656,6 +931,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_LISU + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LISU_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_MLYM { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } @@ -669,20 +949,79 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_NKOO + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_NKO_BOTTOM, 0 } + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_NONE { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_OLCK + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OL_CHIKI, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ORKH + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSGE + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSMA + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SAUR + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SHAW + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 } + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 } + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_SINH { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_SINHALA_BOTTOM, 0 } { AF_BLUE_STRING_SINHALA_DESCENDER, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_SUND + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 } + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_TAML { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_TAMIL_BOTTOM, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_TAVT + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_TELU { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } @@ -699,6 +1038,15 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } { AF_BLUE_STRING_MAX, 0 } + AF_BLUE_STRINGSET_TFNG + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TIFINAGH, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_VAII + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_VAI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } #ifdef AF_CONFIG_OPTION_CJK diff --git a/thirdparty/freetype/src/autofit/afblue.h b/thirdparty/freetype/src/autofit/afblue.h index 41f838e457..e227dbf50b 100644 --- a/thirdparty/freetype/src/autofit/afblue.h +++ b/thirdparty/freetype/src/autofit/afblue.h @@ -7,7 +7,7 @@ /* */ /* Auto-fitter data for blue strings (specification). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -77,110 +77,189 @@ FT_BEGIN_HEADER typedef enum AF_Blue_String_ { - AF_BLUE_STRING_ARABIC_TOP = 0, - AF_BLUE_STRING_ARABIC_BOTTOM = 18, - AF_BLUE_STRING_ARABIC_JOIN = 33, - AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 36, - AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 60, - AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 84, - AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 108, - AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 132, - AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 156, - AF_BLUE_STRING_BENGALI_BASE = 180, - AF_BLUE_STRING_BENGALI_TOP = 212, - AF_BLUE_STRING_BENGALI_HEAD = 240, - AF_BLUE_STRING_CHEROKEE_CAPITAL = 272, - AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 304, - AF_BLUE_STRING_CHEROKEE_SMALL = 336, - AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 368, - AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 384, - AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 408, - AF_BLUE_STRING_CYRILLIC_SMALL = 432, - AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 456, - AF_BLUE_STRING_DEVANAGARI_BASE = 465, - AF_BLUE_STRING_DEVANAGARI_TOP = 497, - AF_BLUE_STRING_DEVANAGARI_HEAD = 529, - AF_BLUE_STRING_DEVANAGARI_BOTTOM = 561, - AF_BLUE_STRING_ETHIOPIC_TOP = 569, - AF_BLUE_STRING_ETHIOPIC_BOTTOM = 601, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 633, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 665, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 697, - AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 729, - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 761, - AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 793, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 825, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 857, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 889, - AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 921, - AF_BLUE_STRING_GREEK_CAPITAL_TOP = 953, - AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 974, - AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 992, - AF_BLUE_STRING_GREEK_SMALL = 1010, - AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 1034, - AF_BLUE_STRING_GUJARATI_TOP = 1058, - AF_BLUE_STRING_GUJARATI_BOTTOM = 1090, - AF_BLUE_STRING_GUJARATI_ASCENDER = 1122, - AF_BLUE_STRING_GUJARATI_DESCENDER = 1172, - AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 1205, - AF_BLUE_STRING_GURMUKHI_BASE = 1225, - AF_BLUE_STRING_GURMUKHI_HEAD = 1257, - AF_BLUE_STRING_GURMUKHI_TOP = 1289, - AF_BLUE_STRING_GURMUKHI_BOTTOM = 1321, - AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 1353, - AF_BLUE_STRING_HEBREW_TOP = 1373, - AF_BLUE_STRING_HEBREW_BOTTOM = 1397, - AF_BLUE_STRING_HEBREW_DESCENDER = 1415, - AF_BLUE_STRING_KANNADA_TOP = 1430, - AF_BLUE_STRING_KANNADA_BOTTOM = 1474, - AF_BLUE_STRING_KHMER_TOP = 1506, - AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 1530, - AF_BLUE_STRING_KHMER_BOTTOM = 1570, - AF_BLUE_STRING_KHMER_DESCENDER = 1602, - AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 1636, - AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 1723, - AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 1731, - AF_BLUE_STRING_LAO_TOP = 1739, - AF_BLUE_STRING_LAO_BOTTOM = 1771, - AF_BLUE_STRING_LAO_ASCENDER = 1803, - AF_BLUE_STRING_LAO_LARGE_ASCENDER = 1819, - AF_BLUE_STRING_LAO_DESCENDER = 1831, - AF_BLUE_STRING_LATIN_CAPITAL_TOP = 1855, - AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 1871, - AF_BLUE_STRING_LATIN_SMALL_F_TOP = 1887, - AF_BLUE_STRING_LATIN_SMALL = 1901, - AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 1915, - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 1925, - AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 1945, - AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 1965, - AF_BLUE_STRING_LATIN_SUBS_SMALL = 1985, - AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 2021, - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 2041, - AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 2072, - AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 2101, - AF_BLUE_STRING_LATIN_SUPS_SMALL = 2127, - AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 2152, - AF_BLUE_STRING_MALAYALAM_TOP = 2163, - AF_BLUE_STRING_MALAYALAM_BOTTOM = 2207, - AF_BLUE_STRING_MYANMAR_TOP = 2239, - AF_BLUE_STRING_MYANMAR_BOTTOM = 2271, - AF_BLUE_STRING_MYANMAR_ASCENDER = 2303, - AF_BLUE_STRING_MYANMAR_DESCENDER = 2331, - AF_BLUE_STRING_SINHALA_TOP = 2363, - AF_BLUE_STRING_SINHALA_BOTTOM = 2395, - AF_BLUE_STRING_SINHALA_DESCENDER = 2427, - AF_BLUE_STRING_TAMIL_TOP = 2471, - AF_BLUE_STRING_TAMIL_BOTTOM = 2503, - AF_BLUE_STRING_TELUGU_TOP = 2535, - AF_BLUE_STRING_TELUGU_BOTTOM = 2563, - AF_BLUE_STRING_THAI_TOP = 2591, - AF_BLUE_STRING_THAI_BOTTOM = 2615, - AF_BLUE_STRING_THAI_ASCENDER = 2643, - AF_BLUE_STRING_THAI_LARGE_ASCENDER = 2655, - AF_BLUE_STRING_THAI_DESCENDER = 2667, - AF_BLUE_STRING_THAI_LARGE_DESCENDER = 2683, - AF_BLUE_STRING_THAI_DIGIT_TOP = 2691, - af_blue_1_1 = 2702, + AF_BLUE_STRING_ADLAM_CAPITAL_TOP = 0, + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM = 30, + AF_BLUE_STRING_ADLAM_SMALL_TOP = 40, + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM = 65, + AF_BLUE_STRING_ARABIC_TOP = 105, + AF_BLUE_STRING_ARABIC_BOTTOM = 123, + AF_BLUE_STRING_ARABIC_JOIN = 138, + AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 141, + AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 165, + AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 189, + AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 210, + AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 234, + AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 258, + AF_BLUE_STRING_AVESTAN_TOP = 282, + AF_BLUE_STRING_AVESTAN_BOTTOM = 302, + AF_BLUE_STRING_BAMUM_TOP = 312, + AF_BLUE_STRING_BAMUM_BOTTOM = 344, + AF_BLUE_STRING_BENGALI_BASE = 376, + AF_BLUE_STRING_BENGALI_TOP = 408, + AF_BLUE_STRING_BENGALI_HEAD = 436, + AF_BLUE_STRING_BUHID_TOP = 468, + AF_BLUE_STRING_BUHID_LARGE = 476, + AF_BLUE_STRING_BUHID_SMALL = 488, + AF_BLUE_STRING_BUHID_BOTTOM = 504, + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP = 532, + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM = 564, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP = 596, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM = 628, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP = 660, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM = 688, + AF_BLUE_STRING_CARIAN_TOP = 720, + AF_BLUE_STRING_CARIAN_BOTTOM = 760, + AF_BLUE_STRING_CHAKMA_TOP = 795, + AF_BLUE_STRING_CHAKMA_BOTTOM = 820, + AF_BLUE_STRING_CHAKMA_DESCENDER = 845, + AF_BLUE_STRING_CHEROKEE_CAPITAL = 910, + AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 942, + AF_BLUE_STRING_CHEROKEE_SMALL = 974, + AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 1006, + AF_BLUE_STRING_COPTIC_CAPITAL_TOP = 1022, + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM = 1054, + AF_BLUE_STRING_COPTIC_SMALL_TOP = 1086, + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM = 1118, + AF_BLUE_STRING_CYPRIOT_TOP = 1150, + AF_BLUE_STRING_CYPRIOT_BOTTOM = 1190, + AF_BLUE_STRING_CYPRIOT_SMALL = 1225, + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 1240, + AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 1264, + AF_BLUE_STRING_CYRILLIC_SMALL = 1288, + AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 1312, + AF_BLUE_STRING_DESERET_CAPITAL_TOP = 1321, + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM = 1346, + AF_BLUE_STRING_DESERET_SMALL_TOP = 1371, + AF_BLUE_STRING_DESERET_SMALL_BOTTOM = 1396, + AF_BLUE_STRING_DEVANAGARI_BASE = 1421, + AF_BLUE_STRING_DEVANAGARI_TOP = 1453, + AF_BLUE_STRING_DEVANAGARI_HEAD = 1485, + AF_BLUE_STRING_DEVANAGARI_BOTTOM = 1517, + AF_BLUE_STRING_ETHIOPIC_TOP = 1525, + AF_BLUE_STRING_ETHIOPIC_BOTTOM = 1557, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 1589, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 1621, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 1653, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 1685, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 1717, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 1749, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 1781, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 1813, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 1845, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 1877, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP = 1909, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM = 1941, + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP = 1973, + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM = 2005, + AF_BLUE_STRING_GOTHIC_TOP = 2037, + AF_BLUE_STRING_GOTHIC_BOTTOM = 2077, + AF_BLUE_STRING_GREEK_CAPITAL_TOP = 2097, + AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 2118, + AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 2136, + AF_BLUE_STRING_GREEK_SMALL = 2154, + AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 2178, + AF_BLUE_STRING_GUJARATI_TOP = 2202, + AF_BLUE_STRING_GUJARATI_BOTTOM = 2234, + AF_BLUE_STRING_GUJARATI_ASCENDER = 2266, + AF_BLUE_STRING_GUJARATI_DESCENDER = 2316, + AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 2349, + AF_BLUE_STRING_GURMUKHI_BASE = 2369, + AF_BLUE_STRING_GURMUKHI_HEAD = 2401, + AF_BLUE_STRING_GURMUKHI_TOP = 2433, + AF_BLUE_STRING_GURMUKHI_BOTTOM = 2465, + AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 2497, + AF_BLUE_STRING_HEBREW_TOP = 2517, + AF_BLUE_STRING_HEBREW_BOTTOM = 2541, + AF_BLUE_STRING_HEBREW_DESCENDER = 2559, + AF_BLUE_STRING_KANNADA_TOP = 2574, + AF_BLUE_STRING_KANNADA_BOTTOM = 2618, + AF_BLUE_STRING_KAYAH_LI_TOP = 2650, + AF_BLUE_STRING_KAYAH_LI_BOTTOM = 2674, + AF_BLUE_STRING_KAYAH_LI_ASCENDER = 2694, + AF_BLUE_STRING_KAYAH_LI_DESCENDER = 2702, + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER = 2714, + AF_BLUE_STRING_KHMER_TOP = 2735, + AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 2759, + AF_BLUE_STRING_KHMER_BOTTOM = 2799, + AF_BLUE_STRING_KHMER_DESCENDER = 2831, + AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 2865, + AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 2952, + AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 2960, + AF_BLUE_STRING_LAO_TOP = 2968, + AF_BLUE_STRING_LAO_BOTTOM = 3000, + AF_BLUE_STRING_LAO_ASCENDER = 3032, + AF_BLUE_STRING_LAO_LARGE_ASCENDER = 3048, + AF_BLUE_STRING_LAO_DESCENDER = 3060, + AF_BLUE_STRING_LATIN_CAPITAL_TOP = 3084, + AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 3100, + AF_BLUE_STRING_LATIN_SMALL_F_TOP = 3116, + AF_BLUE_STRING_LATIN_SMALL_TOP = 3130, + AF_BLUE_STRING_LATIN_SMALL_BOTTOM = 3146, + AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 3162, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 3172, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 3192, + AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 3212, + AF_BLUE_STRING_LATIN_SUBS_SMALL = 3232, + AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 3268, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 3288, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 3319, + AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 3348, + AF_BLUE_STRING_LATIN_SUPS_SMALL = 3374, + AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 3399, + AF_BLUE_STRING_LISU_TOP = 3410, + AF_BLUE_STRING_LISU_BOTTOM = 3442, + AF_BLUE_STRING_MALAYALAM_TOP = 3474, + AF_BLUE_STRING_MALAYALAM_BOTTOM = 3518, + AF_BLUE_STRING_MYANMAR_TOP = 3550, + AF_BLUE_STRING_MYANMAR_BOTTOM = 3582, + AF_BLUE_STRING_MYANMAR_ASCENDER = 3614, + AF_BLUE_STRING_MYANMAR_DESCENDER = 3642, + AF_BLUE_STRING_NKO_TOP = 3674, + AF_BLUE_STRING_NKO_BOTTOM = 3698, + AF_BLUE_STRING_NKO_SMALL_TOP = 3713, + AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3722, + AF_BLUE_STRING_OL_CHIKI = 3734, + AF_BLUE_STRING_OLD_TURKIC_TOP = 3758, + AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3773, + AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3793, + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3833, + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3863, + AF_BLUE_STRING_OSAGE_SMALL_TOP = 3878, + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 3918, + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 3958, + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 3983, + AF_BLUE_STRING_OSMANYA_TOP = 3998, + AF_BLUE_STRING_OSMANYA_BOTTOM = 4038, + AF_BLUE_STRING_SAURASHTRA_TOP = 4078, + AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4110, + AF_BLUE_STRING_SHAVIAN_TOP = 4130, + AF_BLUE_STRING_SHAVIAN_BOTTOM = 4140, + AF_BLUE_STRING_SHAVIAN_DESCENDER = 4165, + AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4175, + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4210, + AF_BLUE_STRING_SINHALA_TOP = 4225, + AF_BLUE_STRING_SINHALA_BOTTOM = 4257, + AF_BLUE_STRING_SINHALA_DESCENDER = 4289, + AF_BLUE_STRING_SUNDANESE_TOP = 4333, + AF_BLUE_STRING_SUNDANESE_BOTTOM = 4357, + AF_BLUE_STRING_SUNDANESE_DESCENDER = 4389, + AF_BLUE_STRING_TAI_VIET_TOP = 4397, + AF_BLUE_STRING_TAI_VIET_BOTTOM = 4417, + AF_BLUE_STRING_TAMIL_TOP = 4429, + AF_BLUE_STRING_TAMIL_BOTTOM = 4461, + AF_BLUE_STRING_TELUGU_TOP = 4493, + AF_BLUE_STRING_TELUGU_BOTTOM = 4521, + AF_BLUE_STRING_THAI_TOP = 4549, + AF_BLUE_STRING_THAI_BOTTOM = 4573, + AF_BLUE_STRING_THAI_ASCENDER = 4601, + AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4613, + AF_BLUE_STRING_THAI_DESCENDER = 4625, + AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4641, + AF_BLUE_STRING_THAI_DIGIT_TOP = 4649, + AF_BLUE_STRING_TIFINAGH = 4661, + AF_BLUE_STRING_VAI_TOP = 4693, + AF_BLUE_STRING_VAI_BOTTOM = 4725, + af_blue_1_1 = 4756, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, @@ -239,34 +318,59 @@ FT_BEGIN_HEADER typedef enum AF_Blue_Stringset_ { - AF_BLUE_STRINGSET_ARAB = 0, - AF_BLUE_STRINGSET_ARMN = 4, - AF_BLUE_STRINGSET_BENG = 11, - AF_BLUE_STRINGSET_CHER = 16, - AF_BLUE_STRINGSET_CYRL = 23, - AF_BLUE_STRINGSET_DEVA = 29, - AF_BLUE_STRINGSET_ETHI = 35, - AF_BLUE_STRINGSET_GEOR = 38, - AF_BLUE_STRINGSET_GEOK = 43, - AF_BLUE_STRINGSET_GREK = 50, - AF_BLUE_STRINGSET_GUJR = 57, - AF_BLUE_STRINGSET_GURU = 63, - AF_BLUE_STRINGSET_HEBR = 69, - AF_BLUE_STRINGSET_KNDA = 73, - AF_BLUE_STRINGSET_KHMR = 76, - AF_BLUE_STRINGSET_KHMS = 82, - AF_BLUE_STRINGSET_LAO = 85, - AF_BLUE_STRINGSET_LATN = 91, - AF_BLUE_STRINGSET_LATB = 98, - AF_BLUE_STRINGSET_LATP = 105, - AF_BLUE_STRINGSET_MLYM = 112, - AF_BLUE_STRINGSET_MYMR = 115, - AF_BLUE_STRINGSET_NONE = 120, - AF_BLUE_STRINGSET_SINH = 121, - AF_BLUE_STRINGSET_TAML = 125, - AF_BLUE_STRINGSET_TELU = 128, - AF_BLUE_STRINGSET_THAI = 131, - af_blue_2_1 = 139, + AF_BLUE_STRINGSET_ADLM = 0, + AF_BLUE_STRINGSET_ARAB = 5, + AF_BLUE_STRINGSET_ARMN = 9, + AF_BLUE_STRINGSET_AVST = 16, + AF_BLUE_STRINGSET_BAMU = 19, + AF_BLUE_STRINGSET_BENG = 22, + AF_BLUE_STRINGSET_BUHD = 27, + AF_BLUE_STRINGSET_CAKM = 32, + AF_BLUE_STRINGSET_CANS = 36, + AF_BLUE_STRINGSET_CARI = 43, + AF_BLUE_STRINGSET_CHER = 46, + AF_BLUE_STRINGSET_COPT = 53, + AF_BLUE_STRINGSET_CPRT = 58, + AF_BLUE_STRINGSET_CYRL = 63, + AF_BLUE_STRINGSET_DEVA = 69, + AF_BLUE_STRINGSET_DSRT = 75, + AF_BLUE_STRINGSET_ETHI = 80, + AF_BLUE_STRINGSET_GEOR = 83, + AF_BLUE_STRINGSET_GEOK = 88, + AF_BLUE_STRINGSET_GLAG = 95, + AF_BLUE_STRINGSET_GOTH = 100, + AF_BLUE_STRINGSET_GREK = 103, + AF_BLUE_STRINGSET_GUJR = 110, + AF_BLUE_STRINGSET_GURU = 116, + AF_BLUE_STRINGSET_HEBR = 122, + AF_BLUE_STRINGSET_KALI = 126, + AF_BLUE_STRINGSET_KNDA = 132, + AF_BLUE_STRINGSET_KHMR = 135, + AF_BLUE_STRINGSET_KHMS = 141, + AF_BLUE_STRINGSET_LAO = 144, + AF_BLUE_STRINGSET_LATN = 150, + AF_BLUE_STRINGSET_LATB = 157, + AF_BLUE_STRINGSET_LATP = 164, + AF_BLUE_STRINGSET_LISU = 171, + AF_BLUE_STRINGSET_MLYM = 174, + AF_BLUE_STRINGSET_MYMR = 177, + AF_BLUE_STRINGSET_NKOO = 182, + AF_BLUE_STRINGSET_NONE = 187, + AF_BLUE_STRINGSET_OLCK = 188, + AF_BLUE_STRINGSET_ORKH = 191, + AF_BLUE_STRINGSET_OSGE = 194, + AF_BLUE_STRINGSET_OSMA = 202, + AF_BLUE_STRINGSET_SAUR = 205, + AF_BLUE_STRINGSET_SHAW = 208, + AF_BLUE_STRINGSET_SINH = 214, + AF_BLUE_STRINGSET_SUND = 218, + AF_BLUE_STRINGSET_TAML = 222, + AF_BLUE_STRINGSET_TAVT = 225, + AF_BLUE_STRINGSET_TELU = 228, + AF_BLUE_STRINGSET_THAI = 231, + AF_BLUE_STRINGSET_TFNG = 239, + AF_BLUE_STRINGSET_VAII = 242, + af_blue_2_1 = 245, #ifdef AF_CONFIG_OPTION_CJK AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, af_blue_2_1_1 = af_blue_2_1 + 2, diff --git a/thirdparty/freetype/src/autofit/afblue.hin b/thirdparty/freetype/src/autofit/afblue.hin index dd44e77254..268bcbc531 100644 --- a/thirdparty/freetype/src/autofit/afblue.hin +++ b/thirdparty/freetype/src/autofit/afblue.hin @@ -4,7 +4,7 @@ /* */ /* Auto-fitter data for blue strings (specification). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afcjk.c b/thirdparty/freetype/src/autofit/afcjk.c index 4823c1d7f8..61e29cdeda 100644 --- a/thirdparty/freetype/src/autofit/afcjk.c +++ b/thirdparty/freetype/src/autofit/afcjk.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for CJK writing system (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,13 +29,13 @@ #include "afglobal.h" #include "afpic.h" #include "aflatin.h" +#include "afcjk.h" #ifdef AF_CONFIG_OPTION_CJK #undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT -#include "afcjk.h" #include "aferrors.h" @@ -563,7 +563,7 @@ FT_Face face ) { FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; + FT_Fixed advance = 0, old_advance = 0; void* shaper_buf; @@ -1398,9 +1398,9 @@ other_flags |= AF_LATIN_HINTS_VERT_SNAP; /* - * We adjust stems to full pixels only if we don't use the `light' mode. + * We adjust stems to full pixels unless in `light' or `lcd' mode. */ - if ( mode != FT_RENDER_MODE_LIGHT ) + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) other_flags |= AF_LATIN_HINTS_STEM_ADJUST; if ( mode == FT_RENDER_MODE_MONO ) @@ -2351,13 +2351,13 @@ sizeof ( AF_CJKMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, + (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply + (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply /* style_hints_apply */ ) @@ -2371,13 +2371,13 @@ sizeof ( AF_CJKMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)NULL, + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) NULL, - (AF_WritingSystem_ApplyHintsFunc) NULL + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ ) diff --git a/thirdparty/freetype/src/autofit/afcjk.h b/thirdparty/freetype/src/autofit/afcjk.h index 40d1184386..84f892f909 100644 --- a/thirdparty/freetype/src/autofit/afcjk.h +++ b/thirdparty/freetype/src/autofit/afcjk.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for CJK writing system (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afcover.h b/thirdparty/freetype/src/autofit/afcover.h index 1c39a707ef..1b18c666ab 100644 --- a/thirdparty/freetype/src/autofit/afcover.h +++ b/thirdparty/freetype/src/autofit/afcover.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter coverages (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afdummy.c b/thirdparty/freetype/src/autofit/afdummy.c index f3960c85fd..61c32db5bf 100644 --- a/thirdparty/freetype/src/autofit/afdummy.c +++ b/thirdparty/freetype/src/autofit/afdummy.c @@ -5,7 +5,7 @@ /* Auto-fitter dummy routines to be used if no hinting should be */ /* performed (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -62,13 +62,13 @@ sizeof ( AF_StyleMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)NULL, + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply + (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply /* style_hints_apply */ ) diff --git a/thirdparty/freetype/src/autofit/afdummy.h b/thirdparty/freetype/src/autofit/afdummy.h index 7e58d1a9a5..ebaa7d76ea 100644 --- a/thirdparty/freetype/src/autofit/afdummy.h +++ b/thirdparty/freetype/src/autofit/afdummy.h @@ -5,7 +5,7 @@ /* Auto-fitter dummy routines to be used if no hinting should be */ /* performed (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/aferrors.h b/thirdparty/freetype/src/autofit/aferrors.h index 53c01f64dd..dde182f3c8 100644 --- a/thirdparty/freetype/src/autofit/aferrors.h +++ b/thirdparty/freetype/src/autofit/aferrors.h @@ -4,7 +4,7 @@ /* */ /* Autofitter error codes (specification only). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afglobal.c b/thirdparty/freetype/src/autofit/afglobal.c index ac6dcafc0f..85bef001f7 100644 --- a/thirdparty/freetype/src/autofit/afglobal.c +++ b/thirdparty/freetype/src/autofit/afglobal.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter routines to compute global hinting values (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -168,7 +168,7 @@ AF_Script_UniRange range; - if ( script_class->script_uni_ranges == NULL ) + if ( !script_class->script_uni_ranges ) continue; /* @@ -411,23 +411,11 @@ #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ hb_font_destroy( globals->hb_font ); - globals->hb_font = NULL; - hb_buffer_destroy( globals->hb_buf ); - globals->hb_buf = NULL; #endif - globals->glyph_count = 0; - globals->stem_darkening_for_ppem = 0; - globals->darken_x = 0; - globals->darken_y = 0; - globals->standard_vertical_width = 0; - globals->standard_horizontal_width = 0; - globals->scale_down_factor = 0; - /* no need to free this one! */ - globals->glyph_styles = NULL; - globals->face = NULL; - + /* no need to free `globals->glyph_styles'; */ + /* it is part of the `globals' array */ FT_FREE( globals ); } } @@ -465,7 +453,7 @@ [style_class->writing_system]; metrics = globals->metrics[style]; - if ( metrics == NULL ) + if ( !metrics ) { /* create the global metrics object if necessary */ FT_Memory memory = globals->face->memory; diff --git a/thirdparty/freetype/src/autofit/afglobal.h b/thirdparty/freetype/src/autofit/afglobal.h index ce6b9e8f26..de6142ea26 100644 --- a/thirdparty/freetype/src/autofit/afglobal.h +++ b/thirdparty/freetype/src/autofit/afglobal.h @@ -5,7 +5,7 @@ /* Auto-fitter routines to compute global hinting values */ /* (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afhints.c b/thirdparty/freetype/src/autofit/afhints.c index 6c3d032d1c..f1ff0baef8 100644 --- a/thirdparty/freetype/src/autofit/afhints.c +++ b/thirdparty/freetype/src/autofit/afhints.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -45,7 +45,7 @@ if ( axis->num_segments < AF_SEGMENTS_EMBEDDED ) { - if ( axis->segments == NULL ) + if ( !axis->segments ) { axis->segments = axis->embedded.segments; axis->max_segments = AF_SEGMENTS_EMBEDDED; @@ -110,7 +110,7 @@ if ( axis->num_edges < AF_EDGES_EMBEDDED ) { - if ( axis->edges == NULL ) + if ( !axis->edges ) { axis->edges = axis->embedded.edges; axis->max_edges = AF_EDGES_EMBEDDED; @@ -420,20 +420,19 @@ dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); if ( axis->num_segments ) - AF_DUMP(( " index pos dir from to" - " link serif edge" + AF_DUMP(( " index pos delta dir from to " + " link serif edge" " height extra flags\n" )); else AF_DUMP(( " (none)\n" )); for ( seg = segments; seg < limit; seg++ ) - AF_DUMP(( " %5d %5.2g %5s %4d %4d" + AF_DUMP(( " %5d %5d %5d %5s %4d %4d" " %4s %5s %4s" " %6d %5d %11s\n", AF_INDEX_NUM( seg, segments ), - dimension == AF_DIMENSION_HORZ - ? (int)seg->first->ox / 64.0 - : (int)seg->first->oy / 64.0, + seg->pos, + seg->delta, af_dir_str( (AF_Direction)seg->dir ), AF_INDEX_NUM( seg->first, points ), AF_INDEX_NUM( seg->last, points ), @@ -553,18 +552,26 @@ * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges * since they have a constant X coordinate. */ - AF_DUMP(( "Table of %s edges:\n", - dimension == AF_DIMENSION_HORZ ? "vertical" - : "horizontal" )); + if ( dimension == AF_DIMENSION_HORZ ) + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "vertical", + 65536.0 * 64.0 / hints->x_scale, + 10.0 * hints->x_scale / 65536.0 / 64.0 )); + else + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "horizontal", + 65536.0 * 64.0 / hints->y_scale, + 10.0 * hints->y_scale / 65536.0 / 64.0 )); + if ( axis->num_edges ) - AF_DUMP(( " index pos dir link serif" - " blue opos pos flags\n" )); + AF_DUMP(( " index pos dir link serif" + " blue opos pos flags\n" )); else AF_DUMP(( " (none)\n" )); for ( edge = edges; edge < limit; edge++ ) - AF_DUMP(( " %5d %5.2g %5s %4s %5s" - " %c %5.2f %5.2f %11s\n", + AF_DUMP(( " %5d %7.2f %5s %4s %5s" + " %c %7.2f %7.2f %11s\n", AF_INDEX_NUM( edge, edges ), (int)edge->opos / 64.0, af_dir_str( (AF_Direction)edge->dir ), @@ -736,7 +743,7 @@ if ( new_max <= AF_CONTOURS_EMBEDDED ) { - if ( hints->contours == NULL ) + if ( !hints->contours ) { hints->contours = hints->embedded.contours; hints->max_contours = AF_CONTOURS_EMBEDDED; @@ -765,7 +772,7 @@ if ( new_max <= AF_POINTS_EMBEDDED ) { - if ( hints->points == NULL ) + if ( !hints->points ) { hints->points = hints->embedded.points; hints->max_points = AF_POINTS_EMBEDDED; @@ -1175,7 +1182,7 @@ AF_Point point, first, last; - if ( edge == NULL ) + if ( !edge ) continue; first = seg->first; @@ -1201,7 +1208,7 @@ AF_Point point, first, last; - if ( edge == NULL ) + if ( !edge ) continue; first = seg->first; diff --git a/thirdparty/freetype/src/autofit/afhints.h b/thirdparty/freetype/src/autofit/afhints.h index 5142e6ed21..16638b1030 100644 --- a/thirdparty/freetype/src/autofit/afhints.h +++ b/thirdparty/freetype/src/autofit/afhints.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -260,6 +260,7 @@ FT_BEGIN_HEADER FT_Byte flags; /* edge/segment flags for this segment */ FT_Char dir; /* segment direction */ FT_Short pos; /* position of segment */ + FT_Short delta; /* deviation from segment position */ FT_Short min_coord; /* minimum coordinate of segment */ FT_Short max_coord; /* maximum coordinate of segment */ FT_Short height; /* the hinted segment height */ diff --git a/thirdparty/freetype/src/autofit/afindic.c b/thirdparty/freetype/src/autofit/afindic.c index 097a2b2995..23be46ed51 100644 --- a/thirdparty/freetype/src/autofit/afindic.c +++ b/thirdparty/freetype/src/autofit/afindic.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for Indic writing system (body). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,13 +18,13 @@ #include "aftypes.h" #include "aflatin.h" +#include "afcjk.h" #ifdef AF_CONFIG_OPTION_INDIC #include "afindic.h" #include "aferrors.h" -#include "afcjk.h" #ifdef AF_CONFIG_OPTION_USE_WARPER @@ -121,13 +121,13 @@ sizeof ( AF_CJKMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, + (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply + (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply /* style_hints_apply */ ) @@ -141,13 +141,13 @@ sizeof ( AF_CJKMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) NULL, - (AF_WritingSystem_ScaleMetricsFunc)NULL, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)NULL, + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) NULL, - (AF_WritingSystem_ApplyHintsFunc) NULL + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ ) diff --git a/thirdparty/freetype/src/autofit/afindic.h b/thirdparty/freetype/src/autofit/afindic.h index 0772e07a29..ec9e263161 100644 --- a/thirdparty/freetype/src/autofit/afindic.h +++ b/thirdparty/freetype/src/autofit/afindic.h @@ -5,7 +5,7 @@ /* Auto-fitter hinting routines for Indic writing system */ /* (specification). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/aflatin.c b/thirdparty/freetype/src/autofit/aflatin.c index 7ccf3f6e37..11fa523c83 100644 --- a/thirdparty/freetype/src/autofit/aflatin.c +++ b/thirdparty/freetype/src/autofit/aflatin.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter hinting routines for latin writing system (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -265,6 +265,45 @@ } + static void + af_latin_sort_blue( FT_UInt count, + AF_LatinBlue* table ) + { + FT_UInt i, j; + AF_LatinBlue swap; + + + /* we sort from bottom to top */ + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + FT_Pos a, b; + + + if ( table[j - 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + a = table[j - 1]->ref.org; + else + a = table[j - 1]->shoot.org; + + if ( table[j]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = table[j]->ref.org; + else + b = table[j]->shoot.org; + + if ( b >= a ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + /* Find all blue zones. Flat segments give the reference points, */ /* round segments the overshoot positions. */ @@ -928,6 +967,60 @@ af_shaper_buf_destroy( face, shaper_buf ); + /* we finally check whether blue zones are ordered; */ + /* `ref' and `shoot' values of two blue zones must not overlap */ + if ( axis->blue_count ) + { + FT_UInt i; + AF_LatinBlue blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2]; + + + for ( i = 0; i < axis->blue_count; i++ ) + blue_sorted[i] = &axis->blues[i]; + + /* sort bottoms of blue zones... */ + af_latin_sort_blue( axis->blue_count, blue_sorted ); + + /* ...and adjust top values if necessary */ + for ( i = 0; i < axis->blue_count - 1; i++ ) + { + FT_Pos* a; + FT_Pos* b; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool a_is_top = 0; +#endif + + + if ( blue_sorted[i]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + { + a = &blue_sorted[i]->shoot.org; +#ifdef FT_DEBUG_LEVEL_TRACE + a_is_top = 1; +#endif + } + else + a = &blue_sorted[i]->ref.org; + + if ( blue_sorted[i + 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = &blue_sorted[i + 1]->shoot.org; + else + b = &blue_sorted[i + 1]->ref.org; + + if ( *a > *b ) + { + *a = *b; + FT_TRACE5(( "blue zone overlap:" + " adjusting %s %d to %ld\n", + a_is_top ? "overshoot" : "reference", + blue_sorted[i] - axis->blues, + *a )); + } + } + } + FT_TRACE5(( "\n" )); return; @@ -941,7 +1034,7 @@ FT_Face face ) { FT_Bool started = 0, same_width = 1; - FT_Fixed advance, old_advance = 0; + FT_Fixed advance = 0, old_advance = 0; void* shaper_buf; @@ -1076,7 +1169,7 @@ FT_UInt ppem; - scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + scaled = FT_MulFix( blue->shoot.org, scale ); ppem = metrics->root.scaler.face->size->metrics.x_ppem; limit = metrics->root.globals->increase_x_height; threshold = 40; @@ -1123,18 +1216,18 @@ if ( dist == 0 ) { - scale = new_scale; - FT_TRACE5(( "af_latin_metrics_scale_dim:" " x height alignment (style `%s'):\n" " " - " vertical scaling changed from %.4f to %.4f (by %d%%)\n" + " vertical scaling changed from %.5f to %.5f (by %d%%)\n" "\n", af_style_names[metrics->root.style_class->style], - axis->org_scale / 65536.0, scale / 65536.0, + new_scale / 65536.0, ( fitted - scaled ) * 100 / scaled )); + + scale = new_scale; } #ifdef FT_DEBUG_LEVEL_TRACE else @@ -1536,8 +1629,9 @@ /* points are different: we are just leaving an edge, thus */ /* record a new segment */ - segment->last = point; - segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); /* a segment is round if either its first or last point */ /* is a control point, and the length of the on points */ @@ -1950,6 +2044,10 @@ FT_Memory memory = hints->memory; AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = hints->metrics->globals; +#endif + AF_StyleClass style_class = hints->metrics->style_class; AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET [style_class->script]; @@ -1966,6 +2064,7 @@ FT_Fixed scale; FT_Pos edge_distance_threshold; FT_Pos segment_length_threshold; + FT_Pos segment_width_threshold; axis->num_edges = 0; @@ -1987,9 +2086,15 @@ * corresponding threshold in font units. */ if ( dim == AF_DIMENSION_HORZ ) - segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); else - segment_length_threshold = 0; + segment_length_threshold = 0; + + /* + * Similarly, we ignore segments that have a width delta + * larger than 0.5px (i.e., a width larger than 1px). + */ + segment_width_threshold = FT_DivFix( 32, scale ); /*********************************************************************/ /* */ @@ -2022,9 +2127,10 @@ FT_Int ee; - /* ignore too short segments and, in this loop, */ - /* one-point segments without a direction */ + /* ignore too short segments, too wide ones, and, in this loop, */ + /* one-point segments without a direction */ if ( seg->height < segment_length_threshold || + seg->delta > segment_width_threshold || seg->dir == AF_DIR_NONE ) continue; @@ -2202,7 +2308,7 @@ seg->serif->edge && seg->serif->edge != edge ); - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + if ( ( seg->link && seg->link->edge ) || is_serif ) { AF_Edge edge2; AF_Segment seg2; @@ -2469,23 +2575,23 @@ other_flags |= AF_LATIN_HINTS_VERT_SNAP; /* - * We adjust stems to full pixels only if we don't use the `light' mode. + * We adjust stems to full pixels unless in `light' or `lcd' mode. */ - if ( mode != FT_RENDER_MODE_LIGHT ) + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) other_flags |= AF_LATIN_HINTS_STEM_ADJUST; if ( mode == FT_RENDER_MODE_MONO ) other_flags |= AF_LATIN_HINTS_MONO; /* - * In `light' hinting mode we disable horizontal hinting completely. + * In `light' or `lcd' mode we disable horizontal hinting completely. * We also do it if the face is italic. * * However, if warping is enabled (which only works in `light' hinting * mode), advance widths get adjusted, too. */ - if ( mode == FT_RENDER_MODE_LIGHT || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) + if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || + ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; #ifdef AF_CONFIG_OPTION_USE_WARPER @@ -2825,6 +2931,10 @@ AF_Edge anchor = NULL; FT_Int has_serifs = 0; +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = hints->metrics->globals; +#endif + AF_StyleClass style_class = hints->metrics->style_class; AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET [style_class->script]; @@ -3468,13 +3578,13 @@ sizeof ( AF_LatinMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, + (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply + (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply /* style_hints_apply */ ) diff --git a/thirdparty/freetype/src/autofit/aflatin.h b/thirdparty/freetype/src/autofit/aflatin.h index fe6bbd801a..d80e125ddc 100644 --- a/thirdparty/freetype/src/autofit/aflatin.h +++ b/thirdparty/freetype/src/autofit/aflatin.h @@ -5,7 +5,7 @@ /* Auto-fitter hinting routines for latin writing system */ /* (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/aflatin2.c b/thirdparty/freetype/src/autofit/aflatin2.c index 5db4a41141..0607278b1e 100644 --- a/thirdparty/freetype/src/autofit/aflatin2.c +++ b/thirdparty/freetype/src/autofit/aflatin2.c @@ -9,7 +9,7 @@ /* */ /* Auto-fitter hinting routines for latin writing system (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,6 +23,9 @@ #include FT_ADVANCES_H + +#ifdef FT_OPTION_AUTOFIT2 + #include "afglobal.h" #include "aflatin.h" #include "aflatin2.h" @@ -1303,7 +1306,7 @@ seg->serif->edge && seg->serif->edge != edge ); - if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + if ( ( seg->link && seg->link->edge ) || is_serif ) { AF_Edge edge2; AF_Segment seg2; @@ -1555,20 +1558,20 @@ other_flags |= AF_LATIN_HINTS_VERT_SNAP; /* - * We adjust stems to full pixels only if we don't use the `light' mode. + * We adjust stems to full pixels unless in `light' or `lcd' mode. */ - if ( mode != FT_RENDER_MODE_LIGHT ) + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) other_flags |= AF_LATIN_HINTS_STEM_ADJUST; if ( mode == FT_RENDER_MODE_MONO ) other_flags |= AF_LATIN_HINTS_MONO; /* - * In `light' hinting mode we disable horizontal hinting completely. + * In `light' or `lcd' mode we disable horizontal hinting completely. * We also do it if the face is italic. */ - if ( mode == FT_RENDER_MODE_LIGHT || - ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) + if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || + ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; #ifdef AF_CONFIG_OPTION_USE_WARPER @@ -2410,14 +2413,21 @@ sizeof ( AF_LatinMetricsRec ), - (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init, - (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale, - (AF_WritingSystem_DoneMetricsFunc) NULL, - (AF_WritingSystem_GetStdWidthsFunc)af_latin2_get_standard_widths, + (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_latin2_get_standard_widths, /* style_metrics_getstdw */ - (AF_WritingSystem_InitHintsFunc) af_latin2_hints_init, - (AF_WritingSystem_ApplyHintsFunc) af_latin2_hints_apply + (AF_WritingSystem_InitHintsFunc) af_latin2_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_latin2_hints_apply /* style_hints_apply */ ) +#else /* !FT_OPTION_AUTOFIT2 */ + + /* ANSI C doesn't like empty source files */ + typedef int _af_latin2_dummy; + +#endif /* !FT_OPTION_AUTOFIT2 */ + /* END */ diff --git a/thirdparty/freetype/src/autofit/aflatin2.h b/thirdparty/freetype/src/autofit/aflatin2.h index f83f704289..2d0b154f58 100644 --- a/thirdparty/freetype/src/autofit/aflatin2.h +++ b/thirdparty/freetype/src/autofit/aflatin2.h @@ -10,7 +10,7 @@ /* Auto-fitter hinting routines for latin writing system */ /* (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afloader.c b/thirdparty/freetype/src/autofit/afloader.c index 26bba065bb..78c4368b61 100644 --- a/thirdparty/freetype/src/autofit/afloader.c +++ b/thirdparty/freetype/src/autofit/afloader.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter glyph loading routines (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -51,7 +51,7 @@ loader->face = face; loader->globals = (AF_FaceGlobals)face->autohint.data; - if ( loader->globals == NULL ) + if ( !loader->globals ) { error = af_face_globals_new( face, &loader->globals, module ); if ( !error ) @@ -86,169 +86,316 @@ ( (FT_Fixed)( (f) * 65536.0 + 0.5 ) ) - /* Do the main work of `af_loader_load_glyph'. Note that we never */ - /* have to deal with composite glyphs as those get loaded into */ - /* FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. */ - /* In the rare cases where FT_LOAD_NO_RECURSE is set, it implies */ - /* FT_LOAD_NO_SCALE and as such the auto-hinter is never called. */ - static FT_Error - af_loader_load_g( AF_Loader loader, - AF_Scaler scaler, - FT_UInt glyph_index, - FT_Int32 load_flags ) + af_loader_embolden_glyph_in_slot( AF_Loader loader, + FT_Face face, + AF_StyleMetrics style_metrics ) { - AF_Module module = loader->globals->module; + FT_Error error = FT_Err_Ok; - FT_Error error; - FT_Face face = loader->face; - AF_StyleMetrics metrics = loader->metrics; - AF_GlyphHints hints = loader->hints; - FT_GlyphSlot slot = face->glyph; - FT_Slot_Internal internal = slot->internal; - FT_GlyphLoader gloader = internal->loader; - FT_Int32 flags; + FT_GlyphSlot slot = face->glyph; + AF_FaceGlobals globals = loader->globals; + AF_WritingSystemClass writing_system_class; + FT_Size_Metrics* size_metrics = &face->size->internal->autohint_metrics; - flags = load_flags | FT_LOAD_LINEAR_DESIGN; - error = FT_Load_Glyph( face, glyph_index, flags ); - if ( error ) + FT_Pos stdVW = 0; + FT_Pos stdHW = 0; + + FT_Bool size_changed = size_metrics->x_ppem != + globals->stem_darkening_for_ppem; + + FT_Fixed em_size = af_intToFixed( face->units_per_EM ); + FT_Fixed em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size ); + + FT_Matrix scale_down_matrix = { 0x10000L, 0, 0, 0x10000L }; + + + /* Skip stem darkening for broken fonts. */ + if ( !face->units_per_EM ) + { + error = FT_ERR( Corrupted_Font_Header ); goto Exit; + } /* - * Apply stem darkening (emboldening) here before hints are applied to - * the outline. Glyphs are scaled down proportionally to the - * emboldening so that curve points don't fall outside their precomputed - * blue zones. - * - * Any emboldening done by the font driver (e.g., the CFF driver) - * doesn't reach here because the autohinter loads the unprocessed - * glyphs in font units for analysis (functions `af_*_metrics_init_*') - * and then above to prepare it for the rasterizers by itself, - * independently of the font driver. So emboldening must be done here, - * within the autohinter. - * - * All glyphs to be autohinted pass through here one by one. The - * standard widths can therefore change from one glyph to the next, - * depending on what script a glyph is assigned to (each script has its - * own set of standard widths and other metrics). The darkening amount - * must therefore be recomputed for each size and - * `standard_{vertical,horizontal}_width' change. + * We depend on the writing system (script analyzers) to supply + * standard widths for the script of the glyph we are looking at. If + * it can't deliver, stem darkening is disabled. */ - if ( !module->no_stem_darkening ) + writing_system_class = + AF_WRITING_SYSTEM_CLASSES_GET[style_metrics->style_class->writing_system]; + + if ( writing_system_class->style_metrics_getstdw ) + writing_system_class->style_metrics_getstdw( style_metrics, + &stdHW, + &stdVW ); + else { - AF_FaceGlobals globals = loader->globals; - AF_WritingSystemClass writing_system_class; + error = FT_ERR( Unimplemented_Feature ); + goto Exit; + } - FT_Pos stdVW = 0; - FT_Pos stdHW = 0; + if ( size_changed || + ( stdVW > 0 && stdVW != globals->standard_vertical_width ) ) + { + FT_Fixed darken_by_font_units_x, darken_x; - FT_Bool size_changed = face->size->metrics.x_ppem - != globals->stem_darkening_for_ppem; - FT_Fixed em_size = af_intToFixed( face->units_per_EM ); - FT_Fixed em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size ); + darken_by_font_units_x = + af_intToFixed( af_loader_compute_darkening( loader, + face, + stdVW ) ); + darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x, + size_metrics->x_scale ), + em_ratio ); - FT_Matrix scale_down_matrix = { 0x10000L, 0, 0, 0x10000L }; + globals->standard_vertical_width = stdVW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_x = af_fixedToInt( darken_x ); + } + if ( size_changed || + ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) ) + { + FT_Fixed darken_by_font_units_y, darken_y; + + + darken_by_font_units_y = + af_intToFixed( af_loader_compute_darkening( loader, + face, + stdHW ) ); + darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y, + size_metrics->y_scale ), + em_ratio ); - /* Skip stem darkening for broken fonts. */ - if ( !face->units_per_EM ) - goto After_Emboldening; + globals->standard_horizontal_width = stdHW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_y = af_fixedToInt( darken_y ); /* - * We depend on the writing system (script analyzers) to supply - * standard widths for the script of the glyph we are looking at. If - * it can't deliver, stem darkening is effectively disabled. + * Scale outlines down on the Y-axis to keep them inside their blue + * zones. The stronger the emboldening, the stronger the downscaling + * (plus heuristical padding to prevent outlines still falling out + * their zones due to rounding). + * + * Reason: `FT_Outline_Embolden' works by shifting the rightmost + * points of stems farther to the right, and topmost points farther + * up. This positions points on the Y-axis outside their + * pre-computed blue zones and leads to distortion when applying the + * hints in the code further below. Code outside this emboldening + * block doesn't know we are presenting it with modified outlines the + * analyzer didn't see! + * + * An unfortunate side effect of downscaling is that the emboldening + * effect is slightly decreased. The loss becomes more pronounced + * versus the CFF driver at smaller sizes, e.g., at 9ppem and below. */ - writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[metrics->style_class->writing_system]; + globals->scale_down_factor = + FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ), + em_size ); + } - if ( writing_system_class->style_metrics_getstdw ) - writing_system_class->style_metrics_getstdw( metrics, - &stdHW, - &stdVW ); - else - goto After_Emboldening; + FT_Outline_EmboldenXY( &slot->outline, + globals->darken_x, + globals->darken_y ); + scale_down_matrix.yy = globals->scale_down_factor; + FT_Outline_Transform( &slot->outline, &scale_down_matrix ); - if ( size_changed || - ( stdVW > 0 && stdVW != globals->standard_vertical_width ) ) - { - FT_Fixed darken_by_font_units_x, darken_x; + Exit: + return error; + } - darken_by_font_units_x = - af_intToFixed( af_loader_compute_darkening( loader, - face, - stdVW ) ); - darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x, - face->size->metrics.x_scale ), - em_ratio ); + /* Load the glyph at index into the current slot of a face and hint it. */ - globals->standard_vertical_width = stdVW; - globals->stem_darkening_for_ppem = face->size->metrics.x_ppem; - globals->darken_x = af_fixedToInt( darken_x ); - } + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + AF_Module module, + FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + + FT_Size size = face->size; + FT_Size_Internal size_internal = size->internal; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal slot_internal = slot->internal; + FT_GlyphLoader gloader = slot_internal->loader; + + AF_GlyphHints hints = loader->hints; + AF_ScalerRec scaler; + AF_StyleMetrics style_metrics; + FT_UInt style_options = AF_STYLE_NONE_DFLT; + AF_StyleClass style_class; + AF_WritingSystemClass writing_system_class; - if ( size_changed || - ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) ) +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = loader->globals; +#endif + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + FT_ZERO( &scaler ); + + if ( !size_internal->autohint_metrics.x_scale || + size_internal->autohint_mode != FT_LOAD_TARGET_MODE( load_flags ) ) + { + /* switching between hinting modes usually means different scaling */ + /* values; this later on enforces recomputation of everything */ + /* related to the current size */ + + size_internal->autohint_mode = FT_LOAD_TARGET_MODE( load_flags ); + size_internal->autohint_metrics = size->metrics; + +#ifdef AF_CONFIG_OPTION_TT_SIZE_METRICS { - FT_Fixed darken_by_font_units_y, darken_y; - - - darken_by_font_units_y = - af_intToFixed( af_loader_compute_darkening( loader, - face, - stdHW ) ); - darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y, - face->size->metrics.y_scale ), - em_ratio ); - - globals->standard_horizontal_width = stdHW; - globals->stem_darkening_for_ppem = face->size->metrics.x_ppem; - globals->darken_y = af_fixedToInt( darken_y ); - - /* - * Scale outlines down on the Y-axis to keep them inside their blue - * zones. The stronger the emboldening, the stronger the - * downscaling (plus heuristical padding to prevent outlines still - * falling out their zones due to rounding). - * - * Reason: `FT_Outline_Embolden' works by shifting the rightmost - * points of stems farther to the right, and topmost points farther - * up. This positions points on the Y-axis outside their - * pre-computed blue zones and leads to distortion when applying the - * hints in the code further below. Code outside this emboldening - * block doesn't know we are presenting it with modified outlines - * the analyzer didn't see! - * - * An unfortunate side effect of downscaling is that the emboldening - * effect is slightly decreased. The loss becomes more pronounced - * versus the CFF driver at smaller sizes, e.g., at 9ppem and below. - */ - globals->scale_down_factor = - FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ), - em_size ); + FT_Size_Metrics* size_metrics = &size_internal->autohint_metrics; + + + /* set metrics to integer values and adjust scaling accordingly; */ + /* this is the same setup as with TrueType fonts, cf. function */ + /* `tt_size_reset' in file `ttobjs.c' */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->height, + size_metrics->y_scale ) ); + + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->units_per_EM ); + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->max_advance_width, + size_metrics->x_scale ) ); } +#endif /* AF_CONFIG_OPTION_TT_SIZE_METRICS */ + } + + /* + * TODO: This code currently doesn't support fractional advance widths, + * i.e., placing hinted glyphs at anything other than integer + * x-positions. This is only relevant for the warper code, which + * scales and shifts glyphs to optimize blackness of stems (hinting on + * the x-axis by nature places things on pixel integers, hinting on the + * y-axis only, i.e., LIGHT mode, doesn't touch the x-axis). The delta + * values of the scaler would need to be adjusted. + */ + scaler.face = face; + scaler.x_scale = size_internal->autohint_metrics.x_scale; + scaler.x_delta = 0; + scaler.y_scale = size_internal->autohint_metrics.y_scale; + scaler.y_delta = 0; + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; + + /* note that the fallback style can't be changed anymore */ + /* after the first call of `af_loader_load_glyph' */ + error = af_loader_reset( loader, module, face ); + if ( error ) + goto Exit; + +#ifdef FT_OPTION_AUTOFIT2 + /* XXX: undocumented hook to activate the latin2 writing system. */ + if ( load_flags & ( 1UL << 20 ) ) + style_options = AF_STYLE_LTN2_DFLT; +#endif + + /* + * Glyphs (really code points) are assigned to scripts. Script + * analysis is done lazily: For each glyph that passes through here, + * the corresponding script analyzer is called, but returns immediately + * if it has been run already. + */ + error = af_face_globals_get_metrics( loader->globals, glyph_index, + style_options, &style_metrics ); + if ( error ) + goto Exit; + + style_class = style_metrics->style_class; + writing_system_class = + AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - FT_Outline_EmboldenXY( &slot->outline, - globals->darken_x, - globals->darken_y ); + loader->metrics = style_metrics; - scale_down_matrix.yy = globals->scale_down_factor; - FT_Outline_Transform( &slot->outline, &scale_down_matrix ); + if ( writing_system_class->style_metrics_scale ) + writing_system_class->style_metrics_scale( style_metrics, &scaler ); + else + style_metrics->scaler = scaler; + + if ( writing_system_class->style_hints_init ) + { + error = writing_system_class->style_hints_init( hints, + style_metrics ); + if ( error ) + goto Exit; } - After_Emboldening: - loader->transformed = internal->glyph_transformed; + /* + * Do the main work of `af_loader_load_glyph'. Note that we never have + * to deal with composite glyphs as those get loaded into + * FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. + * In the rare cases where FT_LOAD_NO_RECURSE is set, it implies + * FT_LOAD_NO_SCALE and as such the auto-hinter is never called. + */ + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM | + FT_LOAD_LINEAR_DESIGN; + load_flags &= ~FT_LOAD_RENDER; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + /* + * Apply stem darkening (emboldening) here before hints are applied to + * the outline. Glyphs are scaled down proportionally to the + * emboldening so that curve points don't fall outside their + * precomputed blue zones. + * + * Any emboldening done by the font driver (e.g., the CFF driver) + * doesn't reach here because the autohinter loads the unprocessed + * glyphs in font units for analysis (functions `af_*_metrics_init_*') + * and then above to prepare it for the rasterizers by itself, + * independently of the font driver. So emboldening must be done here, + * within the autohinter. + * + * All glyphs to be autohinted pass through here one by one. The + * standard widths can therefore change from one glyph to the next, + * depending on what script a glyph is assigned to (each script has its + * own set of standard widths and other metrics). The darkening amount + * must therefore be recomputed for each size and + * `standard_{vertical,horizontal}_width' change. + * + * Ignore errors and carry on without emboldening. + * + */ + + /* stem darkening only works well in `light' mode */ + if ( scaler.render_mode == FT_RENDER_MODE_LIGHT && + ( !face->internal->no_stem_darkening || + ( face->internal->no_stem_darkening < 0 && + !module->no_stem_darkening ) ) ) + af_loader_embolden_glyph_in_slot( loader, face, style_metrics ); + + loader->transformed = slot_internal->glyph_transformed; if ( loader->transformed ) { FT_Matrix inverse; - loader->trans_matrix = internal->glyph_matrix; - loader->trans_delta = internal->glyph_delta; + loader->trans_matrix = slot_internal->glyph_matrix; + loader->trans_delta = slot_internal->glyph_delta; inverse = loader->trans_matrix; if ( !FT_Matrix_Invert( &inverse ) ) @@ -264,8 +411,8 @@ loader->trans_delta.x, loader->trans_delta.y ); - /* compute original horizontal phantom points (and ignore */ - /* vertical ones) */ + /* compute original horizontal phantom points */ + /* (and ignore vertical ones) */ loader->pp1.x = hints->x_delta; loader->pp1.y = hints->y_delta; loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, @@ -276,30 +423,21 @@ if ( slot->outline.n_points == 0 ) goto Hint_Metrics; - /* now load the slot image into the auto-outline and run the */ - /* automatic hinting process */ - { -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = loader->globals; -#endif - AF_StyleClass style_class = metrics->style_class; - AF_WritingSystemClass writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - - - if ( writing_system_class->style_hints_apply ) - writing_system_class->style_hints_apply( glyph_index, - hints, - &gloader->base.outline, - metrics ); - } + /* now load the slot image into the auto-outline */ + /* and run the automatic hinting process */ + if ( writing_system_class->style_hints_apply ) + writing_system_class->style_hints_apply( glyph_index, + hints, + &gloader->base.outline, + style_metrics ); /* we now need to adjust the metrics according to the change in */ /* width/positioning that occurred during the hinting process */ - if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT ) { - FT_Pos old_rsb, old_lsb, new_lsb; - FT_Pos pp1x_uh, pp2x_uh; + FT_Pos old_rsb, old_lsb, new_lsb; + FT_Pos pp1x_uh, pp2x_uh; + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; AF_Edge edge1 = axis->edges; /* leftmost edge */ AF_Edge edge2 = edge1 + @@ -309,12 +447,12 @@ if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) { old_rsb = loader->pp2.x - edge2->opos; - old_lsb = edge1->opos; + /* loader->pp1.x is always zero at this point of time */ + old_lsb = edge1->opos /* - loader->pp1.x */; new_lsb = edge1->pos; /* remember unhinted values to later account */ /* for rounding errors */ - pp1x_uh = new_lsb - old_lsb; pp2x_uh = edge2->pos + old_rsb; @@ -352,6 +490,8 @@ slot->rsb_delta = loader->pp2.x - pp2x; } } + /* `light' mode uses integer advance widths */ + /* but sets `lsb_delta' and `rsb_delta' */ else { FT_Pos pp1x = loader->pp1.x; @@ -380,8 +520,8 @@ vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; - vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); - vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); + vvector.x = FT_MulFix( vvector.x, style_metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, style_metrics->scaler.y_scale ); /* transform the hinted outline if needed */ if ( loader->transformed ) @@ -389,12 +529,12 @@ FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); FT_Vector_Transform( &vvector, &loader->trans_matrix ); } -#if 1 + /* we must translate our final outline by -pp1.x and compute */ /* the new metrics */ if ( loader->pp1.x ) FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); -#endif + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); @@ -413,20 +553,14 @@ /* for mono-width fonts (like Andale, Courier, etc.) we need */ /* to keep the original rounded advance width; ditto for */ /* digits if all have the same advance width */ -#if 0 - if ( !FT_IS_FIXED_WIDTH( slot->face ) ) - slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - else - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - x_scale ); -#else - if ( scaler->render_mode != FT_RENDER_MODE_LIGHT && + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT && ( FT_IS_FIXED_WIDTH( slot->face ) || ( af_face_globals_is_digit( loader->globals, glyph_index ) && - metrics->digits_have_same_width ) ) ) + style_metrics->digits_have_same_width ) ) ) { - slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, - metrics->scaler.x_scale ); + slot->metrics.horiAdvance = + FT_MulFix( slot->metrics.horiAdvance, + style_metrics->scaler.x_scale ); /* Set delta values to 0. Otherwise code that uses them is */ /* going to ruin the fixed advance width. */ @@ -439,23 +573,13 @@ if ( slot->metrics.horiAdvance ) slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; } -#endif slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, - metrics->scaler.y_scale ); + style_metrics->scaler.y_scale ); slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); -#if 0 - /* reassign all outline fields except flags to protect them */ - slot->outline.n_contours = internal->loader->base.outline.n_contours; - slot->outline.n_points = internal->loader->base.outline.n_points; - slot->outline.points = internal->loader->base.outline.points; - slot->outline.tags = internal->loader->base.outline.tags; - slot->outline.contours = internal->loader->base.outline.contours; -#endif - slot->format = FT_GLYPH_FORMAT_OUTLINE; } @@ -464,85 +588,6 @@ } - /* Load a glyph. */ - - FT_LOCAL_DEF( FT_Error ) - af_loader_load_glyph( AF_Loader loader, - AF_Module module, - FT_Face face, - FT_UInt gindex, - FT_Int32 load_flags ) - { - FT_Error error; - FT_Size size = face->size; - AF_ScalerRec scaler; - - - if ( !size ) - return FT_THROW( Invalid_Size_Handle ); - - FT_ZERO( &scaler ); - - scaler.face = face; - scaler.x_scale = size->metrics.x_scale; - scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - scaler.y_scale = size->metrics.y_scale; - scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ - - scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); - scaler.flags = 0; /* XXX: fix this */ - - error = af_loader_reset( loader, module, face ); - if ( !error ) - { - AF_StyleMetrics metrics; - FT_UInt options = AF_STYLE_NONE_DFLT; - - -#ifdef FT_OPTION_AUTOFIT2 - /* XXX: undocumented hook to activate the latin2 writing system */ - if ( load_flags & ( 1UL << 20 ) ) - options = AF_STYLE_LTN2_DFLT; -#endif - - error = af_face_globals_get_metrics( loader->globals, gindex, - options, &metrics ); - if ( !error ) - { -#ifdef FT_CONFIG_OPTION_PIC - AF_FaceGlobals globals = loader->globals; -#endif - AF_StyleClass style_class = metrics->style_class; - AF_WritingSystemClass writing_system_class = - AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; - - - loader->metrics = metrics; - - if ( writing_system_class->style_metrics_scale ) - writing_system_class->style_metrics_scale( metrics, &scaler ); - else - metrics->scaler = scaler; - - load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; - load_flags &= ~FT_LOAD_RENDER; - - if ( writing_system_class->style_hints_init ) - { - error = writing_system_class->style_hints_init( loader->hints, - metrics ); - if ( error ) - goto Exit; - } - - error = af_loader_load_g( loader, &scaler, gindex, load_flags ); - } - } - Exit: - return error; - } - - /* * Compute amount of font units the face should be emboldened by, in * analogy to the CFF driver's `cf2_computeDarkening' function. See there diff --git a/thirdparty/freetype/src/autofit/afloader.h b/thirdparty/freetype/src/autofit/afloader.h index 0062eb9b07..2578abed16 100644 --- a/thirdparty/freetype/src/autofit/afloader.h +++ b/thirdparty/freetype/src/autofit/afloader.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter glyph loading routines (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afmodule.c b/thirdparty/freetype/src/autofit/afmodule.c index 4127382c00..9d7ba224da 100644 --- a/thirdparty/freetype/src/autofit/afmodule.c +++ b/thirdparty/freetype/src/autofit/afmodule.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter module implementation (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -104,21 +104,45 @@ } +#ifdef FT_CONFIG_OPTION_PIC + +#undef AF_SCRIPT_CLASSES_GET +#define AF_SCRIPT_CLASSES_GET \ + ( GET_PIC( ft_module->library )->af_script_classes ) + +#undef AF_STYLE_CLASSES_GET +#define AF_STYLE_CLASSES_GET \ + ( GET_PIC( ft_module->library )->af_style_classes ) + +#endif + + static FT_Error af_property_set( FT_Module ft_module, const char* property_name, - const void* value ) + const void* value, + FT_Bool value_is_string ) { FT_Error error = FT_Err_Ok; AF_Module module = (AF_Module)ft_module; +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + if ( !ft_strcmp( property_name, "fallback-script" ) ) { - FT_UInt* fallback_script = (FT_UInt*)value; + FT_UInt* fallback_script; + FT_UInt ss; - FT_UInt ss; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + fallback_script = (FT_UInt*)value; /* We translate the fallback script to a fallback style that uses */ /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */ @@ -147,19 +171,33 @@ } else if ( !ft_strcmp( property_name, "default-script" ) ) { - FT_UInt* default_script = (FT_UInt*)value; + FT_UInt* default_script; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + default_script = (FT_UInt*)value; + module->default_script = *default_script; return error; } else if ( !ft_strcmp( property_name, "increase-x-height" ) ) { - FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; + FT_Prop_IncreaseXHeight* prop; AF_FaceGlobals globals; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + prop = (FT_Prop_IncreaseXHeight*)value; + error = af_property_get_face_globals( prop->face, &globals, module ); if ( !error ) globals->increase_x_height = prop->limit; @@ -169,27 +207,76 @@ #ifdef AF_CONFIG_OPTION_USE_WARPER else if ( !ft_strcmp( property_name, "warping" ) ) { - FT_Bool* warping = (FT_Bool*)value; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long w = ft_strtol( s, NULL, 10 ); + + + if ( w == 0 ) + module->warping = 0; + else if ( w == 1 ) + module->warping = 1; + else + return FT_THROW( Invalid_Argument ); + } + else +#endif + { + FT_Bool* warping = (FT_Bool*)value; - module->warping = *warping; + module->warping = *warping; + } return error; } #endif /* AF_CONFIG_OPTION_USE_WARPER */ else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) { - FT_Int* darken_params = (FT_Int*)value; + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + + + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); - FT_Int x1 = darken_params[0]; - FT_Int y1 = darken_params[1]; - FT_Int x2 = darken_params[2]; - FT_Int y2 = darken_params[3]; - FT_Int x3 = darken_params[4]; - FT_Int y3 = darken_params[5]; - FT_Int x4 = darken_params[6]; - FT_Int y4 = darken_params[7]; + s = ep + 1; + } + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || @@ -210,10 +297,26 @@ } else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) { - FT_Bool* no_stem_darkening = (FT_Bool*)value; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); - module->no_stem_darkening = *no_stem_darkening; + if ( !nsd ) + module->no_stem_darkening = FALSE; + else + module->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + module->no_stem_darkening = *no_stem_darkening; + } return error; } @@ -329,12 +432,14 @@ FT_DEFINE_SERVICE_PROPERTIESREC( af_service_properties, + (FT_Properties_SetFunc)af_property_set, /* set_property */ (FT_Properties_GetFunc)af_property_get ) /* get_property */ FT_DEFINE_SERVICEDESCREC1( af_services, + FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET ) @@ -427,9 +532,16 @@ error = af_loader_load_glyph( loader, module, slot->face, glyph_index, load_flags ); - af_glyph_hints_dump_points( hints, 0 ); - af_glyph_hints_dump_segments( hints, 0 ); - af_glyph_hints_dump_edges( hints, 0 ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ft_trace_levels[FT_COMPONENT] ) + { +#endif + af_glyph_hints_dump_points( hints, 0 ); + af_glyph_hints_dump_segments( hints, 0 ); + af_glyph_hints_dump_edges( hints, 0 ); +#ifdef FT_DEBUG_LEVEL_TRACE + } +#endif af_loader_done( loader ); @@ -460,6 +572,7 @@ FT_DEFINE_AUTOHINTER_INTERFACE( af_autofitter_interface, + NULL, /* reset_face */ NULL, /* get_global_hints */ NULL, /* done_global_hints */ @@ -478,9 +591,10 @@ (const void*)&AF_INTERFACE_GET, - (FT_Module_Constructor)af_autofitter_init, - (FT_Module_Destructor) af_autofitter_done, - (FT_Module_Requester) af_get_interface ) + (FT_Module_Constructor)af_autofitter_init, /* module_init */ + (FT_Module_Destructor) af_autofitter_done, /* module_done */ + (FT_Module_Requester) af_get_interface /* get_interface */ + ) /* END */ diff --git a/thirdparty/freetype/src/autofit/afmodule.h b/thirdparty/freetype/src/autofit/afmodule.h index e65db5f5cb..0571d14d59 100644 --- a/thirdparty/freetype/src/autofit/afmodule.h +++ b/thirdparty/freetype/src/autofit/afmodule.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter module implementation (specification). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afpic.c b/thirdparty/freetype/src/autofit/afpic.c index 3cbd9168e3..3125e03e27 100644 --- a/thirdparty/freetype/src/autofit/afpic.c +++ b/thirdparty/freetype/src/autofit/afpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for autofit module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afpic.h b/thirdparty/freetype/src/autofit/afpic.h index 98a45a26ba..8cd3392123 100644 --- a/thirdparty/freetype/src/autofit/afpic.h +++ b/thirdparty/freetype/src/autofit/afpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for autofit module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -69,7 +69,7 @@ FT_BEGIN_HEADER #define GET_PIC( lib ) \ - ( (AFModulePIC*)((lib)->pic_container.autofit) ) + ( (AFModulePIC*)( (lib)->pic_container.autofit ) ) #define AF_SERVICES_GET \ ( GET_PIC( library )->af_services ) diff --git a/thirdparty/freetype/src/autofit/afranges.c b/thirdparty/freetype/src/autofit/afranges.c index 732f3d1629..7f37eea1e0 100644 --- a/thirdparty/freetype/src/autofit/afranges.c +++ b/thirdparty/freetype/src/autofit/afranges.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter Unicode script ranges (body). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -52,8 +52,21 @@ /* not be affected by blue zones, regardless of whether this is a */ /* spacing or no-spacing glyph */ - /* the `ta_xxxx_nonbase_uniranges' ranges must be strict subsets */ - /* of the corresponding `ta_xxxx_uniranges' ranges */ + /* the `af_xxxx_nonbase_uniranges' ranges must be strict subsets */ + /* of the corresponding `af_xxxx_uniranges' ranges */ + + + const AF_Script_UniRangeRec af_adlm_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E900, 0x1E95F ), /* Adlam */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_adlm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1D944, 0x1E94A ), + AF_UNIRANGE_REC( 0, 0 ) + }; const AF_Script_UniRangeRec af_arab_uniranges[] = @@ -106,6 +119,37 @@ }; + const AF_Script_UniRangeRec af_avst_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B00, 0x10B3F ), /* Avestan */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_avst_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B39, 0x10B3F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_bamu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6A0, 0xA6FF ), /* Bamum */ +#if 0 + /* The characters in the Bamum supplement are pictograms, */ + /* not (directly) related to the syllabic Bamum script */ + AF_UNIRANGE_REC( 0x16800, 0x16A3F ), /* Bamum Supplement */ +#endif + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_bamu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6F0, 0xA6F1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_beng_uniranges[] = { AF_UNIRANGE_REC( 0x0980, 0x09FF ), /* Bengali */ @@ -123,6 +167,58 @@ }; + const AF_Script_UniRangeRec af_buhd_uniranges[] = + { + AF_UNIRANGE_REC( 0x1740, 0x175F ), /* Buhid */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_buhd_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1752, 0x1753 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cakm_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x1114F ), /* Chakma */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cakm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x11102 ), + AF_UNIRANGE_REC( 0x11127, 0x11134 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cans_uniranges[] = + { + AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */ + AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cans_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cari_uniranges[] = + { + AF_UNIRANGE_REC( 0x102A0, 0x102DF ), /* Carian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cari_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cher_uniranges[] = { AF_UNIRANGE_REC( 0x13A0, 0x13FF ), /* Cherokee */ @@ -136,6 +232,31 @@ }; + const AF_Script_UniRangeRec af_copt_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C80, 0x2CFF ), /* Coptic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_copt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x2CEF, 0x2CF1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cprt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10800, 0x1083F ), /* Cypriot */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cprt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cyrl_uniranges[] = { AF_UNIRANGE_REC( 0x0400, 0x04FF ), /* Cyrillic */ @@ -187,6 +308,18 @@ }; + const AF_Script_UniRangeRec af_dsrt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10400, 0x1044F ), /* Deseret */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_dsrt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_ethi_uniranges[] = { AF_UNIRANGE_REC( 0x1200, 0x137F ), /* Ethiopic */ @@ -233,6 +366,32 @@ }; + const AF_Script_UniRangeRec af_glag_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C00, 0x2C5F ), /* Glagolitic */ + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), /* Glagolitic Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_glag_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_goth_uniranges[] = + { + AF_UNIRANGE_REC( 0x10330, 0x1034F ), /* Gothic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_goth_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_grek_uniranges[] = { AF_UNIRANGE_REC( 0x0370, 0x03FF ), /* Greek and Coptic */ @@ -305,6 +464,19 @@ }; + const AF_Script_UniRangeRec af_kali_uniranges[] = + { + AF_UNIRANGE_REC( 0xA900, 0xA92F ), /* Kayah Li */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_kali_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA926, 0xA92D ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_knda_uniranges[] = { AF_UNIRANGE_REC( 0x0C80, 0x0CFF ), /* Kannada */ @@ -463,6 +635,18 @@ }; + const AF_Script_UniRangeRec af_lisu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_lisu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mlym_uniranges[] = { AF_UNIRANGE_REC( 0x0D00, 0x0D7F ), /* Malayalam */ @@ -480,27 +664,40 @@ const AF_Script_UniRangeRec af_mymr_uniranges[] = { - AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ - AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */ - AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */ - AF_UNIRANGE_REC( 0, 0 ) + AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ + AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */ + AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */ + AF_UNIRANGE_REC( 0, 0 ) }; const AF_Script_UniRangeRec af_mymr_nonbase_uniranges[] = { - AF_UNIRANGE_REC( 0x102D, 0x1030 ), - AF_UNIRANGE_REC( 0x1032, 0x1037 ), - AF_UNIRANGE_REC( 0x103A, 0x103A ), - AF_UNIRANGE_REC( 0x103D, 0x103E ), - AF_UNIRANGE_REC( 0x1058, 0x1059 ), - AF_UNIRANGE_REC( 0x105E, 0x1060 ), - AF_UNIRANGE_REC( 0x1071, 0x1074 ), - AF_UNIRANGE_REC( 0x1082, 0x1082 ), - AF_UNIRANGE_REC( 0x1085, 0x1086 ), - AF_UNIRANGE_REC( 0x108D, 0x108D ), - AF_UNIRANGE_REC( 0xA9E5, 0xA9E5 ), - AF_UNIRANGE_REC( 0xAA7C, 0xAA7C ), - AF_UNIRANGE_REC( 0, 0 ) + AF_UNIRANGE_REC( 0x102D, 0x1030 ), + AF_UNIRANGE_REC( 0x1032, 0x1037 ), + AF_UNIRANGE_REC( 0x103A, 0x103A ), + AF_UNIRANGE_REC( 0x103D, 0x103E ), + AF_UNIRANGE_REC( 0x1058, 0x1059 ), + AF_UNIRANGE_REC( 0x105E, 0x1060 ), + AF_UNIRANGE_REC( 0x1071, 0x1074 ), + AF_UNIRANGE_REC( 0x1082, 0x1082 ), + AF_UNIRANGE_REC( 0x1085, 0x1086 ), + AF_UNIRANGE_REC( 0x108D, 0x108D ), + AF_UNIRANGE_REC( 0xA9E5, 0xA9E5 ), + AF_UNIRANGE_REC( 0xAA7C, 0xAA7C ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_nkoo_uniranges[] = + { + AF_UNIRANGE_REC( 0x07C0, 0x07FF ), /* N'Ko */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_nkoo_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x07EB, 0x07F5 ), + AF_UNIRANGE_REC( 0, 0 ) }; @@ -515,6 +712,80 @@ }; + const AF_Script_UniRangeRec af_olck_uniranges[] = + { + AF_UNIRANGE_REC( 0x1C50, 0x1C7F ), /* Ol Chiki */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_olck_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_orkh_uniranges[] = + { + AF_UNIRANGE_REC( 0x10C00, 0x10C4F ), /* Old Turkic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_orkh_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osge_uniranges[] = + { + AF_UNIRANGE_REC( 0x104B0, 0x104FF ), /* Osage */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osge_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osma_uniranges[] = + { + AF_UNIRANGE_REC( 0x10480, 0x104AF ), /* Osmanya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osma_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_saur_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA8DF ), /* Saurashtra */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_saur_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA881 ), + AF_UNIRANGE_REC( 0xA8B4, 0xA8C5 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_shaw_uniranges[] = + { + AF_UNIRANGE_REC( 0x10450, 0x1047F ), /* Shavian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_shaw_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sinh_uniranges[] = { AF_UNIRANGE_REC( 0x0D80, 0x0DFF ), /* Sinhala */ @@ -529,6 +800,21 @@ }; + const AF_Script_UniRangeRec af_sund_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1BBF ), /* Sundanese */ + AF_UNIRANGE_REC( 0x1CC0, 0x1CCF ), /* Sundanese Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sund_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1B82 ), + AF_UNIRANGE_REC( 0x1BA1, 0x1BAD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_taml_uniranges[] = { AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */ @@ -544,6 +830,23 @@ }; + const AF_Script_UniRangeRec af_tavt_uniranges[] = + { + AF_UNIRANGE_REC( 0xAA80, 0xAADF ), /* Tai Viet */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tavt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xAAB0, 0xAAB0 ), + AF_UNIRANGE_REC( 0xAAB2, 0xAAB4 ), + AF_UNIRANGE_REC( 0xAAB7, 0xAAB8 ), + AF_UNIRANGE_REC( 0xAABE, 0xAABF ), + AF_UNIRANGE_REC( 0xAAC1, 0xAAC1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_telu_uniranges[] = { AF_UNIRANGE_REC( 0x0C00, 0x0C7F ), /* Telugu */ @@ -575,6 +878,30 @@ }; + const AF_Script_UniRangeRec af_tfng_uniranges[] = + { + AF_UNIRANGE_REC( 0x2D30, 0x2D7F ), /* Tifinagh */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tfng_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_vaii_uniranges[] = + { + AF_UNIRANGE_REC( 0xA500, 0xA63F ), /* Vai */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_vaii_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + #ifdef AF_CONFIG_OPTION_INDIC const AF_Script_UniRangeRec af_limb_uniranges[] = @@ -610,21 +937,6 @@ }; - const AF_Script_UniRangeRec af_sund_uniranges[] = - { - AF_UNIRANGE_REC( 0x1B80, 0x1BBF ), /* Sundanese */ - AF_UNIRANGE_REC( 0x1CC0, 0x1CCF ), /* Sundanese Supplement */ - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_sund_nonbase_uniranges[] = - { - AF_UNIRANGE_REC( 0x1B80, 0x1B82 ), - AF_UNIRANGE_REC( 0x1BA1, 0x1BAD ), - AF_UNIRANGE_REC( 0, 0 ) - }; - - const AF_Script_UniRangeRec af_sylo_uniranges[] = { AF_UNIRANGE_REC( 0xA800, 0xA82F ), /* Syloti Nagri */ diff --git a/thirdparty/freetype/src/autofit/afranges.h b/thirdparty/freetype/src/autofit/afranges.h index 1a0e4b1535..72d9eaad2c 100644 --- a/thirdparty/freetype/src/autofit/afranges.h +++ b/thirdparty/freetype/src/autofit/afranges.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter Unicode script ranges (specification). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afscript.h b/thirdparty/freetype/src/autofit/afscript.h index 33c3012981..7547a9e6f9 100644 --- a/thirdparty/freetype/src/autofit/afscript.h +++ b/thirdparty/freetype/src/autofit/afscript.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter scripts (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -30,6 +30,12 @@ /* use `HB_SCRIPT_INVALID' as the HarfBuzz script name tag for */ /* them. */ + SCRIPT( adlm, ADLM, + "Adlam", + HB_SCRIPT_ADLAM, + HINTING_BOTTOM_TO_TOP, + "\xF0\x9E\xA4\x8C \xF0\x9E\xA4\xAE" ) /* 𞤌 𞤮 */ + SCRIPT( arab, ARAB, "Arabic", HB_SCRIPT_ARABIC, @@ -40,7 +46,19 @@ "Armenian", HB_SCRIPT_ARMENIAN, HINTING_BOTTOM_TO_TOP, - "\xD6\x85 \xD5\x95" ) /* Ö… Õ• */ + "\xD5\xBD \xD5\x8D" ) /* Õ½ Õ */ + + SCRIPT( avst, AVST, + "Avestan", + HB_SCRIPT_AVESTAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xAC\x9A" ) /* 𬚠*/ + + SCRIPT( bamu, BAMU, + "Bamum", + HB_SCRIPT_BAMUM, + HINTING_BOTTOM_TO_TOP, + "\xEA\x9B\x81 \xEA\x9B\xAF" ) /* ê› ê›¯ */ /* there are no simple forms for letters; we thus use two digit shapes */ SCRIPT( beng, BENG, @@ -49,12 +67,48 @@ HINTING_TOP_TO_BOTTOM, "\xE0\xA7\xA6 \xE0\xA7\xAA" ) /* ০ ৪ */ + SCRIPT( buhd, BUHD, + "Buhid", + HB_SCRIPT_BUHID, + HINTING_BOTTOM_TO_TOP, + "\xE1\x9D\x8B \xE1\x9D\x8F" ) /* á‹ á */ + + SCRIPT( cakm, CAKM, + "Chakma", + HB_SCRIPT_CHAKMA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x91\x84\xA4 \xF0\x91\x84\x89 \xF0\x91\x84\x9B" ) /* 𑄤 𑄉 ð‘„› */ + + SCRIPT( cans, CANS, + "Canadian Syllabics", + HB_SCRIPT_CANADIAN_SYLLABICS, + HINTING_BOTTOM_TO_TOP, + "\xE1\x91\x8C \xE1\x93\x9A" ) /* ᑌ ᓚ */ + + SCRIPT( cari, CARI, + "Carian", + HB_SCRIPT_CARIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x8A\xAB \xF0\x90\x8B\x89" ) /* ðŠ« ð‹‰ */ + SCRIPT( cher, CHER, "Cherokee", HB_SCRIPT_CHEROKEE, HINTING_BOTTOM_TO_TOP, "\xE1\x8E\xA4 \xE1\x8F\x85 \xEA\xAE\x95" ) /* Ꭴ á… ê®• */ + SCRIPT( copt, COPT, + "Coptic", + HB_SCRIPT_COPTIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB2\x9E \xE2\xB2\x9F" ) /* Ⲟ ⲟ */ + + SCRIPT( cprt, CPRT, + "Cypriot", + HB_SCRIPT_CYPRIOT, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xA0\x85 \xF0\x90\xA0\xA3" ) /* ð … ð £ */ + SCRIPT( cyrl, CYRL, "Cyrillic", HB_SCRIPT_CYRILLIC, @@ -67,6 +121,12 @@ HINTING_TOP_TO_BOTTOM, "\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठव ट */ + SCRIPT( dsrt, DSRT, + "Deseret", + HB_SCRIPT_DESERET, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x90\x84 \xF0\x90\x90\xAC" ) /* ð„ ð¬ */ + SCRIPT( ethi, ETHI, "Ethiopic", HB_SCRIPT_ETHIOPIC, @@ -85,6 +145,18 @@ HINTING_BOTTOM_TO_TOP, "\xE1\x82\xB6 \xE1\x82\xB1 \xE2\xB4\x99" ) /* á‚¶ Ⴑ â´™ */ + SCRIPT( glag, GLAG, + "Glagolitic", + HB_SCRIPT_GLAGOLITIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB0\x95 \xE2\xB1\x85" ) /* â°• â±… */ + + SCRIPT( goth, GOTH, + "Gothic", + HB_SCRIPT_GOTHIC, + HINTING_TOP_TO_BOTTOM, + "\xF0\x90\x8C\xB4 \xF0\x90\x8C\xBE \xF0\x90\x8D\x83" ) /* ðŒ´ ðŒ¾ ðƒ */ + SCRIPT( grek, GREK, "Greek", HB_SCRIPT_GREEK, @@ -109,6 +181,12 @@ HINTING_BOTTOM_TO_TOP, "\xD7\x9D" ) /* × */ + SCRIPT( kali, KALI, + "Kayah Li", + HB_SCRIPT_KAYAH_LI, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ê¤ ê¤€ */ + SCRIPT( knda, KNDA, "Kannada", HB_SCRIPT_KANNADA, @@ -153,6 +231,12 @@ HINTING_BOTTOM_TO_TOP, "\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* áµ’ á´¼ â° */ + SCRIPT( lisu, LISU, + "Lisu", + HB_SCRIPT_LISU, + HINTING_BOTTOM_TO_TOP, + "\xEA\x93\xB3" ) /* ꓳ */ + SCRIPT( mlym, MLYM, "Malayalam", HB_SCRIPT_MALAYALAM, @@ -165,18 +249,67 @@ HINTING_BOTTOM_TO_TOP, "\xE1\x80\x9D \xE1\x80\x84 \xE1\x80\x82" ) /* ဠင ဂ */ + SCRIPT( nkoo, NKOO, + "N'Ko", + HB_SCRIPT_NKO, + HINTING_BOTTOM_TO_TOP, + "\xDF\x8B \xDF\x80" ) /* ß‹ ߀ */ + SCRIPT( none, NONE, "no script", HB_SCRIPT_INVALID, HINTING_BOTTOM_TO_TOP, "" ) + SCRIPT( olck, OLCK, + "Ol Chiki", + HB_SCRIPT_OL_CHIKI, + HINTING_BOTTOM_TO_TOP, + "\xE1\xB1\x9B" ) /* á±› */ + + SCRIPT( orkh, ORKH, + "Old Turkic", + HB_SCRIPT_OLD_TURKIC, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xB0\x97" ) /* ð°— */ + + SCRIPT( osge, OSGE, + "Osage", + HB_SCRIPT_OSAGE, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x93\x82 \xF0\x90\x93\xAA" ) /* 𓂠𓪠*/ + + SCRIPT( osma, OSMA, + "Osmanya", + HB_SCRIPT_OSMANYA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* ð’† ð’ */ + + SCRIPT( saur, SAUR, + "Saurashtra", + HB_SCRIPT_SAURASHTRA, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA2\x9D \xEA\xA3\x90" ) /* ê¢ ê£ */ + + SCRIPT( shaw, SHAW, + "Shavian", + HB_SCRIPT_SHAVIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x91\xB4" ) /* ð‘´ */ + SCRIPT( sinh, SINH, "Sinhala", HB_SCRIPT_SINHALA, HINTING_BOTTOM_TO_TOP, "\xE0\xB6\xA7" ) /* à¶§ */ + /* only digit zero has a simple (round) shape in the Sundanese script */ + SCRIPT( sund, SUND, + "Sundanese", + HB_SCRIPT_SUNDANESE, + HINTING_BOTTOM_TO_TOP, + "\xE1\xAE\xB0" ) /* á®° */ + /* only digit zero has a simple (round) shape in the Tamil script */ SCRIPT( taml, TAML, "Tamil", @@ -184,6 +317,12 @@ HINTING_BOTTOM_TO_TOP, "\xE0\xAF\xA6" ) /* ௦ */ + SCRIPT( tavt, TAVT, + "Tai Viet", + HB_SCRIPT_TAI_VIET, + HINTING_BOTTOM_TO_TOP, + "\xEA\xAA\x92 \xEA\xAA\xAB" ) /* ꪒ ꪫ */ + /* there are no simple forms for letters; we thus use two digit shapes */ SCRIPT( telu, TELU, "Telugu", @@ -197,6 +336,18 @@ HINTING_BOTTOM_TO_TOP, "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๠*/ + SCRIPT( tfng, TFNG, + "Tifinagh", + HB_SCRIPT_TIFINAGH, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB5\x94" ) /* âµ” */ + + SCRIPT( vaii, VAII, + "Vai", + HB_SCRIPT_VAI, + HINTING_BOTTOM_TO_TOP, + "\xEA\x98\x93 \xEA\x96\x9C \xEA\x96\xB4" ) /* ꘓ ê–œ ê–´ */ + #ifdef AF_CONFIG_OPTION_INDIC SCRIPT( limb, LIMB, @@ -211,12 +362,6 @@ HINTING_BOTTOM_TO_TOP, "o" ) /* XXX */ - SCRIPT( sund, SUND, - "Sundanese", - HB_SCRIPT_SUNDANESE, - HINTING_BOTTOM_TO_TOP, - "o" ) /* XXX */ - SCRIPT( sylo, SYLO, "Syloti Nagri", HB_SCRIPT_SYLOTI_NAGRI, diff --git a/thirdparty/freetype/src/autofit/afshaper.c b/thirdparty/freetype/src/autofit/afshaper.c index 6d13b65859..da92fad3ed 100644 --- a/thirdparty/freetype/src/autofit/afshaper.c +++ b/thirdparty/freetype/src/autofit/afshaper.c @@ -4,7 +4,7 @@ /* */ /* HarfBuzz interface for accessing OpenType features (body). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afshaper.h b/thirdparty/freetype/src/autofit/afshaper.h index 0d41f78762..9185d19003 100644 --- a/thirdparty/freetype/src/autofit/afshaper.h +++ b/thirdparty/freetype/src/autofit/afshaper.h @@ -4,7 +4,7 @@ /* */ /* HarfBuzz interface for accessing OpenType features (specification). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afstyles.h b/thirdparty/freetype/src/autofit/afstyles.h index e83a95bb59..a5e13d8944 100644 --- a/thirdparty/freetype/src/autofit/afstyles.h +++ b/thirdparty/freetype/src/autofit/afstyles.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter styles (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -83,6 +83,13 @@ DEFAULT ) + STYLE( adlm_dflt, ADLM_DFLT, + "Adlam default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ADLM, + AF_BLUE_STRINGSET_ADLM, + AF_COVERAGE_DEFAULT ) + STYLE( arab_dflt, ARAB_DFLT, "Arabic default style", AF_WRITING_SYSTEM_LATIN, @@ -97,6 +104,20 @@ AF_BLUE_STRINGSET_ARMN, AF_COVERAGE_DEFAULT ) + STYLE( avst_dflt, AVST_DFLT, + "Avestan default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_AVST, + AF_BLUE_STRINGSET_AVST, + AF_COVERAGE_DEFAULT ) + + STYLE( bamu_dflt, BAMU_DFLT, + "Bamum default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BAMU, + AF_BLUE_STRINGSET_BAMU, + AF_COVERAGE_DEFAULT ) + STYLE( beng_dflt, BENG_DFLT, "Bengali default style", AF_WRITING_SYSTEM_LATIN, @@ -104,6 +125,34 @@ AF_BLUE_STRINGSET_BENG, AF_COVERAGE_DEFAULT ) + STYLE( buhd_dflt, BUHD_DFLT, + "Buhid default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BUHD, + AF_BLUE_STRINGSET_BUHD, + AF_COVERAGE_DEFAULT ) + + STYLE( cakm_dflt, CAKM_DFLT, + "Chakma default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CAKM, + AF_BLUE_STRINGSET_CAKM, + AF_COVERAGE_DEFAULT ) + + STYLE( cans_dflt, CANS_DFLT, + "Canadian Syllabics default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CANS, + AF_BLUE_STRINGSET_CANS, + AF_COVERAGE_DEFAULT ) + + STYLE( cari_dflt, CARI_DFLT, + "Carian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CARI, + AF_BLUE_STRINGSET_CARI, + AF_COVERAGE_DEFAULT ) + STYLE( cher_dflt, CHER_DFLT, "Cherokee default style", AF_WRITING_SYSTEM_LATIN, @@ -111,6 +160,20 @@ AF_BLUE_STRINGSET_CHER, AF_COVERAGE_DEFAULT ) + STYLE( copt_dflt, COPT_DFLT, + "Coptic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_COPT, + AF_BLUE_STRINGSET_COPT, + AF_COVERAGE_DEFAULT ) + + STYLE( cprt_dflt, CPRT_DFLT, + "Cypriot default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CPRT, + AF_BLUE_STRINGSET_CPRT, + AF_COVERAGE_DEFAULT ) + META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" ) STYLE( deva_dflt, DEVA_DFLT, @@ -120,6 +183,13 @@ AF_BLUE_STRINGSET_DEVA, AF_COVERAGE_DEFAULT ) + STYLE( dsrt_dflt, DSRT_DFLT, + "Deseret default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_DSRT, + AF_BLUE_STRINGSET_DSRT, + AF_COVERAGE_DEFAULT ) + STYLE( ethi_dflt, ETHI_DFLT, "Ethiopic default style", AF_WRITING_SYSTEM_LATIN, @@ -141,6 +211,20 @@ AF_BLUE_STRINGSET_GEOK, AF_COVERAGE_DEFAULT ) + STYLE( glag_dflt, GLAG_DFLT, + "Glagolitic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GLAG, + AF_BLUE_STRINGSET_GLAG, + AF_COVERAGE_DEFAULT ) + + STYLE( goth_dflt, GOTH_DFLT, + "Gothic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GOTH, + AF_BLUE_STRINGSET_GOTH, + AF_COVERAGE_DEFAULT ) + META_STYLE_LATIN( grek, GREK, "Greek" ) STYLE( gujr_dflt, GUJR_DFLT, @@ -164,6 +248,13 @@ AF_BLUE_STRINGSET_HEBR, AF_COVERAGE_DEFAULT ) + STYLE( kali_dflt, KALI_DFLT, + "Kayah Li default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KALI, + AF_BLUE_STRINGSET_KALI, + AF_COVERAGE_DEFAULT ) + STYLE( knda_dflt, KNDA_DFLT, "Kannada default style", AF_WRITING_SYSTEM_LATIN, @@ -217,6 +308,13 @@ AF_COVERAGE_DEFAULT ) #endif + STYLE( lisu_dflt, LISU_DFLT, + "Lisu default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LISU, + AF_BLUE_STRINGSET_LISU, + AF_COVERAGE_DEFAULT ) + STYLE( mlym_dflt, MLYM_DFLT, "Malayalam default style", AF_WRITING_SYSTEM_LATIN, @@ -231,6 +329,13 @@ AF_BLUE_STRINGSET_MYMR, AF_COVERAGE_DEFAULT ) + STYLE( nkoo_dflt, NKOO_DFLT, + "N'Ko default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_NKOO, + AF_BLUE_STRINGSET_NKOO, + AF_COVERAGE_DEFAULT ) + STYLE( none_dflt, NONE_DFLT, "no style", AF_WRITING_SYSTEM_DUMMY, @@ -238,6 +343,48 @@ AF_BLUE_STRINGSET_NONE, AF_COVERAGE_DEFAULT ) + STYLE( olck_dflt, OLCK_DFLT, + "Ol Chiki default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OLCK, + AF_BLUE_STRINGSET_OLCK, + AF_COVERAGE_DEFAULT ) + + STYLE( orkh_dflt, ORKH_DFLT, + "Old Turkic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ORKH, + AF_BLUE_STRINGSET_ORKH, + AF_COVERAGE_DEFAULT ) + + STYLE( osge_dflt, OSGE_DFLT, + "Osage default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSGE, + AF_BLUE_STRINGSET_OSGE, + AF_COVERAGE_DEFAULT ) + + STYLE( osma_dflt, OSMA_DFLT, + "Osmanya default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSMA, + AF_BLUE_STRINGSET_OSMA, + AF_COVERAGE_DEFAULT ) + + STYLE( saur_dflt, SAUR_DFLT, + "Saurashtra default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SAUR, + AF_BLUE_STRINGSET_SAUR, + AF_COVERAGE_DEFAULT ) + + STYLE( shaw_dflt, SHAW_DFLT, + "Shavian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SHAW, + AF_BLUE_STRINGSET_SHAW, + AF_COVERAGE_DEFAULT ) + STYLE( sinh_dflt, SINH_DFLT, "Sinhala default style", AF_WRITING_SYSTEM_LATIN, @@ -245,6 +392,13 @@ AF_BLUE_STRINGSET_SINH, AF_COVERAGE_DEFAULT ) + STYLE( sund_dflt, SUND_DFLT, + "Sundanese default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SUND, + AF_BLUE_STRINGSET_SUND, + AF_COVERAGE_DEFAULT ) + STYLE( taml_dflt, TAML_DFLT, "Tamil default style", AF_WRITING_SYSTEM_LATIN, @@ -252,6 +406,13 @@ AF_BLUE_STRINGSET_TAML, AF_COVERAGE_DEFAULT ) + STYLE( tavt_dflt, TAVT_DFLT, + "Tai Viet default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TAVT, + AF_BLUE_STRINGSET_TAVT, + AF_COVERAGE_DEFAULT ) + STYLE( telu_dflt, TELU_DFLT, "Telugu default style", AF_WRITING_SYSTEM_LATIN, @@ -266,6 +427,20 @@ AF_BLUE_STRINGSET_THAI, AF_COVERAGE_DEFAULT ) + STYLE( tfng_dflt, TFNG_DFLT, + "Tifinagh default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TFNG, + AF_BLUE_STRINGSET_TFNG, + AF_COVERAGE_DEFAULT ) + + STYLE( vaii_dflt, VAII_DFLT, + "Vai default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_VAII, + AF_BLUE_STRINGSET_VAII, + AF_COVERAGE_DEFAULT ) + #ifdef AF_CONFIG_OPTION_INDIC /* no blue stringset support for the Indic writing system yet */ @@ -280,7 +455,6 @@ STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" ) STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" ) - STYLE_DEFAULT_INDIC( sund, SUND, "Sundanese" ) STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" ) STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" ) diff --git a/thirdparty/freetype/src/autofit/aftypes.h b/thirdparty/freetype/src/autofit/aftypes.h index ef62043c8a..718dab70b6 100644 --- a/thirdparty/freetype/src/autofit/aftypes.h +++ b/thirdparty/freetype/src/autofit/aftypes.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter types (specification only). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -221,7 +221,7 @@ extern void* _af_debug_hints; (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints, AF_StyleMetrics metrics ); - typedef void + typedef FT_Error (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index, AF_GlyphHints hints, FT_Outline* outline, @@ -575,6 +575,7 @@ extern void* _af_debug_hints; m_init, \ m_scale, \ m_done, \ + m_stdw, \ h_init, \ h_apply ) \ FT_LOCAL_DEF( void ) \ diff --git a/thirdparty/freetype/src/autofit/afwarp.c b/thirdparty/freetype/src/autofit/afwarp.c index ce1806c9d3..f99aa6d987 100644 --- a/thirdparty/freetype/src/autofit/afwarp.c +++ b/thirdparty/freetype/src/autofit/afwarp.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter warping algorithm (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -98,7 +98,6 @@ if ( xx1min + w < warper->x2min ) xx1min = warper->x2min - w; - xx1max = warper->x1max; if ( xx1max + w > warper->x2max ) xx1max = warper->x2max - w; diff --git a/thirdparty/freetype/src/autofit/afwarp.h b/thirdparty/freetype/src/autofit/afwarp.h index 6d96f86d73..2e85cbd851 100644 --- a/thirdparty/freetype/src/autofit/afwarp.h +++ b/thirdparty/freetype/src/autofit/afwarp.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter warping algorithm (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/afwrtsys.h b/thirdparty/freetype/src/autofit/afwrtsys.h index 842f4921a4..86749a2a83 100644 --- a/thirdparty/freetype/src/autofit/afwrtsys.h +++ b/thirdparty/freetype/src/autofit/afwrtsys.h @@ -4,7 +4,7 @@ /* */ /* Auto-fitter writing systems (specification only). */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/autofit/autofit.c b/thirdparty/freetype/src/autofit/autofit.c index dda9aeb6d7..bbedad7b5f 100644 --- a/thirdparty/freetype/src/autofit/autofit.c +++ b/thirdparty/freetype/src/autofit/autofit.c @@ -4,7 +4,7 @@ /* */ /* Auto-fitter module (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,29 +18,22 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> -#include "afpic.c" + #include "afangles.c" #include "afblue.c" +#include "afcjk.c" +#include "afdummy.c" #include "afglobal.c" #include "afhints.c" - -#include "afranges.c" - -#include "afdummy.c" +#include "afindic.c" #include "aflatin.c" -#ifdef FT_OPTION_AUTOFIT2 #include "aflatin2.c" -#endif -#include "afcjk.c" -#include "afindic.c" - -#include "afshaper.c" - #include "afloader.c" #include "afmodule.c" - -#ifdef AF_CONFIG_OPTION_USE_WARPER +#include "afpic.c" +#include "afranges.c" +#include "afshaper.c" #include "afwarp.c" -#endif + /* END */ diff --git a/thirdparty/freetype/src/autofit/module.mk b/thirdparty/freetype/src/autofit/module.mk index 98f0612b99..c4e249b6f1 100644 --- a/thirdparty/freetype/src/autofit/module.mk +++ b/thirdparty/freetype/src/autofit/module.mk @@ -3,7 +3,7 @@ # -# Copyright 2003-2016 by +# Copyright 2003-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/autofit/rules.mk b/thirdparty/freetype/src/autofit/rules.mk index 1ef4704649..ec4e1302d1 100644 --- a/thirdparty/freetype/src/autofit/rules.mk +++ b/thirdparty/freetype/src/autofit/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2003-2016 by +# Copyright 2003-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/base/basepic.c b/thirdparty/freetype/src/base/basepic.c index f2cea90d7c..57fb8169ad 100644 --- a/thirdparty/freetype/src/base/basepic.c +++ b/thirdparty/freetype/src/base/basepic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for base. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/basepic.h b/thirdparty/freetype/src/base/basepic.h index a1a75a0bad..258d4ce2ba 100644 --- a/thirdparty/freetype/src/base/basepic.h +++ b/thirdparty/freetype/src/base/basepic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for base. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftadvanc.c b/thirdparty/freetype/src/base/ftadvanc.c index 9e2ab89845..1557607fc5 100644 --- a/thirdparty/freetype/src/base/ftadvanc.c +++ b/thirdparty/freetype/src/base/ftadvanc.c @@ -4,7 +4,7 @@ /* */ /* Quick computation of advance widths (body). */ /* */ -/* Copyright 2008-2016 by */ +/* Copyright 2008-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -36,7 +36,7 @@ if ( flags & FT_LOAD_NO_SCALE ) return FT_Err_Ok; - if ( face->size == NULL ) + if ( !face->size ) return FT_THROW( Invalid_Size_Handle ); if ( flags & FT_LOAD_VERTICAL_LAYOUT ) @@ -60,12 +60,13 @@ /* - unscaled load */ /* - unhinted load */ /* - light-hinted load */ - /* - neither a MM nor a GX font */ + /* - if a variations font, it must have an `HVAR' or `VVAR' */ + /* table (thus the old MM or GX fonts don't qualify; this */ + /* gets checked by the driver-specific functions) */ -#define LOAD_ADVANCE_FAST_CHECK( face, flags ) \ - ( ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ - FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) && \ - !FT_HAS_MULTIPLE_MASTERS( face ) ) +#define LOAD_ADVANCE_FAST_CHECK( face, flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) /* documentation is in ftadvanc.h */ diff --git a/thirdparty/freetype/src/base/ftapi.c b/thirdparty/freetype/src/base/ftapi.c index b94c3eb9fb..4262d37e39 100644 --- a/thirdparty/freetype/src/base/ftapi.c +++ b/thirdparty/freetype/src/base/ftapi.c @@ -4,7 +4,7 @@ /* */ /* The FreeType compatibility functions (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -38,7 +38,7 @@ /*************************************************************************/ /*************************************************************************/ - /* backwards compatibility API */ + /* backward compatibility API */ FT_BASE_DEF( void ) FT_New_Memory_Stream( FT_Library library, diff --git a/thirdparty/freetype/src/base/ftbase.c b/thirdparty/freetype/src/base/ftbase.c index ab1af6f9f3..55f7359942 100644 --- a/thirdparty/freetype/src/base/ftbase.c +++ b/thirdparty/freetype/src/base/ftbase.c @@ -4,7 +4,7 @@ /* */ /* Single object library component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,26 +17,23 @@ #include <ft2build.h> - #define FT_MAKE_OPTION_SINGLE_OBJECT -#include "ftpic.c" #include "basepic.c" #include "ftadvanc.c" #include "ftcalc.c" #include "ftdbgmem.c" #include "ftgloadr.c" #include "fthash.c" +#include "ftmac.c" #include "ftobjs.c" #include "ftoutln.c" +#include "ftpic.c" #include "ftrfork.c" #include "ftsnames.c" #include "ftstream.c" #include "fttrigon.c" #include "ftutil.c" -#ifdef FT_MACINTOSH -#include "ftmac.c" -#endif /* END */ diff --git a/thirdparty/freetype/src/base/ftbase.h b/thirdparty/freetype/src/base/ftbase.h index 717fdaae24..2072284f06 100644 --- a/thirdparty/freetype/src/base/ftbase.h +++ b/thirdparty/freetype/src/base/ftbase.h @@ -4,7 +4,7 @@ /* */ /* The FreeType private functions used in base module (specification). */ /* */ -/* Copyright 2008-2016 by */ +/* Copyright 2008-2017 by */ /* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftbbox.c b/thirdparty/freetype/src/base/ftbbox.c index d3e45ffa0d..6e19da63cb 100644 --- a/thirdparty/freetype/src/base/ftbbox.c +++ b/thirdparty/freetype/src/base/ftbbox.c @@ -4,7 +4,7 @@ /* */ /* FreeType bbox computation (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -423,12 +423,15 @@ } - FT_DEFINE_OUTLINE_FUNCS(bbox_interface, - (FT_Outline_MoveTo_Func) BBox_Move_To, - (FT_Outline_LineTo_Func) BBox_Line_To, - (FT_Outline_ConicTo_Func)BBox_Conic_To, - (FT_Outline_CubicTo_Func)BBox_Cubic_To, - 0, 0 + FT_DEFINE_OUTLINE_FUNCS( + bbox_interface, + + (FT_Outline_MoveTo_Func) BBox_Move_To, /* move_to */ + (FT_Outline_LineTo_Func) BBox_Line_To, /* line_to */ + (FT_Outline_ConicTo_Func)BBox_Conic_To, /* conic_to */ + (FT_Outline_CubicTo_Func)BBox_Cubic_To, /* cubic_to */ + 0, /* shift */ + 0 /* delta */ ) @@ -457,6 +460,7 @@ { abbox->xMin = abbox->xMax = 0; abbox->yMin = abbox->yMax = 0; + return 0; } @@ -468,10 +472,10 @@ for ( n = 0; n < outline->n_points; n++ ) { - FT_UPDATE_BBOX( vec, cbox); + FT_UPDATE_BBOX( vec, cbox ); if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) - FT_UPDATE_BBOX( vec, bbox); + FT_UPDATE_BBOX( vec, bbox ); vec++; } @@ -487,8 +491,10 @@ TBBox_Rec user; #ifdef FT_CONFIG_OPTION_PIC - FT_Outline_Funcs bbox_interface; - Init_Class_bbox_interface(&bbox_interface); + FT_Outline_Funcs bbox_interface; + + + Init_Class_bbox_interface( &bbox_interface ); #endif user.bbox = bbox; diff --git a/thirdparty/freetype/src/base/ftbdf.c b/thirdparty/freetype/src/base/ftbdf.c index 4aafc2b98e..40f0ca2bb8 100644 --- a/thirdparty/freetype/src/base/ftbdf.c +++ b/thirdparty/freetype/src/base/ftbdf.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing BDF-specific strings (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftbitmap.c b/thirdparty/freetype/src/base/ftbitmap.c index 24fead3e15..88c88c4c1b 100644 --- a/thirdparty/freetype/src/base/ftbitmap.c +++ b/thirdparty/freetype/src/base/ftbitmap.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility functions for bitmaps (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -76,7 +76,7 @@ source_pitch_sign = source->pitch < 0 ? -1 : 1; target_pitch_sign = target->pitch < 0 ? -1 : 1; - if ( source->buffer == NULL ) + if ( !source->buffer ) { *target = *source; if ( source_pitch_sign != target_pitch_sign ) diff --git a/thirdparty/freetype/src/base/ftcalc.c b/thirdparty/freetype/src/base/ftcalc.c index 67549d0c43..f0525502f3 100644 --- a/thirdparty/freetype/src/base/ftcalc.c +++ b/thirdparty/freetype/src/base/ftcalc.c @@ -4,7 +4,7 @@ /* */ /* Arithmetic computations (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -449,8 +449,8 @@ FT_Add64( &temp, &temp2, &temp ); /* last attempt to ditch long division */ - a = temp.hi == 0 ? temp.lo / c - : ft_div64by32( temp.hi, temp.lo, c ); + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); } a_ = (FT_Long)a; @@ -492,8 +492,8 @@ ft_multo64( a, b, &temp ); /* last attempt to ditch long division */ - a = temp.hi == 0 ? temp.lo / c - : ft_div64by32( temp.hi, temp.lo, c ); + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); } a_ = (FT_Long)a; diff --git a/thirdparty/freetype/src/base/ftcid.c b/thirdparty/freetype/src/base/ftcid.c index 251bbd009a..398396b845 100644 --- a/thirdparty/freetype/src/base/ftcid.c +++ b/thirdparty/freetype/src/base/ftcid.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing CID font information. */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* Derek Clegg and Michael Toftdal. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftdbgmem.c b/thirdparty/freetype/src/base/ftdbgmem.c index 6ab5072748..242246bfd1 100644 --- a/thirdparty/freetype/src/base/ftdbgmem.c +++ b/thirdparty/freetype/src/base/ftdbgmem.c @@ -4,7 +4,7 @@ /* */ /* Memory debugger (body). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -268,7 +268,7 @@ ft_mem_table_alloc( table, new_size * (FT_Long)sizeof ( FT_MemNode ) ); - if ( new_buckets == NULL ) + if ( !new_buckets ) return; FT_ARRAY_ZERO( new_buckets, new_size ); @@ -309,7 +309,7 @@ table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); - if ( table == NULL ) + if ( !table ) goto Exit; FT_ZERO( table ); @@ -466,7 +466,7 @@ for (;;) { node = *pnode; - if ( node == NULL ) + if ( !node ) break; if ( node->file_name == _ft_debug_file && @@ -477,7 +477,7 @@ } node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) + if ( !node ) ft_mem_debug_panic( "not enough memory to perform memory debugging\n" ); @@ -545,7 +545,7 @@ /* we need to create a new node in this table */ node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); - if ( node == NULL ) + if ( !node ) ft_mem_debug_panic( "not enough memory to run memory tests" ); node->address = address; @@ -717,7 +717,7 @@ FT_MemTable table = (FT_MemTable)memory->user; - if ( block == NULL ) + if ( !block ) ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); @@ -755,7 +755,7 @@ /* the following is valid according to ANSI C */ #if 0 - if ( block == NULL || cur_size == 0 ) + if ( !block || !cur_size ) ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", file_name, line_no ); #endif @@ -799,7 +799,7 @@ return NULL; new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size ); - if ( new_block == NULL ) + if ( !new_block ) return NULL; ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); @@ -840,9 +840,9 @@ memory->free = ft_mem_debug_free; p = getenv( "FT2_ALLOC_TOTAL_MAX" ); - if ( p != NULL ) + if ( p ) { - FT_Long total_max = ft_atol( p ); + FT_Long total_max = ft_strtol( p, NULL, 10 ); if ( total_max > 0 ) @@ -853,9 +853,9 @@ } p = getenv( "FT2_ALLOC_COUNT_MAX" ); - if ( p != NULL ) + if ( p ) { - FT_Long total_count = ft_atol( p ); + FT_Long total_count = ft_strtol( p, NULL, 10 ); if ( total_count > 0 ) @@ -866,9 +866,9 @@ } p = getenv( "FT2_KEEP_ALIVE" ); - if ( p != NULL ) + if ( p ) { - FT_Long keep_alive = ft_atol( p ); + FT_Long keep_alive = ft_strtol( p, NULL, 10 ); if ( keep_alive > 0 ) diff --git a/thirdparty/freetype/src/base/ftdebug.c b/thirdparty/freetype/src/base/ftdebug.c index 40925d14a0..20c617089f 100644 --- a/thirdparty/freetype/src/base/ftdebug.c +++ b/thirdparty/freetype/src/base/ftdebug.c @@ -4,7 +4,7 @@ /* */ /* Debugging and logging component (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftfntfmt.c b/thirdparty/freetype/src/base/ftfntfmt.c index c6eb3190c6..dcbeba0053 100644 --- a/thirdparty/freetype/src/base/ftfntfmt.c +++ b/thirdparty/freetype/src/base/ftfntfmt.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for font formats (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftfstype.c b/thirdparty/freetype/src/base/ftfstype.c index ae56c8fc8d..cec4fb3025 100644 --- a/thirdparty/freetype/src/base/ftfstype.c +++ b/thirdparty/freetype/src/base/ftfstype.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file to access FSType data (body). */ /* */ -/* Copyright 2008-2016 by */ +/* Copyright 2008-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftgasp.c b/thirdparty/freetype/src/base/ftgasp.c index e38e55b6c0..477b72558c 100644 --- a/thirdparty/freetype/src/base/ftgasp.c +++ b/thirdparty/freetype/src/base/ftgasp.c @@ -4,7 +4,7 @@ /* */ /* Access of TrueType's `gasp' table (body). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftgloadr.c b/thirdparty/freetype/src/base/ftgloadr.c index c4f0ff70f4..8134003b4b 100644 --- a/thirdparty/freetype/src/base/ftgloadr.c +++ b/thirdparty/freetype/src/base/ftgloadr.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph loader (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftglyph.c b/thirdparty/freetype/src/base/ftglyph.c index c2376dd03a..9bfb330508 100644 --- a/thirdparty/freetype/src/base/ftglyph.c +++ b/thirdparty/freetype/src/base/ftglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType convenience functions to handle glyphs (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -132,16 +132,18 @@ } - FT_DEFINE_GLYPH(ft_bitmap_glyph_class, + FT_DEFINE_GLYPH( + ft_bitmap_glyph_class, + sizeof ( FT_BitmapGlyphRec ), FT_GLYPH_FORMAT_BITMAP, - ft_bitmap_glyph_init, - ft_bitmap_glyph_done, - ft_bitmap_glyph_copy, - 0, /* FT_Glyph_TransformFunc */ - ft_bitmap_glyph_bbox, - 0 /* FT_Glyph_PrepareFunc */ + ft_bitmap_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_bitmap_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_bitmap_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + NULL, /* FT_Glyph_TransformFunc glyph_transform */ + ft_bitmap_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + NULL /* FT_Glyph_PrepareFunc glyph_prepare */ ) @@ -260,16 +262,18 @@ } - FT_DEFINE_GLYPH( ft_outline_glyph_class, + FT_DEFINE_GLYPH( + ft_outline_glyph_class, + sizeof ( FT_OutlineGlyphRec ), FT_GLYPH_FORMAT_OUTLINE, - ft_outline_glyph_init, - ft_outline_glyph_done, - ft_outline_glyph_copy, - ft_outline_glyph_transform, - ft_outline_glyph_bbox, - ft_outline_glyph_prepare + ft_outline_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_outline_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_outline_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + ft_outline_glyph_transform, /* FT_Glyph_TransformFunc glyph_transform */ + ft_outline_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + ft_outline_glyph_prepare /* FT_Glyph_PrepareFunc glyph_prepare */ ) @@ -542,8 +546,8 @@ /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ /* then calling FT_Render_Glyph_Internal() */ - FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); - FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); + FT_ZERO( &dummy ); + FT_ZERO( &dummy_internal ); dummy.internal = &dummy_internal; dummy.library = library; dummy.format = clazz->glyph_format; diff --git a/thirdparty/freetype/src/base/ftgxval.c b/thirdparty/freetype/src/base/ftgxval.c index 6667b371a1..ff24d336df 100644 --- a/thirdparty/freetype/src/base/ftgxval.c +++ b/thirdparty/freetype/src/base/ftgxval.c @@ -2,9 +2,9 @@ /* */ /* ftgxval.c */ /* */ -/* FreeType API for validating TrueTyepGX/AAT tables (body). */ +/* FreeType API for validating TrueTypeGX/AAT tables (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO, Redhat K.K, */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/base/ftinit.c b/thirdparty/freetype/src/base/ftinit.c index c2dd0a7b37..b3b08fa541 100644 --- a/thirdparty/freetype/src/base/ftinit.c +++ b/thirdparty/freetype/src/base/ftinit.c @@ -4,7 +4,7 @@ /* */ /* FreeType initialization layer (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -226,6 +226,94 @@ } +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + +#define MAX_LENGTH 128 + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + const char* env; + const char* p; + const char* q; + + char module_name[MAX_LENGTH + 1]; + char property_name[MAX_LENGTH + 1]; + char property_value[MAX_LENGTH + 1]; + + int i; + + + env = ft_getenv( "FREETYPE_PROPERTIES" ); + if ( !env ) + return; + + for ( p = env; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' ) + continue; + + /* read module name, followed by `:' */ + q = p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ':' ) + break; + module_name[i] = *p++; + } + module_name[i] = '\0'; + + if ( !*p || *p != ':' || p == q ) + break; + + /* read property name, followed by `=' */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == '=' ) + break; + property_name[i] = *p++; + } + property_name[i] = '\0'; + + if ( !*p || *p != '=' || p == q ) + break; + + /* read property value, followed by whitespace (if any) */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ' ' || *p == '\t' ) + break; + property_value[i] = *p++; + } + property_value[i] = '\0'; + + if ( !( *p == '\0' || *p == ' ' || *p == '\t' ) || p == q ) + break; + + /* we completely ignore errors */ + ft_property_string_set( library, + module_name, + property_name, + property_value ); + } + } + +#else + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + FT_UNUSED( library ); + } + +#endif + + /* documentation is in freetype.h */ FT_EXPORT_DEF( FT_Error ) @@ -256,6 +344,8 @@ else FT_Add_Default_Modules( *alibrary ); + FT_Set_Default_Properties( *alibrary ); + return error; } diff --git a/thirdparty/freetype/src/base/ftlcdfil.c b/thirdparty/freetype/src/base/ftlcdfil.c index 8bcbed7aab..611b39f570 100644 --- a/thirdparty/freetype/src/base/ftlcdfil.c +++ b/thirdparty/freetype/src/base/ftlcdfil.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for color filtering of subpixel bitmap glyphs (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -30,14 +30,13 @@ #define USE_LEGACY /* FIR filter used by the default and light filters */ - static void - _ft_lcd_filter_fir( FT_Bitmap* bitmap, - FT_Render_Mode mode, - FT_Library library ) + FT_BASE( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_LcdFiveTapFilter weights ) { - FT_Byte* weights = library->lcd_weights; - FT_UInt width = (FT_UInt)bitmap->width; - FT_UInt height = (FT_UInt)bitmap->rows; + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; /* horizontal in-place FIR filter */ @@ -176,7 +175,7 @@ static void _ft_lcd_filter_legacy( FT_Bitmap* bitmap, FT_Render_Mode mode, - FT_Library library ) + FT_Byte* weights ) { FT_UInt width = (FT_UInt)bitmap->width; FT_UInt height = (FT_UInt)bitmap->rows; @@ -189,7 +188,7 @@ { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } }; - FT_UNUSED( library ); + FT_UNUSED( weights ); /* horizontal in-place intra-pixel filter */ @@ -295,8 +294,8 @@ if ( !weights ) return FT_THROW( Invalid_Argument ); - ft_memcpy( library->lcd_weights, weights, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; + ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; library->lcd_extra = 2; return FT_Err_Ok; @@ -307,10 +306,10 @@ FT_Library_SetLcdFilter( FT_Library library, FT_LcdFilter filter ) { - static const FT_Byte default_filter[5] = - { 0x08, 0x4d, 0x56, 0x4d, 0x08 }; - static const FT_Byte light_filter[5] = - { 0x00, 0x55, 0x56, 0x55, 0x00 }; + static const FT_LcdFiveTapFilter default_weights = + { 0x08, 0x4d, 0x56, 0x4d, 0x08 }; + static const FT_LcdFiveTapFilter light_weights = + { 0x00, 0x55, 0x56, 0x55, 0x00 }; if ( !library ) @@ -324,14 +323,18 @@ break; case FT_LCD_FILTER_DEFAULT: - ft_memcpy( library->lcd_weights, default_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; + ft_memcpy( library->lcd_weights, + default_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; library->lcd_extra = 2; break; case FT_LCD_FILTER_LIGHT: - ft_memcpy( library->lcd_weights, light_filter, 5 ); - library->lcd_filter_func = _ft_lcd_filter_fir; + ft_memcpy( library->lcd_weights, + light_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; library->lcd_extra = 2; break; @@ -356,6 +359,17 @@ #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + FT_BASE( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_LcdFiveTapFilter weights ) + { + FT_UNUSED( bitmap ); + FT_UNUSED( mode ); + FT_UNUSED( weights ); + } + + FT_EXPORT_DEF( FT_Error ) FT_Library_SetLcdFilterWeights( FT_Library library, unsigned char *weights ) diff --git a/thirdparty/freetype/src/base/ftmac.c b/thirdparty/freetype/src/base/ftmac.c index e97fdbfc22..4b92066da3 100644 --- a/thirdparty/freetype/src/base/ftmac.c +++ b/thirdparty/freetype/src/base/ftmac.c @@ -8,7 +8,7 @@ /* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */ /* classic platforms built by MPW. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -71,6 +71,9 @@ #include FT_INTERNAL_STREAM_H #include "ftbase.h" + +#ifdef FT_MACINTOSH + /* This is for Mac OS X. Without redefinition, OS_INLINE */ /* expands to `static inline' which doesn't survive the */ /* -ansi compilation flag of GCC. */ @@ -118,8 +121,6 @@ #endif -#ifdef FT_MACINTOSH - /* This function is deprecated because FSSpec is deprecated in Mac OS X */ FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_Name( const char* fontName, @@ -605,7 +606,7 @@ for (;;) { post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) + if ( !post_data ) break; /* we are done */ code = (*post_data)[0]; @@ -644,7 +645,7 @@ for (;;) { post_data = Get1Resource( TTAG_POST, res_id++ ); - if ( post_data == NULL ) + if ( !post_data ) break; /* we are done */ post_size = (FT_ULong)GetHandleSize( post_data ) - 2; @@ -655,7 +656,7 @@ if ( last_code != -1 ) { /* we are done adding a chunk, fill in the size field */ - if ( size_p != NULL ) + if ( size_p ) { *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); @@ -743,7 +744,7 @@ sfnt = GetResource( TTAG_sfnt, sfnt_id ); - if ( sfnt == NULL ) + if ( !sfnt ) return FT_THROW( Invalid_Handle ); sfnt_size = (FT_ULong)GetHandleSize( sfnt ); @@ -821,7 +822,7 @@ return FT_THROW( Cannot_Open_Resource ); num_faces_in_res = 0; - for ( res_index = 1; ; ++res_index ) + for ( res_index = 1; ; res_index++ ) { short num_faces_in_fond; @@ -942,13 +943,14 @@ /* if it works, fine. */ error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); - if ( error == 0 ) - return error; + if ( error ) + { + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + } - /* let it fall through to normal loader (.ttf, .otf, etc.); */ - /* we signal this by returning no error and no FT_Face */ - *aface = NULL; - return 0; + return FT_Err_Ok; } @@ -982,12 +984,13 @@ /* try resourcefork based font: LWFN, FFIL */ error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, face_index, aface ); - if ( error != 0 || *aface != NULL ) + if ( error || *aface ) return error; /* let it fall through to normal loader (.ttf, .otf, etc.) */ args.flags = FT_OPEN_PATHNAME; args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); } @@ -1027,7 +1030,7 @@ error = FT_THROW( Cannot_Open_Resource ); error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); - if ( error != 0 || *aface != NULL ) + if ( error || *aface ) return error; /* fallback to datafork font */ @@ -1074,7 +1077,12 @@ #endif } -#endif /* FT_MACINTOSH */ +#else /* !FT_MACINTOSH */ + + /* ANSI C doesn't like empty source files */ + typedef int _ft_mac_dummy; + +#endif /* !FT_MACINTOSH */ /* END */ diff --git a/thirdparty/freetype/src/base/ftmm.c b/thirdparty/freetype/src/base/ftmm.c index 6b759ca467..2cb56a39be 100644 --- a/thirdparty/freetype/src/base/ftmm.c +++ b/thirdparty/freetype/src/base/ftmm.c @@ -4,7 +4,7 @@ /* */ /* Multiple Master font support (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,7 @@ #include FT_MULTIPLE_MASTERS_H #include FT_INTERNAL_OBJECTS_H #include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H /*************************************************************************/ @@ -62,6 +63,34 @@ } + static FT_Error + ft_face_get_mvar_service( FT_Face face, + FT_Service_MetricsVariations *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + error = FT_ERR( Invalid_Argument ); + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + METRICS_VARIATIONS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + /* documentation is in ftmm.h */ FT_EXPORT_DEF( FT_Error ) @@ -140,6 +169,13 @@ error = service->set_mm_design( face, num_coords, coords ); } + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + return error; } @@ -151,6 +187,50 @@ FT_UInt num_coords, FT_Fixed* coords ) { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_var_design ) + error = service_mm->set_var_design( face, num_coords, coords ); + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { FT_Error error; FT_Service_MultiMasters service; @@ -164,8 +244,8 @@ if ( !error ) { error = FT_ERR( Invalid_Argument ); - if ( service->set_var_design ) - error = service->set_var_design( face, num_coords, coords ); + if ( service->get_var_design ) + error = service->get_var_design( face, num_coords, coords ); } return error; @@ -179,6 +259,97 @@ FT_UInt num_coords, FT_Fixed* coords ) { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { FT_Error error; FT_Service_MultiMasters service; @@ -192,8 +363,8 @@ if ( !error ) { error = FT_ERR( Invalid_Argument ); - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); } return error; @@ -206,7 +377,7 @@ /* orthogonality. */ FT_EXPORT_DEF( FT_Error ) - FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_Get_Var_Blend_Coordinates( FT_Face face, FT_UInt num_coords, FT_Fixed* coords ) { @@ -223,8 +394,8 @@ if ( !error ) { error = FT_ERR( Invalid_Argument ); - if ( service->set_mm_blend ) - error = service->set_mm_blend( face, num_coords, coords ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); } return error; diff --git a/thirdparty/freetype/src/base/ftobjs.c b/thirdparty/freetype/src/base/ftobjs.c index c2dc6183b0..539116e85c 100644 --- a/thirdparty/freetype/src/base/ftobjs.c +++ b/thirdparty/freetype/src/base/ftobjs.c @@ -4,7 +4,7 @@ /* */ /* The FreeType private base classes (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -37,6 +37,9 @@ #include FT_SERVICE_KERNING_H #include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_AUTOHINTER_H +#include FT_CFF_DRIVER_H + #ifdef FT_CONFIG_OPTION_MAC_FONTS #include "ftbase.h" #endif @@ -79,6 +82,15 @@ #define GRID_FIT_METRICS + /* forward declaration */ + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ); + + FT_BASE_DEF( FT_Pointer ) ft_service_list_lookup( FT_ServiceDesc service_descriptors, const char* service_id ) @@ -453,7 +465,8 @@ Exit: - FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); + FT_TRACE4(( "FT_New_GlyphSlot: Return 0x%x\n", error )); + return error; } @@ -641,6 +654,9 @@ load_flags &= ~FT_LOAD_RENDER; } + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + load_flags &= ~FT_LOAD_RENDER; + /* * Determine whether we need to auto-hint or not. * The general rules are: @@ -686,7 +702,7 @@ /* check the size of the `fpgm' and `prep' tables, too -- */ /* the assumption is that there don't exist real TTFs where */ /* both `fpgm' and `prep' tables are missing */ - if ( ( mode == FT_RENDER_MODE_LIGHT && + if ( ( mode == FT_RENDER_MODE_LIGHT && !FT_DRIVER_HINTS_LIGHTLY( driver ) ) || ( FT_IS_SFNT( face ) && ttface->num_locations && @@ -1102,7 +1118,7 @@ end = first + face->num_charmaps; /* points after the last one */ - for ( cur = first; cur < end; ++cur ) + for ( cur = first; cur < end; cur++ ) { if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && @@ -1173,6 +1189,8 @@ } #endif + face->internal->random_seed = -1; + if ( clazz->init_face ) error = clazz->init_face( *astream, face, @@ -1237,7 +1255,7 @@ args.pathname = (char*)pathname; args.stream = NULL; - return FT_Open_Face( library, &args, face_index, aface ); + return ft_open_face_internal( library, &args, face_index, aface, 1 ); } #endif @@ -1264,7 +1282,7 @@ args.memory_size = file_size; args.stream = NULL; - return FT_Open_Face( library, &args, face_index, aface ); + return ft_open_face_internal( library, &args, face_index, aface, 1 ); } @@ -1299,7 +1317,7 @@ /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ /* It frees the memory it uses. */ - /* From ftmac.c. */ + /* From `ftmac.c'. */ static void memory_stream_close( FT_Stream stream ) { @@ -1315,7 +1333,7 @@ /* Create a new memory stream from a buffer and a size. */ - /* From ftmac.c. */ + /* From `ftmac.c'. */ static FT_Error new_memory_stream( FT_Library library, FT_Byte* base, @@ -1335,7 +1353,7 @@ return FT_THROW( Invalid_Argument ); *astream = NULL; - memory = library->memory; + memory = library->memory; if ( FT_NEW( stream ) ) goto Exit; @@ -1351,7 +1369,7 @@ /* Create a new FT_Face given a buffer and a driver name. */ - /* from ftmac.c */ + /* From `ftmac.c'. */ FT_LOCAL_DEF( FT_Error ) open_face_from_buffer( FT_Library library, FT_Byte* base, @@ -1377,11 +1395,11 @@ return error; } - args.flags = FT_OPEN_STREAM; + args.flags = FT_OPEN_STREAM; args.stream = stream; if ( driver_name ) { - args.flags = args.flags | FT_OPEN_DRIVER; + args.flags = args.flags | FT_OPEN_DRIVER; args.driver = FT_Get_Module( library, driver_name ); } @@ -1395,9 +1413,9 @@ face_index &= 0x7FFF0000L; /* retain GX data */ #endif - error = FT_Open_Face( library, &args, face_index, aface ); + error = ft_open_face_internal( library, &args, face_index, aface, 0 ); - if ( error == FT_Err_Ok ) + if ( !error ) (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; else #ifdef FT_MACINTOSH @@ -1589,6 +1607,7 @@ { FT_Error error = FT_ERR( Cannot_Open_Resource ); FT_Memory memory = library->memory; + FT_Byte* pfb_data = NULL; int i, type, flags; FT_ULong len; @@ -1604,12 +1623,12 @@ /* Find the length of all the POST resources, concatenated. Assume */ /* worst case (each resource in its own section). */ pfb_len = 0; - for ( i = 0; i < resource_cnt; ++i ) + for ( i = 0; i < resource_cnt; i++ ) { error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); if ( error ) goto Exit; - if ( FT_READ_ULONG( temp ) ) + if ( FT_READ_ULONG( temp ) ) /* actually LONG */ goto Exit; /* FT2 allocator takes signed long buffer length, @@ -1617,12 +1636,15 @@ */ FT_TRACE4(( " POST fragment #%d: length=0x%08x" " total pfb_len=0x%08x\n", - i, temp, pfb_len + temp + 6)); + i, temp, pfb_len + temp + 6 )); + if ( FT_MAC_RFORK_MAX_LEN < temp || FT_MAC_RFORK_MAX_LEN - temp < pfb_len + 6 ) { FT_TRACE2(( " MacOS resource length cannot exceed" - " 0x%08x\n", FT_MAC_RFORK_MAX_LEN )); + " 0x%08x\n", + FT_MAC_RFORK_MAX_LEN )); + error = FT_THROW( Invalid_Offset ); goto Exit; } @@ -1630,15 +1652,20 @@ pfb_len += temp + 6; } - FT_TRACE2(( " total buffer size to concatenate %d" - " POST fragments: 0x%08x\n", - resource_cnt, pfb_len + 2)); - if ( pfb_len + 2 < 6 ) { + FT_TRACE2(( " total buffer size to concatenate" + " %d POST fragments: 0x%08x\n", + resource_cnt, pfb_len + 2 )); + + if ( pfb_len + 2 < 6 ) + { FT_TRACE2(( " too long fragment length makes" - " pfb_len confused: pfb_len=0x%08x\n", pfb_len )); + " pfb_len confused: pfb_len=0x%08x\n", + pfb_len )); + error = FT_THROW( Array_Too_Large ); goto Exit; } + if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) goto Exit; @@ -1651,9 +1678,10 @@ pfb_pos = 6; pfb_lenpos = 2; - len = 0; + len = 0; type = 1; - for ( i = 0; i < resource_cnt; ++i ) + + for ( i = 0; i < resource_cnt; i++ ) { error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); if ( error ) @@ -1672,18 +1700,24 @@ if ( FT_READ_USHORT( flags ) ) goto Exit2; - FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", - i, offsets[i], rlen, flags )); + + FT_TRACE3(( "POST fragment[%d]:" + " offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", + i, offsets[i], rlen, flags )); error = FT_ERR( Array_Too_Large ); - /* postpone the check of rlen longer than buffer until FT_Stream_Read() */ + + /* postpone the check of `rlen longer than buffer' */ + /* until `FT_Stream_Read' */ + if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ { - FT_TRACE3(( " Skip POST fragment #%d because it is a comment\n", i )); + FT_TRACE3(( " Skip POST fragment #%d because it is a comment\n", + i )); continue; } - /* the flags are part of the resource, so rlen >= 2. */ + /* the flags are part of the resource, so rlen >= 2, */ /* but some fonts declare rlen = 0 for empty fragment */ if ( rlen > 2 ) rlen -= 2; @@ -1695,9 +1729,12 @@ else { FT_TRACE3(( " Write POST fragment #%d header (4-byte) to buffer" - " %p + 0x%08x\n", i, pfb_data, pfb_lenpos )); + " %p + 0x%08x\n", + i, pfb_data, pfb_lenpos )); + if ( pfb_lenpos + 3 > pfb_len + 2 ) goto Exit2; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); @@ -1707,13 +1744,16 @@ break; FT_TRACE3(( " Write POST fragment #%d header (6-byte) to buffer" - " %p + 0x%08x\n", i, pfb_data, pfb_pos )); + " %p + 0x%08x\n", + i, pfb_data, pfb_pos )); + if ( pfb_pos + 6 > pfb_len + 2 ) goto Exit2; + pfb_data[pfb_pos++] = 0x80; type = flags >> 8; - len = rlen; + len = rlen; pfb_data[pfb_pos++] = (FT_Byte)type; pfb_lenpos = pfb_pos; @@ -1727,14 +1767,18 @@ goto Exit2; FT_TRACE3(( " Load POST fragment #%d (%d byte) to buffer" - " %p + 0x%08x\n", i, rlen, pfb_data, pfb_pos )); + " %p + 0x%08x\n", + i, rlen, pfb_data, pfb_pos )); + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); if ( error ) goto Exit2; + pfb_pos += rlen; } error = FT_ERR( Array_Too_Large ); + if ( pfb_pos + 2 > pfb_len + 2 ) goto Exit2; pfb_data[pfb_pos++] = 0x80; @@ -1755,11 +1799,12 @@ aface ); Exit2: - if ( error == FT_ERR( Array_Too_Large ) ) + if ( FT_ERR_EQ( error, Array_Too_Large ) ) FT_TRACE2(( " Abort due to too-short buffer to store" " all POST fragments\n" )); - else if ( error == FT_ERR( Invalid_Offset ) ) + else if ( FT_ERR_EQ( error, Invalid_Offset ) ) FT_TRACE2(( " Abort due to invalid offset in a POST fragment\n" )); + if ( error ) error = FT_ERR( Cannot_Open_Resource ); FT_FREE( pfb_data ); @@ -1803,7 +1848,7 @@ if ( FT_READ_LONG( rlen ) ) goto Exit; - if ( rlen == -1 ) + if ( rlen < 1 ) return FT_THROW( Cannot_Open_Resource ); if ( (FT_ULong)rlen > FT_MAC_RFORK_MAX_LEN ) return FT_THROW( Invalid_Offset ); @@ -1856,19 +1901,19 @@ { FT_Memory memory = library->memory; FT_Error error; - FT_Long map_offset, rdara_pos; + FT_Long map_offset, rdata_pos; FT_Long *data_offsets; FT_Long count; error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, - &map_offset, &rdara_pos ); + &map_offset, &rdata_pos ); if ( error ) return error; /* POST resources must be sorted to concatenate properly */ error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, + map_offset, rdata_pos, TTAG_POST, TRUE, &data_offsets, &count ); if ( !error ) @@ -1885,7 +1930,7 @@ /* sfnt resources should not be sorted to preserve the face order by QuickDraw API */ error = FT_Raccess_Get_DataOffsets( library, stream, - map_offset, rdara_pos, + map_offset, rdata_pos, TTAG_sfnt, FALSE, &data_offsets, &count ); if ( !error ) @@ -1918,7 +1963,7 @@ FT_Long dlen, offset; - if ( NULL == stream ) + if ( !stream ) return FT_THROW( Invalid_Stream_Operation ); error = FT_Stream_Seek( stream, 0 ); @@ -1992,13 +2037,15 @@ { FT_TRACE3(( "Skip rule %d: darwin vfs resource fork" " is already checked and" - " no font is found\n", i )); + " no font is found\n", + i )); continue; } if ( errors[i] ) { - FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); + FT_TRACE3(( "Error 0x%x has occurred in rule %d\n", + errors[i], i )); continue; } @@ -2108,6 +2155,17 @@ FT_Long face_index, FT_Face *aface ) { + return ft_open_face_internal( library, args, face_index, aface, 1 ); + } + + + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ) + { FT_Error error; FT_Driver driver = NULL; FT_Memory memory = NULL; @@ -2118,6 +2176,23 @@ FT_Module* cur; FT_Module* limit; +#ifndef FT_CONFIG_OPTION_MAC_FONTS + FT_UNUSED( test_mac_fonts ); +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE3(( "FT_Open_Face: " )); + if ( face_index < 0 ) + FT_TRACE3(( "Requesting number of faces and named instances\n")); + else + { + FT_TRACE3(( "Requesting face %ld", face_index & 0xFFFFL )); + if ( face_index & 0x7FFF0000L ) + FT_TRACE3(( ", named instance %ld", face_index >> 16 )); + FT_TRACE3(( "\n" )); + } +#endif /* test for valid `library' delayed to `FT_Stream_New' */ @@ -2195,7 +2270,8 @@ goto Success; #ifdef FT_CONFIG_OPTION_MAC_FONTS - if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + if ( test_mac_fonts && + ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && FT_ERR_EQ( error, Table_Missing ) ) { /* TrueType but essential tables are missing */ @@ -2232,16 +2308,20 @@ goto Fail2; #if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) - error = load_mac_face( library, stream, face_index, aface, args ); - if ( !error ) + if ( test_mac_fonts ) { - /* We don't want to go to Success here. We've already done that. */ - /* On the other hand, if we succeeded we still need to close this */ - /* stream (we opened a different stream which extracted the */ - /* interesting information out of this stream here. That stream */ - /* will still be open and the face will point to it). */ - FT_Stream_Free( stream, external_stream ); - return error; + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done */ + /* that. On the other hand, if we succeeded we still need to */ + /* close this stream (we opened a different stream which */ + /* extracted the interesting information out of this stream */ + /* here. That stream will still be open and the face will */ + /* point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } } if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) @@ -2314,11 +2394,24 @@ if ( bsize->height < 0 ) - bsize->height = (FT_Short)-bsize->height; + bsize->height = -bsize->height; if ( bsize->x_ppem < 0 ) - bsize->x_ppem = (FT_Short)-bsize->x_ppem; + bsize->x_ppem = -bsize->x_ppem; if ( bsize->y_ppem < 0 ) bsize->y_ppem = -bsize->y_ppem; + + /* check whether negation actually has worked */ + if ( bsize->height < 0 || bsize->x_ppem < 0 || bsize->y_ppem < 0 ) + { + FT_TRACE0(( "FT_Open_Face:" + " Invalid bitmap dimensions for strike %d," + " now disabled\n", i )); + bsize->width = 0; + bsize->height = 0; + bsize->size = 0; + bsize->x_ppem = 0; + bsize->y_ppem = 0; + } } } @@ -2336,6 +2429,12 @@ internal->transform_delta.y = 0; internal->refcount = 1; + + internal->no_stem_darkening = -1; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + ft_memset( internal->lcd_weights, 0, FT_LCD_FILTER_FIVE_TAPS ); +#endif } if ( aface ) @@ -2352,7 +2451,20 @@ destroy_face( memory, face, driver ); Exit: - FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !error && face_index < 0 ) + { + FT_TRACE3(( "FT_Open_Face: The font has %ld face%s\n" + " and %ld named instance%s for face %ld\n", + face->num_faces, + face->num_faces == 1 ? "" : "s", + face->style_flags >> 16, + ( face->style_flags >> 16 ) == 1 ? "" : "s", + -face_index - 1 )); + } +#endif + + FT_TRACE4(( "FT_Open_Face: Return 0x%x\n", error )); return error; } @@ -2493,6 +2605,8 @@ FT_Size size = NULL; FT_ListNode node = NULL; + FT_Size_Internal internal = NULL; + if ( !face ) return FT_THROW( Invalid_Face_Handle ); @@ -2515,8 +2629,10 @@ size->face = face; - /* for now, do not use any internal fields in size objects */ - size->internal = NULL; + if ( FT_NEW( internal ) ) + goto Exit; + + size->internal = internal; if ( clazz->init_size ) error = clazz->init_size( size ); @@ -2618,6 +2734,9 @@ w = FT_PIX_ROUND( w ); h = FT_PIX_ROUND( h ); + if ( !w || !h ) + return FT_THROW( Invalid_Pixel_Size ); + for ( i = 0; i < face->num_fixed_sizes; i++ ) { FT_Bitmap_Size* bsize = face->available_sizes + i; @@ -2637,6 +2756,8 @@ } } + FT_TRACE3(( "FT_Match_Size: no matching bitmap strike\n" )); + return FT_THROW( Invalid_Pixel_Size ); } @@ -2939,6 +3060,10 @@ req->type >= FT_SIZE_REQUEST_TYPE_MAX ) return FT_THROW( Invalid_Argument ); + /* signal the auto-hinter to recompute its size metrics */ + /* (if requested) */ + face->size->internal->autohint_metrics.x_scale = 0; + clazz = face->driver->clazz; if ( clazz->request_size ) @@ -3356,7 +3481,7 @@ FT_CMap cmap = NULL; - if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) + if ( !clazz || !charmap || !charmap->face ) return FT_THROW( Invalid_Argument ); face = charmap->face; @@ -3485,6 +3610,90 @@ /* documentation is in freetype.h */ + FT_EXPORT_DEF( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ) + { + FT_Error error = FT_Err_Ok; + + + if ( num_properties > 0 && !properties ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + for ( ; num_properties > 0; num_properties-- ) + { + if ( properties->tag == FT_PARAM_TAG_STEM_DARKENING ) + { + if ( properties->data ) + { + if ( *( (FT_Bool*)properties->data ) == TRUE ) + face->internal->no_stem_darkening = FALSE; + else + face->internal->no_stem_darkening = TRUE; + } + else + { + /* use module default */ + face->internal->no_stem_darkening = -1; + } + } + else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS ) + { +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + if ( properties->data ) + ft_memcpy( face->internal->lcd_weights, + properties->data, + FT_LCD_FILTER_FIVE_TAPS ); + else + { + /* Value NULL indicates `no custom weights, use library */ + /* defaults', signaled by filling the weight field with zeros. */ + ft_memset( face->internal->lcd_weights, + 0, + FT_LCD_FILTER_FIVE_TAPS ); + } +#else + error = FT_THROW( Unimplemented_Feature ); + goto Exit; +#endif + } + else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED ) + { + if ( properties->data ) + { + face->internal->random_seed = *( (FT_Int32*)properties->data ); + if ( face->internal->random_seed < 0 ) + face->internal->random_seed = 0; + } + else + { + /* use module default */ + face->internal->random_seed = -1; + } + } + else + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( error ) + break; + + properties++; + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + FT_EXPORT_DEF( FT_UInt ) FT_Face_GetCharVariantIndex( FT_Face face, FT_ULong charcode, @@ -3501,19 +3710,21 @@ FT_CMap ucmap = FT_CMAP( face->charmap ); - if ( charmap != NULL ) + if ( charmap ) { FT_CMap vcmap = FT_CMAP( charmap ); if ( charcode > 0xFFFFFFFFUL ) { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large charcode" )); FT_TRACE1(( " 0x%x is truncated\n", charcode )); } if ( variantSelector > 0xFFFFFFFFUL ) { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large variantSelector" )); FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); } @@ -3542,19 +3753,21 @@ FT_CharMap charmap = find_variant_selector_charmap( face ); - if ( charmap != NULL ) + if ( charmap ) { FT_CMap vcmap = FT_CMAP( charmap ); if ( charcode > 0xFFFFFFFFUL ) { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large charcode" )); FT_TRACE1(( " 0x%x is truncated\n", charcode )); } if ( variantSelector > 0xFFFFFFFFUL ) { - FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large variantSelector" )); FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); } @@ -3581,7 +3794,7 @@ FT_CharMap charmap = find_variant_selector_charmap( face ); - if ( charmap != NULL ) + if ( charmap ) { FT_CMap vcmap = FT_CMAP( charmap ); FT_Memory memory = FT_FACE_MEMORY( face ); @@ -3609,7 +3822,7 @@ FT_CharMap charmap = find_variant_selector_charmap( face ); - if ( charmap != NULL ) + if ( charmap ) { FT_CMap vcmap = FT_CMAP( charmap ); FT_Memory memory = FT_FACE_MEMORY( face ); @@ -3617,7 +3830,7 @@ if ( charcode > 0xFFFFFFFFUL ) { - FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( "FT_Face_GetVariantsOfChar: too large charcode" )); FT_TRACE1(( " 0x%x is truncated\n", charcode )); } @@ -3643,7 +3856,7 @@ FT_CharMap charmap = find_variant_selector_charmap( face ); - if ( charmap != NULL ) + if ( charmap ) { FT_CMap vcmap = FT_CMAP( charmap ); FT_Memory memory = FT_FACE_MEMORY( face ); @@ -3771,7 +3984,7 @@ if ( face && FT_IS_SFNT( face ) ) { FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service != NULL ) + if ( service ) table = service->get_table( face, tag ); } @@ -3795,7 +4008,7 @@ return FT_THROW( Invalid_Face_Handle ); FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) + if ( !service ) return FT_THROW( Unimplemented_Feature ); return service->load_table( face, tag, offset, buffer, length ); @@ -3820,7 +4033,7 @@ return FT_THROW( Invalid_Face_Handle ); FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); - if ( service == NULL ) + if ( !service ) return FT_THROW( Unimplemented_Feature ); return service->table_info( face, table_index, tag, &offset, length ); @@ -3842,7 +4055,7 @@ face = charmap->face; FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) + if ( !service ) return 0; if ( service->get_cmap_info( charmap, &cmap_info )) return 0; @@ -3866,7 +4079,7 @@ face = charmap->face; FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); - if ( service == NULL ) + if ( !service ) return -1; if ( service->get_cmap_info( charmap, &cmap_info )) return -1; @@ -4196,7 +4409,7 @@ if ( ft_trace_levels[trace_bitmap] >= 3 ) { /* we convert to a single bitmap format for computing the checksum */ - if ( !error ) + if ( !error && slot->bitmap.buffer ) { FT_Bitmap bitmap; FT_Error err; @@ -4475,7 +4688,8 @@ FT_BASE_DEF( FT_Pointer ) ft_module_get_service( FT_Module module, - const char* service_id ) + const char* service_id, + FT_Bool global ) { FT_Pointer result = NULL; @@ -4488,7 +4702,7 @@ if ( module->clazz->get_interface ) result = module->clazz->get_interface( module, service_id ); - if ( result == NULL ) + if ( global && !result ) { /* we didn't find it, look in all other modules then */ FT_Library library = module->library; @@ -4505,7 +4719,7 @@ if ( cur[0]->clazz->get_interface ) { result = cur[0]->clazz->get_interface( cur[0], service_id ); - if ( result != NULL ) + if ( result ) break; } } @@ -4564,7 +4778,8 @@ const FT_String* module_name, const FT_String* property_name, void* value, - FT_Bool set ) + FT_Bool set, + FT_Bool value_is_string ) { FT_Module* cur; FT_Module* limit; @@ -4634,8 +4849,13 @@ return FT_THROW( Unimplemented_Feature ); } - return set ? service->set_property( cur[0], property_name, value ) - : service->get_property( cur[0], property_name, value ); + return set ? service->set_property( cur[0], + property_name, + value, + value_is_string ) + : service->get_property( cur[0], + property_name, + value ); } @@ -4651,7 +4871,8 @@ module_name, property_name, (void*)value, - TRUE ); + TRUE, + FALSE ); } @@ -4667,10 +4888,33 @@ module_name, property_name, value, + FALSE, FALSE ); } +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + /* this variant is used for handling the FREETYPE_PROPERTIES */ + /* environment variable */ + + FT_BASE_DEF( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ) + { + return ft_property_do( library, + module_name, + property_name, + (void*)value, + TRUE, + TRUE ); + } + +#endif + + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -4926,7 +5170,8 @@ service = (FT_Service_TrueTypeEngine) ft_module_get_service( module, - FT_SERVICE_ID_TRUETYPE_ENGINE ); + FT_SERVICE_ID_TRUETYPE_ENGINE, + 0 ); if ( service ) result = service->engine_type; } diff --git a/thirdparty/freetype/src/base/ftotval.c b/thirdparty/freetype/src/base/ftotval.c index fe54e0228a..5fa098691e 100644 --- a/thirdparty/freetype/src/base/ftotval.c +++ b/thirdparty/freetype/src/base/ftotval.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for validating OpenType tables (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftoutln.c b/thirdparty/freetype/src/base/ftoutln.c index fc28225c6a..464a066dcc 100644 --- a/thirdparty/freetype/src/base/ftoutln.c +++ b/thirdparty/freetype/src/base/ftoutln.c @@ -4,7 +4,7 @@ /* */ /* FreeType outline management (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -287,7 +287,7 @@ return FT_Err_Ok; Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); return error; Invalid_Outline: diff --git a/thirdparty/freetype/src/base/ftpatent.c b/thirdparty/freetype/src/base/ftpatent.c index 4861be130e..9900f99bfc 100644 --- a/thirdparty/freetype/src/base/ftpatent.c +++ b/thirdparty/freetype/src/base/ftpatent.c @@ -3,9 +3,9 @@ /* ftpatent.c */ /* */ /* FreeType API for checking patented TrueType bytecode instructions */ -/* (body). Obsolete, retained for backwards compatibility. */ +/* (body). Obsolete, retained for backward compatibility. */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* David Turner. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftpfr.c b/thirdparty/freetype/src/base/ftpfr.c index 81faa529c3..5cc0b70726 100644 --- a/thirdparty/freetype/src/base/ftpfr.c +++ b/thirdparty/freetype/src/base/ftpfr.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing PFR-specific data (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftpic.c b/thirdparty/freetype/src/base/ftpic.c index 03769dba22..0f84fddc98 100644 --- a/thirdparty/freetype/src/base/ftpic.c +++ b/thirdparty/freetype/src/base/ftpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services (body). */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftrfork.c b/thirdparty/freetype/src/base/ftrfork.c index 4660c971cf..f7b81375dd 100644 --- a/thirdparty/freetype/src/base/ftrfork.c +++ b/thirdparty/freetype/src/base/ftrfork.c @@ -4,7 +4,7 @@ /* */ /* Embedded resource forks accessor (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO and Redhat K.K. */ /* */ /* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ @@ -56,7 +56,7 @@ { FT_Error error; unsigned char head[16], head2[16]; - FT_Long map_pos, rdata_len; + FT_Long map_pos, map_len, rdata_len; int allzeros, allmatch, i; FT_Long type_list; @@ -67,12 +67,15 @@ if ( error ) return error; - error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); + error = FT_Stream_Read( stream, (FT_Byte*)head, 16 ); if ( error ) return error; /* ensure positive values */ - if ( head[0] >= 0x80 || head[4] >= 0x80 || head[8] >= 0x80 ) + if ( head[0] >= 0x80 || + head[4] >= 0x80 || + head[8] >= 0x80 || + head[12] >= 0x80 ) return FT_THROW( Unknown_File_Format ); *rdata_pos = ( head[ 0] << 24 ) | @@ -87,14 +90,36 @@ ( head[ 9] << 16 ) | ( head[10] << 8 ) | head[11]; + map_len = ( head[12] << 24 ) | + ( head[13] << 16 ) | + ( head[14] << 8 ) | + head[15]; - /* map_len = head[12] .. head[15] */ - - if ( *rdata_pos != map_pos - rdata_len || map_pos == 0 ) + /* the map must not be empty */ + if ( !map_pos ) return FT_THROW( Unknown_File_Format ); - if ( FT_LONG_MAX - rfork_offset < *rdata_pos || - FT_LONG_MAX - rfork_offset < map_pos ) + /* check whether rdata and map overlap */ + if ( *rdata_pos < map_pos ) + { + if ( *rdata_pos > map_pos - rdata_len ) + return FT_THROW( Unknown_File_Format ); + } + else + { + if ( map_pos > *rdata_pos - map_len ) + return FT_THROW( Unknown_File_Format ); + } + + /* check whether end of rdata or map exceeds stream size */ + if ( FT_LONG_MAX - rdata_len < *rdata_pos || + FT_LONG_MAX - map_len < map_pos || + + FT_LONG_MAX - ( *rdata_pos + rdata_len ) < rfork_offset || + FT_LONG_MAX - ( map_pos + map_len ) < rfork_offset || + + (FT_ULong)( rfork_offset + *rdata_pos + rdata_len ) > stream->size || + (FT_ULong)( rfork_offset + map_pos + map_len ) > stream->size ) return FT_THROW( Unknown_File_Format ); *rdata_pos += rfork_offset; @@ -112,7 +137,7 @@ allzeros = 1; allmatch = 1; - for ( i = 0; i < 16; ++i ) + for ( i = 0; i < 16; i++ ) { if ( head2[i] != 0 ) allzeros = 0; @@ -124,15 +149,14 @@ /* If we have reached this point then it is probably a mac resource */ /* file. Now, does it contain any interesting resources? */ - /* Skip handle to next resource map, the file resource number, and */ - /* attributes. */ + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + 2 /* skip file resource number */ + 2 ); /* skip attributes */ - if ( FT_READ_USHORT( type_list ) ) + if ( FT_READ_SHORT( type_list ) ) return error; - if ( type_list == -1 ) + if ( type_list < 0 ) return FT_THROW( Unknown_File_Format ); error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) ); @@ -181,15 +205,34 @@ if ( error ) return error; - if ( FT_READ_USHORT( cnt ) ) + if ( FT_READ_SHORT( cnt ) ) return error; cnt++; - for ( i = 0; i < cnt; ++i ) + /* `rpos' is a signed 16bit integer offset to resource records; the */ + /* size of a resource record is 12 bytes. The map header is 28 bytes, */ + /* and a type list needs 10 bytes or more. If we assume that the name */ + /* list is empty and we have only a single entry in the type list, */ + /* there can be at most */ + /* */ + /* (32768 - 28 - 10) / 12 = 2727 */ + /* */ + /* resources. */ + /* */ + /* A type list starts with a two-byte counter, followed by 10-byte */ + /* type records. Assuming that there are no resources, the number of */ + /* type records can be at most */ + /* */ + /* (32768 - 28 - 2) / 8 = 4079 */ + /* */ + if ( cnt > 4079 ) + return FT_THROW( Invalid_Table ); + + for ( i = 0; i < cnt; i++ ) { if ( FT_READ_LONG( tag_internal ) || - FT_READ_USHORT( subcnt ) || - FT_READ_USHORT( rpos ) ) + FT_READ_SHORT( subcnt ) || + FT_READ_SHORT( rpos ) ) return error; FT_TRACE2(( "Resource tags: %c%c%c%c\n", @@ -205,6 +248,11 @@ *count = subcnt + 1; rpos += map_offset; + /* a zero count might be valid in the resource specification, */ + /* however, it is completely useless to us */ + if ( *count < 1 || *count > 2727 ) + return FT_THROW( Invalid_Table ); + error = FT_Stream_Seek( stream, (FT_ULong)rpos ); if ( error ) return error; @@ -212,35 +260,44 @@ if ( FT_NEW_ARRAY( ref, *count ) ) return error; - for ( j = 0; j < *count; ++j ) + for ( j = 0; j < *count; j++ ) { - if ( FT_READ_USHORT( ref[j].res_id ) ) + if ( FT_READ_SHORT( ref[j].res_id ) ) goto Exit; - if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ + if ( FT_STREAM_SKIP( 2 ) ) /* resource name offset */ goto Exit; - if ( FT_READ_LONG( temp ) ) + if ( FT_READ_LONG( temp ) ) /* attributes (8bit), offset (24bit) */ goto Exit; - if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + if ( ref[j].res_id < 0 || temp < 0 ) + { + error = FT_THROW( Invalid_Table ); goto Exit; + } ref[j].offset = temp & 0xFFFFFFL; + FT_TRACE3(( " [%d]:" " resource_id=0x%04x, offset=0x%08x\n", j, ref[j].res_id, ref[j].offset )); } - if (sort_by_res_id) + if ( sort_by_res_id ) { - ft_qsort( ref, (size_t)*count, sizeof ( FT_RFork_Ref ), - ( int(*)(const void*, const void*) ) - ft_raccess_sort_ref_by_id ); + ft_qsort( ref, + (size_t)*count, + sizeof ( FT_RFork_Ref ), + ( int(*)(const void*, + const void*) )ft_raccess_sort_ref_by_id ); FT_TRACE3(( " -- sort resources by their ids --\n" )); - for ( j = 0; j < *count; ++ j ) { + + for ( j = 0; j < *count; j++ ) FT_TRACE3(( " [%d]:" " resource_id=0x%04x, offset=0x%08x\n", j, ref[j].res_id, ref[j].offset )); - } } if ( FT_NEW_ARRAY( offsets_internal, *count ) ) @@ -250,7 +307,7 @@ * gap between reference IDs are acceptable? * further investigation on Apple implementation is needed. */ - for ( j = 0; j < *count; ++j ) + for ( j = 0; j < *count; j++ ) offsets_internal[j] = rdata_pos + ref[j].offset; *offsets = offsets_internal; diff --git a/thirdparty/freetype/src/base/ftsnames.c b/thirdparty/freetype/src/base/ftsnames.c index ce7964118c..3609450088 100644 --- a/thirdparty/freetype/src/base/ftsnames.c +++ b/thirdparty/freetype/src/base/ftsnames.c @@ -7,7 +7,7 @@ /* */ /* This is _not_ used to retrieve glyph names! */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,6 +20,8 @@ #include <ft2build.h> +#include FT_INTERNAL_DEBUG_H + #include FT_SFNT_NAMES_H #include FT_INTERNAL_TRUETYPE_TYPES_H #include FT_INTERNAL_STREAM_H @@ -54,11 +56,11 @@ if ( idx < (FT_UInt)ttface->num_names ) { - TT_NameEntryRec* entry = ttface->name_table.names + idx; + TT_Name entry = ttface->name_table.names + idx; /* load name on demand */ - if ( entry->stringLength > 0 && entry->string == NULL ) + if ( entry->stringLength > 0 && !entry->string ) { FT_Memory memory = face->memory; FT_Stream stream = face->stream; @@ -88,6 +90,58 @@ } + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( alangTag && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->name_table.format != 1 ) + return FT_THROW( Invalid_Table ); + + if ( langID > 0x8000U && + langID - 0x8000U < ttface->name_table.numLangTagRecords ) + { + TT_LangTag entry = ttface->name_table.langTags + + ( langID - 0x8000U ); + + + /* load name on demand */ + if ( entry->stringLength > 0 && !entry->string ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + alangTag->string = (FT_Byte*)entry->string; + alangTag->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + #endif /* TT_CONFIG_OPTION_SFNT_NAMES */ diff --git a/thirdparty/freetype/src/base/ftstream.c b/thirdparty/freetype/src/base/ftstream.c index bb512a7ccb..a3f8c8b3c9 100644 --- a/thirdparty/freetype/src/base/ftstream.c +++ b/thirdparty/freetype/src/base/ftstream.c @@ -4,7 +4,7 @@ /* */ /* I/O stream support (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftstroke.c b/thirdparty/freetype/src/base/ftstroke.c index 4f3c4937b5..d32de0d62b 100644 --- a/thirdparty/freetype/src/base/ftstroke.c +++ b/thirdparty/freetype/src/base/ftstroke.c @@ -4,7 +4,7 @@ /* */ /* FreeType path stroker (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftsynth.c b/thirdparty/freetype/src/base/ftsynth.c index 4b66a33c3f..66dae6037a 100644 --- a/thirdparty/freetype/src/base/ftsynth.c +++ b/thirdparty/freetype/src/base/ftsynth.c @@ -4,7 +4,7 @@ /* */ /* FreeType synthesizing code for emboldening and slanting (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -130,7 +130,7 @@ if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) { FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); - FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr )); + FT_TRACE1(( "too strong emboldening parameter ystr=%d\n", ystr )); return; } error = FT_GlyphSlot_Own_Bitmap( slot ); diff --git a/thirdparty/freetype/src/base/ftsystem.c b/thirdparty/freetype/src/base/ftsystem.c index ac1f01c8bc..324f949a49 100644 --- a/thirdparty/freetype/src/base/ftsystem.c +++ b/thirdparty/freetype/src/base/ftsystem.c @@ -4,7 +4,7 @@ /* */ /* ANSI-specific FreeType low-level system interface (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/fttrigon.c b/thirdparty/freetype/src/base/fttrigon.c index 7b582c8a3d..7a4d17c829 100644 --- a/thirdparty/freetype/src/base/fttrigon.c +++ b/thirdparty/freetype/src/base/fttrigon.c @@ -4,7 +4,7 @@ /* */ /* FreeType trigonometric functions (body). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/fttype1.c b/thirdparty/freetype/src/base/fttype1.c index 5c0fce8686..4d16a6371a 100644 --- a/thirdparty/freetype/src/base/fttype1.c +++ b/thirdparty/freetype/src/base/fttype1.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for PS names support (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/ftutil.c b/thirdparty/freetype/src/base/ftutil.c index fad7d1a5fb..dccc209f4d 100644 --- a/thirdparty/freetype/src/base/ftutil.c +++ b/thirdparty/freetype/src/base/ftutil.c @@ -4,7 +4,7 @@ /* */ /* FreeType utility file for memory and list management (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -74,7 +74,7 @@ if ( size > 0 ) { block = memory->alloc( memory, size ); - if ( block == NULL ) + if ( !block ) error = FT_THROW( Out_Of_Memory ); } else if ( size < 0 ) @@ -141,7 +141,7 @@ } else if ( cur_count == 0 ) { - FT_ASSERT( block == NULL ); + FT_ASSERT( !block ); block = ft_mem_alloc( memory, new_count*item_size, &error ); } @@ -153,7 +153,7 @@ block2 = memory->realloc( memory, cur_size, new_size, block ); - if ( block2 == NULL ) + if ( !block2 ) error = FT_THROW( Out_Of_Memory ); else block = block2; diff --git a/thirdparty/freetype/src/base/ftwinfnt.c b/thirdparty/freetype/src/base/ftwinfnt.c index 89e9155098..05baa02da6 100644 --- a/thirdparty/freetype/src/base/ftwinfnt.c +++ b/thirdparty/freetype/src/base/ftwinfnt.c @@ -4,7 +4,7 @@ /* */ /* FreeType API for accessing Windows FNT specific info (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/base/rules.mk b/thirdparty/freetype/src/base/rules.mk index aa424c5463..2a1e93cb00 100644 --- a/thirdparty/freetype/src/base/rules.mk +++ b/thirdparty/freetype/src/base/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/bdf/bdf.c b/thirdparty/freetype/src/bdf/bdf.c index f95fb76225..e54df6649b 100644 --- a/thirdparty/freetype/src/bdf/bdf.c +++ b/thirdparty/freetype/src/bdf/bdf.c @@ -24,9 +24,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#define FT_MAKE_OPTION_SINGLE_OBJECT +#define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> + #include "bdflib.c" #include "bdfdrivr.c" diff --git a/thirdparty/freetype/src/bdf/bdfdrivr.c b/thirdparty/freetype/src/bdf/bdfdrivr.c index a381cf68f5..a2242be014 100644 --- a/thirdparty/freetype/src/bdf/bdfdrivr.c +++ b/thirdparty/freetype/src/bdf/bdfdrivr.c @@ -276,7 +276,7 @@ THE SOFTWARE. len = lengths[nn]; - if ( src == NULL ) + if ( !src ) continue; /* separate elements with a space */ @@ -423,7 +423,7 @@ THE SOFTWARE. else bdfface->family_name = NULL; - if ( ( error = bdf_interpret_style( face ) ) != 0 ) + if ( FT_SET_ERROR( bdf_interpret_style( face ) ) ) goto Exit; /* the number of glyphs (with one slot for the undefined glyph */ @@ -439,7 +439,7 @@ THE SOFTWARE. FT_Short resolution_x = 0, resolution_y = 0; - FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + FT_ZERO( bsize ); bsize->height = (FT_Short)( font->font_ascent + font->font_descent ); @@ -866,10 +866,10 @@ THE SOFTWARE. 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - 0, /* FT_Module_Constructor module_init */ - 0, /* FT_Module_Destructor module_done */ + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ bdf_driver_requester /* FT_Module_Requester get_interface */ }, @@ -879,16 +879,16 @@ THE SOFTWARE. BDF_Face_Init, /* FT_Face_InitFunc init_face */ BDF_Face_Done, /* FT_Face_DoneFunc done_face */ - 0, /* FT_Size_InitFunc init_size */ - 0, /* FT_Size_DoneFunc done_size */ - 0, /* FT_Slot_InitFunc init_slot */ - 0, /* FT_Slot_DoneFunc done_slot */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ BDF_Glyph_Load, /* FT_Slot_LoadFunc load_glyph */ - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ BDF_Size_Request, /* FT_Size_RequestFunc request_size */ BDF_Size_Select /* FT_Size_SelectFunc select_size */ diff --git a/thirdparty/freetype/src/bdf/bdflib.c b/thirdparty/freetype/src/bdf/bdflib.c index e1dce954ff..7fd95a7385 100644 --- a/thirdparty/freetype/src/bdf/bdflib.c +++ b/thirdparty/freetype/src/bdf/bdflib.c @@ -1119,7 +1119,7 @@ /* See whether this property type exists yet or not. */ /* If not, create it. */ propid = ft_hash_str_lookup( name, &(font->proptbl) ); - if ( propid == NULL ) + if ( !propid ) { error = bdf_create_property( name, BDF_ATOM, font ); if ( error ) @@ -1144,7 +1144,7 @@ } fp = font->props + font->props_size; - FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) ); + FT_ZERO( fp ); font->props_size++; } @@ -2301,7 +2301,7 @@ p->font->comments[p->font->comments_len] = 0; } } - else if ( error == FT_Err_Ok ) + else if ( !error ) error = FT_THROW( Invalid_File_Format ); *font = p->font; diff --git a/thirdparty/freetype/src/bzip2/ftbzip2.c b/thirdparty/freetype/src/bzip2/ftbzip2.c new file mode 100644 index 0000000000..7fc71e7079 --- /dev/null +++ b/thirdparty/freetype/src/bzip2/ftbzip2.c @@ -0,0 +1,525 @@ +/***************************************************************************/ +/* */ +/* ftbzip2.c */ +/* */ +/* FreeType support for .bz2 compressed files. */ +/* */ +/* This optional component relies on libbz2. It should mainly be used to */ +/* parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2010-2017 by */ +/* Joel Klinghed. */ +/* */ +/* based on `src/gzip/ftgzip.c' */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_BZIP2_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Bzip2_Err_ +#define FT_ERR_BASE FT_Mod_Err_Bzip2 + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_BZIP2 + +#ifdef FT_CONFIG_OPTION_PIC +#error "bzip2 code does not support PIC yet" +#endif + +#define BZ_NO_STDIO /* Do not need FILE */ +#include <bzlib.h> + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z I P 2 M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + typedef void *(* alloc_func)(void*, int, int); + typedef void (* free_func)(void*, void*); + + static void* + ft_bzip2_alloc( FT_Memory memory, + int items, + int size ) + { + FT_ULong sz = (FT_ULong)size * (FT_ULong)items; + FT_Error error; + FT_Pointer p = NULL; + + + (void)FT_ALLOC( p, sz ); + return p; + } + + + static void + ft_bzip2_free( FT_Memory memory, + void* address ) + { + FT_MEM_FREE( address ); + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z I P 2 F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_BZIP2_BUFFER_SIZE 4096 + + typedef struct FT_BZip2FileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + bz_stream bzstream; /* bzlib input stream */ + + FT_Byte input[FT_BZIP2_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_BZIP2_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_BZip2FileRec, *FT_BZip2File; + + + /* check and skip .bz2 header - we don't support `transparent' compression */ + static FT_Error + ft_bzip2_check_header( FT_Stream stream ) + { + FT_Error error = FT_Err_Ok; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the version, and head[3] the blocksize */ + if ( head[0] != 0x42 || + head[1] != 0x5A || + head[2] != 0x68 ) /* only support bzip2 (huffman) */ + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + Exit: + return error; + } + + + static FT_Error + ft_bzip2_file_init( FT_BZip2File zip, + FT_Stream stream, + FT_Stream source ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Error error = FT_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check .bz2 header */ + { + stream = source; + + error = ft_bzip2_check_header( stream ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + } + + /* initialize bzlib */ + bzstream->bzalloc = (alloc_func)ft_bzip2_alloc; + bzstream->bzfree = (free_func) ft_bzip2_free; + bzstream->opaque = zip->memory; + + bzstream->avail_in = 0; + bzstream->next_in = (char*)zip->buffer; + + if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK || + !bzstream->next_in ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static void + ft_bzip2_file_done( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + + + BZ2_bzDecompressEnd( bzstream ); + + /* clear the rest */ + bzstream->bzalloc = NULL; + bzstream->bzfree = NULL; + bzstream->opaque = NULL; + bzstream->next_in = NULL; + bzstream->next_out = NULL; + bzstream->avail_in = 0; + bzstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_bzip2_file_reset( FT_BZip2File zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + bz_stream* bzstream = &zip->bzstream; + + + BZ2_bzDecompressEnd( bzstream ); + + bzstream->avail_in = 0; + bzstream->next_in = (char*)zip->input; + bzstream->avail_out = 0; + bzstream->next_out = (char*)zip->buffer; + + zip->limit = zip->buffer + FT_BZIP2_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + BZ2_bzDecompressInit( bzstream, 0, 0 ); + } + + return error; + } + + + static FT_Error + ft_bzip2_file_fill_input( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_BZIP2_BUFFER_SIZE ); + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + } + else + { + size = stream->size - stream->pos; + if ( size > FT_BZIP2_BUFFER_SIZE ) + size = FT_BZIP2_BUFFER_SIZE; + + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + bzstream->next_in = (char*)zip->input; + bzstream->avail_in = size; + + return FT_Err_Ok; + } + + + static FT_Error + ft_bzip2_file_fill_output( FT_BZip2File zip ) + { + bz_stream* bzstream = &zip->bzstream; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + bzstream->next_out = (char*)zip->cursor; + bzstream->avail_out = FT_BZIP2_BUFFER_SIZE; + + while ( bzstream->avail_out > 0 ) + { + int err; + + + if ( bzstream->avail_in == 0 ) + { + error = ft_bzip2_file_fill_input( zip ); + if ( error ) + break; + } + + err = BZ2_bzDecompress( bzstream ); + + if ( err == BZ_STREAM_END ) + { + zip->limit = (FT_Byte*)bzstream->next_out; + if ( zip->limit == zip->cursor ) + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + else if ( err != BZ_OK ) + { + zip->limit = zip->cursor; + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_BZIP2_BUFFER_SIZE */ + static FT_Error + ft_bzip2_file_skip_output( FT_BZip2File zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong delta; + + + for (;;) + { + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_bzip2_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_bzip2_file_io( FT_BZip2File zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_bzip2_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_bzip2_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_bzip2_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** B Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_bzip2_stream_close( FT_Stream stream ) + { + FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize bzip file descriptor */ + ft_bzip2_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static unsigned long + ft_bzip2_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_BZip2File zip = (FT_BZip2File)stream->descriptor.pointer; + + + return ft_bzip2_file_io( zip, offset, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_BZip2File zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * check the header right now; this prevents allocating unnecessary + * objects when we don't need them + */ + error = ft_bzip2_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_bzip2_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_bzip2_stream_io; + stream->close = ft_bzip2_stream_close; + + Exit: + return error; + } + +#else /* !FT_CONFIG_OPTION_USE_BZIP2 */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenBzip2( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !FT_CONFIG_OPTION_USE_BZIP2 */ + + +/* END */ diff --git a/thirdparty/freetype/src/bzip2/rules.mk b/thirdparty/freetype/src/bzip2/rules.mk new file mode 100644 index 0000000000..f63ddc4d34 --- /dev/null +++ b/thirdparty/freetype/src/bzip2/rules.mk @@ -0,0 +1,64 @@ +# +# FreeType 2 BZIP2 support configuration rules +# + +# Copyright 2010-2017 by +# Joel Klinghed. +# +# based on `src/lzw/rules.mk' +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# BZIP2 driver directory +# +BZIP2_DIR := $(SRC_DIR)/bzip2 + + +# compilation flags for the driver +# +BZIP2_COMPILE := $(CC) $(ANSIFLAGS) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# BZIP2 support sources (i.e., C files) +# +BZIP2_DRV_SRC := $(BZIP2_DIR)/ftbzip2.c + +# BZIP2 driver object(s) +# +# BZIP2_DRV_OBJ_M is used during `multi' builds +# BZIP2_DRV_OBJ_S is used during `single' builds +# +BZIP2_DRV_OBJ_M := $(OBJ_DIR)/ftbzip2.$O +BZIP2_DRV_OBJ_S := $(OBJ_DIR)/ftbzip2.$O + +# BZIP2 support source file for single build +# +BZIP2_DRV_SRC_S := $(BZIP2_DIR)/ftbzip2.c + + +# BZIP2 support - single object +# +$(BZIP2_DRV_OBJ_S): $(BZIP2_DRV_SRC_S) $(BZIP2_DRV_SRC) $(FREETYPE_H) $(BZIP2_DRV_H) + $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BZIP2_DRV_SRC_S)) + + +# BZIP2 support - multiple objects +# +$(OBJ_DIR)/%.$O: $(BZIP2_DIR)/%.c $(FREETYPE_H) $(BZIP2_DRV_H) + $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BZIP2_DRV_OBJ_S) +DRV_OBJS_M += $(BZIP2_DRV_OBJ_M) + + +# EOF diff --git a/thirdparty/freetype/src/cache/ftcache.c b/thirdparty/freetype/src/cache/ftcache.c index 50941df4c4..8226188314 100644 --- a/thirdparty/freetype/src/cache/ftcache.c +++ b/thirdparty/freetype/src/cache/ftcache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType Caching sub-system (body only). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,15 +17,16 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "ftcmru.c" -#include "ftcmanag.c" + +#include "ftcbasic.c" #include "ftccache.c" #include "ftccmap.c" #include "ftcglyph.c" #include "ftcimage.c" +#include "ftcmanag.c" +#include "ftcmru.c" #include "ftcsbits.c" -#include "ftcbasic.c" + /* END */ diff --git a/thirdparty/freetype/src/cache/ftcbasic.c b/thirdparty/freetype/src/cache/ftcbasic.c index 8e6de8c41c..289bd5c430 100644 --- a/thirdparty/freetype/src/cache/ftcbasic.c +++ b/thirdparty/freetype/src/cache/ftcbasic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType basic cache interface (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -237,12 +237,14 @@ { { sizeof ( FTC_BasicFamilyRec ), - ftc_basic_family_compare, - ftc_basic_family_init, - 0, /* FTC_MruNode_ResetFunc */ - 0 /* FTC_MruNode_DoneFunc */ + + ftc_basic_family_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_basic_family_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + NULL /* FTC_MruNode_DoneFunc node_done */ }, - ftc_basic_family_load_glyph + + ftc_basic_family_load_glyph /* FTC_IFamily_LoadGlyphFunc family_load_glyph */ }; @@ -250,16 +252,17 @@ const FTC_GCacheClassRec ftc_basic_image_cache_class = { { - ftc_inode_new, - ftc_inode_weight, - ftc_gnode_compare, - ftc_basic_gnode_compare_faceid, - ftc_inode_free, + ftc_inode_new, /* FTC_Node_NewFunc node_new */ + ftc_inode_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_gnode_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_inode_free, /* FTC_Node_FreeFunc node_free */ sizeof ( FTC_GCacheRec ), - ftc_gcache_init, - ftc_gcache_done + ftc_gcache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_gcache_done /* FTC_Cache_DoneFunc cache_done */ }, + (FTC_MruListClass)&ftc_basic_image_family_class }; @@ -419,11 +422,12 @@ { { sizeof ( FTC_BasicFamilyRec ), - ftc_basic_family_compare, - ftc_basic_family_init, - 0, /* FTC_MruNode_ResetFunc */ - 0 /* FTC_MruNode_DoneFunc */ + ftc_basic_family_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_basic_family_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + NULL /* FTC_MruNode_DoneFunc node_done */ }, + ftc_basic_family_get_count, ftc_basic_family_load_bitmap }; @@ -433,16 +437,17 @@ const FTC_GCacheClassRec ftc_basic_sbit_cache_class = { { - ftc_snode_new, - ftc_snode_weight, - ftc_snode_compare, - ftc_basic_gnode_compare_faceid, - ftc_snode_free, + ftc_snode_new, /* FTC_Node_NewFunc node_new */ + ftc_snode_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_snode_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_snode_free, /* FTC_Node_FreeFunc node_free */ sizeof ( FTC_GCacheRec ), - ftc_gcache_init, - ftc_gcache_done + ftc_gcache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_gcache_done /* FTC_Cache_DoneFunc cache_done */ }, + (FTC_MruListClass)&ftc_basic_sbit_family_class }; diff --git a/thirdparty/freetype/src/cache/ftccache.c b/thirdparty/freetype/src/cache/ftccache.c index 3b1a4bc7e4..37dc3abb1d 100644 --- a/thirdparty/freetype/src/cache/ftccache.c +++ b/thirdparty/freetype/src/cache/ftccache.c @@ -4,7 +4,7 @@ /* */ /* The FreeType internal cache interface (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -147,7 +147,7 @@ for (;;) { node = *pnode; - if ( node == NULL ) + if ( !node ) break; if ( node->hash & ( mask + 1 ) ) @@ -232,7 +232,7 @@ FTC_Node node = *pnode; - if ( node == NULL ) + if ( !node ) { FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" )); return; @@ -288,7 +288,7 @@ cache = manager->caches[node->cache_index]; #ifdef FT_DEBUG_ERROR - if ( cache == NULL ) + if ( !cache ) { FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); return; @@ -494,7 +494,7 @@ FTC_Node_CompareFunc compare = cache->clazz.node_compare; - if ( cache == NULL || anode == NULL ) + if ( !cache || !anode ) return FT_THROW( Invalid_Argument ); /* Go to the `top' node of the list sharing same masked hash */ @@ -505,7 +505,7 @@ for (;;) { node = *pnode; - if ( node == NULL ) + if ( !node ) goto NewNode; if ( node->hash == hash && @@ -523,7 +523,7 @@ /* Update pnode by modified linked list */ while ( *pnode != node ) { - if ( *pnode == NULL ) + if ( !*pnode ) { FT_ERROR(( "FTC_Cache_Lookup: oops!!! node missing\n" )); goto NewNode; @@ -582,7 +582,7 @@ FT_Bool list_changed = FALSE; - if ( node == NULL ) + if ( !node ) break; if ( cache->clazz.node_remove_faceid( node, face_id, diff --git a/thirdparty/freetype/src/cache/ftccache.h b/thirdparty/freetype/src/cache/ftccache.h index 1b1295951f..d3c11ce082 100644 --- a/thirdparty/freetype/src/cache/ftccache.h +++ b/thirdparty/freetype/src/cache/ftccache.h @@ -4,7 +4,7 @@ /* */ /* FreeType internal cache interface (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -227,7 +227,7 @@ FT_BEGIN_HEADER for (;;) \ { \ _node = *_pnode; \ - if ( _node == NULL ) \ + if ( !_node ) \ goto NewNode_; \ \ if ( _node->hash == _hash && \ @@ -245,7 +245,7 @@ FT_BEGIN_HEADER /* Update _pnode by possibly modified linked list */ \ while ( *_pnode != _node ) \ { \ - if ( *_pnode == NULL ) \ + if ( !*_pnode ) \ { \ FT_ERROR(( "FTC_CACHE_LOOKUP_CMP: oops!!! node missing\n" )); \ goto NewNode_; \ @@ -325,7 +325,7 @@ FT_BEGIN_HEADER break; \ \ _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ - if ( _try_done > 0 && ( list_changed != NULL ) ) \ + if ( _try_done > 0 && list_changed != NULL ) \ *(FT_Bool*)( list_changed ) = TRUE; \ \ if ( _try_done == 0 ) \ diff --git a/thirdparty/freetype/src/cache/ftccback.h b/thirdparty/freetype/src/cache/ftccback.h index 279e94d923..2681e8c022 100644 --- a/thirdparty/freetype/src/cache/ftccback.h +++ b/thirdparty/freetype/src/cache/ftccback.h @@ -4,7 +4,7 @@ /* */ /* Callback functions of the caching sub-system (specification only). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftccmap.c b/thirdparty/freetype/src/cache/ftccmap.c index 41a0ce97dd..2fa84979c8 100644 --- a/thirdparty/freetype/src/cache/ftccmap.c +++ b/thirdparty/freetype/src/cache/ftccmap.c @@ -4,7 +4,7 @@ /* */ /* FreeType CharMap cache (body) */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -201,15 +201,15 @@ static const FTC_CacheClassRec ftc_cmap_cache_class = { - ftc_cmap_node_new, - ftc_cmap_node_weight, - ftc_cmap_node_compare, - ftc_cmap_node_remove_faceid, - ftc_cmap_node_free, + ftc_cmap_node_new, /* FTC_Node_NewFunc node_new */ + ftc_cmap_node_weight, /* FTC_Node_WeightFunc node_weight */ + ftc_cmap_node_compare, /* FTC_Node_CompareFunc node_compare */ + ftc_cmap_node_remove_faceid, /* FTC_Node_CompareFunc node_remove_faceid */ + ftc_cmap_node_free, /* FTC_Node_FreeFunc node_free */ sizeof ( FTC_CacheRec ), - ftc_cache_init, - ftc_cache_done, + ftc_cache_init, /* FTC_Cache_InitFunc cache_init */ + ftc_cache_done, /* FTC_Cache_DoneFunc cache_done */ }; diff --git a/thirdparty/freetype/src/cache/ftcerror.h b/thirdparty/freetype/src/cache/ftcerror.h index 1fd7357a8b..84fe52f546 100644 --- a/thirdparty/freetype/src/cache/ftcerror.h +++ b/thirdparty/freetype/src/cache/ftcerror.h @@ -4,7 +4,7 @@ /* */ /* Caching sub-system error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcglyph.c b/thirdparty/freetype/src/cache/ftcglyph.c index c4046812dd..d2468f2f43 100644 --- a/thirdparty/freetype/src/cache/ftcglyph.c +++ b/thirdparty/freetype/src/cache/ftcglyph.c @@ -4,7 +4,7 @@ /* */ /* FreeType Glyph Image (FT_Glyph) cache (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcglyph.h b/thirdparty/freetype/src/cache/ftcglyph.h index dc7be06f03..cab58ed311 100644 --- a/thirdparty/freetype/src/cache/ftcglyph.h +++ b/thirdparty/freetype/src/cache/ftcglyph.h @@ -4,7 +4,7 @@ /* */ /* FreeType abstract glyph cache (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcimage.c b/thirdparty/freetype/src/cache/ftcimage.c index 74040aa745..359f818cce 100644 --- a/thirdparty/freetype/src/cache/ftcimage.c +++ b/thirdparty/freetype/src/cache/ftcimage.c @@ -4,7 +4,7 @@ /* */ /* FreeType Image cache (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcimage.h b/thirdparty/freetype/src/cache/ftcimage.h index 25aa43b97e..14049af9d2 100644 --- a/thirdparty/freetype/src/cache/ftcimage.h +++ b/thirdparty/freetype/src/cache/ftcimage.h @@ -4,7 +4,7 @@ /* */ /* FreeType Generic Image cache (specification) */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcmanag.c b/thirdparty/freetype/src/cache/ftcmanag.c index 661a32af5b..edec2b6b5b 100644 --- a/thirdparty/freetype/src/cache/ftcmanag.c +++ b/thirdparty/freetype/src/cache/ftcmanag.c @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -156,10 +156,11 @@ const FTC_MruListClassRec ftc_size_list_class = { sizeof ( FTC_SizeNodeRec ), - ftc_size_node_compare, - ftc_size_node_init, - ftc_size_node_reset, - ftc_size_node_done + + ftc_size_node_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_size_node_init, /* FTC_MruNode_InitFunc node_init */ + ftc_size_node_reset, /* FTC_MruNode_ResetFunc node_reset */ + ftc_size_node_done /* FTC_MruNode_DoneFunc node_done */ }; @@ -296,10 +297,10 @@ { sizeof ( FTC_FaceNodeRec), - ftc_face_node_compare, - ftc_face_node_init, - 0, /* FTC_MruNode_ResetFunc */ - ftc_face_node_done + ftc_face_node_compare, /* FTC_MruNode_CompareFunc node_compare */ + ftc_face_node_init, /* FTC_MruNode_InitFunc node_init */ + NULL, /* FTC_MruNode_ResetFunc node_reset */ + ftc_face_node_done /* FTC_MruNode_DoneFunc node_done */ }; @@ -552,7 +553,7 @@ manager->num_nodes )); #endif - if ( manager->cur_weight < manager->max_weight || first == NULL ) + if ( manager->cur_weight < manager->max_weight || !first ) return; /* go to last node -- it's a circular list */ @@ -637,7 +638,7 @@ /* try to remove `count' nodes from the list */ - if ( first == NULL ) /* empty list! */ + if ( !first ) /* empty list! */ return 0; /* go to last node - it's a circular list */ diff --git a/thirdparty/freetype/src/cache/ftcmanag.h b/thirdparty/freetype/src/cache/ftcmanag.h index f2c434a135..556842e131 100644 --- a/thirdparty/freetype/src/cache/ftcmanag.h +++ b/thirdparty/freetype/src/cache/ftcmanag.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache Manager (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/ftcmru.c b/thirdparty/freetype/src/cache/ftcmru.c index d107584a19..e293269f2f 100644 --- a/thirdparty/freetype/src/cache/ftcmru.c +++ b/thirdparty/freetype/src/cache/ftcmru.c @@ -4,7 +4,7 @@ /* */ /* FreeType MRU support (body). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -76,7 +76,7 @@ FTC_MruNode first = *plist; - FT_ASSERT( first != NULL ); + FT_ASSERT( first ); if ( first != node ) { @@ -126,7 +126,7 @@ FTC_MruNode prev, next; - FT_ASSERT( first != NULL ); + FT_ASSERT( first ); #ifdef FT_DEBUG_ERROR { @@ -238,7 +238,7 @@ FTC_MruNode *anode ) { FT_Error error; - FTC_MruNode node = NULL; + FTC_MruNode node = NULL; FT_Memory memory = list->memory; @@ -296,7 +296,7 @@ node = FTC_MruList_Find( list, key ); - if ( node == NULL ) + if ( !node ) return FTC_MruList_New( list, key, anode ); *anode = node; @@ -332,7 +332,7 @@ first = list->nodes; - while ( first && ( selection == NULL || selection( first, key ) ) ) + while ( first && ( !selection || selection( first, key ) ) ) { FTC_MruList_Remove( list, first ); first = list->nodes; diff --git a/thirdparty/freetype/src/cache/ftcmru.h b/thirdparty/freetype/src/cache/ftcmru.h index ae3c4ce23a..c4c330d558 100644 --- a/thirdparty/freetype/src/cache/ftcmru.h +++ b/thirdparty/freetype/src/cache/ftcmru.h @@ -4,7 +4,7 @@ /* */ /* Simple MRU list-cache (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -108,6 +108,7 @@ FT_BEGIN_HEADER typedef struct FTC_MruListClassRec_ { FT_Offset node_size; + FTC_MruNode_CompareFunc node_compare; FTC_MruNode_InitFunc node_init; FTC_MruNode_ResetFunc node_reset; @@ -115,6 +116,7 @@ FT_BEGIN_HEADER } FTC_MruListClassRec; + typedef struct FTC_MruListRec_ { FT_UInt num_nodes; diff --git a/thirdparty/freetype/src/cache/ftcsbits.c b/thirdparty/freetype/src/cache/ftcsbits.c index d6f1ddcd4e..2f9336decd 100644 --- a/thirdparty/freetype/src/cache/ftcsbits.c +++ b/thirdparty/freetype/src/cache/ftcsbits.c @@ -4,7 +4,7 @@ /* */ /* FreeType sbits manager (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -378,7 +378,7 @@ * */ - if ( sbit->buffer == NULL && sbit->width == 255 ) + if ( !sbit->buffer && sbit->width == 255 ) { FT_ULong size; FT_Error error; diff --git a/thirdparty/freetype/src/cache/ftcsbits.h b/thirdparty/freetype/src/cache/ftcsbits.h index a0600ede09..1e15ce9764 100644 --- a/thirdparty/freetype/src/cache/ftcsbits.h +++ b/thirdparty/freetype/src/cache/ftcsbits.h @@ -4,7 +4,7 @@ /* */ /* A small-bitmap cache (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cache/rules.mk b/thirdparty/freetype/src/cache/rules.mk index 827e259f90..6204689505 100644 --- a/thirdparty/freetype/src/cache/rules.mk +++ b/thirdparty/freetype/src/cache/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2000-2016 by +# Copyright 2000-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/cff/cf2arrst.c b/thirdparty/freetype/src/cff/cf2arrst.c index 89f3e9f1d7..6796450fe1 100644 --- a/thirdparty/freetype/src/cff/cf2arrst.c +++ b/thirdparty/freetype/src/cff/cf2arrst.c @@ -58,7 +58,7 @@ FT_Error* error, size_t sizeItem ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); /* initialize the structure */ arrstack->memory = memory; @@ -78,7 +78,7 @@ FT_Memory memory = arrstack->memory; /* for FT_FREE */ - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); arrstack->allocated = 0; arrstack->count = 0; @@ -95,7 +95,7 @@ cf2_arrstack_setNumElements( CF2_ArrStack arrstack, size_t numElements ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); { FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ @@ -140,7 +140,7 @@ cf2_arrstack_setCount( CF2_ArrStack arrstack, size_t numElements ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); if ( numElements > arrstack->allocated ) { @@ -157,7 +157,7 @@ FT_LOCAL_DEF( void ) cf2_arrstack_clear( CF2_ArrStack arrstack ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); arrstack->count = 0; } @@ -167,7 +167,7 @@ FT_LOCAL_DEF( size_t ) cf2_arrstack_size( const CF2_ArrStack arrstack ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); return arrstack->count; } @@ -176,7 +176,7 @@ FT_LOCAL_DEF( void* ) cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); return arrstack->ptr; } @@ -190,7 +190,7 @@ void* newPtr; - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); if ( idx >= arrstack->count ) { @@ -212,7 +212,7 @@ cf2_arrstack_push( CF2_ArrStack arrstack, const void* ptr ) { - FT_ASSERT( arrstack != NULL ); + FT_ASSERT( arrstack ); if ( arrstack->count == arrstack->allocated ) { @@ -225,7 +225,7 @@ } } - FT_ASSERT( ptr != NULL ); + FT_ASSERT( ptr ); { size_t offset = arrstack->count * arrstack->sizeItem; diff --git a/thirdparty/freetype/src/cff/cf2error.c b/thirdparty/freetype/src/cff/cf2error.c index b5595a3d1f..e3dd69f50d 100644 --- a/thirdparty/freetype/src/cff/cf2error.c +++ b/thirdparty/freetype/src/cff/cf2error.c @@ -44,7 +44,7 @@ cf2_setError( FT_Error* error, FT_Error value ) { - if ( error && *error == 0 ) + if ( error && !*error ) *error = value; } diff --git a/thirdparty/freetype/src/cff/cf2error.h b/thirdparty/freetype/src/cff/cf2error.h index 512edd1d21..d2c770d297 100644 --- a/thirdparty/freetype/src/cff/cf2error.h +++ b/thirdparty/freetype/src/cff/cf2error.h @@ -66,7 +66,7 @@ FT_BEGIN_HEADER * model our error mechanism on a Java-like exception mechanism. * When we assign an error code we are thus `throwing' an error. * - * The perservation of an error code is done by coding convention. + * The preservation of an error code is done by coding convention. * Upon a function call if the error code is anything other than * `FT_Err_Ok', which is guaranteed to be zero, we * will return without altering that error. This will allow the diff --git a/thirdparty/freetype/src/cff/cf2fixed.h b/thirdparty/freetype/src/cff/cf2fixed.h index 74af37708b..2e4b5032fa 100644 --- a/thirdparty/freetype/src/cff/cf2fixed.h +++ b/thirdparty/freetype/src/cff/cf2fixed.h @@ -51,8 +51,8 @@ FT_BEGIN_HEADER #define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL ) #define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L ) -#define CF2_FIXED_ONE 0x10000L -#define CF2_FIXED_EPSILON 0x0001 +#define CF2_FIXED_ONE ( (CF2_Fixed)0x10000L ) +#define CF2_FIXED_EPSILON ( (CF2_Fixed)0x0001 ) /* in C 89, left and right shift of negative numbers is */ /* implementation specific behaviour in the general case */ diff --git a/thirdparty/freetype/src/cff/cf2font.c b/thirdparty/freetype/src/cff/cf2font.c index 83fd348f2d..a86e3619b4 100644 --- a/thirdparty/freetype/src/cff/cf2font.c +++ b/thirdparty/freetype/src/cff/cf2font.c @@ -234,7 +234,8 @@ } - /* set up values for the current FontDict and matrix */ + /* set up values for the current FontDict and matrix; */ + /* called for each glyph to be rendered */ /* caller's transform is adjusted for subpixel positioning */ static void @@ -246,6 +247,9 @@ FT_Bool needExtraSetup = FALSE; + CFF_VStoreRec* vstore; + FT_Bool hasVariations = FALSE; + /* character space units */ CF2_Fixed boldenX = font->syntheticEmboldeningAmountX; CF2_Fixed boldenY = font->syntheticEmboldeningAmountY; @@ -253,6 +257,9 @@ CFF_SubFont subFont; CF2_Fixed ppem; + CF2_UInt lenNormalizedV = 0; + FT_Fixed* normalizedV = NULL; + /* clear previous error */ font->error = FT_Err_Ok; @@ -266,6 +273,48 @@ needExtraSetup = TRUE; } + /* check for variation vectors */ + vstore = cf2_getVStore( decoder ); + hasVariations = ( vstore->dataCount != 0 ); + + if ( hasVariations ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* check whether Private DICT in this subfont needs to be reparsed */ + font->error = cf2_getNormalizedVector( decoder, + &lenNormalizedV, + &normalizedV ); + if ( font->error ) + return; + + if ( cff_blend_check_vector( &subFont->blend, + subFont->private_dict.vsindex, + lenNormalizedV, + normalizedV ) ) + { + /* blend has changed, reparse */ + cff_load_private_dict( decoder->cff, + subFont, + lenNormalizedV, + normalizedV ); + needExtraSetup = TRUE; + } +#endif + + /* copy from subfont */ + font->blend.font = subFont->blend.font; + + /* clear state of charstring blend */ + font->blend.usedBV = FALSE; + + /* initialize value for charstring */ + font->vsindex = subFont->private_dict.vsindex; + + /* store vector inputs for blends in charstring */ + font->lenNDV = lenNormalizedV; + font->NDV = normalizedV; + } + /* if ppem has changed, we need to recompute some cached data */ /* note: because of CID font matrix concatenation, ppem and transform */ /* do not necessarily track. */ @@ -423,7 +472,8 @@ /* compute blue zones for this instance */ cf2_blues_init( &font->blues, font ); - } + + } /* needExtraSetup */ } diff --git a/thirdparty/freetype/src/cff/cf2font.h b/thirdparty/freetype/src/cff/cf2font.h index bd05e69e7b..17ecd17bbb 100644 --- a/thirdparty/freetype/src/cff/cf2font.h +++ b/thirdparty/freetype/src/cff/cf2font.h @@ -42,6 +42,7 @@ #include "cf2ft.h" #include "cf2blues.h" +#include "cffload.h" FT_BEGIN_HEADER @@ -63,6 +64,7 @@ FT_BEGIN_HEADER FT_Memory memory; FT_Error error; /* shared error for this instance */ + FT_Bool isCFF2; CF2_RenderingFlags renderingFlags; /* variables that depend on Transform: */ @@ -74,6 +76,12 @@ FT_BEGIN_HEADER CF2_Matrix outerTransform; /* post hinting; includes rotations */ CF2_Fixed ppem; /* transform-dependent */ + /* variation data */ + CFF_BlendRec blend; /* cached charstring blend vector */ + CF2_UInt vsindex; /* current vsindex */ + CF2_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + CF2_Int unitsPerEm; CF2_Fixed syntheticEmboldeningAmountX; /* character space units */ diff --git a/thirdparty/freetype/src/cff/cf2ft.c b/thirdparty/freetype/src/cff/cf2ft.c index 55f3206ac2..eb8472f119 100644 --- a/thirdparty/freetype/src/cff/cf2ft.c +++ b/thirdparty/freetype/src/cff/cf2ft.c @@ -104,7 +104,8 @@ FT_Memory memory = font->memory; - (void)memory; + FT_FREE( font->blend.lastNDV ); + FT_FREE( font->blend.BV ); } } @@ -239,7 +240,7 @@ FT_Memory memory, FT_Error* error ) { - FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) ); + FT_ZERO( outline ); outline->root.memory = memory; outline->root.error = error; @@ -311,7 +312,7 @@ font = (CF2_Font)decoder->cff->cf2_instance.data; /* on first glyph, allocate instance structure */ - if ( decoder->cff->cf2_instance.data == NULL ) + if ( !decoder->cff->cf2_instance.data ) { decoder->cff->cf2_instance.finalizer = (FT_Generic_Finalizer)cf2_free_instance; @@ -339,6 +340,11 @@ CFF_Builder* builder = &decoder->builder; CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); + FT_Bool no_stem_darkening_driver = + driver->no_stem_darkening; + FT_Char no_stem_darkening_font = + builder->face->root.internal->no_stem_darkening; + /* local error */ FT_Error error2 = FT_Err_Ok; CF2_BufferRec buf; @@ -366,10 +372,15 @@ &hinted, &scaled ); + /* copy isCFF2 boolean from TT_Face to CF2_Font */ + font->isCFF2 = builder->face->is_cff2; + font->renderingFlags = 0; if ( hinted ) font->renderingFlags |= CF2_FlagsHinted; - if ( scaled && !driver->no_stem_darkening ) + if ( scaled && ( !no_stem_darkening_font || + ( no_stem_darkening_font < 0 && + !no_stem_darkening_driver ) ) ) font->renderingFlags |= CF2_FlagsDarkened; font->darkenParams[0] = driver->darken_params[0]; @@ -413,6 +424,44 @@ } + /* get pointer to VStore structure */ + FT_LOCAL_DEF( CFF_VStore ) + cf2_getVStore( CFF_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return &decoder->cff->vstore; + } + + + /* get maxstack value from CFF2 Top DICT */ + FT_LOCAL_DEF( FT_UInt ) + cf2_getMaxstack( CFF_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return decoder->cff->top_font.font_dict.maxstack; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Get normalized design vector for current render request; */ + /* return pointer and length. */ + /* */ + /* Note: Uses FT_Fixed not CF2_Fixed for the vector. */ + FT_LOCAL_DEF( FT_Error ) + cf2_getNormalizedVector( CFF_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ) + { + FT_ASSERT( decoder && decoder->builder.face ); + FT_ASSERT( vec && len ); + + return cff_get_var_blend( decoder->builder.face, len, NULL, vec, NULL ); + } +#endif + + /* get `y_ppem' from `CFF_Size' */ FT_LOCAL_DEF( CF2_Fixed ) cf2_getPpemY( CFF_Decoder* decoder ) diff --git a/thirdparty/freetype/src/cff/cf2ft.h b/thirdparty/freetype/src/cff/cf2ft.h index 8e55e841a0..b054a6e950 100644 --- a/thirdparty/freetype/src/cff/cf2ft.h +++ b/thirdparty/freetype/src/cff/cf2ft.h @@ -64,6 +64,18 @@ FT_BEGIN_HEADER FT_LOCAL( CFF_SubFont ) cf2_getSubfont( CFF_Decoder* decoder ); + FT_LOCAL( CFF_VStore ) + cf2_getVStore( CFF_Decoder* decoder ); + + FT_LOCAL( FT_UInt ) + cf2_getMaxstack( CFF_Decoder* decoder ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cf2_getNormalizedVector( CFF_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ); +#endif FT_LOCAL( CF2_Fixed ) cf2_getPpemY( CFF_Decoder* decoder ); diff --git a/thirdparty/freetype/src/cff/cf2hints.c b/thirdparty/freetype/src/cff/cf2hints.c index bbbe8e3c32..c8f7dfeba6 100644 --- a/thirdparty/freetype/src/cff/cf2hints.c +++ b/thirdparty/freetype/src/cff/cf2hints.c @@ -401,10 +401,10 @@ /* calculate all four possibilities; moves down are negative */ CF2_Fixed downMoveDown = 0 - fracDown; CF2_Fixed upMoveDown = 0 - fracUp; - CF2_Fixed downMoveUp = fracDown == 0 + CF2_Fixed downMoveUp = ( fracDown == 0 ) ? 0 : cf2_intToFixed( 1 ) - fracDown; - CF2_Fixed upMoveUp = fracUp == 0 + CF2_Fixed upMoveUp = ( fracUp == 0 ) ? 0 : cf2_intToFixed( 1 ) - fracUp; diff --git a/thirdparty/freetype/src/cff/cf2intrp.c b/thirdparty/freetype/src/cff/cf2intrp.c index 7d663dd0ec..40bd9059a1 100644 --- a/thirdparty/freetype/src/cff/cf2intrp.c +++ b/thirdparty/freetype/src/cff/cf2intrp.c @@ -47,6 +47,8 @@ #include "cf2error.h" +#include "cffload.h" + /*************************************************************************/ /* */ @@ -58,12 +60,6 @@ #define FT_COMPONENT trace_cf2interp - /* some operators are not implemented yet */ -#define CF2_FIXME FT_TRACE4(( "cf2_interpT2CharString:" \ - " operator not implemented yet\n" )) - - - FT_LOCAL_DEF( void ) cf2_hintmask_init( CF2_HintMask hintmask, FT_Error* error ) @@ -215,8 +211,8 @@ cf2_cmdESC, /* 12 */ cf2_cmdRESERVED_13, /* 13 */ cf2_cmdENDCHAR, /* 14 */ - cf2_cmdRESERVED_15, /* 15 */ - cf2_cmdRESERVED_16, /* 16 */ + cf2_cmdVSINDEX, /* 15 */ + cf2_cmdBLEND, /* 16 */ cf2_cmdRESERVED_17, /* 17 */ cf2_cmdHSTEMHM, /* 18 */ cf2_cmdHINTMASK, /* 19 */ @@ -273,7 +269,8 @@ cf2_escHFLEX, /* 34 */ cf2_escFLEX, /* 35 */ cf2_escHFLEX1, /* 36 */ - cf2_escFLEX1 /* 37 */ + cf2_escFLEX1, /* 37 */ + cf2_escRESERVED_38 /* 38 & all higher */ }; @@ -336,22 +333,22 @@ FT_Bool doConditionalLastRead ) { CF2_Fixed vals[14]; - CF2_UInt index; + CF2_UInt idx; FT_Bool isHFlex; CF2_Int top, i, j; vals[0] = *curX; vals[1] = *curY; - index = 0; - isHFlex = readFromStack[9] == FALSE; + idx = 0; + isHFlex = FT_BOOL( readFromStack[9] == FALSE ); top = isHFlex ? 9 : 10; for ( i = 0; i < top; i++ ) { vals[i + 2] = vals[i]; if ( readFromStack[i] ) - vals[i + 2] += cf2_stack_getReal( opStack, index++ ); + vals[i + 2] += cf2_stack_getReal( opStack, idx++ ); } if ( isHFlex ) @@ -361,7 +358,7 @@ { FT_Bool lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) > cf2_fixedAbs( vals[11] - *curY ) ); - CF2_Fixed lastVal = cf2_stack_getReal( opStack, index ); + CF2_Fixed lastVal = cf2_stack_getReal( opStack, idx ); if ( lastIsX ) @@ -378,12 +375,12 @@ else { if ( readFromStack[10] ) - vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ ); + vals[12] = vals[10] + cf2_stack_getReal( opStack, idx++ ); else vals[12] = *curX; if ( readFromStack[11] ) - vals[13] = vals[11] + cf2_stack_getReal( opStack, index ); + vals[13] = vals[11] + cf2_stack_getReal( opStack, idx ); else vals[13] = *curY; } @@ -403,6 +400,43 @@ } + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + static void + cf2_doBlend( const CFF_Blend blend, + CF2_Stack opStack, + CF2_UInt numBlends ) + { + CF2_UInt delta; + CF2_UInt base; + CF2_UInt i, j; + CF2_UInt numOperands = (CF2_UInt)( numBlends * blend->lenBV ); + + + base = cf2_stack_count( opStack ) - numOperands; + delta = base + numBlends; + + for ( i = 0; i < numBlends; i++ ) + { + const CF2_Fixed* weight = &blend->BV[1]; + + /* start with first term */ + CF2_Fixed sum = cf2_stack_getReal( opStack, i + base ); + + + for ( j = 1; j < blend->lenBV; j++ ) + sum += FT_MulFix( *weight++, cf2_stack_getReal( opStack, delta++ ) ); + + /* store blended result */ + cf2_stack_setReal( opStack, i + base, sum ); + } + + /* leave only `numBlends' results on stack */ + cf2_stack_pop( opStack, numOperands - numBlends ); + } + + /* * `error' is a shared error code used by many objects in this * routine. Before the code continues from an error, it must check and @@ -445,6 +479,7 @@ CF2_Fixed hintOriginY = curY; CF2_Stack opStack = NULL; + FT_UInt stackSize; FT_Byte op1; /* first opcode byte */ CF2_F16Dot16 storage[CF2_STORAGE_SIZE]; /* for `put' and `get' */ @@ -469,6 +504,8 @@ CF2_GlyphPathRec glyphPath; + FT_ZERO( &storage ); + /* initialize the remaining objects */ cf2_arrstack_init( &subrStack, memory, @@ -518,19 +555,24 @@ * If one of the above operators occurs without explicitly specifying * a width, we assume the default width. * + * CFF2 charstrings always return the default width (0). + * */ - haveWidth = FALSE; + haveWidth = font->isCFF2 ? TRUE : FALSE; *width = cf2_getDefaultWidthX( decoder ); /* - * Note: at this point, all pointers to resources must be NULL - * and all local objects must be initialized. - * There must be no branches to exit: above this point. + * Note: At this point, all pointers to resources must be NULL + * and all local objects must be initialized. + * There must be no branches to `exit:' above this point. * */ /* allocate an operand stack */ - opStack = cf2_stack_init( memory, error ); + stackSize = font->isCFF2 ? cf2_getMaxstack( decoder ) + : CF2_OPERAND_STACK_SIZE; + opStack = cf2_stack_init( memory, error, stackSize ); + if ( !opStack ) { lastError = FT_THROW( Out_Of_Memory ); @@ -559,14 +601,23 @@ { /* If we've reached the end of the charstring, simulate a */ /* cf2_cmdRETURN or cf2_cmdENDCHAR. */ + /* We do this for both CFF and CFF2. */ if ( charstringIndex ) op1 = cf2_cmdRETURN; /* end of buffer for subroutine */ else op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */ } else + { op1 = (FT_Byte)cf2_buf_readByte( charstring ); + /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */ + /* Note: Trace message will report 0 instead of 11 or 14. */ + if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) && + font->isCFF2 ) + op1 = cf2_cmdRESERVED_0; + } + /* check for errors once per loop */ if ( *error ) goto exit; @@ -584,13 +635,78 @@ case cf2_cmdRESERVED_2: case cf2_cmdRESERVED_9: case cf2_cmdRESERVED_13: - case cf2_cmdRESERVED_15: - case cf2_cmdRESERVED_16: case cf2_cmdRESERVED_17: /* we may get here if we have a prior error */ FT_TRACE4(( " unknown op (%d)\n", op1 )); break; + case cf2_cmdVSINDEX: + FT_TRACE4(( " vsindex\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + if ( font->blend.usedBV ) + { + /* vsindex not allowed after blend */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + { + FT_Int temp = cf2_stack_popInt( opStack ); + + + if ( temp >= 0 ) + font->vsindex = (FT_UInt)temp; + } + break; + + case cf2_cmdBLEND: + { + FT_UInt numBlends; + + + FT_TRACE4(( " blend\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + /* do we have a `blend' op in a non-variant font? */ + if ( !font->blend.font ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* check cached blend vector */ + if ( cff_blend_check_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ) ) + { + lastError = cff_blend_build_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ); + if ( lastError ) + goto exit; + } + + /* do the blend */ + numBlends = (FT_UInt)cf2_stack_popInt( opStack ); + if ( numBlends > stackSize ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + cf2_doBlend( &font->blend, opStack, numBlends ); + + font->blend.usedBV = TRUE; + } + continue; /* do not clear the stack */ + case cf2_cmdHSTEMHM: case cf2_cmdHSTEM: FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" )); @@ -659,16 +775,16 @@ case cf2_cmdRLINETO: { - CF2_UInt index; + CF2_UInt idx; CF2_UInt count = cf2_stack_count( opStack ); FT_TRACE4(( " rlineto\n" )); - for ( index = 0; index < count; index += 2 ) + for ( idx = 0; idx < count; idx += 2 ) { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); + curX += cf2_stack_getReal( opStack, idx + 0 ); + curY += cf2_stack_getReal( opStack, idx + 1 ); cf2_glyphpath_lineTo( &glyphPath, curX, curY ); } @@ -680,17 +796,17 @@ case cf2_cmdHLINETO: case cf2_cmdVLINETO: { - CF2_UInt index; + CF2_UInt idx; CF2_UInt count = cf2_stack_count( opStack ); - FT_Bool isX = op1 == cf2_cmdHLINETO; + FT_Bool isX = FT_BOOL( op1 == cf2_cmdHLINETO ); FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" )); - for ( index = 0; index < count; index++ ) + for ( idx = 0; idx < count; idx++ ) { - CF2_Fixed v = cf2_stack_getReal( opStack, index ); + CF2_Fixed v = cf2_stack_getReal( opStack, idx ); if ( isX ) @@ -711,33 +827,33 @@ case cf2_cmdRRCURVETO: { CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; + CF2_UInt idx = 0; FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n" : " rrcurveto\n" )); - while ( index + 6 <= count ) + while ( idx + 6 <= count ) { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; + CF2_Fixed x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX; + CF2_Fixed y1 = cf2_stack_getReal( opStack, idx + 1 ) + curY; + CF2_Fixed x2 = cf2_stack_getReal( opStack, idx + 2 ) + x1; + CF2_Fixed y2 = cf2_stack_getReal( opStack, idx + 3 ) + y1; + CF2_Fixed x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2; + CF2_Fixed y3 = cf2_stack_getReal( opStack, idx + 5 ) + y2; cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - curX = x3; - curY = y3; - index += 6; + curX = x3; + curY = y3; + idx += 6; } if ( op1 == cf2_cmdRCURVELINE ) { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); + curX += cf2_stack_getReal( opStack, idx + 0 ); + curY += cf2_stack_getReal( opStack, idx + 1 ); cf2_glyphpath_lineTo( &glyphPath, curX, curY ); } @@ -828,440 +944,469 @@ FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring ); + /* first switch for 2-byte operators handles CFF2 */ + /* and opcodes that are reserved for both CFF and CFF2 */ switch ( op2 ) { - case cf2_escDOTSECTION: - /* something about `flip type of locking' -- ignore it */ - FT_TRACE4(( " dotsection\n" )); + case cf2_escHFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, FALSE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, FALSE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; - break; - case cf2_escAND: - { - CF2_F16Dot16 arg1; - CF2_F16Dot16 arg2; + FT_TRACE4(( " hflex\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + continue; + case cf2_escFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, TRUE /* dy6 */ + }; - FT_TRACE4(( " and\n" )); - arg2 = cf2_stack_popFixed( opStack ); - arg1 = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " flex\n" )); - cf2_stack_pushInt( opStack, arg1 && arg2 ); + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); } - continue; /* do not clear the stack */ + break; /* TODO: why is this not a continue? */ - case cf2_escOR: + case cf2_escHFLEX1: { - CF2_F16Dot16 arg1; - CF2_F16Dot16 arg2; - + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; - FT_TRACE4(( " or\n" )); - arg2 = cf2_stack_popFixed( opStack ); - arg1 = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " hflex1\n" )); - cf2_stack_pushInt( opStack, arg1 || arg2 ); + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); } - continue; /* do not clear the stack */ + continue; - case cf2_escNOT: + case cf2_escFLEX1: { - CF2_F16Dot16 arg; - + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + FALSE /* dx6 */, FALSE /* dy6 */ + }; - FT_TRACE4(( " not\n" )); - arg = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " flex1\n" )); - cf2_stack_pushInt( opStack, !arg ); + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + TRUE /* doConditionalLastRead */ ); } - continue; /* do not clear the stack */ + continue; + + /* these opcodes are reserved in both CFF & CFF2 */ + case cf2_escRESERVED_1: + case cf2_escRESERVED_2: + case cf2_escRESERVED_6: + case cf2_escRESERVED_7: + case cf2_escRESERVED_8: + case cf2_escRESERVED_13: + case cf2_escRESERVED_16: + case cf2_escRESERVED_17: + case cf2_escRESERVED_19: + case cf2_escRESERVED_25: + case cf2_escRESERVED_31: + case cf2_escRESERVED_32: + case cf2_escRESERVED_33: + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + break; - case cf2_escABS: + default: { - CF2_F16Dot16 arg; + if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + /* second switch for 2-byte operators handles just CFF */ + switch ( op2 ) + { + case cf2_escDOTSECTION: + /* something about `flip type of locking' -- ignore it */ + FT_TRACE4(( " dotsection\n" )); - FT_TRACE4(( " abs\n" )); + break; - arg = cf2_stack_popFixed( opStack ); + case cf2_escAND: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; - cf2_stack_pushFixed( opStack, FT_ABS( arg ) ); - } - continue; /* do not clear the stack */ - case cf2_escADD: - { - CF2_F16Dot16 summand1; - CF2_F16Dot16 summand2; + FT_TRACE4(( " and\n" )); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); - FT_TRACE4(( " add\n" )); + cf2_stack_pushInt( opStack, arg1 && arg2 ); + } + continue; /* do not clear the stack */ - summand2 = cf2_stack_popFixed( opStack ); - summand1 = cf2_stack_popFixed( opStack ); + case cf2_escOR: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; - cf2_stack_pushFixed( opStack, summand1 + summand2 ); - } - continue; /* do not clear the stack */ - case cf2_escSUB: - { - CF2_F16Dot16 minuend; - CF2_F16Dot16 subtrahend; + FT_TRACE4(( " or\n" )); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); - FT_TRACE4(( " sub\n" )); + cf2_stack_pushInt( opStack, arg1 || arg2 ); + } + continue; /* do not clear the stack */ - subtrahend = cf2_stack_popFixed( opStack ); - minuend = cf2_stack_popFixed( opStack ); + case cf2_escNOT: + { + CF2_F16Dot16 arg; - cf2_stack_pushFixed( opStack, minuend - subtrahend ); - } - continue; /* do not clear the stack */ - case cf2_escDIV: - { - CF2_F16Dot16 dividend; - CF2_F16Dot16 divisor; + FT_TRACE4(( " not\n" )); + arg = cf2_stack_popFixed( opStack ); - FT_TRACE4(( " div\n" )); + cf2_stack_pushInt( opStack, !arg ); + } + continue; /* do not clear the stack */ - divisor = cf2_stack_popFixed( opStack ); - dividend = cf2_stack_popFixed( opStack ); + case cf2_escABS: + { + CF2_F16Dot16 arg; - cf2_stack_pushFixed( opStack, FT_DivFix( dividend, divisor ) ); - } - continue; /* do not clear the stack */ - case cf2_escNEG: - { - CF2_F16Dot16 arg; + FT_TRACE4(( " abs\n" )); + arg = cf2_stack_popFixed( opStack ); - FT_TRACE4(( " neg\n" )); + cf2_stack_pushFixed( opStack, FT_ABS( arg ) ); + } + continue; /* do not clear the stack */ - arg = cf2_stack_popFixed( opStack ); + case cf2_escADD: + { + CF2_F16Dot16 summand1; + CF2_F16Dot16 summand2; - cf2_stack_pushFixed( opStack, -arg ); - } - continue; /* do not clear the stack */ - case cf2_escEQ: - { - CF2_F16Dot16 arg1; - CF2_F16Dot16 arg2; + FT_TRACE4(( " add\n" )); + summand2 = cf2_stack_popFixed( opStack ); + summand1 = cf2_stack_popFixed( opStack ); - FT_TRACE4(( " eq\n" )); + cf2_stack_pushFixed( opStack, summand1 + summand2 ); + } + continue; /* do not clear the stack */ - arg2 = cf2_stack_popFixed( opStack ); - arg1 = cf2_stack_popFixed( opStack ); + case cf2_escSUB: + { + CF2_F16Dot16 minuend; + CF2_F16Dot16 subtrahend; - cf2_stack_pushInt( opStack, arg1 == arg2 ); - } - continue; /* do not clear the stack */ - case cf2_escDROP: - FT_TRACE4(( " drop\n" )); + FT_TRACE4(( " sub\n" )); - (void)cf2_stack_popFixed( opStack ); - continue; /* do not clear the stack */ + subtrahend = cf2_stack_popFixed( opStack ); + minuend = cf2_stack_popFixed( opStack ); - case cf2_escPUT: - { - CF2_F16Dot16 val; - CF2_Int idx; + cf2_stack_pushFixed( opStack, minuend - subtrahend ); + } + continue; /* do not clear the stack */ + case cf2_escDIV: + { + CF2_F16Dot16 dividend; + CF2_F16Dot16 divisor; - FT_TRACE4(( " put\n" )); - idx = cf2_stack_popInt( opStack ); - val = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " div\n" )); - if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) - storage[idx] = val; - } - continue; /* do not clear the stack */ + divisor = cf2_stack_popFixed( opStack ); + dividend = cf2_stack_popFixed( opStack ); - case cf2_escGET: - { - CF2_Int idx; + cf2_stack_pushFixed( opStack, FT_DivFix( dividend, divisor ) ); + } + continue; /* do not clear the stack */ + case cf2_escNEG: + { + CF2_F16Dot16 arg; - FT_TRACE4(( " get\n" )); - idx = cf2_stack_popInt( opStack ); + FT_TRACE4(( " neg\n" )); - if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) - cf2_stack_pushFixed( opStack, storage[idx] ); - } - continue; /* do not clear the stack */ + arg = cf2_stack_popFixed( opStack ); - case cf2_escIFELSE: - { - CF2_F16Dot16 arg1; - CF2_F16Dot16 arg2; - CF2_F16Dot16 cond1; - CF2_F16Dot16 cond2; + cf2_stack_pushFixed( opStack, -arg ); + } + continue; /* do not clear the stack */ + case cf2_escEQ: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; - FT_TRACE4(( " ifelse\n" )); - cond2 = cf2_stack_popFixed( opStack ); - cond1 = cf2_stack_popFixed( opStack ); - arg2 = cf2_stack_popFixed( opStack ); - arg1 = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " eq\n" )); - cf2_stack_pushFixed( opStack, cond1 <= cond2 ? arg1 : arg2 ); - } - continue; /* do not clear the stack */ + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); - case cf2_escRANDOM: /* in spec */ - FT_TRACE4(( " random\n" )); + cf2_stack_pushInt( opStack, arg1 == arg2 ); + } + continue; /* do not clear the stack */ - CF2_FIXME; - break; + case cf2_escDROP: + FT_TRACE4(( " drop\n" )); - case cf2_escMUL: - { - CF2_F16Dot16 factor1; - CF2_F16Dot16 factor2; + (void)cf2_stack_popFixed( opStack ); + continue; /* do not clear the stack */ + case cf2_escPUT: + { + CF2_F16Dot16 val; + CF2_Int idx; - FT_TRACE4(( " mul\n" )); - factor2 = cf2_stack_popFixed( opStack ); - factor1 = cf2_stack_popFixed( opStack ); + FT_TRACE4(( " put\n" )); - cf2_stack_pushFixed( opStack, FT_MulFix( factor1, factor2 ) ); - } - continue; /* do not clear the stack */ + idx = cf2_stack_popInt( opStack ); + val = cf2_stack_popFixed( opStack ); - case cf2_escSQRT: - { - CF2_F16Dot16 arg; + if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) + storage[idx] = val; + } + continue; /* do not clear the stack */ + case cf2_escGET: + { + CF2_Int idx; - FT_TRACE4(( " sqrt\n" )); - arg = cf2_stack_popFixed( opStack ); - if ( arg > 0 ) - { - FT_Fixed root = arg; - FT_Fixed new_root; + FT_TRACE4(( " get\n" )); + idx = cf2_stack_popInt( opStack ); - /* Babylonian method */ - for (;;) - { - new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1; - if ( new_root == root ) - break; - root = new_root; - } - arg = new_root; - } - else - arg = 0; + if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) + cf2_stack_pushFixed( opStack, storage[idx] ); + } + continue; /* do not clear the stack */ - cf2_stack_pushFixed( opStack, arg ); - } - continue; /* do not clear the stack */ + case cf2_escIFELSE: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + CF2_F16Dot16 cond1; + CF2_F16Dot16 cond2; - case cf2_escDUP: - { - CF2_F16Dot16 arg; + FT_TRACE4(( " ifelse\n" )); - FT_TRACE4(( " dup\n" )); + cond2 = cf2_stack_popFixed( opStack ); + cond1 = cf2_stack_popFixed( opStack ); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); - arg = cf2_stack_popFixed( opStack ); + cf2_stack_pushFixed( opStack, cond1 <= cond2 ? arg1 : arg2 ); + } + continue; /* do not clear the stack */ - cf2_stack_pushFixed( opStack, arg ); - cf2_stack_pushFixed( opStack, arg ); - } - continue; /* do not clear the stack */ + case cf2_escRANDOM: /* in spec */ + { + CF2_F16Dot16 r; - case cf2_escEXCH: - { - CF2_F16Dot16 arg1; - CF2_F16Dot16 arg2; + FT_TRACE4(( " random\n" )); - FT_TRACE4(( " exch\n" )); + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + r = (CF2_F16Dot16) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); - arg2 = cf2_stack_popFixed( opStack ); - arg1 = cf2_stack_popFixed( opStack ); + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); - cf2_stack_pushFixed( opStack, arg2 ); - cf2_stack_pushFixed( opStack, arg1 ); - } - continue; /* do not clear the stack */ + cf2_stack_pushFixed( opStack, r ); + } + continue; /* do not clear the stack */ - case cf2_escINDEX: - { - CF2_Int idx; - CF2_UInt size; + case cf2_escMUL: + { + CF2_F16Dot16 factor1; + CF2_F16Dot16 factor2; - FT_TRACE4(( " index\n" )); + FT_TRACE4(( " mul\n" )); - idx = cf2_stack_popInt( opStack ); - size = cf2_stack_count( opStack ); + factor2 = cf2_stack_popFixed( opStack ); + factor1 = cf2_stack_popFixed( opStack ); - if ( size > 0 ) - { - /* for `cf2_stack_getReal', index 0 is bottom of stack */ - CF2_UInt gr_idx; + cf2_stack_pushFixed( opStack, FT_MulFix( factor1, factor2 ) ); + } + continue; /* do not clear the stack */ + case cf2_escSQRT: + { + CF2_F16Dot16 arg; - if ( idx < 0 ) - gr_idx = size - 1; - else if ( (CF2_UInt)idx >= size ) - gr_idx = 0; - else - gr_idx = size - 1 - (CF2_UInt)idx; - cf2_stack_pushFixed( opStack, - cf2_stack_getReal( opStack, gr_idx ) ); - } - } - continue; /* do not clear the stack */ + FT_TRACE4(( " sqrt\n" )); - case cf2_escROLL: - { - CF2_Int idx; - CF2_Int count; + arg = cf2_stack_popFixed( opStack ); + if ( arg > 0 ) + { + FT_Fixed root = arg; + FT_Fixed new_root; - FT_TRACE4(( " roll\n" )); + /* Babylonian method */ + for (;;) + { + new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1; + if ( new_root == root ) + break; + root = new_root; + } + arg = new_root; + } + else + arg = 0; - idx = cf2_stack_popInt( opStack ); - count = cf2_stack_popInt( opStack ); + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ - cf2_stack_roll( opStack, count, idx ); - } - continue; /* do not clear the stack */ + case cf2_escDUP: + { + CF2_F16Dot16 arg; - case cf2_escHFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, FALSE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, FALSE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; + FT_TRACE4(( " dup\n" )); - FT_TRACE4(( " hflex\n" )); + arg = cf2_stack_popFixed( opStack ); - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; + cf2_stack_pushFixed( opStack, arg ); + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ - case cf2_escFLEX: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, TRUE /* dy6 */ - }; + case cf2_escEXCH: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; - FT_TRACE4(( " flex\n" )); + FT_TRACE4(( " exch\n" )); - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - break; /* TODO: why is this not a continue? */ + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); - case cf2_escHFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, FALSE /* dy3 */, - TRUE /* dx4 */, FALSE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - TRUE /* dx6 */, FALSE /* dy6 */ - }; + cf2_stack_pushFixed( opStack, arg2 ); + cf2_stack_pushFixed( opStack, arg1 ); + } + continue; /* do not clear the stack */ + case cf2_escINDEX: + { + CF2_Int idx; + CF2_UInt size; - FT_TRACE4(( " hflex1\n" )); - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - FALSE /* doConditionalLastRead */ ); - } - continue; + FT_TRACE4(( " index\n" )); - case cf2_escFLEX1: - { - static const FT_Bool readFromStack[12] = - { - TRUE /* dx1 */, TRUE /* dy1 */, - TRUE /* dx2 */, TRUE /* dy2 */, - TRUE /* dx3 */, TRUE /* dy3 */, - TRUE /* dx4 */, TRUE /* dy4 */, - TRUE /* dx5 */, TRUE /* dy5 */, - FALSE /* dx6 */, FALSE /* dy6 */ - }; + idx = cf2_stack_popInt( opStack ); + size = cf2_stack_count( opStack ); + if ( size > 0 ) + { + /* for `cf2_stack_getReal', index 0 is bottom of stack */ + CF2_UInt gr_idx; - FT_TRACE4(( " flex1\n" )); - cf2_doFlex( opStack, - &curX, - &curY, - &glyphPath, - readFromStack, - TRUE /* doConditionalLastRead */ ); - } - continue; + if ( idx < 0 ) + gr_idx = size - 1; + else if ( (CF2_UInt)idx >= size ) + gr_idx = 0; + else + gr_idx = size - 1 - (CF2_UInt)idx; - case cf2_escRESERVED_1: - case cf2_escRESERVED_2: - case cf2_escRESERVED_6: - case cf2_escRESERVED_7: - case cf2_escRESERVED_8: - case cf2_escRESERVED_13: - case cf2_escRESERVED_16: - case cf2_escRESERVED_17: - case cf2_escRESERVED_19: - case cf2_escRESERVED_25: - case cf2_escRESERVED_31: - case cf2_escRESERVED_32: - case cf2_escRESERVED_33: - default: - FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + cf2_stack_pushFixed( opStack, + cf2_stack_getReal( opStack, gr_idx ) ); + } + } + continue; /* do not clear the stack */ - }; /* end of switch statement checking `op2' */ + case cf2_escROLL: + { + CF2_Int idx; + CF2_Int count; + + FT_TRACE4(( " roll\n" )); + + idx = cf2_stack_popInt( opStack ); + count = cf2_stack_popInt( opStack ); + + cf2_stack_roll( opStack, count, idx ); + } + continue; /* do not clear the stack */ + + } /* end of 2nd switch checking op2 */ + } + } + } /* end of 1st switch checking op2 */ } /* case cf2_cmdESC */ + break; case cf2_cmdENDCHAR: @@ -1283,7 +1428,8 @@ /* close path if still open */ cf2_glyphpath_closeOpenPath( &glyphPath ); - if ( cf2_stack_count( opStack ) > 1 ) + /* disable seac for CFF2 (charstring ending with args on stack) */ + if ( !font->isCFF2 && cf2_stack_count( opStack ) > 1 ) { /* must be either 4 or 5 -- */ /* this is a (deprecated) implied `seac' operator */ @@ -1454,35 +1600,35 @@ case cf2_cmdRLINECURVE: { CF2_UInt count = cf2_stack_count( opStack ); - CF2_UInt index = 0; + CF2_UInt idx = 0; FT_TRACE4(( " rlinecurve\n" )); - while ( index + 6 < count ) + while ( idx + 6 < count ) { - curX += cf2_stack_getReal( opStack, index + 0 ); - curY += cf2_stack_getReal( opStack, index + 1 ); + curX += cf2_stack_getReal( opStack, idx + 0 ); + curY += cf2_stack_getReal( opStack, idx + 1 ); cf2_glyphpath_lineTo( &glyphPath, curX, curY ); - index += 2; + idx += 2; } - while ( index < count ) + while ( idx < count ) { - CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY; - CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1; - CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1; - CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; - CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2; + CF2_Fixed x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX; + CF2_Fixed y1 = cf2_stack_getReal( opStack, idx + 1 ) + curY; + CF2_Fixed x2 = cf2_stack_getReal( opStack, idx + 2 ) + x1; + CF2_Fixed y2 = cf2_stack_getReal( opStack, idx + 3 ) + y1; + CF2_Fixed x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2; + CF2_Fixed y3 = cf2_stack_getReal( opStack, idx + 5 ) + y2; cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - curX = x3; - curY = y3; - index += 6; + curX = x3; + curY = y3; + idx += 6; } cf2_stack_clear( opStack ); @@ -1492,42 +1638,42 @@ case cf2_cmdVVCURVETO: { CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; + CF2_UInt idx = 0; /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ /* we enforce it by clearing the second bit */ /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; + count = count1 & ~2U; + idx += count1 - count; FT_TRACE4(( " vvcurveto\n" )); - while ( index < count ) + while ( idx < count ) { CF2_Fixed x1, y1, x2, y2, x3, y3; - if ( ( count - index ) & 1 ) + if ( ( count - idx ) & 1 ) { - x1 = cf2_stack_getReal( opStack, index ) + curX; + x1 = cf2_stack_getReal( opStack, idx ) + curX; - ++index; + idx++; } else x1 = curX; - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; + y1 = cf2_stack_getReal( opStack, idx + 0 ) + curY; + x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1; + y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1; x3 = x2; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; + y3 = cf2_stack_getReal( opStack, idx + 3 ) + y2; cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - curX = x3; - curY = y3; - index += 4; + curX = x3; + curY = y3; + idx += 4; } cf2_stack_clear( opStack ); @@ -1537,42 +1683,42 @@ case cf2_cmdHHCURVETO: { CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; + CF2_UInt idx = 0; /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ /* we enforce it by clearing the second bit */ /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; + count = count1 & ~2U; + idx += count1 - count; FT_TRACE4(( " hhcurveto\n" )); - while ( index < count ) + while ( idx < count ) { CF2_Fixed x1, y1, x2, y2, x3, y3; - if ( ( count - index ) & 1 ) + if ( ( count - idx ) & 1 ) { - y1 = cf2_stack_getReal( opStack, index ) + curY; + y1 = cf2_stack_getReal( opStack, idx ) + curY; - ++index; + idx++; } else y1 = curY; - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; + x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX; + x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1; + y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1; + x3 = cf2_stack_getReal( opStack, idx + 3 ) + x2; y3 = y2; cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - curX = x3; - curY = y3; - index += 4; + curX = x3; + curY = y3; + idx += 4; } cf2_stack_clear( opStack ); @@ -1583,38 +1729,38 @@ case cf2_cmdHVCURVETO: { CF2_UInt count, count1 = cf2_stack_count( opStack ); - CF2_UInt index = 0; + CF2_UInt idx = 0; - FT_Bool alternate = op1 == cf2_cmdHVCURVETO; + FT_Bool alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO ); /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ /* 8n+4, or 8n+5, we enforce it by clearing the */ /* second bit */ /* (and sorting the stack indexing to suit) */ - count = count1 & ~2U; - index += count1 - count; + count = count1 & ~2U; + idx += count1 - count; FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" )); - while ( index < count ) + while ( idx < count ) { CF2_Fixed x1, x2, x3, y1, y2, y3; if ( alternate ) { - x1 = cf2_stack_getReal( opStack, index + 0 ) + curX; + x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX; y1 = curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - y3 = cf2_stack_getReal( opStack, index + 3 ) + y2; + x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1; + y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1; + y3 = cf2_stack_getReal( opStack, idx + 3 ) + y2; - if ( count - index == 5 ) + if ( count - idx == 5 ) { - x3 = cf2_stack_getReal( opStack, index + 4 ) + x2; + x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2; - ++index; + idx++; } else x3 = x2; @@ -1624,16 +1770,16 @@ else { x1 = curX; - y1 = cf2_stack_getReal( opStack, index + 0 ) + curY; - x2 = cf2_stack_getReal( opStack, index + 1 ) + x1; - y2 = cf2_stack_getReal( opStack, index + 2 ) + y1; - x3 = cf2_stack_getReal( opStack, index + 3 ) + x2; + y1 = cf2_stack_getReal( opStack, idx + 0 ) + curY; + x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1; + y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1; + x3 = cf2_stack_getReal( opStack, idx + 3 ) + x2; - if ( count - index == 5 ) + if ( count - idx == 5 ) { - y3 = cf2_stack_getReal( opStack, index + 4 ) + y2; + y3 = cf2_stack_getReal( opStack, idx + 4 ) + y2; - ++index; + idx++; } else y3 = y2; @@ -1643,9 +1789,9 @@ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); - curX = x3; - curY = y3; - index += 4; + curX = x3; + curY = y3; + idx += 4; } cf2_stack_clear( opStack ); @@ -1734,7 +1880,7 @@ ( byte3 << 8 ) | byte4 ); - FT_TRACE4(( " %.2f", v / 65536.0 )); + FT_TRACE4(( " %.5f", v / 65536.0 )); cf2_stack_pushFixed( opStack, v ); } @@ -1755,6 +1901,9 @@ /* check whether last error seen is also the first one */ cf2_setError( error, lastError ); + if ( *error ) + FT_TRACE4(( "charstring error %d\n", *error )); + /* free resources from objects we've used */ cf2_glyphpath_finalize( &glyphPath ); cf2_arrstack_finalize( &vStemHintArray ); diff --git a/thirdparty/freetype/src/cff/cf2stack.c b/thirdparty/freetype/src/cff/cf2stack.c index 6fafd901f3..12a026d21d 100644 --- a/thirdparty/freetype/src/cff/cf2stack.c +++ b/thirdparty/freetype/src/cff/cf2stack.c @@ -51,21 +51,31 @@ /* `error'). */ FT_LOCAL_DEF( CF2_Stack ) cf2_stack_init( FT_Memory memory, - FT_Error* e ) + FT_Error* e, + FT_UInt stackSize ) { - FT_Error error = FT_Err_Ok; /* for FT_QNEW */ + FT_Error error = FT_Err_Ok; /* for FT_NEW */ CF2_Stack stack = NULL; - if ( !FT_QNEW( stack ) ) + if ( !FT_NEW( stack ) ) { - /* initialize the structure; FT_QNEW zeroes it */ + /* initialize the structure; FT_NEW zeroes it */ stack->memory = memory; stack->error = e; - stack->top = &stack->buffer[0]; /* empty stack */ } + /* allocate the stack buffer */ + if ( FT_NEW_ARRAY( stack->buffer, stackSize ) ) + { + FT_FREE( stack ); + return NULL; + } + + stack->stackSize = stackSize; + stack->top = stack->buffer; /* empty stack */ + return stack; } @@ -77,6 +87,8 @@ { FT_Memory memory = stack->memory; + /* free the buffer */ + FT_FREE( stack->buffer ); /* free the main structure */ FT_FREE( stack ); @@ -87,7 +99,7 @@ FT_LOCAL_DEF( CF2_UInt ) cf2_stack_count( CF2_Stack stack ) { - return (CF2_UInt)( stack->top - &stack->buffer[0] ); + return (CF2_UInt)( stack->top - stack->buffer ); } @@ -95,7 +107,7 @@ cf2_stack_pushInt( CF2_Stack stack, CF2_Int val ) { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) + if ( stack->top == stack->buffer + stack->stackSize ) { CF2_SET_ERROR( stack->error, Stack_Overflow ); return; /* stack overflow */ @@ -103,7 +115,7 @@ stack->top->u.i = val; stack->top->type = CF2_NumberInt; - ++stack->top; + stack->top++; } @@ -111,7 +123,7 @@ cf2_stack_pushFixed( CF2_Stack stack, CF2_Fixed val ) { - if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] ) + if ( stack->top == stack->buffer + stack->stackSize ) { CF2_SET_ERROR( stack->error, Stack_Overflow ); return; /* stack overflow */ @@ -119,7 +131,7 @@ stack->top->u.r = val; stack->top->type = CF2_NumberFixed; - ++stack->top; + stack->top++; } @@ -127,7 +139,7 @@ FT_LOCAL_DEF( CF2_Int ) cf2_stack_popInt( CF2_Stack stack ) { - if ( stack->top == &stack->buffer[0] ) + if ( stack->top == stack->buffer ) { CF2_SET_ERROR( stack->error, Stack_Underflow ); return 0; /* underflow */ @@ -138,7 +150,7 @@ return 0; /* type mismatch */ } - --stack->top; + stack->top--; return stack->top->u.i; } @@ -149,13 +161,13 @@ FT_LOCAL_DEF( CF2_Fixed ) cf2_stack_popFixed( CF2_Stack stack ) { - if ( stack->top == &stack->buffer[0] ) + if ( stack->top == stack->buffer ) { CF2_SET_ERROR( stack->error, Stack_Underflow ); return cf2_intToFixed( 0 ); /* underflow */ } - --stack->top; + stack->top--; switch ( stack->top->type ) { @@ -175,7 +187,7 @@ cf2_stack_getReal( CF2_Stack stack, CF2_UInt idx ) { - FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE ); + FT_ASSERT( cf2_stack_count( stack ) <= stack->stackSize ); if ( idx >= cf2_stack_count( stack ) ) { @@ -195,7 +207,38 @@ } - FT_LOCAL( void ) + /* provide random access to stack */ + FT_LOCAL_DEF( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ) + { + if ( idx > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; + } + + stack->buffer[idx].u.r = val; + stack->buffer[idx].type = CF2_NumberFixed; + } + + + /* discard (pop) num values from stack */ + FT_LOCAL_DEF( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ) + { + if ( num > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return; + } + stack->top -= num; + } + + + FT_LOCAL_DEF( void ) cf2_stack_roll( CF2_Stack stack, CF2_Int count, CF2_Int shift ) @@ -278,7 +321,7 @@ FT_LOCAL_DEF( void ) cf2_stack_clear( CF2_Stack stack ) { - stack->top = &stack->buffer[0]; + stack->top = stack->buffer; } diff --git a/thirdparty/freetype/src/cff/cf2stack.h b/thirdparty/freetype/src/cff/cf2stack.h index e740a7ac41..ef08eefe41 100644 --- a/thirdparty/freetype/src/cff/cf2stack.h +++ b/thirdparty/freetype/src/cff/cf2stack.h @@ -62,15 +62,17 @@ FT_BEGIN_HEADER { FT_Memory memory; FT_Error* error; - CF2_StackNumber buffer[CF2_OPERAND_STACK_SIZE]; + CF2_StackNumber* buffer; CF2_StackNumber* top; + FT_UInt stackSize; } CF2_StackRec, *CF2_Stack; FT_LOCAL( CF2_Stack ) cf2_stack_init( FT_Memory memory, - FT_Error* error ); + FT_Error* error, + FT_UInt stackSize ); FT_LOCAL( void ) cf2_stack_free( CF2_Stack stack ); @@ -92,6 +94,14 @@ FT_BEGIN_HEADER FT_LOCAL( CF2_Fixed ) cf2_stack_getReal( CF2_Stack stack, CF2_UInt idx ); + FT_LOCAL( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ); + + FT_LOCAL( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ); FT_LOCAL( void ) cf2_stack_roll( CF2_Stack stack, diff --git a/thirdparty/freetype/src/cff/cff.c b/thirdparty/freetype/src/cff/cff.c index 86ca1be040..397f6dfafe 100644 --- a/thirdparty/freetype/src/cff/cff.c +++ b/thirdparty/freetype/src/cff/cff.c @@ -4,7 +4,7 @@ /* */ /* FreeType OpenType driver component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,16 +17,15 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "cffpic.c" +#include "cffcmap.c" #include "cffdrivr.c" +#include "cffgload.c" #include "cffparse.c" +#include "cffpic.c" #include "cffload.c" #include "cffobjs.c" -#include "cffgload.c" -#include "cffcmap.c" #include "cf2arrst.c" #include "cf2blues.c" @@ -38,4 +37,5 @@ #include "cf2read.c" #include "cf2stack.c" + /* END */ diff --git a/thirdparty/freetype/src/cff/cffcmap.c b/thirdparty/freetype/src/cff/cffcmap.c index 3ef48328c5..4adce7a54d 100644 --- a/thirdparty/freetype/src/cff/cffcmap.c +++ b/thirdparty/freetype/src/cff/cffcmap.c @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -104,15 +104,21 @@ } - FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, + FT_DEFINE_CMAP_CLASS( + cff_cmap_encoding_class_rec, + sizeof ( CFF_CMapStdRec ), - (FT_CMap_InitFunc) cff_cmap_encoding_init, - (FT_CMap_DoneFunc) cff_cmap_encoding_done, - (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, - (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, + (FT_CMap_InitFunc) cff_cmap_encoding_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_encoding_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ ) @@ -202,15 +208,22 @@ } - FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, + FT_DEFINE_CMAP_CLASS( + cff_cmap_unicode_class_rec, + sizeof ( PS_UnicodesRec ), - (FT_CMap_InitFunc) cff_cmap_unicode_init, - (FT_CMap_DoneFunc) cff_cmap_unicode_done, - (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, + (FT_CMap_InitFunc) cff_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ ) + /* END */ diff --git a/thirdparty/freetype/src/cff/cffcmap.h b/thirdparty/freetype/src/cff/cffcmap.h index 23795d5090..7792e04248 100644 --- a/thirdparty/freetype/src/cff/cffcmap.h +++ b/thirdparty/freetype/src/cff/cffcmap.h @@ -4,7 +4,7 @@ /* */ /* CFF character mapping table (cmap) support (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cff/cffdrivr.c b/thirdparty/freetype/src/cff/cffdrivr.c index 950a9605c3..38bfc2ca3d 100644 --- a/thirdparty/freetype/src/cff/cffdrivr.c +++ b/thirdparty/freetype/src/cff/cffdrivr.c @@ -4,7 +4,7 @@ /* */ /* OpenType font driver implementation (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -32,6 +32,11 @@ #include "cffcmap.h" #include "cffparse.h" +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + #include "cfferrs.h" #include "cffpic.h" @@ -207,6 +212,13 @@ if ( flags & FT_LOAD_VERTICAL_LAYOUT ) { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( !ttface->is_default_instance && + !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + /* check whether we have data from the `vmtx' table at all; */ /* otherwise we extract the info from the CFF glyphstrings */ /* (instead of synthesizing a global value using the `OS/2' */ @@ -232,6 +244,13 @@ } else { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( !ttface->is_default_instance && + !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + /* check whether we have data from the `hmtx' table at all */ if ( !ttface->horizontal.number_Of_HMetrics ) goto Missing_Table; @@ -291,6 +310,35 @@ FT_Error error; + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( font->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->get_name ) + return service->get_name( FT_FACE( face ), + glyph_index, + buffer, + buffer_max ); + else + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from a CFF2 font\n" + " " + " without the `PSNames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + } + if ( !font->psnames ) { FT_ERROR(( "cff_get_glyph_name:" @@ -332,6 +380,31 @@ cff = (CFF_FontRec *)face->extra.data; charset = &cff->charset; + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( cff->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->name_index ) + return service->name_index( FT_FACE( face ), glyph_name ); + else + { + FT_ERROR(( "cff_get_name_index:" + " cannot get glyph index from a CFF2 font\n" + " " + " without the `PSNames' module\n" )); + return 0; + } + } + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); if ( !psnames ) return 0; @@ -358,6 +431,7 @@ FT_DEFINE_SERVICE_GLYPHDICTREC( cff_service_glyph_dict, + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, /* get_name */ (FT_GlyphDict_NameIndexFunc)cff_get_name_index /* name_index */ ) @@ -383,11 +457,11 @@ FT_Error error = FT_Err_Ok; - if ( cff && cff->font_info == NULL ) + if ( cff && !cff->font_info ) { - CFF_FontRecDict dict = &cff->top_font.font_dict; + CFF_FontRecDict dict = &cff->top_font.font_dict; PS_FontInfoRec *font_info = NULL; - FT_Memory memory = face->root.memory; + FT_Memory memory = face->root.memory; if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) @@ -421,6 +495,7 @@ FT_DEFINE_SERVICE_PSINFOREC( cff_service_ps_info, + (PS_GetFontInfoFunc) cff_ps_get_font_info, /* ps_get_font_info */ (PS_GetFontExtraFunc) NULL, /* ps_get_font_extra */ (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, /* ps_has_glyph_names */ @@ -453,7 +528,8 @@ FT_Service_PsFontName service = (FT_Service_PsFontName)ft_module_get_service( sfnt_module, - FT_SERVICE_ID_POSTSCRIPT_FONT_NAME ); + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, + 0 ); if ( service && service->get_ps_font_name ) @@ -466,6 +542,7 @@ FT_DEFINE_SERVICE_PSFONTNAMEREC( cff_service_ps_name, + (FT_PsName_GetFunc)cff_get_ps_name /* get_ps_font_name */ ) @@ -491,21 +568,21 @@ FT_Library library = FT_FACE_LIBRARY( face ); - cmap_info->language = 0; - cmap_info->format = 0; - if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET && cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET ) { FT_Module sfnt = FT_Get_Module( library, "sfnt" ); FT_Service_TTCMaps service = (FT_Service_TTCMaps)ft_module_get_service( sfnt, - FT_SERVICE_ID_TT_CMAP ); + FT_SERVICE_ID_TT_CMAP, + 0 ); if ( service && service->get_cmap_info ) error = service->get_cmap_info( charmap, cmap_info ); } + else + error = FT_THROW( Invalid_CharMap_Format ); return error; } @@ -513,6 +590,7 @@ FT_DEFINE_SERVICE_TTCMAPSREC( cff_service_get_cmap_info, + (TT_CMap_Info_GetFunc)cff_get_cmap_info /* get_cmap_info */ ) @@ -544,7 +622,7 @@ if ( registry ) { - if ( cff->registry == NULL ) + if ( !cff->registry ) cff->registry = cff_index_get_sid_string( cff, dict->cid_registry ); *registry = cff->registry; @@ -552,7 +630,7 @@ if ( ordering ) { - if ( cff->ordering == NULL ) + if ( !cff->ordering ) cff->ordering = cff_index_get_sid_string( cff, dict->cid_ordering ); *ordering = cff->ordering; @@ -643,6 +721,7 @@ FT_DEFINE_SERVICE_CIDREC( cff_service_cid_info, + (FT_CID_GetRegistryOrderingSupplementFunc) cff_get_ros, /* get_ros */ (FT_CID_GetIsInternallyCIDKeyedFunc) @@ -659,26 +738,62 @@ static FT_Error cff_property_set( FT_Module module, /* CFF_Driver */ const char* property_name, - const void* value ) + const void* value, + FT_Bool value_is_string ) { FT_Error error = FT_Err_Ok; CFF_Driver driver = (CFF_Driver)module; +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + if ( !ft_strcmp( property_name, "darkening-parameters" ) ) { - FT_Int* darken_params = (FT_Int*)value; + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; - FT_Int x1 = darken_params[0]; - FT_Int y1 = darken_params[1]; - FT_Int x2 = darken_params[2]; - FT_Int y2 = darken_params[3]; - FT_Int x3 = darken_params[4]; - FT_Int y3 = darken_params[5]; - FT_Int x4 = darken_params[6]; - FT_Int y4 = darken_params[7]; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); + + s = ep + 1; + } + + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; + if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || x1 > x2 || x2 > x3 || x3 > x4 || @@ -698,26 +813,85 @@ } else if ( !ft_strcmp( property_name, "hinting-engine" ) ) { - FT_UInt* hinting_engine = (FT_UInt*)value; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; - if ( *hinting_engine == FT_CFF_HINTING_ADOBE + if ( !ft_strcmp( s, "adobe" ) ) + driver->hinting_engine = FT_CFF_HINTING_ADOBE; #ifdef CFF_CONFIG_OPTION_OLD_ENGINE - || *hinting_engine == FT_CFF_HINTING_FREETYPE + else if ( !ft_strcmp( s, "freetype" ) ) + driver->hinting_engine = FT_CFF_HINTING_FREETYPE; #endif - ) - driver->hinting_engine = *hinting_engine; + else + return FT_THROW( Invalid_Argument ); + } else - error = FT_ERR( Unimplemented_Feature ); +#endif + { + FT_UInt* hinting_engine = (FT_UInt*)value; - return error; + + if ( *hinting_engine == FT_CFF_HINTING_ADOBE +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + || *hinting_engine == FT_CFF_HINTING_FREETYPE +#endif + ) + driver->hinting_engine = *hinting_engine; + else + error = FT_ERR( Unimplemented_Feature ); + + return error; + } } else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) { - FT_Bool* no_stem_darkening = (FT_Bool*)value; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); + + + if ( !nsd ) + driver->no_stem_darkening = FALSE; + else + driver->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + driver->no_stem_darkening = *no_stem_darkening; + } + + return error; + } + else if ( !ft_strcmp( property_name, "random-seed" ) ) + { + FT_Int32 random_seed; - driver->no_stem_darkening = *no_stem_darkening; +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + random_seed = (FT_Int32)ft_strtol( s, NULL, 10 ); + } + else +#endif + random_seed = *(FT_Int32*)value; + + if ( random_seed < 0 ) + random_seed = 0; + + driver->random_seed = random_seed; return error; } @@ -783,10 +957,137 @@ FT_DEFINE_SERVICE_PROPERTIESREC( cff_service_properties, + (FT_Properties_SetFunc)cff_property_set, /* set_property */ (FT_Properties_GetFunc)cff_property_get ) /* get_property */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + * MULTIPLE MASTER SERVICE + * + */ + + static FT_Error + cff_set_mm_blend( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->set_mm_blend( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_mm_blend( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_mm_blend( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_mm_var( CFF_Face face, + FT_MM_Var* *master ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_mm_var( FT_FACE( face ), master ); + } + + + static FT_Error + cff_set_var_design( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->set_var_design( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_var_design( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_var_design( FT_FACE( face ), num_coords, coords ); + } + + + FT_DEFINE_SERVICE_MULTIMASTERSREC( + cff_service_multi_masters, + + (FT_Get_MM_Func) NULL, /* get_mm */ + (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ + (FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */ + (FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */ + (FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */ + (FT_Set_Var_Design_Func)cff_set_var_design, /* set_var_design */ + (FT_Get_Var_Design_Func)cff_get_var_design, /* get_var_design */ + + (FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */ + (FT_Done_Blend_Func) cff_done_blend /* done_blend */ + ) + + + /* + * METRICS VARIATIONS SERVICE + * + */ + + static FT_Error + cff_hadvance_adjust( CFF_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + + + return var->hadvance_adjust( FT_FACE( face ), gindex, avalue ); + } + + + static void + cff_metrics_adjust( CFF_Face face ) + { + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + + + var->metrics_adjust( FT_FACE( face ) ); + } + + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + cff_service_metrics_variations, + + (FT_HAdvance_Adjust_Func)cff_hadvance_adjust, /* hadvance_adjust */ + (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ + (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + + (FT_VAdvance_Adjust_Func)NULL, /* vadvance_adjust */ + (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ + (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ + (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + + (FT_Metrics_Adjust_Func) cff_metrics_adjust /* metrics_adjust */ + ) +#endif + + /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ @@ -799,9 +1100,25 @@ /*************************************************************************/ /*************************************************************************/ -#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES +#if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \ + defined TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC9( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_MULTI_MASTERS, &CFF_SERVICE_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &CFF_SERVICE_METRICS_VAR_GET, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET + ) +#elif !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES FT_DEFINE_SERVICEDESCREC7( cff_services, + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, @@ -810,9 +1127,23 @@ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET ) +#elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC8( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_MULTI_MASTERS, &CFF_SERVICE_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &CFF_SERVICE_METRICS_VAR_GET, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET + ) #else FT_DEFINE_SERVICEDESCREC6( cff_services, + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, @@ -842,7 +1173,7 @@ #endif result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface ); - if ( result != NULL ) + if ( result ) return result; /* `driver' is not yet evaluated in non-PIC mode */ @@ -882,7 +1213,7 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ cff_driver_init, /* FT_Module_Constructor module_init */ cff_driver_done, /* FT_Module_Destructor module_done */ @@ -902,7 +1233,7 @@ cff_glyph_load, /* FT_Slot_LoadFunc load_glyph */ cff_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_AttachFunc attach_file */ cff_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ cff_size_request, /* FT_Size_RequestFunc request_size */ diff --git a/thirdparty/freetype/src/cff/cffdrivr.h b/thirdparty/freetype/src/cff/cffdrivr.h index d7b0598374..05381e66db 100644 --- a/thirdparty/freetype/src/cff/cffdrivr.h +++ b/thirdparty/freetype/src/cff/cffdrivr.h @@ -4,7 +4,7 @@ /* */ /* High-level OpenType driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cff/cfferrs.h b/thirdparty/freetype/src/cff/cfferrs.h index e7fc6eb71c..40808c1051 100644 --- a/thirdparty/freetype/src/cff/cfferrs.h +++ b/thirdparty/freetype/src/cff/cfferrs.h @@ -4,7 +4,7 @@ /* */ /* CFF error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cff/cffgload.c b/thirdparty/freetype/src/cff/cffgload.c index 752c18ed92..940804850e 100644 --- a/thirdparty/freetype/src/cff/cffgload.c +++ b/thirdparty/freetype/src/cff/cffgload.c @@ -4,7 +4,7 @@ /* */ /* OpenType Glyph Loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -278,11 +278,15 @@ if ( hinting && size ) { - CFF_Internal internal = (CFF_Internal)size->root.internal; + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; - builder->hints_globals = (void *)internal->topfont; - builder->hints_funcs = glyph->root.internal->glyph_hints; + if ( internal ) + { + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } } } @@ -391,7 +395,7 @@ /* clear everything */ - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + FT_ZERO( decoder ); /* initialize builder */ cff_builder_init( &decoder->builder, face, size, slot, hinting ); @@ -440,7 +444,8 @@ if ( builder->hints_funcs && size ) { - CFF_Internal internal = (CFF_Internal)size->root.internal; + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; /* for CFFs without subfonts, this value has already been set */ @@ -457,7 +462,7 @@ decoder->glyph_width = sub->private_dict.default_width; decoder->nominal_width = sub->private_dict.nominal_width; - decoder->current_subfont = sub; /* for Adobe's CFF handler */ + decoder->current_subfont = sub; Exit: return error; @@ -913,7 +918,6 @@ FT_Byte* limit; CFF_Builder* builder = &decoder->builder; FT_Pos x, y; - FT_Fixed seed; FT_Fixed* stack; FT_Int charstring_type = decoder->cff->top_font.font_dict.charstring_type; @@ -929,15 +933,6 @@ decoder->num_hints = 0; decoder->read_width = 1; - /* compute random seed from stack address of parameter */ - seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ - (FT_Offset)(char*)&decoder ^ - (FT_Offset)(char*)&charstring_base ) & - FT_ULONG_MAX ); - seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; - if ( seed == 0 ) - seed = 0x7384; - /* initialize the decoder */ decoder->top = decoder->stack; decoder->zone = decoder->zones; @@ -1026,7 +1021,7 @@ if ( !( val & 0xFFFFL ) ) FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) )); else - FT_TRACE4(( " %.2f", val / 65536.0 )); + FT_TRACE4(( " %.5f", val / 65536.0 )); #endif } @@ -2104,22 +2099,16 @@ break; case cff_op_random: - { - FT_Fixed Rand; - + FT_TRACE4(( " random\n" )); - FT_TRACE4(( " rand\n" )); - - Rand = seed; - if ( Rand >= 0x8000L ) - Rand++; + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + args[0] = (FT_Fixed) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + args++; - args[0] = Rand; - seed = FT_MulFix( seed, 0x10000L - seed ); - if ( seed == 0 ) - seed += 0x2873; - args++; - } + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); break; case cff_op_mul: @@ -2445,7 +2434,7 @@ case cff_op_and: { - FT_Fixed cond = args[0] && args[1]; + FT_Fixed cond = ( args[0] && args[1] ); FT_TRACE4(( " and\n" )); @@ -2457,7 +2446,7 @@ case cff_op_or: { - FT_Fixed cond = args[0] || args[1]; + FT_Fixed cond = ( args[0] || args[1] ); FT_TRACE4(( " or\n" )); @@ -2481,7 +2470,7 @@ case cff_op_eq: { - FT_Fixed cond = args[0] == args[1]; + FT_Fixed cond = ( args[0] == args[1] ); FT_TRACE4(( " eq\n" )); @@ -2942,6 +2931,7 @@ cff_decoder_init( &decoder, face, size, glyph, hinting, FT_LOAD_TARGET_MODE( load_flags ) ); + /* this is for pure CFFs */ if ( load_flags & FT_LOAD_ADVANCE_ONLY ) decoder.width_only = TRUE; diff --git a/thirdparty/freetype/src/cff/cffgload.h b/thirdparty/freetype/src/cff/cffgload.h index b875fbed90..0fa93b4398 100644 --- a/thirdparty/freetype/src/cff/cffgload.h +++ b/thirdparty/freetype/src/cff/cffgload.h @@ -4,7 +4,7 @@ /* */ /* OpenType Glyph Loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cff/cffload.c b/thirdparty/freetype/src/cff/cffload.c index 3d1bda97b9..3beaeb1c8e 100644 --- a/thirdparty/freetype/src/cff/cffload.c +++ b/thirdparty/freetype/src/cff/cffload.c @@ -4,7 +4,7 @@ /* */ /* OpenType and CFF data/program tables loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -23,12 +23,20 @@ #include FT_TRUETYPE_TAGS_H #include FT_TYPE1_TABLES_H +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + #include "cffload.h" #include "cffparse.h" #include "cfferrs.h" +#define FT_FIXED_ONE ( (FT_Fixed)0x10000 ) + + #if 1 static const FT_UShort cff_isoadobe_charset[229] = @@ -225,19 +233,33 @@ static FT_Error cff_index_init( CFF_Index idx, FT_Stream stream, - FT_Bool load ) + FT_Bool load, + FT_Bool cff2 ) { FT_Error error; FT_Memory memory = stream->memory; - FT_UShort count; + FT_UInt count; - FT_MEM_ZERO( idx, sizeof ( *idx ) ); + FT_ZERO( idx ); idx->stream = stream; idx->start = FT_STREAM_POS(); - if ( !FT_READ_USHORT( count ) && - count > 0 ) + + if ( cff2 ) + { + if ( FT_READ_ULONG( count ) ) + goto Exit; + idx->hdr_size = 5; + } + else + { + if ( FT_READ_USHORT( count ) ) + goto Exit; + idx->hdr_size = 3; + } + + if ( count > 0 ) { FT_Byte offsize; FT_ULong size; @@ -258,7 +280,7 @@ idx->off_size = offsize; size = (FT_ULong)( count + 1 ) * offsize; - idx->data_offset = idx->start + 3 + size; + idx->data_offset = idx->start + idx->hdr_size + size; if ( FT_STREAM_SKIP( size - offsize ) ) goto Exit; @@ -310,7 +332,7 @@ FT_FRAME_RELEASE( idx->bytes ); FT_FREE( idx->offsets ); - FT_MEM_ZERO( idx, sizeof ( *idx ) ); + FT_ZERO( idx ); } } @@ -323,7 +345,7 @@ FT_Memory memory = stream->memory; - if ( idx->count > 0 && idx->offsets == NULL ) + if ( idx->count > 0 && !idx->offsets ) { FT_Byte offsize = idx->off_size; FT_ULong data_size; @@ -335,7 +357,7 @@ data_size = (FT_ULong)( idx->count + 1 ) * offsize; if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || - FT_STREAM_SEEK( idx->start + 3 ) || + FT_STREAM_SEEK( idx->start + idx->hdr_size ) || FT_FRAME_ENTER( data_size ) ) goto Exit; @@ -395,7 +417,7 @@ *table = NULL; - if ( idx->offsets == NULL ) + if ( !idx->offsets ) { error = cff_index_load_offsets( idx ); if ( error ) @@ -493,7 +515,7 @@ FT_ULong pos = element * idx->off_size; - if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) + if ( FT_STREAM_SEEK( idx->start + idx->hdr_size + pos ) ) goto Exit; off1 = cff_index_read_offset( idx, &error ); @@ -589,20 +611,26 @@ FT_UInt element ) { CFF_Index idx = &font->name_index; - FT_Memory memory = idx->stream->memory; + FT_Memory memory; FT_Byte* bytes; FT_ULong byte_len; FT_Error error; FT_String* name = 0; + if ( !idx->stream ) /* CFF2 does not include a name index */ + goto Exit; + + memory = idx->stream->memory; + error = cff_index_access_element( idx, element, &bytes, &byte_len ); if ( error ) goto Exit; if ( !FT_ALLOC( name, byte_len + 1 ) ) { - FT_MEM_COPY( name, bytes, byte_len ); + if ( byte_len ) + FT_MEM_COPY( name, bytes, byte_len ); name[byte_len] = 0; } cff_index_forget_element( idx, &bytes ); @@ -724,6 +752,11 @@ FT_Byte fd = 0; + /* if there is no FDSelect, return zero */ + /* Note: CFF2 with just one Font Dict has no FDSelect */ + if ( !fdselect->data ) + goto Exit; + switch ( fdselect->format ) { case 0: @@ -776,6 +809,7 @@ ; } + Exit: return fd; } @@ -1054,6 +1088,522 @@ static void + cff_vstore_done( CFF_VStoreRec* vstore, + FT_Memory memory ) + { + FT_UInt i; + + + /* free regionList and axisLists */ + if ( vstore->varRegionList ) + { + for ( i = 0; i < vstore->regionCount; i++ ) + FT_FREE( vstore->varRegionList[i].axisList ); + } + FT_FREE( vstore->varRegionList ); + + /* free varData and indices */ + if ( vstore->varData ) + { + for ( i = 0; i < vstore->dataCount; i++ ) + FT_FREE( vstore->varData[i].regionIndices ); + } + FT_FREE( vstore->varData ); + } + + + /* convert 2.14 to Fixed */ + #define FT_fdot14ToFixed( x ) ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) + + + static FT_Error + cff_vstore_load( CFF_VStoreRec* vstore, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_ERR( Invalid_File_Format ); + + FT_ULong* dataOffsetArray = NULL; + FT_UInt i, j; + + + /* no offset means no vstore to parse */ + if ( offset ) + { + FT_UInt vsOffset; + FT_UInt format; + FT_ULong regionListOffset; + + + /* we need to parse the table to determine its size; */ + /* skip table length */ + if ( FT_STREAM_SEEK( base_offset + offset ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + /* actual variation store begins after the length */ + vsOffset = FT_STREAM_POS(); + + /* check the header */ + if ( FT_READ_USHORT( format ) ) + goto Exit; + if ( format != 1 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( regionListOffset ) || + FT_READ_USHORT( vstore->dataCount ) ) + goto Exit; + + /* make temporary copy of item variation data offsets; */ + /* we'll parse region list first, then come back */ + if ( FT_NEW_ARRAY( dataOffsetArray, vstore->dataCount ) ) + goto Exit; + + for ( i = 0; i < vstore->dataCount; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse regionList and axisLists */ + if ( FT_STREAM_SEEK( vsOffset + regionListOffset ) || + FT_READ_USHORT( vstore->axisCount ) || + FT_READ_USHORT( vstore->regionCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( vstore->varRegionList, vstore->regionCount ) ) + goto Exit; + + for ( i = 0; i < vstore->regionCount; i++ ) + { + CFF_VarRegion* region = &vstore->varRegionList[i]; + + + if ( FT_NEW_ARRAY( region->axisList, vstore->axisCount ) ) + goto Exit; + + for ( j = 0; j < vstore->axisCount; j++ ) + { + CFF_AxisCoords* axis = ®ion->axisList[j]; + + FT_Int16 start14, peak14, end14; + + + if ( FT_READ_SHORT( start14 ) || + FT_READ_SHORT( peak14 ) || + FT_READ_SHORT( end14 ) ) + goto Exit; + + axis->startCoord = FT_fdot14ToFixed( start14 ); + axis->peakCoord = FT_fdot14ToFixed( peak14 ); + axis->endCoord = FT_fdot14ToFixed( end14 ); + } + } + + /* use dataOffsetArray now to parse varData items */ + if ( FT_NEW_ARRAY( vstore->varData, vstore->dataCount ) ) + goto Exit; + + for ( i = 0; i < vstore->dataCount; i++ ) + { + CFF_VarData* data = &vstore->varData[i]; + + + if ( FT_STREAM_SEEK( vsOffset + dataOffsetArray[i] ) ) + goto Exit; + + /* ignore `itemCount' and `shortDeltaCount' */ + /* because CFF2 has no delta sets */ + if ( FT_STREAM_SKIP( 4 ) ) + goto Exit; + + /* Note: just record values; consistency is checked later */ + /* by cff_blend_build_vector when it consumes `vstore' */ + + if ( FT_READ_USHORT( data->regionIdxCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( data->regionIndices, data->regionIdxCount ) ) + goto Exit; + + for ( j = 0; j < data->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( data->regionIndices[j] ) ) + goto Exit; + } + } + } + + error = FT_Err_Ok; + + Exit: + FT_FREE( dataOffsetArray ); + if ( error ) + cff_vstore_done( vstore, memory ); + + return error; + } + + + /* Clear blend stack (after blend values are consumed). */ + /* */ + /* TODO: Should do this in cff_run_parse, but subFont */ + /* ref is not available there. */ + /* */ + /* Allocation is not changed when stack is cleared. */ + FT_LOCAL_DEF( void ) + cff_blend_clear( CFF_SubFont subFont ) + { + subFont->blend_top = subFont->blend_stack; + subFont->blend_used = 0; + } + + + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + /* */ + /* This is comparable to `cf2_doBlend' but */ + /* the cffparse stack is different and can't be written. */ + /* Blended values are written to a different buffer, */ + /* using reserved operator 255. */ + /* */ + /* Blend calculation is done in 16.16 fixed point. */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_doBlend( CFF_SubFont subFont, + CFF_Parser parser, + FT_UInt numBlends ) + { + FT_UInt delta; + FT_UInt base; + FT_UInt i, j; + FT_UInt size; + + CFF_Blend blend = &subFont->blend; + + FT_Memory memory = subFont->blend.font->memory; /* for FT_REALLOC */ + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + + /* compute expected number of operands for this blend */ + FT_UInt numOperands = (FT_UInt)( numBlends * blend->lenBV ); + FT_UInt count = (FT_UInt)( parser->top - 1 - parser->stack ); + + + if ( numOperands > count ) + { + FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d args\n", count )); + + error = FT_THROW( Stack_Underflow ); + goto Exit; + } + + /* check whether we have room for `numBlends' values at `blend_top' */ + size = 5 * numBlends; /* add 5 bytes per entry */ + if ( subFont->blend_used + size > subFont->blend_alloc ) + { + FT_Byte* blend_stack_old = subFont->blend_stack; + FT_Byte* blend_top_old = subFont->blend_top; + + + /* increase or allocate `blend_stack' and reset `blend_top'; */ + /* prepare to append `numBlends' values to the buffer */ + if ( FT_REALLOC( subFont->blend_stack, + subFont->blend_alloc, + subFont->blend_alloc + size ) ) + goto Exit; + + subFont->blend_top = subFont->blend_stack + subFont->blend_used; + subFont->blend_alloc += size; + + /* iterate over the parser stack and adjust pointers */ + /* if the reallocated buffer has a different address */ + if ( blend_stack_old && + subFont->blend_stack != blend_stack_old ) + { + FT_PtrDist offset = subFont->blend_stack - blend_stack_old; + FT_Byte** p; + + + for ( p = parser->stack; p < parser->top; p++ ) + { + if ( *p >= blend_stack_old && *p < blend_top_old ) + *p += offset; + } + } + } + subFont->blend_used += size; + + base = count - numOperands; /* index of first blend arg */ + delta = base + numBlends; /* index of first delta arg */ + + for ( i = 0; i < numBlends; i++ ) + { + const FT_Int32* weight = &blend->BV[1]; + FT_Int32 sum; + + + /* convert inputs to 16.16 fixed point */ + sum = cff_parse_num( parser, &parser->stack[i + base] ) * 65536; + + for ( j = 1; j < blend->lenBV; j++ ) + sum += FT_MulFix( *weight++, + cff_parse_num( parser, + &parser->stack[delta++] ) * 65536 ); + + /* point parser stack to new value on blend_stack */ + parser->stack[i + base] = subFont->blend_top; + + /* Push blended result as Type 2 5-byte fixed point number. This */ + /* will not conflict with actual DICTs because 255 is a reserved */ + /* opcode in both CFF and CFF2 DICTs. See `cff_parse_num' for */ + /* decode of this, which rounds to an integer. */ + *subFont->blend_top++ = 255; + *subFont->blend_top++ = ( (FT_UInt32)sum & 0xFF000000U ) >> 24; + *subFont->blend_top++ = ( (FT_UInt32)sum & 0x00FF0000U ) >> 16; + *subFont->blend_top++ = ( (FT_UInt32)sum & 0x0000FF00U ) >> 8; + *subFont->blend_top++ = (FT_UInt32)sum & 0x000000FFU; + } + + /* leave only numBlends results on parser stack */ + parser->top = &parser->stack[base + numBlends]; + + Exit: + return error; + } + + + /* Compute a blend vector from variation store index and normalized */ + /* vector based on pseudo-code in OpenType Font Variations Overview. */ + /* */ + /* Note: lenNDV == 0 produces a default blend vector, (1,0,0,...). */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + FT_Memory memory = blend->font->memory; /* for FT_REALLOC */ + + FT_UInt len; + CFF_VStore vs; + CFF_VarData* varData; + FT_UInt master; + + + FT_ASSERT( lenNDV == 0 || NDV ); + + blend->builtBV = FALSE; + + vs = &blend->font->vstore; + + /* VStore and fvar must be consistent */ + if ( lenNDV != 0 && lenNDV != vs->axisCount ) + { + FT_TRACE4(( " cff_blend_build_vector: Axis count mismatch\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( vsindex >= vs->dataCount ) + { + FT_TRACE4(( " cff_blend_build_vector: vsindex out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* select the item variation data structure */ + varData = &vs->varData[vsindex]; + + /* prepare buffer for the blend vector */ + len = varData->regionIdxCount + 1; /* add 1 for default component */ + if ( FT_REALLOC( blend->BV, + blend->lenBV * sizeof( *blend->BV ), + len * sizeof( *blend->BV ) ) ) + goto Exit; + + blend->lenBV = len; + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < len; master++ ) + { + FT_UInt j; + FT_UInt idx; + CFF_VarRegion* varRegion; + + + /* default factor is always one */ + if ( master == 0 ) + { + blend->BV[master] = FT_FIXED_ONE; + FT_TRACE4(( " build blend vector len %d\n" + " [ %f ", + len, + blend->BV[master] / 65536.0 )); + continue; + } + + /* VStore array does not include default master, so subtract one */ + idx = varData->regionIndices[master - 1]; + varRegion = &vs->varRegionList[idx]; + + if ( idx >= vs->regionCount ) + { + FT_TRACE4(( " cff_blend_build_vector:" + " region index out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Note: `lenNDV' could be zero. */ + /* In that case, build default blend vector (1,0,0...). */ + if ( !lenNDV ) + { + blend->BV[master] = 0; + continue; + } + + /* In the normal case, initialize each component to 1 */ + /* before inner loop. */ + blend->BV[master] = FT_FIXED_ONE; /* default */ + + /* inner loop steps through axes in this region */ + for ( j = 0; j < lenNDV; j++ ) + { + CFF_AxisCoords* axis = &varRegion->axisList[j]; + FT_Fixed axisScalar; + + + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + axisScalar = FT_FIXED_ONE; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + axisScalar = FT_FIXED_ONE; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + axisScalar = FT_FIXED_ONE; + + /* ignore this region if coords are out of range */ + else if ( NDV[j] < axis->startCoord || + NDV[j] > axis->endCoord ) + axisScalar = 0; + + /* calculate a proportional factor */ + else + { + if ( NDV[j] == axis->peakCoord ) + axisScalar = FT_FIXED_ONE; + else if ( NDV[j] < axis->peakCoord ) + axisScalar = FT_DivFix( NDV[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + axisScalar = FT_DivFix( axis->endCoord - NDV[j], + axis->endCoord - axis->peakCoord ); + } + + /* take product of all the axis scalars */ + blend->BV[master] = FT_MulFix( blend->BV[master], axisScalar ); + } + + FT_TRACE4(( ", %f ", + blend->BV[master] / 65536.0 )); + } + + FT_TRACE4(( "]\n" )); + + /* record the parameters used to build the blend vector */ + blend->lastVsindex = vsindex; + + if ( lenNDV != 0 ) + { + /* user has set a normalized vector */ + if ( FT_REALLOC( blend->lastNDV, + blend->lenNDV * sizeof ( *NDV ), + lenNDV * sizeof ( *NDV ) ) ) + goto Exit; + + FT_MEM_COPY( blend->lastNDV, + NDV, + lenNDV * sizeof ( *NDV ) ); + } + + blend->lenNDV = lenNDV; + blend->builtBV = TRUE; + + Exit: + return error; + } + + + /* `lenNDV' is zero for default vector; */ + /* return TRUE if blend vector needs to be built. */ + FT_LOCAL_DEF( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + if ( !blend->builtBV || + blend->lastVsindex != vsindex || + blend->lenNDV != lenNDV || + ( lenNDV && + memcmp( NDV, + blend->lastNDV, + lenNDV * sizeof ( *NDV ) ) != 0 ) ) + { + /* need to build blend vector */ + return TRUE; + } + + return FALSE; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + FT_LOCAL_DEF( FT_Error ) + cff_get_var_blend( CFF_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_var_blend( FT_FACE( face ), + num_coords, + coords, + normalizedcoords, + mm_var ); + } + + + FT_LOCAL_DEF( void ) + cff_done_blend( CFF_Face face ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + mm->done_blend( FT_FACE( face ) ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static void cff_encoding_done( CFF_Encoding encoding ) { encoding->format = 0; @@ -1305,31 +1855,148 @@ } + /* Parse private dictionary; first call is always from `cff_face_init', */ + /* so NDV has not been set for CFF2 variation. */ + /* */ + /* `cff_slot_load' must call this function each time NDV changes. */ + FT_LOCAL_DEF( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; + CFF_ParserRec parser; + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + FT_Stream stream = font->stream; + FT_UInt stackSize; + + + /* store handle needed to access memory, vstore for blend; */ + /* we need this for clean-up even if there is no private DICT */ + subfont->blend.font = font; + subfont->blend.usedBV = FALSE; /* clear state */ + + if ( !top->private_offset || !top->private_size ) + goto Exit2; /* no private DICT, do nothing */ + + /* set defaults */ + FT_ZERO( priv ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + /* provide inputs for blend calculations */ + priv->subfont = subfont; + subfont->lenNDV = lenNDV; + subfont->NDV = NDV; + + /* add 1 for the operator */ + stackSize = font->cff2 ? font->top_font.font_dict.maxstack + 1 + : CFF_MAX_STACK_DEPTH + 1; + + if ( cff_parser_init( &parser, + font->cff2 ? CFF2_CODE_PRIVATE : CFF_CODE_PRIVATE, + priv, + font->library, + stackSize, + top->num_designs, + top->num_axes ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font->base_offset + top->private_offset ) || + FT_FRAME_ENTER( top->private_size ) ) + goto Exit; + + FT_TRACE4(( " private dictionary:\n" )); + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + + /* sanitize `initialRandomSeed' to be a positive value, if necessary; */ + /* this is not mandated by the specification but by our implementation */ + if ( priv->initial_random_seed < 0 ) + priv->initial_random_seed = -priv->initial_random_seed; + else if ( priv->initial_random_seed == 0 ) + priv->initial_random_seed = 987654321; + + Exit: + /* clean up */ + cff_blend_clear( subfont ); /* clear blend stack */ + cff_parser_done( &parser ); /* free parser stack */ + + Exit2: + /* no clean up (parser not initialized) */ + return error; + } + + + FT_LOCAL_DEF( FT_UInt32 ) + cff_random( FT_UInt32 r ) + { + /* a 32bit version of the `xorshift' algorithm */ + r ^= r << 13; + r ^= r >> 17; + r ^= r << 5; + + return r; + } + + + /* There are 3 ways to call this function, distinguished by code. */ + /* */ + /* . CFF_CODE_TOPDICT for either a CFF Top DICT or a CFF Font DICT */ + /* . CFF2_CODE_TOPDICT for CFF2 Top DICT */ + /* . CFF2_CODE_FONTDICT for CFF2 Font DICT */ + static FT_Error - cff_subfont_load( CFF_SubFont font, + cff_subfont_load( CFF_SubFont subfont, CFF_Index idx, FT_UInt font_index, FT_Stream stream, FT_ULong base_offset, - FT_Library library ) + FT_UInt code, + CFF_Font font, + CFF_Face face ) { FT_Error error; CFF_ParserRec parser; FT_Byte* dict = NULL; FT_ULong dict_len; - CFF_FontRecDict top = &font->font_dict; - CFF_Private priv = &font->private_dict; - - - cff_parser_init( &parser, - CFF_CODE_TOPDICT, - &font->font_dict, - library, - 0, - 0 ); + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + + FT_Bool cff2 = FT_BOOL( code == CFF2_CODE_TOPDICT || + code == CFF2_CODE_FONTDICT ); + FT_UInt stackSize = cff2 ? CFF2_DEFAULT_STACK + : CFF_MAX_STACK_DEPTH; + + + /* Note: We use default stack size for CFF2 Font DICT because */ + /* Top and Font DICTs are not allowed to have blend operators. */ + error = cff_parser_init( &parser, + code, + &subfont->font_dict, + font->library, + stackSize, + 0, + 0 ); + if ( error ) + goto Exit; /* set defaults */ - FT_MEM_ZERO( top, sizeof ( *top ) ); + FT_ZERO( top ); top->underline_position = -( 100L << 16 ); top->underline_thickness = 50L << 16; @@ -1352,14 +2019,35 @@ top->cid_ordering = 0xFFFFU; top->cid_font_name = 0xFFFFU; - error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + /* set default stack size */ + top->maxstack = cff2 ? CFF2_DEFAULT_STACK : 48; + + if ( idx->count ) /* count is nonzero for a real index */ + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + else + { + /* CFF2 has a fake top dict index; */ + /* simulate `cff_index_access_element' */ + + /* Note: macros implicitly use `stream' and set `error' */ + if ( FT_STREAM_SEEK( idx->data_offset ) || + FT_FRAME_EXTRACT( idx->data_size, dict ) ) + goto Exit; + + dict_len = idx->data_size; + } + if ( !error ) { FT_TRACE4(( " top dictionary:\n" )); error = cff_parser_run( &parser, dict, dict + dict_len ); } - cff_index_forget_element( idx, &dict ); + /* clean up regardless of error */ + if ( idx->count ) + cff_index_forget_element( idx, &dict ); + else + FT_FRAME_RELEASE( dict ); if ( error ) goto Exit; @@ -1368,39 +2056,62 @@ if ( top->cid_registry != 0xFFFFU ) goto Exit; - /* parse the private dictionary, if any */ - if ( top->private_offset && top->private_size ) + /* Parse the private dictionary, if any. */ + /* */ + /* CFF2 does not have a private dictionary in the Top DICT */ + /* but may have one in a Font DICT. We need to parse */ + /* the latter here in order to load any local subrs. */ + error = cff_load_private_dict( font, subfont, 0, 0 ); + if ( error ) + goto Exit; + + if ( !cff2 ) { - /* set defaults */ - FT_MEM_ZERO( priv, sizeof ( *priv ) ); - - priv->blue_shift = 7; - priv->blue_fuzz = 1; - priv->lenIV = -1; - priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); - priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); - - cff_parser_init( &parser, - CFF_CODE_PRIVATE, - priv, - library, - top->num_designs, - top->num_axes ); - - if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || - FT_FRAME_ENTER( font->font_dict.private_size ) ) - goto Exit; + /* + * Initialize the random number generator. + * + * . If we have a face-specific seed, use it. + * If non-zero, update it to a positive value. + * + * . Otherwise, use the seed from the CFF driver. + * If non-zero, update it to a positive value. + * + * . If the random value is zero, use the seed given by the subfont's + * `initialRandomSeed' value. + * + */ + if ( face->root.internal->random_seed == -1 ) + { + CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face ); - FT_TRACE4(( " private dictionary:\n" )); - error = cff_parser_run( &parser, - (FT_Byte*)stream->cursor, - (FT_Byte*)stream->limit ); - FT_FRAME_EXIT(); - if ( error ) - goto Exit; - /* ensure that `num_blue_values' is even */ - priv->num_blue_values &= ~1; + subfont->random = (FT_UInt32)driver->random_seed; + if ( driver->random_seed ) + { + do + { + driver->random_seed = + (FT_Int32)cff_random( (FT_UInt32)driver->random_seed ); + + } while ( driver->random_seed < 0 ); + } + } + else + { + subfont->random = (FT_UInt32)face->root.internal->random_seed; + if ( face->root.internal->random_seed ) + { + do + { + face->root.internal->random_seed = + (FT_Int32)cff_random( (FT_UInt32)face->root.internal->random_seed ); + + } while ( face->root.internal->random_seed < 0 ); + } + } + + if ( !subfont->random ) + subfont->random = (FT_UInt32)priv->initial_random_seed; } /* read the local subrs, if any */ @@ -1410,17 +2121,19 @@ priv->local_subrs_offset ) ) goto Exit; - error = cff_index_init( &font->local_subrs_index, stream, 1 ); + error = cff_index_init( &subfont->local_subrs_index, stream, 1, cff2 ); if ( error ) goto Exit; - error = cff_index_get_pointers( &font->local_subrs_index, - &font->local_subrs, NULL, NULL ); + error = cff_index_get_pointers( &subfont->local_subrs_index, + &subfont->local_subrs, NULL, NULL ); if ( error ) goto Exit; } Exit: + cff_parser_done( &parser ); /* free parser stack */ + return error; } @@ -1433,6 +2146,10 @@ { cff_index_done( &subfont->local_subrs_index ); FT_FREE( subfont->local_subrs ); + + FT_FREE( subfont->blend.lastNDV ); + FT_FREE( subfont->blend.BV ); + FT_FREE( subfont->blend_stack ); } } @@ -1442,18 +2159,19 @@ FT_Stream stream, FT_Int face_index, CFF_Font font, - FT_Bool pure_cff ) + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ) { static const FT_Frame_Field cff_header_fields[] = { #undef FT_STRUCTURE #define FT_STRUCTURE CFF_FontRec - FT_FRAME_START( 4 ), + FT_FRAME_START( 3 ), FT_FRAME_BYTE( version_major ), FT_FRAME_BYTE( version_minor ), FT_FRAME_BYTE( header_size ), - FT_FRAME_BYTE( absolute_offsize ), FT_FRAME_END }; @@ -1468,43 +2186,133 @@ FT_ZERO( font ); FT_ZERO( &string_index ); - font->stream = stream; - font->memory = memory; - dict = &font->top_font.font_dict; - base_offset = FT_STREAM_POS(); + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + font->library = library; + font->stream = stream; + font->memory = memory; + font->cff2 = cff2; + font->base_offset = base_offset; /* read CFF font header */ if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) goto Exit; - /* check format */ - if ( font->version_major != 1 || - font->header_size < 4 || - font->absolute_offsize > 4 ) + if ( cff2 ) { - FT_TRACE2(( " not a CFF font header\n" )); - error = FT_THROW( Unknown_File_Format ); - goto Exit; + if ( font->version_major != 2 || + font->header_size < 5 ) + { + FT_TRACE2(( " not a CFF2 font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( FT_READ_USHORT( font->top_dict_length ) ) + goto Exit; + } + else + { + FT_Byte absolute_offset; + + + if ( FT_READ_BYTE( absolute_offset ) ) + goto Exit; + + if ( font->version_major != 1 || + font->header_size < 4 || + absolute_offset > 4 ) + { + FT_TRACE2(( " not a CFF font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } } /* skip the rest of the header */ - if ( FT_STREAM_SKIP( font->header_size - 4 ) ) + if ( FT_STREAM_SEEK( base_offset + font->header_size ) ) + { + /* For pure CFFs we have read only four bytes so far. Contrary to */ + /* other formats like SFNT those bytes doesn't define a signature; */ + /* it is thus possible that the font isn't a CFF at all. */ + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } goto Exit; + } - /* read the name, top dict, string and global subrs index */ - if ( FT_SET_ERROR( cff_index_init( &font->name_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &font->font_dict_index, - stream, 0 ) ) || - FT_SET_ERROR( cff_index_init( &string_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_init( &font->global_subrs_index, - stream, 1 ) ) || - FT_SET_ERROR( cff_index_get_pointers( &string_index, - &font->strings, - &font->string_pool, - &font->string_pool_size ) ) ) - goto Exit; + if ( cff2 ) + { + /* For CFF2, the top dict data immediately follow the header */ + /* and the length is stored in the header `offSize' field; */ + /* there is no index for it. */ + /* */ + /* Use the `font_dict_index' to save the current position */ + /* and length of data, but leave count at zero as an indicator. */ + FT_ZERO( &font->font_dict_index ); + + font->font_dict_index.data_offset = FT_STREAM_POS(); + font->font_dict_index.data_size = font->top_dict_length; + + /* skip the top dict data for now, we will parse it later */ + if ( FT_STREAM_SKIP( font->top_dict_length ) ) + goto Exit; + + /* next, read the global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) ) + goto Exit; + } + else + { + /* for CFF, read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0, cff2 ) ) ) + { + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } + goto Exit; + } + + /* if we have an empty font name, */ + /* it must be the only font in the CFF */ + if ( font->name_index.count > 1 && + font->name_index.data_size < font->name_index.count ) + { + /* for pure CFFs, we still haven't checked enough bytes */ + /* to be sure that it is a CFF at all */ + error = pure_cff ? FT_THROW( Unknown_File_Format ) + : FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &string_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_get_pointers( &string_index, + &font->strings, + &font->string_pool, + &font->string_pool_size ) ) ) + goto Exit; + + /* there must be a Top DICT index entry for each name index entry */ + if ( font->name_index.count > font->font_dict_index.count ) + { + FT_ERROR(( "cff_font_load:" + " not enough entries in Top DICT index\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } font->num_strings = string_index.count; @@ -1550,34 +2358,48 @@ subfont_index, stream, base_offset, - library ); + cff2 ? CFF2_CODE_TOPDICT : CFF_CODE_TOPDICT, + font, + face ); if ( error ) goto Exit; if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) goto Exit; - error = cff_index_init( &font->charstrings_index, stream, 0 ); + error = cff_index_init( &font->charstrings_index, stream, 0, cff2 ); if ( error ) goto Exit; - /* now, check for a CID font */ - if ( dict->cid_registry != 0xFFFFU ) + /* now, check for a CID or CFF2 font */ + if ( dict->cid_registry != 0xFFFFU || + cff2 ) { CFF_IndexRec fd_index; CFF_SubFont sub = NULL; FT_UInt idx; + /* for CFF2, read the Variation Store if available; */ + /* this must follow the Top DICT parse and precede any Private DICT */ + error = cff_vstore_load( &font->vstore, + stream, + base_offset, + dict->vstore_offset ); + if ( error ) + goto Exit; + /* this is a CID-keyed font, we must now allocate a table of */ /* sub-fonts, then load each of them separately */ if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) goto Exit; - error = cff_index_init( &fd_index, stream, 0 ); + error = cff_index_init( &fd_index, stream, 0, cff2 ); if ( error ) goto Exit; + /* Font Dicts are not limited to 256 for CFF2. */ + /* TODO: support this for CFF2 */ if ( fd_index.count > CFF_MAX_CID_FONTS ) { FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); @@ -1598,17 +2420,26 @@ { sub = font->subfonts[idx]; FT_TRACE4(( "parsing subfont %u\n", idx )); - error = cff_subfont_load( sub, &fd_index, idx, - stream, base_offset, library ); + error = cff_subfont_load( sub, + &fd_index, + idx, + stream, + base_offset, + cff2 ? CFF2_CODE_FONTDICT + : CFF_CODE_TOPDICT, + font, + face ); if ( error ) goto Fail_CID; } - /* now load the FD Select array */ - error = CFF_Load_FD_Select( &font->fd_select, - font->charstrings_index.count, - stream, - base_offset + dict->cid_fd_select_offset ); + /* now load the FD Select array; */ + /* CFF2 omits FDSelect if there is only one FD */ + if ( !cff2 || fd_index.count > 1 ) + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); Fail_CID: cff_index_done( &fd_index ); @@ -1636,7 +2467,7 @@ goto Exit; /* read the Charset and Encoding tables if available */ - if ( font->num_glyphs > 0 ) + if ( !cff2 && font->num_glyphs > 0 ) { FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); @@ -1684,7 +2515,7 @@ cff_index_done( &font->charstrings_index ); /* release font dictionaries, but only if working with */ - /* a CID keyed CFF font */ + /* a CID keyed CFF font or a CFF2 font */ if ( font->num_subfonts > 0 ) { for ( idx = 0; idx < font->num_subfonts; idx++ ) @@ -1696,6 +2527,7 @@ cff_encoding_done( &font->encoding ); cff_charset_done( &font->charset, font->stream ); + cff_vstore_done( &font->vstore, memory ); cff_subfont_done( memory, &font->top_font ); diff --git a/thirdparty/freetype/src/cff/cffload.h b/thirdparty/freetype/src/cff/cffload.h index 1dd07baf11..c745e8127b 100644 --- a/thirdparty/freetype/src/cff/cffload.h +++ b/thirdparty/freetype/src/cff/cffload.h @@ -4,7 +4,7 @@ /* */ /* OpenType & CFF data/program tables loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,8 @@ #include <ft2build.h> #include "cfftypes.h" +#include "cffparse.h" +#include "cffobjs.h" /* for CFF_Face */ FT_BEGIN_HEADER @@ -59,21 +61,64 @@ FT_BEGIN_HEADER FT_UInt cid ); + FT_LOCAL( FT_UInt32 ) + cff_random( FT_UInt32 r ); + FT_LOCAL( FT_Error ) - cff_font_load( FT_Library library, - FT_Stream stream, - FT_Int face_index, - CFF_Font font, - FT_Bool pure_cff ); + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ); FT_LOCAL( void ) cff_font_done( CFF_Font font ); + FT_LOCAL( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ); + FT_LOCAL( FT_Byte ) cff_fd_select_get( CFF_FDSelect fdselect, FT_UInt glyph_index ); + FT_LOCAL( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( void ) + cff_blend_clear( CFF_SubFont subFont ); + + FT_LOCAL( FT_Error ) + cff_blend_doBlend( CFF_SubFont subfont, + CFF_Parser parser, + FT_UInt numBlends ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cff_get_var_blend( CFF_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + FT_LOCAL( void ) + cff_done_blend( CFF_Face face ); +#endif + FT_END_HEADER diff --git a/thirdparty/freetype/src/cff/cffobjs.c b/thirdparty/freetype/src/cff/cffobjs.c index 0f0769677f..61613933ff 100644 --- a/thirdparty/freetype/src/cff/cffobjs.c +++ b/thirdparty/freetype/src/cff/cffobjs.c @@ -4,7 +4,7 @@ /* */ /* OpenType objects manager (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,6 +27,11 @@ #include FT_INTERNAL_SFNT_H #include FT_CFF_DRIVER_H +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + #include "cffobjs.h" #include "cffload.h" #include "cffcmap.h" @@ -49,9 +54,6 @@ /* */ /* SIZE FUNCTIONS */ /* */ - /* Note that we store the global hints in the size's `internal' root */ - /* field. */ - /* */ /*************************************************************************/ @@ -75,10 +77,11 @@ FT_LOCAL_DEF( void ) cff_size_done( FT_Size cffsize ) /* CFF_Size */ { + FT_Memory memory = cffsize->face->memory; CFF_Size size = (CFF_Size)cffsize; CFF_Face face = (CFF_Face)size->root.face; CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)cffsize->internal; + CFF_Internal internal = (CFF_Internal)cffsize->internal->module_data; if ( internal ) @@ -98,7 +101,7 @@ funcs->destroy( internal->subfonts[i - 1] ); } - /* `internal' is freed by destroy_size (in ftobjs.c) */ + FT_FREE( internal ); } } @@ -114,7 +117,7 @@ FT_UInt n, count; - FT_MEM_ZERO( priv, sizeof ( *priv ) ); + FT_ZERO( priv ); count = priv->num_blue_values = cpriv->num_blue_values; for ( n = 0; n < count; n++ ) @@ -194,7 +197,7 @@ goto Exit; } - cffsize->internal = (FT_Size_Internal)(void*)internal; + cffsize->internal->module_data = internal; } size->strike_index = 0xFFFFFFFFUL; @@ -224,7 +227,7 @@ { CFF_Face face = (CFF_Face)size->face; CFF_Font font = (CFF_Font)face->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; FT_UInt i; @@ -296,7 +299,7 @@ { CFF_Face cffface = (CFF_Face)size->face; CFF_Font font = (CFF_Font)cffface->extra.data; - CFF_Internal internal = (CFF_Internal)size->internal; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; FT_UInt i; @@ -450,7 +453,7 @@ FT_Int idx; - for ( idx = 1; idx <= style_name_length; ++idx ) + for ( idx = 1; idx <= style_name_length; idx++ ) { if ( family_name[family_name_length - idx] != style_name[style_name_length - idx] ) @@ -469,7 +472,7 @@ family_name[idx] == ' ' || family_name[idx] == '_' || family_name[idx] == '+' ) ) - --idx; + idx--; if ( idx > 0 ) family_name[idx + 1] = '\0'; @@ -491,6 +494,7 @@ FT_Service_PsCMaps psnames; PSHinter_Service pshinter; FT_Bool pure_cff = 1; + FT_Bool cff2 = 0; FT_Bool sfnt_format = 0; FT_Library library = cffface->driver->root.library; @@ -516,6 +520,7 @@ goto Exit; /* check whether we have a valid OpenType file */ + FT_TRACE2(( " " )); error = sfnt->init_face( stream, face, face_index, num_params, params ); if ( !error ) { @@ -553,8 +558,18 @@ goto Exit; } - /* now load the CFF part of the file */ - error = face->goto_table( face, TTAG_CFF, stream, 0 ); + /* now load the CFF part of the file; */ + /* give priority to CFF2 */ + error = face->goto_table( face, TTAG_CFF2, stream, 0 ); + if ( !error ) + { + cff2 = 1; + face->is_cff2 = cff2; + } + + if ( FT_ERR_EQ( error, Table_Missing ) ) + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + if ( error ) goto Exit; } @@ -579,7 +594,13 @@ goto Exit; face->extra.data = cff; - error = cff_font_load( library, stream, face_index, cff, pure_cff ); + error = cff_font_load( library, + stream, + face_index, + cff, + face, + pure_cff, + cff2 ); if ( error ) goto Exit; @@ -667,6 +688,56 @@ } #endif /* FT_DEBUG_LEVEL_TRACE */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + FT_Int instance_index = face_index >> 16; + + + if ( FT_HAS_MULTIPLE_MASTERS( cffface ) && + mm && + instance_index > 0 ) + { + FT_MM_Var* mm_var; + + + error = mm->get_mm_var( cffface, NULL ); + if ( error ) + goto Exit; + + mm->get_var_blend( cffface, NULL, NULL, NULL, &mm_var ); + + if ( mm_var->namedstyle ) + { + FT_Var_Named_Style* named_style; + FT_String* style_name; + + + /* in `face_index', the instance index starts with value 1 */ + named_style = mm_var->namedstyle + instance_index - 1; + error = sfnt->get_name( face, + (FT_UShort)named_style->strid, + &style_name ); + if ( error ) + goto Exit; + + /* set style name; if already set, replace it */ + if ( face->root.style_name ) + FT_FREE( face->root.style_name ); + face->root.style_name = style_name; + + /* finally, select the named instance */ + error = mm->set_var_design( cffface, + mm_var->num_axis, + named_style->coords ); + if ( error ) + goto Exit; + } + } + } +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + if ( !dict->has_font_matrix ) dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; @@ -949,7 +1020,6 @@ cffface->style_flags = flags; } - #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ /* has unset this flag because of the 3.0 `post' table. */ @@ -960,7 +1030,6 @@ if ( dict->cid_registry != 0xFFFFU && pure_cff ) cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; - /*******************************************************************/ /* */ /* Compute char maps. */ @@ -1011,7 +1080,7 @@ error = FT_Err_Ok; /* if no Unicode charmap was previously selected, select this one */ - if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) + if ( !cffface->charmap && nn != (FT_UInt)cffface->num_charmaps ) cffface->charmap = cffface->charmaps[nn]; Skip_Unicode: @@ -1079,6 +1148,11 @@ FT_FREE( face->extra.data ); } } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + cff_done_blend( face ); + face->blend = NULL; +#endif } @@ -1087,6 +1161,8 @@ { CFF_Driver driver = (CFF_Driver)module; + FT_UInt32 seed; + /* set default property values, cf. `ftcffdrv.h' */ #ifdef CFF_CONFIG_OPTION_OLD_ENGINE @@ -1106,6 +1182,18 @@ driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&module ^ + (FT_Offset)(char*)module->memory ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + + driver->random_seed = (FT_Int32)seed; + if ( driver->random_seed < 0 ) + driver->random_seed = -driver->random_seed; + else if ( driver->random_seed == 0 ) + driver->random_seed = 123456789; + return FT_Err_Ok; } diff --git a/thirdparty/freetype/src/cff/cffobjs.h b/thirdparty/freetype/src/cff/cffobjs.h index 9dc77536bd..1dba694c53 100644 --- a/thirdparty/freetype/src/cff/cffobjs.h +++ b/thirdparty/freetype/src/cff/cffobjs.h @@ -4,7 +4,7 @@ /* */ /* OpenType objects manager (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -118,10 +118,10 @@ FT_BEGIN_HEADER { FT_DriverRec root; - FT_UInt hinting_engine; - FT_Bool no_stem_darkening; - - FT_Int darken_params[8]; + FT_UInt hinting_engine; + FT_Bool no_stem_darkening; + FT_Int darken_params[8]; + FT_Int32 random_seed; } CFF_DriverRec; diff --git a/thirdparty/freetype/src/cff/cffparse.c b/thirdparty/freetype/src/cff/cffparse.c index a4f986b67c..e1511bdbd1 100644 --- a/thirdparty/freetype/src/cff/cffparse.c +++ b/thirdparty/freetype/src/cff/cffparse.c @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (body) */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,7 @@ #include "cfferrs.h" #include "cffpic.h" #include "cffgload.h" +#include "cffload.h" /*************************************************************************/ @@ -36,22 +37,52 @@ #define FT_COMPONENT trace_cffparse - FT_LOCAL_DEF( void ) + FT_LOCAL_DEF( FT_Error ) cff_parser_init( CFF_Parser parser, FT_UInt code, void* object, FT_Library library, + FT_UInt stackSize, FT_UShort num_designs, FT_UShort num_axes ) { - FT_MEM_ZERO( parser, sizeof ( *parser ) ); + FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */ + FT_Error error; /* for FT_NEW_ARRAY */ + + + FT_ZERO( parser ); +#if 0 parser->top = parser->stack; +#endif parser->object_code = code; parser->object = object; parser->library = library; parser->num_designs = num_designs; parser->num_axes = num_axes; + + /* allocate the stack buffer */ + if ( FT_NEW_ARRAY( parser->stack, stackSize ) ) + { + FT_FREE( parser->stack ); + goto Exit; + } + + parser->stackSize = stackSize; + parser->top = parser->stack; /* empty stack */ + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_parser_done( CFF_Parser parser ) + { + FT_Memory memory = parser->library->memory; /* for FT_FREE */ + + + FT_FREE( parser->stack ); } @@ -402,24 +433,54 @@ /* read a number, either integer or real */ - static FT_Long - cff_parse_num( FT_Byte** d ) + FT_LOCAL_DEF( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ) { - return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) - : cff_parse_integer( d[0], d[1] ); + if ( **d == 30 ) + { + /* binary-coded decimal is truncated to integer */ + return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; + } + + else if ( **d == 255 ) + { + /* 16.16 fixed point is used internally for CFF2 blend results. */ + /* Since these are trusted values, a limit check is not needed. */ + + /* After the 255, 4 bytes give the number. */ + /* The blend value is converted to integer, with rounding; */ + /* due to the right-shift we don't need the lowest byte. */ +#if 0 + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 ); +#else + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 8 ) | + (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 ); +#endif + } + + else + return cff_parse_integer( *d, parser->limit ); } /* read a floating point number, either integer or real */ static FT_Fixed - do_fixed( FT_Byte** d, - FT_Long scaling ) + do_fixed( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) { if ( **d == 30 ) - return cff_parse_real( d[0], d[1], scaling, NULL ); + return cff_parse_real( *d, parser->limit, scaling, NULL ); else { - FT_Long val = cff_parse_integer( d[0], d[1] ); + FT_Long val = cff_parse_integer( *d, parser->limit ); if ( scaling ) @@ -447,19 +508,21 @@ /* read a floating point number, either integer or real */ static FT_Fixed - cff_parse_fixed( FT_Byte** d ) + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ) { - return do_fixed( d, 0 ); + return do_fixed( parser, d, 0 ); } /* read a floating point number, either integer or real, */ /* but return `10^scaling' times the number read in */ static FT_Fixed - cff_parse_fixed_scaled( FT_Byte** d, - FT_Long scaling ) + cff_parse_fixed_scaled( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) { - return do_fixed( d, scaling ); + return do_fixed( parser, d, scaling ); } @@ -467,13 +530,14 @@ /* and return it as precise as possible -- `scaling' returns */ /* the scaling factor (as a power of 10) */ static FT_Fixed - cff_parse_fixed_dynamic( FT_Byte** d, - FT_Long* scaling ) + cff_parse_fixed_dynamic( CFF_Parser parser, + FT_Byte** d, + FT_Long* scaling ) { FT_ASSERT( scaling ); if ( **d == 30 ) - return cff_parse_real( d[0], d[1], 0, scaling ); + return cff_parse_real( *d, parser->limit, 0, scaling ); else { FT_Long number; @@ -543,7 +607,7 @@ for ( i = 0; i < 6; i++ ) { - values[i] = cff_parse_fixed_dynamic( data++, &scalings[i] ); + values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] ); if ( values[i] ) { if ( scalings[i] > max_scaling ) @@ -640,10 +704,10 @@ if ( parser->top >= parser->stack + 4 ) { - bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); - bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); + bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); error = FT_Err_Ok; FT_TRACE4(( " [%d %d %d %d]\n", @@ -672,7 +736,7 @@ FT_Long tmp; - tmp = cff_parse_num( data++ ); + tmp = cff_parse_num( parser, data++ ); if ( tmp < 0 ) { FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); @@ -681,7 +745,7 @@ } dict->private_size = (FT_ULong)tmp; - tmp = cff_parse_num( data ); + tmp = cff_parse_num( parser, data ); if ( tmp < 0 ) { FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); @@ -726,7 +790,7 @@ /* currently, we handle only the first argument */ if ( parser->top >= parser->stack + 5 ) { - FT_Long num_designs = cff_parse_num( parser->stack ); + FT_Long num_designs = cff_parse_num( parser, parser->stack ); if ( num_designs > 16 || num_designs < 2 ) @@ -763,11 +827,11 @@ if ( parser->top >= parser->stack + 3 ) { - dict->cid_registry = (FT_UInt)cff_parse_num( data++ ); - dict->cid_ordering = (FT_UInt)cff_parse_num( data++ ); + dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ ); if ( **data == 30 ) FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); - dict->cid_supplement = cff_parse_num( data ); + dict->cid_supplement = cff_parse_num( parser, data ); if ( dict->cid_supplement < 0 ) FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", dict->cid_supplement )); @@ -783,6 +847,123 @@ } + static FT_Error + cff_parse_vsindex( CFF_Parser parser ) + { + /* vsindex operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + FT_Byte** data = parser->stack; + CFF_Blend blend; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + blend = &priv->subfont->blend; + + if ( blend->usedBV ) + { + FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" )); + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ ); + + FT_TRACE4(( " %d\n", priv->vsindex )); + + error = FT_Err_Ok; + + Exit: + return error; + } + + + static FT_Error + cff_parse_blend( CFF_Parser parser ) + { + /* blend operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + CFF_SubFont subFont; + CFF_Blend blend; + FT_UInt numBlends; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + subFont = priv->subfont; + blend = &subFont->blend; + + if ( cff_blend_check_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ) ) + { + error = cff_blend_build_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ); + if ( error ) + goto Exit; + } + + numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 ); + if ( numBlends > parser->stackSize ) + { + FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE4(( " %d values blended\n", numBlends )); + + error = cff_blend_doBlend( subFont, parser, numBlends ); + + blend->usedBV = TRUE; + + Exit: + return error; + } + + + /* maxstack operator increases parser and operand stacks for CFF2 */ + static FT_Error + cff_parse_maxstack( CFF_Parser parser ) + { + /* maxstack operator can only be used in a Top DICT */ + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error = FT_Err_Ok; + + + if ( !dict ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ ); + if ( dict->maxstack > CFF2_MAX_STACK ) + dict->maxstack = CFF2_MAX_STACK; + if ( dict->maxstack < CFF2_DEFAULT_STACK ) + dict->maxstack = CFF2_DEFAULT_STACK; + + FT_TRACE4(( " %d\n", dict->maxstack )); + + Exit: + return error; + } + + #define CFF_FIELD_NUM( code, name, id ) \ CFF_FIELD( code, name, id, cff_kind_num ) #define CFF_FIELD_FIXED( code, name, id ) \ @@ -794,9 +975,6 @@ #define CFF_FIELD_BOOL( code, name, id ) \ CFF_FIELD( code, name, id, cff_kind_bool ) -#define CFFCODE_TOPDICT 0x1000 -#define CFFCODE_PRIVATE 0x2000 - #ifndef FT_CONFIG_OPTION_PIC @@ -817,6 +995,15 @@ 0, 0 \ }, +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0 \ + }, + #define CFF_FIELD( code, name, id, kind ) \ { \ kind, \ @@ -860,6 +1047,16 @@ id \ }, +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0, \ + id \ + }, + #define CFF_FIELD( code, name, id, kind ) \ { \ kind, \ @@ -926,6 +1123,8 @@ #define CFF_FIELD_DELTA( code, name, max, id ) i++; #undef CFF_FIELD_CALLBACK #define CFF_FIELD_CALLBACK( code, name, id ) i++; +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code, id ) i++; #include "cfftoken.h" @@ -973,6 +1172,17 @@ clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ i++; +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code_, id_ ) \ + clazz[i].kind = cff_kind_blend; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_blend; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; + #include "cfftoken.h" clazz[i].kind = 0; @@ -1023,6 +1233,18 @@ clazz[i].id = id_; \ i++; +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code_, id_ ) \ + clazz[i].kind = cff_kind_blend; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_blend; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + clazz[i].id = id_; \ + i++; + #include "cfftoken.h" clazz[i].kind = 0; @@ -1067,11 +1289,13 @@ { FT_UInt v = *p; - - if ( v >= 27 && v != 31 ) + /* Opcode 31 is legacy MM T2 operator, not a number. */ + /* Opcode 255 is reserved and should not appear in fonts; */ + /* it is used internally for CFF2 blends. */ + if ( v >= 27 && v != 31 && v != 255 ) { /* it's a number; we will push its position on the stack */ - if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) goto Stack_Overflow; *parser->top++ = p; @@ -1132,8 +1356,8 @@ charstring_len = (FT_ULong)( p - charstring_base ) + 1; /* construct CFF_Decoder object */ - FT_MEM_ZERO( &decoder, sizeof ( decoder ) ); - FT_MEM_ZERO( &cff_rec, sizeof ( cff_rec ) ); + FT_ZERO( &decoder ); + FT_ZERO( &cff_rec ); cff_rec.top_font.font_dict.num_designs = parser->num_designs; cff_rec.top_font.font_dict.num_axes = parser->num_axes; @@ -1162,7 +1386,7 @@ FT_Bool neg; - if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) goto Stack_Overflow; *parser->top++ = q; @@ -1239,13 +1463,17 @@ /* and look for it in our current list. */ FT_UInt code; - FT_UInt num_args = (FT_UInt) - ( parser->top - parser->stack ); + FT_UInt num_args; const CFF_Field_Handler* field; + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + num_args = (FT_UInt)( parser->top - parser->stack ); *parser->top = p; - code = v; + code = v; + if ( v == 12 ) { /* two byte operator */ @@ -1280,15 +1508,15 @@ case cff_kind_bool: case cff_kind_string: case cff_kind_num: - val = cff_parse_num( parser->stack ); + val = cff_parse_num( parser, parser->stack ); goto Store_Number; case cff_kind_fixed: - val = cff_parse_fixed( parser->stack ); + val = cff_parse_fixed( parser, parser->stack ); goto Store_Number; case cff_kind_fixed_thousand: - val = cff_parse_fixed_scaled( parser->stack, 3 ); + val = cff_parse_fixed_scaled( parser, parser->stack, 3 ); Store_Number: switch ( field->size ) @@ -1357,7 +1585,7 @@ val = 0; while ( num_args > 0 ) { - val += cff_parse_num( data++ ); + val += cff_parse_num( parser, data++ ); switch ( field->size ) { case (8 / FT_CHAR_BIT): @@ -1386,7 +1614,7 @@ } break; - default: /* callback */ + default: /* callback or blend */ error = field->reader( parser ); if ( error ) goto Exit; @@ -1400,7 +1628,10 @@ Found: /* clear stack */ - parser->top = parser->stack; + /* TODO: could clear blend stack here, */ + /* but we don't have access to subFont */ + if ( field->kind != cff_kind_blend ) + parser->top = parser->stack; } p++; } diff --git a/thirdparty/freetype/src/cff/cffparse.h b/thirdparty/freetype/src/cff/cffparse.h index a95970edcb..83d1bba45f 100644 --- a/thirdparty/freetype/src/cff/cffparse.h +++ b/thirdparty/freetype/src/cff/cffparse.h @@ -4,7 +4,7 @@ /* */ /* CFF token stream parser (specification) */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -28,10 +28,25 @@ FT_BEGIN_HEADER + /* CFF uses constant parser stack size; */ + /* CFF2 can increase from default 193 */ #define CFF_MAX_STACK_DEPTH 96 -#define CFF_CODE_TOPDICT 0x1000 -#define CFF_CODE_PRIVATE 0x2000 + /* + * There are plans to remove the `maxstack' operator in a forthcoming + * revision of the CFF2 specification, increasing the (then static) stack + * size to 513. By making the default stack size equal to the maximum + * stack size, the operator is essentially disabled, which has the + * desired effect in FreeType. + */ +#define CFF2_MAX_STACK 513 +#define CFF2_DEFAULT_STACK 513 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 +#define CFF2_CODE_TOPDICT 0x3000 +#define CFF2_CODE_FONTDICT 0x4000 +#define CFF2_CODE_PRIVATE 0x5000 typedef struct CFF_ParserRec_ @@ -41,8 +56,9 @@ FT_BEGIN_HEADER FT_Byte* limit; FT_Byte* cursor; - FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; + FT_Byte** stack; FT_Byte** top; + FT_UInt stackSize; /* allocated size */ FT_UInt object_code; void* object; @@ -53,14 +69,22 @@ FT_BEGIN_HEADER } CFF_ParserRec, *CFF_Parser; - FT_LOCAL( void ) + FT_LOCAL( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ); + + FT_LOCAL( FT_Error ) cff_parser_init( CFF_Parser parser, FT_UInt code, void* object, FT_Library library, + FT_UInt stackSize, FT_UShort num_designs, FT_UShort num_axes ); + FT_LOCAL( void ) + cff_parser_done( CFF_Parser parser ); + FT_LOCAL( FT_Error ) cff_parser_run( CFF_Parser parser, FT_Byte* start, @@ -77,6 +101,7 @@ FT_BEGIN_HEADER cff_kind_bool, cff_kind_delta, cff_kind_callback, + cff_kind_blend, cff_kind_max /* do not remove */ }; diff --git a/thirdparty/freetype/src/cff/cffpic.c b/thirdparty/freetype/src/cff/cffpic.c index a0bc34fd5f..4e9ba12b3f 100644 --- a/thirdparty/freetype/src/cff/cffpic.c +++ b/thirdparty/freetype/src/cff/cffpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for cff module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cff/cffpic.h b/thirdparty/freetype/src/cff/cffpic.h index bed6b35a86..5db39cd627 100644 --- a/thirdparty/freetype/src/cff/cffpic.h +++ b/thirdparty/freetype/src/cff/cffpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for cff module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -32,6 +32,8 @@ #define CFF_SERVICE_CID_INFO_GET cff_service_cid_info #define CFF_SERVICE_PROPERTIES_GET cff_service_properties #define CFF_SERVICES_GET cff_services +#define CFF_SERVICE_MULTI_MASTERS_GET cff_service_multi_masters +#define CFF_SERVICE_METRICS_VAR_GET cff_service_metrics_variations #define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec #define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec #define CFF_FIELD_HANDLERS_GET cff_field_handlers @@ -45,22 +47,26 @@ #include FT_SERVICE_TT_CMAP_H #include FT_SERVICE_CID_H #include FT_SERVICE_PROPERTIES_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H FT_BEGIN_HEADER typedef struct CffModulePIC_ { - FT_ServiceDescRec* cff_services; - CFF_Field_Handler* cff_field_handlers; - FT_Service_PsInfoRec cff_service_ps_info; - FT_Service_GlyphDictRec cff_service_glyph_dict; - FT_Service_PsFontNameRec cff_service_ps_name; - FT_Service_TTCMapsRec cff_service_get_cmap_info; - FT_Service_CIDRec cff_service_cid_info; - FT_Service_PropertiesRec cff_service_properties; - FT_CMap_ClassRec cff_cmap_encoding_class_rec; - FT_CMap_ClassRec cff_cmap_unicode_class_rec; + FT_ServiceDescRec* cff_services; + CFF_Field_Handler* cff_field_handlers; + FT_Service_PsInfoRec cff_service_ps_info; + FT_Service_GlyphDictRec cff_service_glyph_dict; + FT_Service_PsFontNameRec cff_service_ps_name; + FT_Service_TTCMapsRec cff_service_get_cmap_info; + FT_Service_CIDRec cff_service_cid_info; + FT_Service_PropertiesRec cff_service_properties; + FT_Service_MultiMastersRec cff_service_multi_masters; + FT_Service_MetricsVariationsRec cff_service_metrics_variations; + FT_CMap_ClassRec cff_cmap_encoding_class_rec; + FT_CMap_ClassRec cff_cmap_unicode_class_rec; } CffModulePIC; @@ -82,6 +88,10 @@ FT_BEGIN_HEADER ( GET_PIC( library )->cff_service_properties ) #define CFF_SERVICES_GET \ ( GET_PIC( library )->cff_services ) +#define CFF_SERVICE_MULTI_MASTERS_GET \ + ( GET_PIC( library )->cff_service_multi_masters ) +#define CFF_SERVICE_METRICS_VAR_GET \ + ( GET_PIC( library )->cff_service_metrics_variations ) #define CFF_CMAP_ENCODING_CLASS_REC_GET \ ( GET_PIC( library )->cff_cmap_encoding_class_rec ) #define CFF_CMAP_UNICODE_CLASS_REC_GET \ diff --git a/thirdparty/freetype/src/cff/cfftoken.h b/thirdparty/freetype/src/cff/cfftoken.h index 22637c780b..3222e933f1 100644 --- a/thirdparty/freetype/src/cff/cfftoken.h +++ b/thirdparty/freetype/src/cff/cfftoken.h @@ -4,7 +4,7 @@ /* */ /* CFF token definitions (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,7 +20,7 @@ #define FT_STRUCTURE CFF_FontRecDictRec #undef CFFCODE -#define CFFCODE CFFCODE_TOPDICT +#define CFFCODE CFF_CODE_TOPDICT CFF_FIELD_STRING ( 0, version, "Version" ) CFF_FIELD_STRING ( 1, notice, "Notice" ) @@ -78,7 +78,7 @@ #undef FT_STRUCTURE #define FT_STRUCTURE CFF_PrivateRec #undef CFFCODE -#define CFFCODE CFFCODE_PRIVATE +#define CFFCODE CFF_CODE_PRIVATE CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) @@ -102,4 +102,49 @@ CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" ) +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_TOPDICT + + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) + CFF_FIELD_NUM ( 24, vstore_offset, "vstore" ) + CFF_FIELD_CALLBACK( 25, maxstack, "maxstack" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_FONTDICT + + CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) + CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) + CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) + CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) + CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) + CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) + CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) + CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) + CFF_FIELD_CALLBACK ( 22, vsindex, "vsindex" ) + CFF_FIELD_BLEND ( 23, "blend" ) + CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) + + /* END */ diff --git a/thirdparty/freetype/src/cff/cfftypes.h b/thirdparty/freetype/src/cff/cfftypes.h index 4426c7e4f1..74f569f08b 100644 --- a/thirdparty/freetype/src/cff/cfftypes.h +++ b/thirdparty/freetype/src/cff/cfftypes.h @@ -5,7 +5,7 @@ /* Basic OpenType/CFF type definitions and interface (specification */ /* only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -64,6 +64,7 @@ FT_BEGIN_HEADER { FT_Stream stream; FT_ULong start; + FT_UInt hdr_size; FT_UInt count; FT_Byte off_size; FT_ULong data_offset; @@ -102,6 +103,79 @@ FT_BEGIN_HEADER } CFF_CharsetRec, *CFF_Charset; + /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */ + + typedef struct CFF_VarData_ + { +#if 0 + FT_UInt itemCount; /* not used; always zero */ + FT_UInt shortDeltaCount; /* not used; always zero */ +#endif + + FT_UInt regionIdxCount; /* number of region indexes */ + FT_UInt* regionIndices; /* array of `regionIdxCount' indices; */ + /* these index `varRegionList' */ + } CFF_VarData; + + + /* contribution of one axis to a region */ + typedef struct CFF_AxisCoords_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero peak means no effect (factor = 1) */ + FT_Fixed endCoord; + + } CFF_AxisCoords; + + + typedef struct CFF_VarRegion_ + { + CFF_AxisCoords* axisList; /* array of axisCount records */ + + } CFF_VarRegion; + + + typedef struct CFF_VStoreRec_ + { + FT_UInt dataCount; + CFF_VarData* varData; /* array of dataCount records */ + /* vsindex indexes this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + CFF_VarRegion* varRegionList; + + } CFF_VStoreRec, *CFF_VStore; + + + /* forward reference */ + typedef struct CFF_FontRec_* CFF_Font; + + + /* This object manages one cached blend vector. */ + /* */ + /* There is a BlendRec for Private DICT parsing in each subfont */ + /* and a BlendRec for charstrings in CF2_Font instance data. */ + /* A cached BV may be used across DICTs or Charstrings if inputs */ + /* have not changed. */ + /* */ + /* `usedBV' is reset at the start of each parse or charstring. */ + /* vsindex cannot be changed after a BV is used. */ + /* */ + /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32). */ + typedef struct CFF_BlendRec_ + { + FT_Bool builtBV; /* blendV has been built */ + FT_Bool usedBV; /* blendV has been used */ + CFF_Font font; /* top level font struct */ + FT_UInt lastVsindex; /* last vsindex used */ + FT_UInt lenNDV; /* normDV length (aka numAxes) */ + FT_Fixed* lastNDV; /* last NDV used */ + FT_UInt lenBV; /* BlendV length (aka numMasters) */ + FT_Int32* BV; /* current blendV (per DICT/glyph) */ + + } CFF_BlendRec, *CFF_Blend; + + typedef struct CFF_FontRecDictRec_ { FT_UInt version; @@ -151,9 +225,17 @@ FT_BEGIN_HEADER FT_UShort num_designs; FT_UShort num_axes; + /* fields for CFF2 */ + FT_ULong vstore_offset; + FT_UInt maxstack; + } CFF_FontRecDictRec, *CFF_FontRecDict; + /* forward reference */ + typedef struct CFF_SubFontRec_* CFF_SubFont; + + typedef struct CFF_PrivateRec_ { FT_Byte num_blue_values; @@ -186,6 +268,10 @@ FT_BEGIN_HEADER FT_Pos default_width; FT_Pos nominal_width; + /* fields for CFF2 */ + FT_UInt vsindex; + CFF_SubFont subfont; + } CFF_PrivateRec, *CFF_Private; @@ -213,10 +299,31 @@ FT_BEGIN_HEADER CFF_FontRecDictRec font_dict; CFF_PrivateRec private_dict; - CFF_IndexRec local_subrs_index; - FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */ + /* fields for CFF2 */ + CFF_BlendRec blend; /* current blend vector */ + FT_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + + /* `blend_stack' is a writable buffer to hold blend results. */ + /* This buffer is to the side of the normal cff parser stack; */ + /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */ + /* The normal stack then points to these values instead of the DICT */ + /* because all other operators in Private DICT clear the stack. */ + /* `blend_stack' could be cleared at each operator other than blend. */ + /* Blended values are stored as 5-byte fixed point values. */ + + FT_Byte* blend_stack; /* base of stack allocation */ + FT_Byte* blend_top; /* first empty slot */ + FT_UInt blend_used; /* number of bytes in use */ + FT_UInt blend_alloc; /* number of bytes allocated */ + + CFF_IndexRec local_subrs_index; + FT_Byte** local_subrs; /* array of pointers */ + /* into Local Subrs INDEX data */ - } CFF_SubFontRec, *CFF_SubFont; + FT_UInt32 random; + + } CFF_SubFontRec; #define CFF_MAX_CID_FONTS 256 @@ -224,16 +331,20 @@ FT_BEGIN_HEADER typedef struct CFF_FontRec_ { + FT_Library library; FT_Stream stream; - FT_Memory memory; + FT_Memory memory; /* TODO: take this from stream->memory? */ + FT_ULong base_offset; /* offset to start of CFF */ FT_UInt num_faces; FT_UInt num_glyphs; FT_Byte version_major; FT_Byte version_minor; FT_Byte header_size; - FT_Byte absolute_offsize; + FT_UInt top_dict_length; /* cff2 only */ + + FT_Bool cff2; CFF_IndexRec name_index; CFF_IndexRec top_dict_index; @@ -280,7 +391,10 @@ FT_BEGIN_HEADER /* since version 2.4.12 */ FT_Generic cf2_instance; - } CFF_FontRec, *CFF_Font; + /* since version 2.7.1 */ + CFF_VStoreRec vstore; /* parsed vstore structure */ + + } CFF_FontRec; FT_END_HEADER diff --git a/thirdparty/freetype/src/cff/module.mk b/thirdparty/freetype/src/cff/module.mk index 1b4781afed..2975aeed8c 100644 --- a/thirdparty/freetype/src/cff/module.mk +++ b/thirdparty/freetype/src/cff/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/cff/rules.mk b/thirdparty/freetype/src/cff/rules.mk index 92f68b1ede..86840bfe3c 100644 --- a/thirdparty/freetype/src/cff/rules.mk +++ b/thirdparty/freetype/src/cff/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/cid/ciderrs.h b/thirdparty/freetype/src/cid/ciderrs.h index 1dc98c7cdd..709dc8cd1e 100644 --- a/thirdparty/freetype/src/cid/ciderrs.h +++ b/thirdparty/freetype/src/cid/ciderrs.h @@ -4,7 +4,7 @@ /* */ /* CID error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidgload.c b/thirdparty/freetype/src/cid/cidgload.c index c7b95593ee..b96c33334d 100644 --- a/thirdparty/freetype/src/cid/cidgload.c +++ b/thirdparty/freetype/src/cid/cidgload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 Glyph Loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidgload.h b/thirdparty/freetype/src/cid/cidgload.h index 62d664b3af..7f816b5bc7 100644 --- a/thirdparty/freetype/src/cid/cidgload.h +++ b/thirdparty/freetype/src/cid/cidgload.h @@ -4,7 +4,7 @@ /* */ /* OpenType Glyph Loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidload.c b/thirdparty/freetype/src/cid/cidload.c index d4f1ad1a7f..ff0722110d 100644 --- a/thirdparty/freetype/src/cid/cidload.c +++ b/thirdparty/freetype/src/cid/cidload.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -461,6 +461,9 @@ FT_Byte* p; + if ( !num_subrs ) + continue; + /* reallocate offsets array if needed */ if ( num_subrs + 1 > max_offsets ) { @@ -570,7 +573,7 @@ { FT_UNUSED( face ); - FT_MEM_ZERO( loader, sizeof ( *loader ) ); + FT_ZERO( loader ); } @@ -733,9 +736,11 @@ } /* we must convert the data section from hexadecimal to binary */ - if ( FT_ALLOC( face->binary_data, parser->binary_length ) || - cid_hex_to_binary( face->binary_data, parser->binary_length, - parser->data_offset, face ) ) + if ( FT_ALLOC( face->binary_data, parser->binary_length ) || + FT_SET_ERROR( cid_hex_to_binary( face->binary_data, + parser->binary_length, + parser->data_offset, + face ) ) ) goto Exit; FT_Stream_OpenMemory( face->cid_stream, @@ -777,7 +782,8 @@ CID_FaceDict dict = cid->font_dicts + n; - if ( dict->sd_bytes < 0 ) + if ( dict->sd_bytes < 0 || + ( dict->num_subrs && dict->sd_bytes < 1 ) ) { FT_ERROR(( "cid_parse_dict: Invalid `SDBytes' value\n" )); error = FT_THROW( Invalid_File_Format ); diff --git a/thirdparty/freetype/src/cid/cidload.h b/thirdparty/freetype/src/cid/cidload.h index 680f0d8fc5..45a0e6df25 100644 --- a/thirdparty/freetype/src/cid/cidload.h +++ b/thirdparty/freetype/src/cid/cidload.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 font loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidobjs.c b/thirdparty/freetype/src/cid/cidobjs.c index 2d2600fd4c..ceda8ff97f 100644 --- a/thirdparty/freetype/src/cid/cidobjs.c +++ b/thirdparty/freetype/src/cid/cidobjs.c @@ -4,7 +4,7 @@ /* */ /* CID objects manager (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -113,16 +113,16 @@ CID_Size size = (CID_Size)cidsize; - if ( cidsize->internal ) + if ( cidsize->internal->module_data ) { PSH_Globals_Funcs funcs; funcs = cid_size_get_globals_funcs( size ); if ( funcs ) - funcs->destroy( (PSH_Globals)cidsize->internal ); + funcs->destroy( (PSH_Globals)cidsize->internal->module_data ); - cidsize->internal = NULL; + cidsize->internal->module_data = NULL; } } @@ -145,7 +145,7 @@ error = funcs->create( cidsize->face->memory, priv, &globals ); if ( !error ) - cidsize->internal = (FT_Size_Internal)(void*)globals; + cidsize->internal->module_data = globals; } return error; @@ -164,7 +164,7 @@ funcs = cid_size_get_globals_funcs( (CID_Size)size ); if ( funcs ) - funcs->set_scale( (PSH_Globals)size->internal, + funcs->set_scale( (PSH_Globals)size->internal->module_data, size->metrics.x_scale, size->metrics.y_scale, 0, 0 ); diff --git a/thirdparty/freetype/src/cid/cidobjs.h b/thirdparty/freetype/src/cid/cidobjs.h index 5dd377a9f8..8bcf886e10 100644 --- a/thirdparty/freetype/src/cid/cidobjs.h +++ b/thirdparty/freetype/src/cid/cidobjs.h @@ -4,7 +4,7 @@ /* */ /* CID objects manager (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidparse.c b/thirdparty/freetype/src/cid/cidparse.c index 73aca2ac6a..007609bbdf 100644 --- a/thirdparty/freetype/src/cid/cidparse.c +++ b/thirdparty/freetype/src/cid/cidparse.c @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -65,7 +65,7 @@ FT_Byte *arg1, *arg2; - FT_MEM_ZERO( parser, sizeof ( *parser ) ); + FT_ZERO( parser ); psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); parser->stream = stream; @@ -138,13 +138,13 @@ ft_strncmp( (char*)p, STARTDATA, STARTDATA_LEN ) == 0 ) { /* save offset of binary data after `StartData' */ - offset += (FT_ULong)( p - buffer ) + STARTDATA_LEN; + offset += (FT_ULong)( p - buffer ) + STARTDATA_LEN + 1; goto Found; } else if ( p[1] == 's' && ft_strncmp( (char*)p, SFNTS, SFNTS_LEN ) == 0 ) { - offset += (FT_ULong)( p - buffer ) + SFNTS_LEN; + offset += (FT_ULong)( p - buffer ) + SFNTS_LEN + 1; goto Found; } } @@ -199,7 +199,7 @@ limit = parser->root.limit; cur = parser->root.cursor; - while ( cur < limit - SFNTS_LEN ) + while ( cur <= limit - SFNTS_LEN ) { if ( parser->root.error ) { @@ -208,12 +208,12 @@ } if ( cur[0] == 'S' && - cur < limit - STARTDATA_LEN && + cur <= limit - STARTDATA_LEN && ft_strncmp( (char*)cur, STARTDATA, STARTDATA_LEN ) == 0 ) { if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) { - FT_Long tmp = ft_atol( (const char *)arg2 ); + FT_Long tmp = ft_strtol( (const char *)arg2, NULL, 10 ); if ( tmp < 0 ) diff --git a/thirdparty/freetype/src/cid/cidparse.h b/thirdparty/freetype/src/cid/cidparse.h index 7268dc6ae8..20bebb942b 100644 --- a/thirdparty/freetype/src/cid/cidparse.h +++ b/thirdparty/freetype/src/cid/cidparse.h @@ -4,7 +4,7 @@ /* */ /* CID-keyed Type1 parser (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidriver.c b/thirdparty/freetype/src/cid/cidriver.c index 64141ab6b1..bb611a961e 100644 --- a/thirdparty/freetype/src/cid/cidriver.c +++ b/thirdparty/freetype/src/cid/cidriver.c @@ -4,7 +4,7 @@ /* */ /* CID driver interface (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -206,7 +206,7 @@ 0x10000L, /* version 1.0 of driver */ 0x20000L, /* requires FreeType 2.0 */ - 0, /* module-specific interface */ + NULL, /* module-specific interface */ cid_driver_init, /* FT_Module_Constructor module_init */ cid_driver_done, /* FT_Module_Destructor module_done */ @@ -226,12 +226,12 @@ cid_slot_load_glyph, /* FT_Slot_LoadFunc load_glyph */ - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ cid_size_request, /* FT_Size_RequestFunc request_size */ - 0 /* FT_Size_SelectFunc select_size */ + NULL /* FT_Size_SelectFunc select_size */ }; diff --git a/thirdparty/freetype/src/cid/cidriver.h b/thirdparty/freetype/src/cid/cidriver.h index a359a78907..76640c57ba 100644 --- a/thirdparty/freetype/src/cid/cidriver.h +++ b/thirdparty/freetype/src/cid/cidriver.h @@ -4,7 +4,7 @@ /* */ /* High-level CID driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/cidtoken.h b/thirdparty/freetype/src/cid/cidtoken.h index 9c773fd094..653cc5586e 100644 --- a/thirdparty/freetype/src/cid/cidtoken.h +++ b/thirdparty/freetype/src/cid/cidtoken.h @@ -4,7 +4,7 @@ /* */ /* CID token definitions (specification only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/cid/module.mk b/thirdparty/freetype/src/cid/module.mk index d9585d7816..b30b8679b9 100644 --- a/thirdparty/freetype/src/cid/module.mk +++ b/thirdparty/freetype/src/cid/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/cid/rules.mk b/thirdparty/freetype/src/cid/rules.mk index f33aab00d6..fcddd92eca 100644 --- a/thirdparty/freetype/src/cid/rules.mk +++ b/thirdparty/freetype/src/cid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/cid/type1cid.c b/thirdparty/freetype/src/cid/type1cid.c index de3bdf7705..93e6f810db 100644 --- a/thirdparty/freetype/src/cid/type1cid.c +++ b/thirdparty/freetype/src/cid/type1cid.c @@ -4,7 +4,7 @@ /* */ /* FreeType OpenType driver component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,13 +17,13 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "cidparse.c" + +#include "cidgload.c" #include "cidload.c" #include "cidobjs.c" +#include "cidparse.c" #include "cidriver.c" -#include "cidgload.c" /* END */ diff --git a/thirdparty/freetype/src/gxvalid/README b/thirdparty/freetype/src/gxvalid/README index d3ac49c3e2..7201459aaf 100644 --- a/thirdparty/freetype/src/gxvalid/README +++ b/thirdparty/freetype/src/gxvalid/README @@ -413,7 +413,7 @@ gxvalid: TrueType GX validator format assured for Windows and OS/2 support is only subtable format 0. The Microsoft TrueType specification also describes subtable format 2, but does not mention which platforms support - it. Aubtable formats 1, 3, and higher are documented as reserved + it. Subtable formats 1, 3, and higher are documented as reserved for future use. Therefore, the classic version can store subtable formats 0 and 2, at least. `ttfdump.exe', a font tool provided by Microsoft, ignores the subtable format written in the subtable @@ -518,7 +518,7 @@ gxvalid: TrueType GX validator ------------------------------------------------------------------------ -Copyright 2004-2016 by +Copyright 2004-2017 by suzuki toshiya, Masatake YAMATO, Red hat K.K., David Turner, Robert Wilhelm, and Werner Lemberg. diff --git a/thirdparty/freetype/src/gxvalid/gxvalid.c b/thirdparty/freetype/src/gxvalid/gxvalid.c index 7fb868cad1..da485141d3 100644 --- a/thirdparty/freetype/src/gxvalid/gxvalid.c +++ b/thirdparty/freetype/src/gxvalid/gxvalid.c @@ -4,7 +4,7 @@ /* */ /* FreeType validator for TrueTypeGX/AAT tables (body only). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -16,15 +16,17 @@ /* */ /***************************************************************************/ -#define FT_MAKE_OPTION_SINGLE_OBJECT +#define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> -#include "gxvfeat.c" -#include "gxvcommn.c" #include "gxvbsln.c" -#include "gxvtrak.c" +#include "gxvcommn.c" +#include "gxvfeat.c" #include "gxvjust.c" +#include "gxvkern.c" +#include "gxvlcar.c" +#include "gxvmod.c" #include "gxvmort.c" #include "gxvmort0.c" #include "gxvmort1.c" @@ -37,11 +39,9 @@ #include "gxvmorx2.c" #include "gxvmorx4.c" #include "gxvmorx5.c" -#include "gxvkern.c" #include "gxvopbd.c" #include "gxvprop.c" -#include "gxvlcar.c" -#include "gxvmod.c" +#include "gxvtrak.c" /* END */ diff --git a/thirdparty/freetype/src/gxvalid/gxvalid.h b/thirdparty/freetype/src/gxvalid/gxvalid.h index 7a3ab795ef..78116ef85a 100644 --- a/thirdparty/freetype/src/gxvalid/gxvalid.h +++ b/thirdparty/freetype/src/gxvalid/gxvalid.h @@ -2,9 +2,9 @@ /* */ /* gxvalid.h */ /* */ -/* TrueTyeeGX/AAT table validation (specification only). */ +/* TrueTypeGX/AAT table validation (specification only). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvbsln.c b/thirdparty/freetype/src/gxvalid/gxvbsln.c index 493b20c31a..81dff7304d 100644 --- a/thirdparty/freetype/src/gxvalid/gxvbsln.c +++ b/thirdparty/freetype/src/gxvalid/gxvbsln.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT bsln table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvcommn.c b/thirdparty/freetype/src/gxvalid/gxvcommn.c index 4b5e41539a..db0a91ea74 100644 --- a/thirdparty/freetype/src/gxvalid/gxvcommn.c +++ b/thirdparty/freetype/src/gxvalid/gxvcommn.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT common tables validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -454,7 +454,7 @@ } - /* ================= Segment Single Format 2 Loolup Table ============== */ + /* ================= Segment Single Format 2 Lookup Table ============== */ /* * Apple spec says: * @@ -789,7 +789,7 @@ FT_INVALID_FORMAT; func = fmt_funcs_table[format]; - if ( func == NULL ) + if ( !func ) FT_INVALID_FORMAT; func( p, limit, gxvalid ); @@ -972,7 +972,7 @@ FT_UShort i; - ft_memset( nGlyphInClass, 0, 256 ); + FT_MEM_ZERO( nGlyphInClass, 256 ); for ( i = 0; i < nGlyphs; i++ ) @@ -1161,7 +1161,7 @@ break; } - if ( NULL != gxvalid->statetable.entry_validate_func ) + if ( gxvalid->statetable.entry_validate_func ) gxvalid->statetable.entry_validate_func( state, flags, &glyphOffset, @@ -1244,10 +1244,10 @@ if ( stateSize > 0xFF ) FT_INVALID_DATA; - if ( gxvalid->statetable.optdata_load_func != NULL ) + if ( gxvalid->statetable.optdata_load_func ) gxvalid->statetable.optdata_load_func( p, limit, gxvalid ); - if ( gxvalid->statetable.subtable_setup_func != NULL) + if ( gxvalid->statetable.subtable_setup_func ) setup_func = gxvalid->statetable.subtable_setup_func; else setup_func = gxv_StateTable_subtable_setup; @@ -1534,7 +1534,7 @@ goto Exit; } - if ( NULL != gxvalid->xstatetable.entry_validate_func ) + if ( gxvalid->xstatetable.entry_validate_func ) gxvalid->xstatetable.entry_validate_func( state, flags, &glyphOffset, @@ -1591,10 +1591,10 @@ GXV_TRACE(( "StateTable Subtables\n" )); - if ( gxvalid->xstatetable.optdata_load_func != NULL ) + if ( gxvalid->xstatetable.optdata_load_func ) gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid ); - if ( gxvalid->xstatetable.subtable_setup_func != NULL ) + if ( gxvalid->xstatetable.subtable_setup_func ) setup_func = gxvalid->xstatetable.subtable_setup_func; else setup_func = gxv_XStateTable_subtable_setup; diff --git a/thirdparty/freetype/src/gxvalid/gxvcommn.h b/thirdparty/freetype/src/gxvalid/gxvcommn.h index 9470c8412b..10b1c800f0 100644 --- a/thirdparty/freetype/src/gxvalid/gxvcommn.h +++ b/thirdparty/freetype/src/gxvalid/gxvcommn.h @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT common tables validation (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxverror.h b/thirdparty/freetype/src/gxvalid/gxverror.h index 2e53355ce4..80a2b8a262 100644 --- a/thirdparty/freetype/src/gxvalid/gxverror.h +++ b/thirdparty/freetype/src/gxvalid/gxverror.h @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT validation module error codes (specification only). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvfeat.c b/thirdparty/freetype/src/gxvalid/gxvfeat.c index 5bff7c261d..2e3ec6f9be 100644 --- a/thirdparty/freetype/src/gxvalid/gxvfeat.c +++ b/thirdparty/freetype/src/gxvalid/gxvfeat.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT feat table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvfeat.h b/thirdparty/freetype/src/gxvalid/gxvfeat.h index 284bada891..8c0e847eb7 100644 --- a/thirdparty/freetype/src/gxvalid/gxvfeat.h +++ b/thirdparty/freetype/src/gxvalid/gxvfeat.h @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT feat table validation (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvfgen.c b/thirdparty/freetype/src/gxvalid/gxvfgen.c index 667dac3cde..8cc08cd9c3 100644 --- a/thirdparty/freetype/src/gxvalid/gxvfgen.c +++ b/thirdparty/freetype/src/gxvalid/gxvfgen.c @@ -5,7 +5,7 @@ /* Generate feature registry data for gxv `feat' validator. */ /* This program is derived from gxfeatreg.c in gxlayout. */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* Masatake YAMATO and Redhat K.K. */ /* */ /* This file may only be used, */ diff --git a/thirdparty/freetype/src/gxvalid/gxvjust.c b/thirdparty/freetype/src/gxvalid/gxvjust.c index 20d29bfbc8..c8cfd83eac 100644 --- a/thirdparty/freetype/src/gxvalid/gxvjust.c +++ b/thirdparty/freetype/src/gxvalid/gxvjust.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT just table validation (body). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvkern.c b/thirdparty/freetype/src/gxvalid/gxvkern.c index ee1ab36f70..9f9037387d 100644 --- a/thirdparty/freetype/src/gxvalid/gxvkern.c +++ b/thirdparty/freetype/src/gxvalid/gxvkern.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT kern table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvlcar.c b/thirdparty/freetype/src/gxvalid/gxvlcar.c index d31b6410bd..775d5229f2 100644 --- a/thirdparty/freetype/src/gxvalid/gxvlcar.c +++ b/thirdparty/freetype/src/gxvalid/gxvlcar.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT lcar table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmod.c b/thirdparty/freetype/src/gxvalid/gxvmod.c index e589a7fb79..84e9275baf 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmod.c +++ b/thirdparty/freetype/src/gxvalid/gxvmod.c @@ -4,7 +4,7 @@ /* */ /* FreeType's TrueTypeGX/AAT validation module implementation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -274,11 +274,11 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) gxvalid_get_service + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) gxvalid_get_service /* get_interface */ }; diff --git a/thirdparty/freetype/src/gxvalid/gxvmod.h b/thirdparty/freetype/src/gxvalid/gxvmod.h index 8b82e91070..df25e60cb2 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmod.h +++ b/thirdparty/freetype/src/gxvalid/gxvmod.h @@ -5,7 +5,7 @@ /* FreeType's TrueTypeGX/AAT validation module implementation */ /* (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort.c b/thirdparty/freetype/src/gxvalid/gxvmort.c index b83a2b2c0f..184a6317c0 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT mort table validation (body). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -205,7 +205,7 @@ FT_INVALID_FORMAT; func = fmt_funcs_table[type]; - if ( func == NULL ) + if ( !func ) GXV_TRACE(( "morx type %d is reserved\n", type )); func( p, p + rest, gxvalid ); diff --git a/thirdparty/freetype/src/gxvalid/gxvmort.h b/thirdparty/freetype/src/gxvalid/gxvmort.h index 5fd228212a..d0543adcc5 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort.h +++ b/thirdparty/freetype/src/gxvalid/gxvmort.h @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT common definition for mort table (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort0.c b/thirdparty/freetype/src/gxvalid/gxvmort0.c index e11f5ddc49..a75fad7768 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort0.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort0.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT mort table validation */ /* body for type0 (Indic Script Rearrangement) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort1.c b/thirdparty/freetype/src/gxvalid/gxvmort1.c index fd761d0692..361ef2262d 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort1.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort1.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT mort table validation */ /* body for type1 (Contextual Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort2.c b/thirdparty/freetype/src/gxvalid/gxvmort2.c index 08455dec6b..c17e51e323 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort2.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort2.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT mort table validation */ /* body for type2 (Ligature Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort4.c b/thirdparty/freetype/src/gxvalid/gxvmort4.c index 6f7bbb8710..041bab369f 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort4.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort4.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT mort table validation */ /* body for type4 (Non-Contextual Glyph Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmort5.c b/thirdparty/freetype/src/gxvalid/gxvmort5.c index 54ddbe2b15..4751eceaa0 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmort5.c +++ b/thirdparty/freetype/src/gxvalid/gxvmort5.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT mort table validation */ /* body for type5 (Contextual Glyph Insertion) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx.c b/thirdparty/freetype/src/gxvalid/gxvmorx.c index a3abe435a6..2bb4f3b8b1 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT morx table validation (body). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ @@ -98,7 +98,7 @@ FT_INVALID_FORMAT; func = fmt_funcs_table[type]; - if ( func == NULL ) + if ( !func ) GXV_TRACE(( "morx type %d is reserved\n", type )); func( p, p + rest, gxvalid ); diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx.h b/thirdparty/freetype/src/gxvalid/gxvmorx.h index 9ba25c14a4..20cec58672 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx.h +++ b/thirdparty/freetype/src/gxvalid/gxvmorx.h @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT common definition for morx table (specification). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx0.c b/thirdparty/freetype/src/gxvalid/gxvmorx0.c index 4abb7368f2..e0a0a92438 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx0.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx0.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT morx table validation */ /* body for type0 (Indic Script Rearrangement) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx1.c b/thirdparty/freetype/src/gxvalid/gxvmorx1.c index e581848c2b..9afebdbfa8 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx1.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx1.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT morx table validation */ /* body for type1 (Contextual Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx2.c b/thirdparty/freetype/src/gxvalid/gxvmorx2.c index 9495cca489..3a60cf68a4 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx2.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx2.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT morx table validation */ /* body for type2 (Ligature Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx4.c b/thirdparty/freetype/src/gxvalid/gxvmorx4.c index 3b7731bbce..29555685af 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx4.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx4.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT morx table validation */ /* body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvmorx5.c b/thirdparty/freetype/src/gxvalid/gxvmorx5.c index 0e96166c02..05c11417ef 100644 --- a/thirdparty/freetype/src/gxvalid/gxvmorx5.c +++ b/thirdparty/freetype/src/gxvalid/gxvmorx5.c @@ -5,7 +5,7 @@ /* TrueTypeGX/AAT morx table validation */ /* body for type5 (Contextual Glyph Insertion) subtable. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvopbd.c b/thirdparty/freetype/src/gxvalid/gxvopbd.c index e3ba082e16..11580d8b2a 100644 --- a/thirdparty/freetype/src/gxvalid/gxvopbd.c +++ b/thirdparty/freetype/src/gxvalid/gxvopbd.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT opbd table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvprop.c b/thirdparty/freetype/src/gxvalid/gxvprop.c index 61b3aeee30..7d398b7e66 100644 --- a/thirdparty/freetype/src/gxvalid/gxvprop.c +++ b/thirdparty/freetype/src/gxvalid/gxvprop.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT prop table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/gxvtrak.c b/thirdparty/freetype/src/gxvalid/gxvtrak.c index 0f07c04e2a..dd49825565 100644 --- a/thirdparty/freetype/src/gxvalid/gxvtrak.c +++ b/thirdparty/freetype/src/gxvalid/gxvtrak.c @@ -4,7 +4,7 @@ /* */ /* TrueTypeGX/AAT trak table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ diff --git a/thirdparty/freetype/src/gxvalid/module.mk b/thirdparty/freetype/src/gxvalid/module.mk index b431384a5c..7f87e10812 100644 --- a/thirdparty/freetype/src/gxvalid/module.mk +++ b/thirdparty/freetype/src/gxvalid/module.mk @@ -2,7 +2,7 @@ # FreeType 2 gxvalid module definition # -# Copyright 2004-2016 by +# Copyright 2004-2017 by # suzuki toshiya, Masatake YAMATO, Red Hat K.K., # David Turner, Robert Wilhelm, and Werner Lemberg. # diff --git a/thirdparty/freetype/src/gxvalid/rules.mk b/thirdparty/freetype/src/gxvalid/rules.mk index 424f2a6377..10ec08c5b0 100644 --- a/thirdparty/freetype/src/gxvalid/rules.mk +++ b/thirdparty/freetype/src/gxvalid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2004-2016 by +# Copyright 2004-2017 by # suzuki toshiya, Masatake YAMATO, Red Hat K.K., # David Turner, Robert Wilhelm, and Werner Lemberg. # diff --git a/thirdparty/freetype/src/gzip/adler32.c b/thirdparty/freetype/src/gzip/adler32.c new file mode 100644 index 0000000000..c53f9dd125 --- /dev/null +++ b/thirdparty/freetype/src/gzip/adler32.c @@ -0,0 +1,48 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zlib.h" + +#define BASE 65521L /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* ========================================================================= */ +ZEXPORT(uLong) adler32( /* adler, buf, len) */ + uLong adler, + const Bytef *buf, + uInt len ) +{ + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int k; + + if (buf == Z_NULL) return 1L; + + while (len > 0) { + k = len < NMAX ? len : NMAX; + len -= k; + while (k >= 16) { + DO16(buf); + buf += 16; + k -= 16; + } + if (k != 0) do { + s1 += *buf++; + s2 += s1; + } while (--k); + s1 %= BASE; + s2 %= BASE; + } + return (s2 << 16) | s1; +} diff --git a/thirdparty/freetype/src/gzip/ftgzip.c b/thirdparty/freetype/src/gzip/ftgzip.c new file mode 100644 index 0000000000..c487786d99 --- /dev/null +++ b/thirdparty/freetype/src/gzip/ftgzip.c @@ -0,0 +1,816 @@ +/***************************************************************************/ +/* */ +/* ftgzip.c */ +/* */ +/* FreeType support for .gz compressed files. */ +/* */ +/* This optional component relies on zlib. It should mainly be used to */ +/* parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2002-2017 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_GZIP_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Gzip_Err_ +#define FT_ERR_BASE FT_Mod_Err_Gzip + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + +#ifdef FT_CONFIG_OPTION_PIC +#error "gzip code does not support PIC yet" +#endif + +#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB + +#include <zlib.h> + +#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + /* In this case, we include our own modified sources of the ZLib */ + /* within the `gzip' component. The modifications were necessary */ + /* to #include all files without conflicts, as well as preventing */ + /* the definition of `extern' functions that may cause linking */ + /* conflicts when a program is linked with both FreeType and the */ + /* original ZLib. */ + +#ifndef USE_ZLIB_ZCALLOC +#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutil.c */ +#endif + + /* Note that our `zlib.h' includes `ftzconf.h' instead of `zconf.h'; */ + /* the main reason is that even a global `zlib.h' includes `zconf.h' */ + /* with */ + /* */ + /* #include "zconf.h" */ + /* */ + /* instead of the expected */ + /* */ + /* #include <zconf.h> */ + /* */ + /* so that configuration with `FT_CONFIG_OPTION_SYSTEM_ZLIB' might */ + /* include the wrong `zconf.h' file, leading to errors. */ +#include "zlib.h" + +#undef SLOW +#define SLOW 1 /* we can't use asm-optimized sources here! */ + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `conversion from XXX to YYY, */ + /* possible loss of data' in order to compile cleanly with */ + /* the maximum level of warnings: zlib is non-FreeType */ + /* code. */ +#pragma warning( push ) +#pragma warning( disable : 4244 ) +#endif /* _MSC_VER */ + + /* Urgh. `inflate_mask' must not be declared twice -- C++ doesn't like + this. We temporarily disable it and load all necessary header files. */ +#define NO_INFLATE_MASK +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" +#undef NO_INFLATE_MASK + + /* infutil.c must be included before infcodes.c */ +#include "zutil.c" +#include "inftrees.c" +#include "infutil.c" +#include "infcodes.c" +#include "infblock.c" +#include "inflate.c" +#include "adler32.c" + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + static voidpf + ft_gzip_alloc( FT_Memory memory, + uInt items, + uInt size ) + { + FT_ULong sz = (FT_ULong)size * items; + FT_Error error; + FT_Pointer p = NULL; + + + (void)FT_ALLOC( p, sz ); + return p; + } + + + static void + ft_gzip_free( FT_Memory memory, + voidpf address ) + { + FT_MEM_FREE( address ); + } + + +#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC ) + + local voidpf + zcalloc ( voidpf opaque, + unsigned items, + unsigned size ) + { + return ft_gzip_alloc( (FT_Memory)opaque, items, size ); + } + + local void + zcfree( voidpf opaque, + voidpf ptr ) + { + ft_gzip_free( (FT_Memory)opaque, ptr ); + } + +#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_GZIP_BUFFER_SIZE 4096 + + typedef struct FT_GZipFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + z_stream zstream; /* zlib input stream */ + + FT_ULong start; /* starting position, after .gz header */ + FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_GZipFileRec, *FT_GZipFile; + + + /* gzip flag byte */ +#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ +#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ + + + /* check and skip .gz header - we don't support `transparent' compression */ + static FT_Error + ft_gzip_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the method, and head[3] the flags */ + if ( head[0] != 0x1F || + head[1] != 0x8B || + head[2] != Z_DEFLATED || + (head[3] & FT_GZIP_RESERVED) ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* skip time, xflags and os code */ + (void)FT_STREAM_SKIP( 6 ); + + /* skip the extra field */ + if ( head[3] & FT_GZIP_EXTRA_FIELD ) + { + FT_UInt len; + + + if ( FT_READ_USHORT_LE( len ) || + FT_STREAM_SKIP( len ) ) + goto Exit; + } + + /* skip original file name */ + if ( head[3] & FT_GZIP_ORIG_NAME ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip .gz comment */ + if ( head[3] & FT_GZIP_COMMENT ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip CRC */ + if ( head[3] & FT_GZIP_HEAD_CRC ) + if ( FT_STREAM_SKIP( 2 ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + ft_gzip_file_init( FT_GZipFile zip, + FT_Stream stream, + FT_Stream source ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = FT_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .gz header */ + { + stream = source; + + error = ft_gzip_check_header( stream ); + if ( error ) + goto Exit; + + zip->start = FT_STREAM_POS(); + } + + /* initialize zlib -- there is no zlib header in the compressed stream */ + zstream->zalloc = (alloc_func)ft_gzip_alloc; + zstream->zfree = (free_func) ft_gzip_free; + zstream->opaque = stream->memory; + + zstream->avail_in = 0; + zstream->next_in = zip->buffer; + + if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || + !zstream->next_in ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static void + ft_gzip_file_done( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + + + inflateEnd( zstream ); + + /* clear the rest */ + zstream->zalloc = NULL; + zstream->zfree = NULL; + zstream->opaque = NULL; + zstream->next_in = NULL; + zstream->next_out = NULL; + zstream->avail_in = 0; + zstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_gzip_file_reset( FT_GZipFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( zip->start ) ) + { + z_stream* zstream = &zip->zstream; + + + inflateReset( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->input; + zstream->avail_out = 0; + zstream->next_out = zip->buffer; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_gzip_file_fill_input( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_GZIP_BUFFER_SIZE ); + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + } + else + { + size = stream->size - stream->pos; + if ( size > FT_GZIP_BUFFER_SIZE ) + size = FT_GZIP_BUFFER_SIZE; + + if ( size == 0 ) + { + zip->limit = zip->cursor; + return FT_THROW( Invalid_Stream_Operation ); + } + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + zstream->next_in = zip->input; + zstream->avail_in = size; + + return FT_Err_Ok; + } + + + static FT_Error + ft_gzip_file_fill_output( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + zstream->next_out = zip->cursor; + zstream->avail_out = FT_GZIP_BUFFER_SIZE; + + while ( zstream->avail_out > 0 ) + { + int err; + + + if ( zstream->avail_in == 0 ) + { + error = ft_gzip_file_fill_input( zip ); + if ( error ) + break; + } + + err = inflate( zstream, Z_NO_FLUSH ); + + if ( err == Z_STREAM_END ) + { + zip->limit = zstream->next_out; + if ( zip->limit == zip->cursor ) + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + else if ( err != Z_OK ) + { + zip->limit = zip->cursor; + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ + static FT_Error + ft_gzip_file_skip_output( FT_GZipFile zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong delta; + + + for (;;) + { + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_gzip_file_io( FT_GZipFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_gzip_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** G Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_gzip_stream_close( FT_Stream stream ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize gzip file descriptor */ + ft_gzip_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + + if ( !stream->read ) + FT_FREE( stream->base ); + } + + + static unsigned long + ft_gzip_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + + + return ft_gzip_file_io( zip, offset, buffer, count ); + } + + + static FT_ULong + ft_gzip_get_uncompressed_size( FT_Stream stream ) + { + FT_Error error; + FT_ULong old_pos; + FT_ULong result = 0; + + + old_pos = stream->pos; + if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) + { + result = FT_Stream_ReadULongLE( stream, &error ); + if ( error ) + result = 0; + + (void)FT_Stream_Seek( stream, old_pos ); + } + + return result; + } + + + /* documentation is in ftgzip.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_GZipFile zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * check the header right now; this prevents allocating un-necessary + * objects when we don't need them + */ + error = ft_gzip_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_gzip_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + /* + * We use the following trick to try to dramatically improve the + * performance while dealing with small files. If the original stream + * size is less than a certain threshold, we try to load the whole font + * file into memory. This saves us from using the 32KB buffer needed + * to inflate the file, plus the two 4KB intermediate input/output + * buffers used in the `FT_GZipFile' structure. + */ + { + FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); + + + if ( zip_size != 0 && zip_size < 40 * 1024 ) + { + FT_Byte* zip_buff = NULL; + + + if ( !FT_ALLOC( zip_buff, zip_size ) ) + { + FT_ULong count; + + + count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); + if ( count == zip_size ) + { + ft_gzip_file_done( zip ); + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + + stream->size = zip_size; + stream->pos = 0; + stream->base = zip_buff; + stream->read = NULL; + stream->close = ft_gzip_stream_close; + + goto Exit; + } + + ft_gzip_file_io( zip, 0, NULL, 0 ); + FT_FREE( zip_buff ); + } + error = FT_Err_Ok; + } + + if ( zip_size ) + stream->size = zip_size; + else + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + } + + stream->pos = 0; + stream->base = NULL; + stream->read = ft_gzip_stream_io; + stream->close = ft_gzip_stream_close; + + Exit: + return error; + } + + + /* documentation is in ftgzip.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ) + { + z_stream stream; + int err; + + + /* check for `input' delayed to `inflate' */ + + if ( !memory || ! output_len || !output ) + return FT_THROW( Invalid_Argument ); + + /* this function is modeled after zlib's `uncompress' function */ + + stream.next_in = (Bytef*)input; + stream.avail_in = (uInt)input_len; + + stream.next_out = output; + stream.avail_out = (uInt)*output_len; + + stream.zalloc = (alloc_func)ft_gzip_alloc; + stream.zfree = (free_func) ft_gzip_free; + stream.opaque = memory; + + err = inflateInit2( &stream, MAX_WBITS ); + if ( err != Z_OK ) + return FT_THROW( Invalid_Argument ); + + err = inflate( &stream, Z_FINISH ); + if ( err != Z_STREAM_END ) + { + inflateEnd( &stream ); + if ( err == Z_OK ) + err = Z_BUF_ERROR; + } + else + { + *output_len = stream.total_out; + + err = inflateEnd( &stream ); + } + + if ( err == Z_MEM_ERROR ) + return FT_THROW( Out_Of_Memory ); + + if ( err == Z_BUF_ERROR ) + return FT_THROW( Array_Too_Large ); + + if ( err == Z_DATA_ERROR ) + return FT_THROW( Invalid_Table ); + + return FT_Err_Ok; + } + + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Gzip_Uncompress( FT_Memory memory, + FT_Byte* output, + FT_ULong* output_len, + const FT_Byte* input, + FT_ULong input_len ) + { + FT_UNUSED( memory ); + FT_UNUSED( output ); + FT_UNUSED( output_len ); + FT_UNUSED( input ); + FT_UNUSED( input_len ); + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + + +/* END */ diff --git a/thirdparty/freetype/src/gzip/ftzconf.h b/thirdparty/freetype/src/gzip/ftzconf.h new file mode 100644 index 0000000000..3abf0ba03b --- /dev/null +++ b/thirdparty/freetype/src/gzip/ftzconf.h @@ -0,0 +1,284 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef _ZCONF_H +#define _ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateReset z_inflateReset +# define compress z_compress +# define compress2 z_compress2 +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table + +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) +# define WIN32 +#endif +#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) +# ifndef __32BIT__ +# define __32BIT__ +# endif +#endif +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif + +/* WinCE doesn't have errno.h */ +#ifdef _WIN32_WCE +# define NO_ERRNO_H +#endif + + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#if defined(MSDOS) && !defined(__32BIT__) +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) +# define STDC +#endif +#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) +# ifndef STDC +# define STDC +# endif +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Old Borland C and LCC incorrectly complains about missing returns: */ +#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) +# define NEED_DUMMY_RETURN +#endif + +#if defined(__LCC__) +# define NEED_DUMMY_RETURN +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +#endif +#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) +# ifndef __32BIT__ +# define SMALL_MEDIUM +# define FAR _far +# endif +#endif + +/* Compile with -DZLIB_DLL for Windows DLL support */ +#if defined(ZLIB_DLL) +# if defined(_WINDOWS) || defined(WINDOWS) +# ifdef FAR +# undef FAR +# endif +# include <windows.h> +# define ZEXPORT(x) x WINAPI +# ifdef WIN32 +# define ZEXPORTVA(x) x WINAPIV +# else +# define ZEXPORTVA(x) x FAR _cdecl _export +# endif +# endif +# if defined (__BORLANDC__) +# if (__BORLANDC__ >= 0x0500) && defined (WIN32) +# include <windows.h> +# define ZEXPORT(x) x __declspec(dllexport) WINAPI +# define ZEXPORTRVA(x) x __declspec(dllexport) WINAPIV +# else +# if defined (_Windows) && defined (__DLL__) +# define ZEXPORT(x) x _export +# define ZEXPORTVA(x) x _export +# endif +# endif +# endif +#endif + + +#ifndef ZEXPORT +# define ZEXPORT(x) static x +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA(x) static x +#endif +#ifndef ZEXTERN +# define ZEXTERN(x) static x +#endif +#ifndef ZEXTERNDEF +# define ZEXTERNDEF(x) static x +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(MACOS) && !defined(TARGET_OS_MAC) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H +# include <sys/types.h> /* for off_t */ +# include <unistd.h> /* for SEEK_* and off_t */ +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(inflate_blocks,"INBL") +# pragma map(inflate_blocks_new,"INBLNE") +# pragma map(inflate_blocks_free,"INBLFR") +# pragma map(inflate_blocks_reset,"INBLRE") +# pragma map(inflate_codes_free,"INCOFR") +# pragma map(inflate_codes,"INCO") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_flush,"INFLU") +# pragma map(inflate_mask,"INMA") +# pragma map(inflate_set_dictionary,"INSEDI2") +# pragma map(inflate_copyright,"INCOPY") +# pragma map(inflate_trees_bits,"INTRBI") +# pragma map(inflate_trees_dynamic,"INTRDY") +# pragma map(inflate_trees_fixed,"INTRFI") +# pragma map(inflate_trees_free,"INTRFR") +#endif + +#endif /* _ZCONF_H */ diff --git a/thirdparty/freetype/src/gzip/infblock.c b/thirdparty/freetype/src/gzip/infblock.c new file mode 100644 index 0000000000..d6e2dc297d --- /dev/null +++ b/thirdparty/freetype/src/gzip/infblock.c @@ -0,0 +1,387 @@ +/* infblock.c -- interpret and process block types to last block + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +/* Table for deflate from PKZIP's appnote.txt. */ +local const uInt border[] = { /* Order of the bit length code lengths */ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* + Notes beyond the 1.93a appnote.txt: + + 1. Distance pointers never point before the beginning of the output + stream. + 2. Distance pointers can point back across blocks, up to 32k away. + 3. There is an implied maximum of 7 bits for the bit length table and + 15 bits for the actual data. + 4. If only one code exists, then it is encoded using one bit. (Zero + would be more efficient, but perhaps a little confusing.) If two + codes exist, they are coded using one bit each (0 and 1). + 5. There is no way of sending zero distance codes--a dummy must be + sent if there are none. (History: a pre 2.0 version of PKZIP would + store blocks with no distance codes, but this was discovered to be + too harsh a criterion.) Valid only for 1.93a. 2.04c does allow + zero distance codes, which is sent as one code of zero bits in + length. + 6. There are up to 286 literal/length codes. Code 256 represents the + end-of-block. Note however that the static length tree defines + 288 codes just to fill out the Huffman codes. Codes 286 and 287 + cannot be used though, since there is no length base or extra bits + defined for them. Similarily, there are up to 30 distance codes. + However, static trees define 32 codes (all 5 bits) to fill out the + Huffman codes, but the last two had better not show up in the data. + 7. Unzip can check dynamic Huffman blocks for complete code sets. + The exception is that a single code would not be complete (see #4). + 8. The five bits following the block type is really the number of + literal codes sent minus 257. + 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits + (1+6+6). Therefore, to output three times the length, you output + three codes (1+1+1), whereas to output four times the same length, + you only need two codes (1+3). Hmm. + 10. In the tree reconstruction algorithm, Code = Code + Increment + only if BitLength(i) is not zero. (Pretty obvious.) + 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) + 12. Note: length code 284 can represent 227-258, but length code 285 + really is 258. The last length deserves its own, short code + since it gets used a lot in very redundant files. The length + 258 is special since 258 - 3 (the min match length) is 255. + 13. The literal/length and distance code bit lengths are read as a + single stream of lengths. It is possible (and advantageous) for + a repeat code (16, 17, or 18) to go across the boundary between + the two sets of lengths. + */ + + +local void inflate_blocks_reset( /* s, z, c) */ +inflate_blocks_statef *s, +z_streamp z, +uLongf *c ) +{ + if (c != Z_NULL) + *c = s->check; + if (s->mode == BTREE || s->mode == DTREE) + ZFREE(z, s->sub.trees.blens); + if (s->mode == CODES) + inflate_codes_free(s->sub.decode.codes, z); + s->mode = TYPE; + s->bitk = 0; + s->bitb = 0; + s->read = s->write = s->window; + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); + Tracev((stderr, "inflate: blocks reset\n")); +} + + +local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */ +z_streamp z, +check_func c, +uInt w ) +{ + inflate_blocks_statef *s; + + if ((s = (inflate_blocks_statef *)ZALLOC + (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) + return s; + if ((s->hufts = + (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) + { + ZFREE(z, s); + return Z_NULL; + } + if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) + { + ZFREE(z, s->hufts); + ZFREE(z, s); + return Z_NULL; + } + s->end = s->window + w; + s->checkfn = c; + s->mode = TYPE; + Tracev((stderr, "inflate: blocks allocated\n")); + inflate_blocks_reset(s, z, Z_NULL); + return s; +} + + +local int inflate_blocks( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt t; /* temporary storage */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input based on current state */ + while (1) switch (s->mode) + { + case TYPE: + NEEDBITS(3) + t = (uInt)b & 7; + s->last = t & 1; + switch (t >> 1) + { + case 0: /* stored */ + Tracev((stderr, "inflate: stored block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + t = k & 7; /* go to byte boundary */ + DUMPBITS(t) + s->mode = LENS; /* get length of stored block */ + break; + case 1: /* fixed */ + Tracev((stderr, "inflate: fixed codes block%s\n", + s->last ? " (last)" : "")); + { + uInt bl, bd; + inflate_huft *tl, *td; + + inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl, + (const inflate_huft**)&td, z); + s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); + if (s->sub.decode.codes == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + } + DUMPBITS(3) + s->mode = CODES; + break; + case 2: /* dynamic */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + s->last ? " (last)" : "")); + DUMPBITS(3) + s->mode = TABLE; + break; + case 3: /* illegal */ + DUMPBITS(3) + s->mode = BAD; + z->msg = (char*)"invalid block type"; + r = Z_DATA_ERROR; + LEAVE + } + break; + case LENS: + NEEDBITS(32) + if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) + { + s->mode = BAD; + z->msg = (char*)"invalid stored block lengths"; + r = Z_DATA_ERROR; + LEAVE + } + s->sub.left = (uInt)b & 0xffff; + b = k = 0; /* dump bits */ + Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); + s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); + break; + case STORED: + if (n == 0) + LEAVE + NEEDOUT + t = s->sub.left; + if (t > n) t = n; + if (t > m) t = m; + zmemcpy(q, p, t); + p += t; n -= t; + q += t; m -= t; + if ((s->sub.left -= t) != 0) + break; + Tracev((stderr, "inflate: stored end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + s->mode = s->last ? DRY : TYPE; + break; + case TABLE: + NEEDBITS(14) + s->sub.trees.table = t = (uInt)b & 0x3fff; +#ifndef PKZIP_BUG_WORKAROUND + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) + { + s->mode = BAD; + z->msg = (char*)"too many length or distance symbols"; + r = Z_DATA_ERROR; + LEAVE + } +#endif + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + DUMPBITS(14) + s->sub.trees.index = 0; + Tracev((stderr, "inflate: table sizes ok\n")); + s->mode = BTREE; + case BTREE: + while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) + { + NEEDBITS(3) + s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; + DUMPBITS(3) + } + while (s->sub.trees.index < 19) + s->sub.trees.blens[border[s->sub.trees.index++]] = 0; + s->sub.trees.bb = 7; + t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, + &s->sub.trees.tb, s->hufts, z); + if (t != Z_OK) + { + r = t; + if (r == Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + LEAVE + } + s->sub.trees.index = 0; + Tracev((stderr, "inflate: bits tree ok\n")); + s->mode = DTREE; + case DTREE: + while (t = s->sub.trees.table, + s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) + { + inflate_huft *h; + uInt i, j, c; + + t = s->sub.trees.bb; + NEEDBITS(t) + h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); + t = h->bits; + c = h->base; + if (c < 16) + { + DUMPBITS(t) + s->sub.trees.blens[s->sub.trees.index++] = c; + } + else /* c == 16..18 */ + { + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + NEEDBITS(t + i) + DUMPBITS(t) + j += (uInt)b & inflate_mask[i]; + DUMPBITS(i) + i = s->sub.trees.index; + t = s->sub.trees.table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || + (c == 16 && i < 1)) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + z->msg = (char*)"invalid bit length repeat"; + r = Z_DATA_ERROR; + LEAVE + } + c = c == 16 ? s->sub.trees.blens[i - 1] : 0; + do { + s->sub.trees.blens[i++] = c; + } while (--j); + s->sub.trees.index = i; + } + } + s->sub.trees.tb = Z_NULL; + { + uInt bl, bd; + inflate_huft *tl, *td; + inflate_codes_statef *c; + + bl = 9; /* must be <= 9 for lookahead assumptions */ + bd = 6; /* must be <= 9 for lookahead assumptions */ + t = s->sub.trees.table; + t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), + s->sub.trees.blens, &bl, &bd, &tl, &td, + s->hufts, z); + if (t != Z_OK) + { + if (t == (uInt)Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); + s->mode = BAD; + } + r = t; + LEAVE + } + Tracev((stderr, "inflate: trees ok\n")); + if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) + { + r = Z_MEM_ERROR; + LEAVE + } + s->sub.decode.codes = c; + } + ZFREE(z, s->sub.trees.blens); + s->mode = CODES; + case CODES: + UPDATE + if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) + return inflate_flush(s, z, r); + r = Z_OK; + inflate_codes_free(s->sub.decode.codes, z); + LOAD + Tracev((stderr, "inflate: codes end, %lu total out\n", + z->total_out + (q >= s->read ? q - s->read : + (s->end - s->read) + (q - s->window)))); + if (!s->last) + { + s->mode = TYPE; + break; + } + s->mode = DRY; + case DRY: + FLUSH + if (s->read != s->write) + LEAVE + s->mode = DONE; + case DONE: + r = Z_STREAM_END; + LEAVE + case BAD: + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return 0; +#endif +} + + +local int inflate_blocks_free( /* s, z) */ +inflate_blocks_statef *s, +z_streamp z ) +{ + inflate_blocks_reset(s, z, Z_NULL); + ZFREE(z, s->window); + ZFREE(z, s->hufts); + ZFREE(z, s); + Tracev((stderr, "inflate: blocks freed\n")); + return Z_OK; +} + + diff --git a/thirdparty/freetype/src/gzip/infblock.h b/thirdparty/freetype/src/gzip/infblock.h new file mode 100644 index 0000000000..c2535a1e45 --- /dev/null +++ b/thirdparty/freetype/src/gzip/infblock.h @@ -0,0 +1,36 @@ +/* infblock.h -- header to use infblock.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFBLOCK_H +#define _INFBLOCK_H + +struct inflate_blocks_state; +typedef struct inflate_blocks_state FAR inflate_blocks_statef; + +local inflate_blocks_statef * inflate_blocks_new OF(( + z_streamp z, + check_func c, /* check function */ + uInt w)); /* window size */ + +local int inflate_blocks OF(( + inflate_blocks_statef *, + z_streamp , + int)); /* initial return code */ + +local void inflate_blocks_reset OF(( + inflate_blocks_statef *, + z_streamp , + uLongf *)); /* check value on output */ + +local int inflate_blocks_free OF(( + inflate_blocks_statef *, + z_streamp)); + +#endif /* _INFBLOCK_H */ diff --git a/thirdparty/freetype/src/gzip/infcodes.c b/thirdparty/freetype/src/gzip/infcodes.c new file mode 100644 index 0000000000..f7bfd58c4f --- /dev/null +++ b/thirdparty/freetype/src/gzip/infcodes.c @@ -0,0 +1,250 @@ +/* infcodes.c -- process literals and length/distance pairs + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + +typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + START, /* x: set up for LEN */ + LEN, /* i: get length/literal/eob next */ + LENEXT, /* i: getting length extra (have base) */ + DIST, /* i: get distance next */ + DISTEXT, /* i: getting distance extra */ + COPY, /* o: copying bytes in window, waiting for space */ + LIT, /* o: got literal, waiting for output space */ + WASH, /* o: got eob, possibly still output waiting */ + END, /* x: got eob and all data flushed */ + BADCODE} /* x: got error */ +inflate_codes_mode; + +/* inflate codes private state */ +struct inflate_codes_state { + + /* mode */ + inflate_codes_mode mode; /* current inflate_codes mode */ + + /* mode dependent information */ + uInt len; + union { + struct { + inflate_huft *tree; /* pointer into tree */ + uInt need; /* bits needed */ + } code; /* if LEN or DIST, where in tree */ + uInt lit; /* if LIT, literal */ + struct { + uInt get; /* bits to get for extra */ + uInt dist; /* distance back to copy from */ + } copy; /* if EXT or COPY, where and how much */ + } sub; /* submode */ + + /* mode independent information */ + Byte lbits; /* ltree bits decoded per branch */ + Byte dbits; /* dtree bits decoder per branch */ + inflate_huft *ltree; /* literal/length/eob tree */ + inflate_huft *dtree; /* distance tree */ + +}; + + +local inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */ +uInt bl, uInt bd, +inflate_huft *tl, +inflate_huft *td, /* need separate declaration for Borland C++ */ +z_streamp z ) +{ + inflate_codes_statef *c; + + if ((c = (inflate_codes_statef *) + ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) + { + c->mode = START; + c->lbits = (Byte)bl; + c->dbits = (Byte)bd; + c->ltree = tl; + c->dtree = td; + Tracev((stderr, "inflate: codes new\n")); + } + return c; +} + + +local int inflate_codes( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt j; /* temporary storage */ + inflate_huft *t; /* temporary pointer */ + uInt e; /* extra bits or operation */ + uLong b; /* bit buffer */ + uInt k; /* bits in bit buffer */ + Bytef *p; /* input data pointer */ + uInt n; /* bytes available there */ + Bytef *q; /* output window write pointer */ + uInt m; /* bytes to end of window or read pointer */ + Bytef *f; /* pointer to copy strings from */ + inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ + + /* copy input/output information to locals (UPDATE macro restores) */ + LOAD + + /* process input and output based on current state */ + while (1) switch (c->mode) + { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ + case START: /* x: set up for LEN */ +#ifndef SLOW + if (m >= 258 && n >= 10) + { + UPDATE + r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); + LOAD + if (r != Z_OK) + { + c->mode = r == Z_STREAM_END ? WASH : BADCODE; + break; + } + } +#endif /* !SLOW */ + c->sub.code.need = c->lbits; + c->sub.code.tree = c->ltree; + c->mode = LEN; + case LEN: /* i: get length/literal/eob next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e == 0) /* literal */ + { + c->sub.lit = t->base; + Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", t->base)); + c->mode = LIT; + break; + } + if (e & 16) /* length */ + { + c->sub.copy.get = e & 15; + c->len = t->base; + c->mode = LENEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + if (e & 32) /* end of block */ + { + Tracevv((stderr, "inflate: end of block\n")); + c->mode = WASH; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid literal/length code"; + r = Z_DATA_ERROR; + LEAVE + case LENEXT: /* i: getting length extra (have base) */ + j = c->sub.copy.get; + NEEDBITS(j) + c->len += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + c->sub.code.need = c->dbits; + c->sub.code.tree = c->dtree; + Tracevv((stderr, "inflate: length %u\n", c->len)); + c->mode = DIST; + case DIST: /* i: get distance next */ + j = c->sub.code.need; + NEEDBITS(j) + t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); + DUMPBITS(t->bits) + e = (uInt)(t->exop); + if (e & 16) /* distance */ + { + c->sub.copy.get = e & 15; + c->sub.copy.dist = t->base; + c->mode = DISTEXT; + break; + } + if ((e & 64) == 0) /* next table */ + { + c->sub.code.need = e; + c->sub.code.tree = t + t->base; + break; + } + c->mode = BADCODE; /* invalid code */ + z->msg = (char*)"invalid distance code"; + r = Z_DATA_ERROR; + LEAVE + case DISTEXT: /* i: getting distance extra */ + j = c->sub.copy.get; + NEEDBITS(j) + c->sub.copy.dist += (uInt)b & inflate_mask[j]; + DUMPBITS(j) + Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); + c->mode = COPY; + case COPY: /* o: copying bytes in window, waiting for space */ + f = q - c->sub.copy.dist; + while (f < s->window) /* modulo window size-"while" instead */ + f += s->end - s->window; /* of "if" handles invalid distances */ + while (c->len) + { + NEEDOUT + OUTBYTE(*f++) + if (f == s->end) + f = s->window; + c->len--; + } + c->mode = START; + break; + case LIT: /* o: got literal, waiting for output space */ + NEEDOUT + OUTBYTE(c->sub.lit) + c->mode = START; + break; + case WASH: /* o: got eob, possibly more output */ + if (k > 7) /* return unused byte, if any */ + { + Assert(k < 16, "inflate_codes grabbed too many bytes") + k -= 8; + n++; + p--; /* can always return one */ + } + FLUSH + if (s->read != s->write) + LEAVE + c->mode = END; + case END: + r = Z_STREAM_END; + LEAVE + case BADCODE: /* x: got error */ + r = Z_DATA_ERROR; + LEAVE + default: + r = Z_STREAM_ERROR; + LEAVE + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + + +local void inflate_codes_free( /* c, z) */ +inflate_codes_statef *c, +z_streamp z ) +{ + ZFREE(z, c); + Tracev((stderr, "inflate: codes free\n")); +} diff --git a/thirdparty/freetype/src/gzip/infcodes.h b/thirdparty/freetype/src/gzip/infcodes.h new file mode 100644 index 0000000000..154d7f896c --- /dev/null +++ b/thirdparty/freetype/src/gzip/infcodes.h @@ -0,0 +1,31 @@ +/* infcodes.h -- header to use infcodes.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFCODES_H +#define _INFCODES_H + +struct inflate_codes_state; +typedef struct inflate_codes_state FAR inflate_codes_statef; + +local inflate_codes_statef *inflate_codes_new OF(( + uInt, uInt, + inflate_huft *, inflate_huft *, + z_streamp )); + +local int inflate_codes OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +local void inflate_codes_free OF(( + inflate_codes_statef *, + z_streamp )); + +#endif /* _INFCODES_H */ diff --git a/thirdparty/freetype/src/gzip/inffixed.h b/thirdparty/freetype/src/gzip/inffixed.h new file mode 100644 index 0000000000..4d4760ea00 --- /dev/null +++ b/thirdparty/freetype/src/gzip/inffixed.h @@ -0,0 +1,151 @@ +/* inffixed.h -- table for decoding fixed codes + * Generated automatically by the maketree.c program + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +local const uInt fixed_bl = 9; +local const uInt fixed_bd = 5; +local const inflate_huft fixed_tl[] = { + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, + {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, + {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, + {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, + {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, + {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, + {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, + {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, + {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, + {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, + {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, + {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, + {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, + {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, + {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, + {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, + {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, + {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, + {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, + {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, + {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, + {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, + {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, + {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, + {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, + {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, + {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, + {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, + {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, + {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, + {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, + {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, + {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, + {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, + {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, + {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, + {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, + {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, + {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, + {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, + {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, + {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, + {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, + {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, + {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, + {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, + {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, + {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, + {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, + {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, + {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, + {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, + {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, + {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, + {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, + {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, + {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, + {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, + {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, + {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, + {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, + {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, + {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, + {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} + }; +local const inflate_huft fixed_td[] = { + {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, + {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, + {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, + {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, + {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, + {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, + {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, + {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} + }; diff --git a/thirdparty/freetype/src/gzip/inflate.c b/thirdparty/freetype/src/gzip/inflate.c new file mode 100644 index 0000000000..8877fa3eb2 --- /dev/null +++ b/thirdparty/freetype/src/gzip/inflate.c @@ -0,0 +1,273 @@ +/* inflate.c -- zlib interface to inflate modules + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" + +#define DONE INFLATE_DONE +#define BAD INFLATE_BAD + +typedef enum { + METHOD, /* waiting for method byte */ + FLAG, /* waiting for flag byte */ + DICT4, /* four dictionary check bytes to go */ + DICT3, /* three dictionary check bytes to go */ + DICT2, /* two dictionary check bytes to go */ + DICT1, /* one dictionary check byte to go */ + DICT0, /* waiting for inflateSetDictionary */ + BLOCKS, /* decompressing blocks */ + CHECK4, /* four check bytes to go */ + CHECK3, /* three check bytes to go */ + CHECK2, /* two check bytes to go */ + CHECK1, /* one check byte to go */ + DONE, /* finished check, done */ + BAD} /* got an error--stay here */ +inflate_mode; + +/* inflate private state */ +struct internal_state { + + /* mode */ + inflate_mode mode; /* current inflate mode */ + + /* mode dependent information */ + union { + uInt method; /* if FLAGS, method byte */ + struct { + uLong was; /* computed check value */ + uLong need; /* stream check value */ + } check; /* if CHECK, check values to compare */ + uInt marker; /* if BAD, inflateSync's marker bytes count */ + } sub; /* submode */ + + /* mode independent information */ + int nowrap; /* flag for no wrapper */ + uInt wbits; /* log2(window size) (8..15, defaults to 15) */ + inflate_blocks_statef + *blocks; /* current inflate_blocks state */ + +}; + + +ZEXPORT(int) inflateReset( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL) + return Z_STREAM_ERROR; + z->total_in = z->total_out = 0; + z->msg = Z_NULL; + z->state->mode = z->state->nowrap ? BLOCKS : METHOD; + inflate_blocks_reset(z->state->blocks, z, Z_NULL); + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateEnd( /* z) */ +z_streamp z ) +{ + if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) + return Z_STREAM_ERROR; + if (z->state->blocks != Z_NULL) + inflate_blocks_free(z->state->blocks, z); + ZFREE(z, z->state); + z->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + + +ZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */ +z_streamp z, +int w, +const char *version, +int stream_size ) +{ + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != sizeof(z_stream)) + return Z_VERSION_ERROR; + + /* initialize state */ + if (z == Z_NULL) + return Z_STREAM_ERROR; + z->msg = Z_NULL; + if (z->zalloc == Z_NULL) + { + z->zalloc = zcalloc; + z->opaque = (voidpf)0; + } + if (z->zfree == Z_NULL) z->zfree = zcfree; + if ((z->state = (struct internal_state FAR *) + ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) + return Z_MEM_ERROR; + z->state->blocks = Z_NULL; + + /* handle undocumented nowrap option (no zlib header or check) */ + z->state->nowrap = 0; + if (w < 0) + { + w = - w; + z->state->nowrap = 1; + } + + /* set window size */ + if (w < 8 || w > 15) + { + inflateEnd(z); + return Z_STREAM_ERROR; + } + z->state->wbits = (uInt)w; + + /* create inflate_blocks state */ + if ((z->state->blocks = + inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) + == Z_NULL) + { + inflateEnd(z); + return Z_MEM_ERROR; + } + Tracev((stderr, "inflate: allocated\n")); + + /* reset state */ + inflateReset(z); + return Z_OK; +} + + + +#undef NEEDBYTE +#define NEEDBYTE {if(z->avail_in==0)return r;r=f;} + +#undef NEXTBYTE +#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) + + +ZEXPORT(int) inflate( /* z, f) */ +z_streamp z, +int f ) +{ + int r; + uInt b; + + if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) + return Z_STREAM_ERROR; + f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; + r = Z_BUF_ERROR; + while (1) switch (z->state->mode) + { + case METHOD: + NEEDBYTE + if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) + { + z->state->mode = BAD; + z->msg = (char*)"unknown compression method"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + if ((z->state->sub.method >> 4) + 8 > z->state->wbits) + { + z->state->mode = BAD; + z->msg = (char*)"invalid window size"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + z->state->mode = FLAG; + case FLAG: + NEEDBYTE + b = NEXTBYTE; + if (((z->state->sub.method << 8) + b) % 31) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect header check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib header ok\n")); + if (!(b & PRESET_DICT)) + { + z->state->mode = BLOCKS; + break; + } + z->state->mode = DICT4; + case DICT4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = DICT3; + case DICT3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = DICT2; + case DICT2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = DICT1; + case DICT1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + z->adler = z->state->sub.check.need; + z->state->mode = DICT0; + return Z_NEED_DICT; + case DICT0: + z->state->mode = BAD; + z->msg = (char*)"need dictionary"; + z->state->sub.marker = 0; /* can try inflateSync */ + return Z_STREAM_ERROR; + case BLOCKS: + r = inflate_blocks(z->state->blocks, z, r); + if (r == Z_DATA_ERROR) + { + z->state->mode = BAD; + z->state->sub.marker = 0; /* can try inflateSync */ + break; + } + if (r == Z_OK) + r = f; + if (r != Z_STREAM_END) + return r; + r = f; + inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); + if (z->state->nowrap) + { + z->state->mode = DONE; + break; + } + z->state->mode = CHECK4; + case CHECK4: + NEEDBYTE + z->state->sub.check.need = (uLong)NEXTBYTE << 24; + z->state->mode = CHECK3; + case CHECK3: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 16; + z->state->mode = CHECK2; + case CHECK2: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE << 8; + z->state->mode = CHECK1; + case CHECK1: + NEEDBYTE + z->state->sub.check.need += (uLong)NEXTBYTE; + + if (z->state->sub.check.was != z->state->sub.check.need) + { + z->state->mode = BAD; + z->msg = (char*)"incorrect data check"; + z->state->sub.marker = 5; /* can't try inflateSync */ + break; + } + Tracev((stderr, "inflate: zlib check ok\n")); + z->state->mode = DONE; + case DONE: + return Z_STREAM_END; + case BAD: + return Z_DATA_ERROR; + default: + return Z_STREAM_ERROR; + } +#ifdef NEED_DUMMY_RETURN + return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ +#endif +} + diff --git a/thirdparty/freetype/src/gzip/inftrees.c b/thirdparty/freetype/src/gzip/inftrees.c new file mode 100644 index 0000000000..56f52b1701 --- /dev/null +++ b/thirdparty/freetype/src/gzip/inftrees.c @@ -0,0 +1,468 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#if !defined(BUILDFIXED) && !defined(STDC) +# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ +#endif + + +#if 0 +local const char inflate_copyright[] = + " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; +#endif +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* simplify the use of the inflate_huft type with some defines */ +#define exop word.what.Exop +#define bits word.what.Bits + + +local int huft_build OF(( + uIntf *, /* code lengths in bits */ + uInt, /* number of codes */ + uInt, /* number of "simple" codes */ + const uIntf *, /* list of base values for non-simple codes */ + const uIntf *, /* list of extra bits for non-simple codes */ + inflate_huft * FAR*,/* result: starting table */ + uIntf *, /* maximum lookup bits (returns actual) */ + inflate_huft *, /* space for trees */ + uInt *, /* hufts used in space */ + uIntf * )); /* space for values */ + +/* Tables for deflate from PKZIP's appnote.txt. */ +local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + /* see note #13 above about 258 */ +local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ +local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; +local const uInt cpdext[30] = { /* Extra bits for distance codes */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + +/* + Huffman code decoding is performed using a multi-level table lookup. + The fastest way to decode is to simply build a lookup table whose + size is determined by the longest code. However, the time it takes + to build this table can also be a factor if the data being decoded + is not very long. The most common codes are necessarily the + shortest codes, so those codes dominate the decoding time, and hence + the speed. The idea is you can have a shorter table that decodes the + shorter, more probable codes, and then point to subsidiary tables for + the longer codes. The time it costs to decode the longer codes is + then traded against the time it takes to make longer tables. + + This results of this trade are in the variables lbits and dbits + below. lbits is the number of bits the first level table for literal/ + length codes can decode in one step, and dbits is the same thing for + the distance codes. Subsequent tables are also less than or equal to + those sizes. These values may be adjusted either when all of the + codes are shorter than that, in which case the longest code length in + bits is used, or when the shortest code is *longer* than the requested + table size, in which case the length of the shortest code in bits is + used. + + There are two different values for the two tables, since they code a + different number of possibilities each. The literal/length table + codes 286 possible values, or in a flat code, a little over eight + bits. The distance table codes 30 possible values, or a little less + than five bits, flat. The optimum values for speed end up being + about one bit more than those, so lbits is 8+1 and dbits is 5+1. + The optimum values may differ though from machine to machine, and + possibly even between compilers. Your mileage may vary. + */ + + +/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ +#define BMAX 15 /* maximum bit length of any code */ + +local int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */ +uIntf *b, /* code lengths in bits (all assumed <= BMAX) */ +uInt n, /* number of codes (assumed <= 288) */ +uInt s, /* number of simple-valued codes (0..s-1) */ +const uIntf *d, /* list of base values for non-simple codes */ +const uIntf *e, /* list of extra bits for non-simple codes */ +inflate_huft * FAR *t, /* result: starting table */ +uIntf *m, /* maximum lookup bits, returns actual */ +inflate_huft *hp, /* space for trees */ +uInt *hn, /* hufts used in space */ +uIntf *v /* working area: values in order of bit length */ +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR + if the given code set is incomplete (the tables are still built in this + case), or Z_DATA_ERROR if the input is invalid. */ +) +{ + + uInt a; /* counter for codes of length k */ + uInt c[BMAX+1]; /* bit length count table */ + uInt f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + uInt i; /* counter, current code */ + uInt j; /* counter */ + int k; /* number of bits in current code */ + int l; /* bits per table (returned in m) */ + uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ + uIntf *p; /* pointer into c[], b[], or v[] */ + inflate_huft *q; /* points to current table */ + struct inflate_huft_s r; /* table entry for structure assignment */ + inflate_huft *u[BMAX]; /* table stack */ + int w; /* bits before this table == (l * h) */ + uInt x[BMAX+1]; /* bit offsets, then code stack */ + uIntf *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + uInt z; /* number of entries in current table */ + + + /* Make compiler happy */ + r.base = 0; + + /* Generate counts for each bit length */ + p = c; +#define C0 *p++ = 0; +#define C2 C0 C0 C0 C0 +#define C4 C2 C2 C2 C2 + C4 /* clear c[]--assume BMAX+1 is 16 */ + p = b; i = n; + do { + c[*p++]++; /* assume all entries <= BMAX */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (inflate_huft *)Z_NULL; + *m = 0; + return Z_OK; + } + + + /* Find minimum and maximum length, bound *m by those */ + l = *m; + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((uInt)l < j) + l = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((uInt)l > i) + l = i; + *m = l; + + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return Z_DATA_ERROR; + if ((y -= c[i]) < 0) + return Z_DATA_ERROR; + c[i] += y; + + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + n = x[g]; /* set n to length of v */ + + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = -l; /* bits decoded == (l * h) */ + u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ + q = (inflate_huft *)Z_NULL; /* ditto */ + z = 0; /* ditto */ + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { + a = c[k]; + while (a--) + { + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l) + { + h++; + w += l; /* previous table always l bits */ + + /* compute minimum size table less than or equal to l bits */ + z = g - w; + z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + if (j < z) + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } + z = 1 << j; /* table entries for j-bit table */ + + /* allocate new table */ + if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ + return Z_DATA_ERROR; /* overflow of MANY */ + u[h] = q = hp + *hn; + *hn += z; + + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.bits = (Byte)l; /* bits to dump before this table */ + r.exop = (Byte)j; /* bits in this table */ + j = i >> (w - l); + r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ + u[h-1][j] = r; /* connect to last table */ + } + else + *t = q; /* first table is returned result */ + } + + /* set up table entry in r */ + r.bits = (Byte)(k - w); + if (p >= v + n) + r.exop = 128 + 64; /* out of values--invalid code */ + else if (*p < s) + { + r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ + r.base = *p++; /* simple code is just the value */ + } + else + { + r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ + r.base = d[*p++ - s]; + } + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + mask = (1 << w) - 1; /* needed on HP, cc -O bug */ + while ((i & mask) != x[h]) + { + h--; /* don't need to update q */ + w -= l; + mask = (1 << w) - 1; + } + } + } + + + /* Return Z_BUF_ERROR if we were given an incomplete table */ + return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; +} + + +local int inflate_trees_bits( /* c, bb, tb, hp, z) */ +uIntf *c, /* 19 code lengths */ +uIntf *bb, /* bits tree desired/actual depth */ +inflate_huft * FAR *tb, /* bits tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, + tb, bb, hp, &hn, v); + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed dynamic bit lengths tree"; + else if (r == Z_BUF_ERROR || *bb == 0) + { + z->msg = (char*)"incomplete dynamic bit lengths tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +} + + +local int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */ +uInt nl, /* number of literal/length codes */ +uInt nd, /* number of distance codes */ +uIntf *c, /* that many (total) code lengths */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +inflate_huft * FAR *tl, /* literal/length tree result */ +inflate_huft * FAR *td, /* distance tree result */ +inflate_huft *hp, /* space for trees */ +z_streamp z /* for messages */ +) +{ + int r; + uInt hn = 0; /* hufts used in space */ + uIntf *v; /* work area for huft_build */ + + /* allocate work area */ + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + + /* build literal/length tree */ + r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); + if (r != Z_OK || *bl == 0) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed literal/length tree"; + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"incomplete literal/length tree"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; + } + + /* build distance tree */ + r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); + if (r != Z_OK || (*bd == 0 && nl > 257)) + { + if (r == Z_DATA_ERROR) + z->msg = (char*)"oversubscribed distance tree"; + else if (r == Z_BUF_ERROR) { +#if 0 + { +#endif +#ifdef PKZIP_BUG_WORKAROUND + r = Z_OK; + } +#else + z->msg = (char*)"incomplete distance tree"; + r = Z_DATA_ERROR; + } + else if (r != Z_MEM_ERROR) + { + z->msg = (char*)"empty distance tree with lengths"; + r = Z_DATA_ERROR; + } + ZFREE(z, v); + return r; +#endif + } + + /* done */ + ZFREE(z, v); + return Z_OK; +} + + +/* build fixed tables only once--keep them here */ +#ifdef BUILDFIXED +local int fixed_built = 0; +#define FIXEDH 544 /* number of hufts used by fixed tables */ +local inflate_huft fixed_mem[FIXEDH]; +local uInt fixed_bl; +local uInt fixed_bd; +local inflate_huft *fixed_tl; +local inflate_huft *fixed_td; +#else +#include "inffixed.h" +#endif + + +local int inflate_trees_fixed( /* bl, bd, tl, td, z) */ +uIntf *bl, /* literal desired/actual bit depth */ +uIntf *bd, /* distance desired/actual bit depth */ +const inflate_huft * FAR *tl, /* literal/length tree result */ +const inflate_huft * FAR *td, /* distance tree result */ +z_streamp z /* for memory allocation */ +) +{ +#ifdef BUILDFIXED + /* build fixed tables if not already */ + if (!fixed_built) + { + int k; /* temporary variable */ + uInt f = 0; /* number of hufts used in fixed_mem */ + uIntf *c; /* length list for huft_build */ + uIntf *v; /* work area for huft_build */ + + /* allocate memory */ + if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + return Z_MEM_ERROR; + if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) + { + ZFREE(z, c); + return Z_MEM_ERROR; + } + + /* literal table */ + for (k = 0; k < 144; k++) + c[k] = 8; + for (; k < 256; k++) + c[k] = 9; + for (; k < 280; k++) + c[k] = 7; + for (; k < 288; k++) + c[k] = 8; + fixed_bl = 9; + huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, + fixed_mem, &f, v); + + /* distance table */ + for (k = 0; k < 30; k++) + c[k] = 5; + fixed_bd = 5; + huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, + fixed_mem, &f, v); + + /* done */ + ZFREE(z, v); + ZFREE(z, c); + fixed_built = 1; + } +#else + FT_UNUSED(z); +#endif + *bl = fixed_bl; + *bd = fixed_bd; + *tl = fixed_tl; + *td = fixed_td; + return Z_OK; +} diff --git a/thirdparty/freetype/src/gzip/inftrees.h b/thirdparty/freetype/src/gzip/inftrees.h new file mode 100644 index 0000000000..07bf2aa0bf --- /dev/null +++ b/thirdparty/freetype/src/gzip/inftrees.h @@ -0,0 +1,63 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Huffman code lookup table entry--this entry is four bytes for machines + that have 16-bit pointers (e.g. PC's in the small or medium model). */ + +#ifndef _INFTREES_H +#define _INFTREES_H + +typedef struct inflate_huft_s FAR inflate_huft; + +struct inflate_huft_s { + union { + struct { + Byte Exop; /* number of extra bits or operation */ + Byte Bits; /* number of bits in this code or subcode */ + } what; + uInt pad; /* pad structure to a power of 2 (4 bytes for */ + } word; /* 16-bit, 8 bytes for 32-bit int's) */ + uInt base; /* literal, length base, distance base, + or table offset */ +}; + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1004 huft structures (850 for length/literals + and 154 for distances, the latter actually the result of an + exhaustive search). The actual maximum is not known, but the + value below is more than safe. */ +#define MANY 1440 + +local int inflate_trees_bits OF(( + uIntf *, /* 19 code lengths */ + uIntf *, /* bits tree desired/actual depth */ + inflate_huft * FAR *, /* bits tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_dynamic OF(( + uInt, /* number of literal/length codes */ + uInt, /* number of distance codes */ + uIntf *, /* that many (total) code lengths */ + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + inflate_huft * FAR *, /* literal/length tree result */ + inflate_huft * FAR *, /* distance tree result */ + inflate_huft *, /* space for trees */ + z_streamp)); /* for messages */ + +local int inflate_trees_fixed OF(( + uIntf *, /* literal desired/actual bit depth */ + uIntf *, /* distance desired/actual bit depth */ + const inflate_huft * FAR *, /* literal/length tree result */ + const inflate_huft * FAR *, /* distance tree result */ + z_streamp)); /* for memory allocation */ + +#endif /* _INFTREES_H */ diff --git a/thirdparty/freetype/src/gzip/infutil.c b/thirdparty/freetype/src/gzip/infutil.c new file mode 100644 index 0000000000..6087b40647 --- /dev/null +++ b/thirdparty/freetype/src/gzip/infutil.c @@ -0,0 +1,86 @@ +/* inflate_util.c -- data and routines common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infblock.h" +#include "inftrees.h" +#include "infcodes.h" +#include "infutil.h" + + +/* And'ing with mask[n] masks the lower n bits */ +local const uInt inflate_mask[17] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush( /* s, z, r) */ +inflate_blocks_statef *s, +z_streamp z, +int r ) +{ + uInt n; + Bytef *p; + Bytef *q; + + /* local copies of source and destination pointers */ + p = z->next_out; + q = s->read; + + /* compute number of bytes to copy as far as end of window */ + n = (uInt)((q <= s->write ? s->write : s->end) - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy as far as end of window */ + zmemcpy(p, q, n); + p += n; + q += n; + + /* see if more to copy at beginning of window */ + if (q == s->end) + { + /* wrap pointers */ + q = s->window; + if (s->write == s->end) + s->write = s->window; + + /* compute bytes to copy */ + n = (uInt)(s->write - q); + if (n > z->avail_out) n = z->avail_out; + if (n && r == Z_BUF_ERROR) r = Z_OK; + + /* update counters */ + z->avail_out -= n; + z->total_out += n; + + /* update check information */ + if (s->checkfn != Z_NULL) + z->adler = s->check = (*s->checkfn)(s->check, q, n); + + /* copy */ + zmemcpy(p, q, n); + p += n; + q += n; + } + + /* update pointers */ + z->next_out = p; + s->read = q; + + /* done */ + return r; +} diff --git a/thirdparty/freetype/src/gzip/infutil.h b/thirdparty/freetype/src/gzip/infutil.h new file mode 100644 index 0000000000..7174b6dd0f --- /dev/null +++ b/thirdparty/freetype/src/gzip/infutil.h @@ -0,0 +1,98 @@ +/* infutil.h -- types and macros common to blocks and codes + * Copyright (C) 1995-2002 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +#ifndef _INFUTIL_H +#define _INFUTIL_H + +typedef enum { + TYPE, /* get type bits (3, including end bit) */ + LENS, /* get lengths for stored */ + STORED, /* processing stored block */ + TABLE, /* get table lengths */ + BTREE, /* get bit lengths tree for a dynamic block */ + DTREE, /* get length, distance trees for a dynamic block */ + CODES, /* processing fixed or dynamic block */ + DRY, /* output remaining window bytes */ + DONE, /* finished last block, done */ + BAD} /* got a data error--stuck here */ +inflate_block_mode; + +/* inflate blocks semi-private state */ +struct inflate_blocks_state { + + /* mode */ + inflate_block_mode mode; /* current inflate_block mode */ + + /* mode dependent information */ + union { + uInt left; /* if STORED, bytes left to copy */ + struct { + uInt table; /* table lengths (14 bits) */ + uInt index; /* index into blens (or border) */ + uIntf *blens; /* bit lengths of codes */ + uInt bb; /* bit length tree depth */ + inflate_huft *tb; /* bit length decoding tree */ + } trees; /* if DTREE, decoding info for trees */ + struct { + inflate_codes_statef + *codes; + } decode; /* if CODES, current state */ + } sub; /* submode */ + uInt last; /* true if this block is the last block */ + + /* mode independent information */ + uInt bitk; /* bits in bit buffer */ + uLong bitb; /* bit buffer */ + inflate_huft *hufts; /* single malloc for tree space */ + Bytef *window; /* sliding window */ + Bytef *end; /* one byte after sliding window */ + Bytef *read; /* window read pointer */ + Bytef *write; /* window write pointer */ + check_func checkfn; /* check function */ + uLong check; /* check on output */ + +}; + + +/* defines for inflate input/output */ +/* update pointers and return */ +#define UPDBITS {s->bitb=b;s->bitk=k;} +#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} +#define UPDOUT {s->write=q;} +#define UPDATE {UPDBITS UPDIN UPDOUT} +#define LEAVE {UPDATE return inflate_flush(s,z,r);} +/* get bytes and bits */ +#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} +#define NEEDBYTE {if(n)r=Z_OK;else LEAVE} +#define NEXTBYTE (n--,*p++) +#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}} +#define DUMPBITS(j) {b>>=(j);k-=(j);} +/* output bytes */ +#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q) +#define LOADOUT {q=s->write;m=(uInt)WAVAIL;} +#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} +#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} +#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} +#define OUTBYTE(a) {*q++=(Byte)(a);m--;} +/* load local pointers */ +#define LOAD {LOADIN LOADOUT} + +/* masks for lower bits (size given to avoid silly warnings with Visual C++) */ +#ifndef NO_INFLATE_MASK +local uInt inflate_mask[17]; +#endif + +/* copy as much as possible from the sliding window to the output area */ +local int inflate_flush OF(( + inflate_blocks_statef *, + z_streamp , + int)); + +#endif diff --git a/thirdparty/freetype/src/gzip/rules.mk b/thirdparty/freetype/src/gzip/rules.mk new file mode 100644 index 0000000000..bc7d5fa631 --- /dev/null +++ b/thirdparty/freetype/src/gzip/rules.mk @@ -0,0 +1,83 @@ +# +# FreeType 2 GZip support configuration rules +# + + +# Copyright 2002-2017 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# gzip driver directory +# +GZIP_DIR := $(SRC_DIR)/gzip + + +# compilation flags for the driver +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) +else + GZIP_COMPILE := $(CC) $(ANSIFLAGS) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) +endif + + +# gzip support sources +# +# All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB +# is not defined (regardless whether we have a `single' or a `multi' build). +# However, it doesn't harm if we add everything as a dependency +# unconditionally. +# +GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c \ + $(GZIP_DIR)/ftzconf.h \ + $(GZIP_DIR)/infblock.c \ + $(GZIP_DIR)/infblock.h \ + $(GZIP_DIR)/infcodes.c \ + $(GZIP_DIR)/infcodes.h \ + $(GZIP_DIR)/inffixed.h \ + $(GZIP_DIR)/inflate.c \ + $(GZIP_DIR)/inftrees.c \ + $(GZIP_DIR)/inftrees.h \ + $(GZIP_DIR)/infutil.c \ + $(GZIP_DIR)/infutil.h \ + $(GZIP_DIR)/zlib.h \ + $(GZIP_DIR)/zutil.c \ + $(GZIP_DIR)/zutil.h + + +# gzip driver object(s) +# +# GZIP_DRV_OBJ is used during both `single' and `multi' builds +# +GZIP_DRV_OBJ := $(OBJ_DIR)/ftgzip.$O + + +# gzip main source file +# +GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c + + +# gzip support - object +# +$(GZIP_DRV_OBJ): $(GZIP_DRV_SRC) $(GZIP_DRV_SRCS) $(FREETYPE_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC)) + + +# update main driver object lists +# +DRV_OBJS_S += $(GZIP_DRV_OBJ) +DRV_OBJS_M += $(GZIP_DRV_OBJ) + + +# EOF diff --git a/thirdparty/freetype/src/gzip/zlib.h b/thirdparty/freetype/src/gzip/zlib.h new file mode 100644 index 0000000000..a4e82c6a02 --- /dev/null +++ b/thirdparty/freetype/src/gzip/zlib.h @@ -0,0 +1,830 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.1.4, March 11th, 2002 + + Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler + + 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. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef _ZLIB_H +#define _ZLIB_H + +#include "ftzconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.1.4" + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: ascii or binary */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +/* Allowed flush values; see deflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_ASCII 1 +#define Z_UNKNOWN 2 +/* Possible values of the data_type field */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + + + /* basic functions */ + +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN(int) deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + 0.1% larger than avail_in plus 12 bytes. If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). +*/ + + +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN(int) inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN(int) inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may some + introduce some output latency (reading input without producing any output) + except when forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much + output as possible to the output buffer. The flushing behavior of inflate is + not specified for values of the flush parameter other than Z_SYNC_FLUSH + and Z_FINISH, but the current implementation actually flushes as much output + as possible anyway. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster routine + may be used for the single inflate() call. + + If a preset dictionary is needed at this point (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the + dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise + it sets strm->adler to the adler32 checksum of all output produced + so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or + an error code as described below. At the end of the stream, inflate() + checks that its computed adler32 checksum is equal to that saved by the + compressor and returns Z_STREAM_END only if the checksum is correct. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect + adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent + (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if no progress is possible or if there was not + enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR + case, the application may then call inflateSync to look for a good + compression block. +*/ + + +ZEXTERN(int) inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN(int) deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match). Filtered data consists mostly of small values with a + somewhat random distribution. In this case, the compression algorithm is + tuned to compress them better. The effect of Z_FILTERED is to force more + Huffman coding and less string matching; it is somewhat intermediate + between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects + the compression ratio but not the correctness of the compressed output even + if it is not set appropriately. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. + + Upon return of this function, strm->adler is set to the Adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +/* +ZEXTERN(int) inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. If a compressed stream with a larger window size is given as + input, inflate() will return with the error code Z_DATA_ERROR instead of + trying to allocate a larger window. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.) +*/ + +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary). + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN(int) inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least 0.1% larger than + sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ + + +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h". (See the description + of deflateInit2 for more information about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ + +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN(uLong) adler32 OF((uLong adler, const Bytef *buf, uInt len)); + +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN(int) inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ZLIB_H */ diff --git a/thirdparty/freetype/src/gzip/zutil.c b/thirdparty/freetype/src/gzip/zutil.c new file mode 100644 index 0000000000..7ad0c1f81b --- /dev/null +++ b/thirdparty/freetype/src/gzip/zutil.c @@ -0,0 +1,181 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef STDC +extern void exit OF((int)); +#endif + + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#if defined( MSDOS ) && defined( __TURBOC__ ) && !defined( MY_ZCALLOC ) +#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) +/* Small and medium model in Turbo C are for now limited to near allocation + * with reduced MAX_WBITS and MAX_MEM_LEVEL + */ +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} +#endif +#endif /* MSDOS && __TURBOC__ */ + + +#if defined(M_I86) && !defined(__32BIT__) && !defined( MY_ZCALLOC ) +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* MSC */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp ft_scalloc OF((uInt items, uInt size)); +extern void ft_sfree OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return (voidpf)ft_scalloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + ft_sfree(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/thirdparty/freetype/src/gzip/zutil.h b/thirdparty/freetype/src/gzip/zutil.h new file mode 100644 index 0000000000..c9688cd9c0 --- /dev/null +++ b/thirdparty/freetype/src/gzip/zutil.h @@ -0,0 +1,215 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2002 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef _Z_UTIL_H +#define _Z_UTIL_H + +#include "zlib.h" + +#ifdef STDC +# include <stddef.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include <errno.h> +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#ifdef MSDOS +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include <alloc.h> +# endif +# else /* MSC or DJGPP */ +# endif +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +# define OS_CODE 0x0b +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include <unix.h> /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0F +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# define fdopen(fd,type) _fdopen(fd,type) +#endif + + + /* Common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) ft_fopen((name), (mode)) +#endif + + /* functions */ + +#ifdef HAVE_STRERROR + extern char *strerror OF((int)); +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy ft_memcpy +# define zmemcmp ft_memcmp +# define zmemzero(dest, len) ft_memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include <stdio.h> + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +typedef uLong (*check_func) OF((uLong check, const Bytef *buf, + uInt len)); +local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +local void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* _Z_UTIL_H */ diff --git a/thirdparty/freetype/src/lzw/ftlzw.c b/thirdparty/freetype/src/lzw/ftlzw.c new file mode 100644 index 0000000000..941f6cef4c --- /dev/null +++ b/thirdparty/freetype/src/lzw/ftlzw.c @@ -0,0 +1,420 @@ +/***************************************************************************/ +/* */ +/* ftlzw.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2004-2017 by */ +/* Albert Chin-A-Young. */ +/* */ +/* based on code in `src/gzip/ftgzip.c' */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_LZW_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX LZW_Err_ +#define FT_ERR_BASE FT_Mod_Err_LZW + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_LZW + +#ifdef FT_CONFIG_OPTION_PIC +#error "lzw code does not support PIC yet" +#endif + +#include "ftzopen.h" + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_LZW_BUFFER_SIZE 4096 + + typedef struct FT_LZWFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + FT_LzwStateRec lzw; /* lzw decompressor state */ + + FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_LZWFileRec, *FT_LZWFile; + + + /* check and skip .Z header */ + static FT_Error + ft_lzw_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[2]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 2 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers */ + if ( head[0] != 0x1F || + head[1] != 0x9D ) + error = FT_THROW( Invalid_File_Format ); + + Exit: + return error; + } + + + static FT_Error + ft_lzw_file_init( FT_LZWFile zip, + FT_Stream stream, + FT_Stream source ) + { + FT_LzwState lzw = &zip->lzw; + FT_Error error; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .Z header */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + /* initialize internal lzw variable */ + ft_lzwstate_init( lzw, source ); + + Exit: + return error; + } + + + static void + ft_lzw_file_done( FT_LZWFile zip ) + { + /* clear the rest */ + ft_lzwstate_done( &zip->lzw ); + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_lzw_file_reset( FT_LZWFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + ft_lzwstate_reset( &zip->lzw ); + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_lzw_file_fill_output( FT_LZWFile zip ) + { + FT_LzwState lzw = &zip->lzw; + FT_ULong count; + FT_Error error = FT_Err_Ok; + + + zip->cursor = zip->buffer; + + count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE ); + + zip->limit = zip->cursor + count; + + if ( count == 0 ) + error = FT_THROW( Invalid_Stream_Operation ); + + return error; + } + + + /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ + static FT_Error + ft_lzw_file_skip_output( FT_LZWFile zip, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + + + /* first, we skip what we can from the output buffer */ + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + } + + /* next, we skip as many bytes remaining as possible */ + while ( count > 0 ) + { + FT_ULong delta = FT_LZW_BUFFER_SIZE; + FT_ULong numread; + + + if ( delta > count ) + delta = count; + + numread = ft_lzwstate_io( &zip->lzw, NULL, delta ); + if ( numread < delta ) + { + /* not enough bytes */ + error = FT_THROW( Invalid_Stream_Operation ); + break; + } + + zip->pos += delta; + count -= delta; + } + + return error; + } + + + static FT_ULong + ft_lzw_file_io( FT_LZWFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* seeking backwards. */ + if ( pos < zip->pos ) + { + /* If the new position is within the output buffer, simply */ + /* decrement pointers, otherwise we reset the stream completely! */ + if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) ) + { + zip->cursor -= zip->pos - pos; + zip->pos = pos; + } + else + { + error = ft_lzw_file_reset( zip ); + if ( error ) + goto Exit; + } + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer + result, zip->cursor, delta ); + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** L Z W E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_lzw_stream_close( FT_Stream stream ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize lzw file descriptor */ + ft_lzw_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static unsigned long + ft_lzw_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + + + return ft_lzw_file_io( zip, offset, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory; + FT_LZWFile zip = NULL; + + + if ( !stream || !source ) + { + error = FT_THROW( Invalid_Stream_Handle ); + goto Exit; + } + + memory = source->memory; + + /* + * Check the header right now; this prevents allocation of a huge + * LZWFile object (400 KByte of heap memory) if not necessary. + * + * Did I mention that you should never use .Z compressed font + * files? + */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_NEW( zip ) ) + { + error = ft_lzw_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_lzw_stream_io; + stream->close = ft_lzw_stream_close; + + Exit: + return error; + } + + +#include "ftzopen.c" + + +#else /* !FT_CONFIG_OPTION_USE_LZW */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return FT_THROW( Unimplemented_Feature ); + } + + +#endif /* !FT_CONFIG_OPTION_USE_LZW */ + + +/* END */ diff --git a/thirdparty/freetype/src/lzw/ftzopen.c b/thirdparty/freetype/src/lzw/ftzopen.c new file mode 100644 index 0000000000..486c546c14 --- /dev/null +++ b/thirdparty/freetype/src/lzw/ftzopen.c @@ -0,0 +1,424 @@ +/***************************************************************************/ +/* */ +/* ftzopen.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005-2017 by */ +/* David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include "ftzopen.h" +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + static int + ft_lzwstate_refill( FT_LzwState state ) + { + FT_ULong count; + + + if ( state->in_eof ) + return -1; + + count = FT_Stream_TryRead( state->source, + state->buf_tab, + state->num_bits ); /* WHY? */ + + state->buf_size = (FT_UInt)count; + state->buf_total += count; + state->in_eof = FT_BOOL( count < state->num_bits ); + state->buf_offset = 0; + + state->buf_size <<= 3; + if ( state->buf_size > state->num_bits ) + state->buf_size -= state->num_bits - 1; + else + return -1; /* not enough data */ + + if ( count == 0 ) /* end of file */ + return -1; + + return 0; + } + + + static FT_Int32 + ft_lzwstate_get_code( FT_LzwState state ) + { + FT_UInt num_bits = state->num_bits; + FT_UInt offset = state->buf_offset; + FT_Byte* p; + FT_Int result; + + + if ( state->buf_clear || + offset >= state->buf_size || + state->free_ent >= state->free_bits ) + { + if ( state->free_ent >= state->free_bits ) + { + state->num_bits = ++num_bits; + if ( num_bits > LZW_MAX_BITS ) + return -1; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << num_bits ) - 256 ) + : state->max_free + 1; + } + + if ( state->buf_clear ) + { + state->num_bits = num_bits = LZW_INIT_BITS; + state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 ); + state->buf_clear = 0; + } + + if ( ft_lzwstate_refill( state ) < 0 ) + return -1; + + offset = 0; + } + + state->buf_offset = offset + num_bits; + + p = &state->buf_tab[offset >> 3]; + offset &= 7; + result = *p++ >> offset; + offset = 8 - offset; + num_bits -= offset; + + if ( num_bits >= 8 ) + { + result |= *p++ << offset; + offset += 8; + num_bits -= 8; + } + if ( num_bits > 0 ) + result |= ( *p & LZW_MASK( num_bits ) ) << offset; + + return result; + } + + + /* grow the character stack */ + static int + ft_lzwstate_stack_grow( FT_LzwState state ) + { + if ( state->stack_top >= state->stack_size ) + { + FT_Memory memory = state->memory; + FT_Error error; + FT_Offset old_size = state->stack_size; + FT_Offset new_size = old_size; + + new_size = new_size + ( new_size >> 1 ) + 4; + + if ( state->stack == state->stack_0 ) + { + state->stack = NULL; + old_size = 0; + } + + /* requirement of the character stack larger than 1<<LZW_MAX_BITS */ + /* implies bug in the decompression code */ + if ( new_size > ( 1 << LZW_MAX_BITS ) ) + { + new_size = 1 << LZW_MAX_BITS; + if ( new_size == old_size ) + return -1; + } + + if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) ) + return -1; + + state->stack_size = new_size; + } + return 0; + } + + + /* grow the prefix/suffix arrays */ + static int + ft_lzwstate_prefix_grow( FT_LzwState state ) + { + FT_UInt old_size = state->prefix_size; + FT_UInt new_size = old_size; + FT_Memory memory = state->memory; + FT_Error error; + + + if ( new_size == 0 ) /* first allocation -> 9 bits */ + new_size = 512; + else + new_size += new_size >> 2; /* don't grow too fast */ + + /* + * Note that the `suffix' array is located in the same memory block + * pointed to by `prefix'. + * + * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer + * to write it literally. + * + */ + if ( FT_REALLOC_MULT( state->prefix, old_size, new_size, + sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) ) + return -1; + + /* now adjust `suffix' and move the data accordingly */ + state->suffix = (FT_Byte*)( state->prefix + new_size ); + + FT_MEM_MOVE( state->suffix, + state->prefix + old_size, + old_size * sizeof ( FT_Byte ) ); + + state->prefix_size = new_size; + return 0; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_reset( FT_LzwState state ) + { + state->in_eof = 0; + state->buf_offset = 0; + state->buf_size = 0; + state->buf_clear = 0; + state->buf_total = 0; + state->stack_top = 0; + state->num_bits = LZW_INIT_BITS; + state->phase = FT_LZW_PHASE_START; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ) + { + FT_ZERO( state ); + + state->source = source; + state->memory = source->memory; + + state->prefix = NULL; + state->suffix = NULL; + state->prefix_size = 0; + + state->stack = state->stack_0; + state->stack_size = sizeof ( state->stack_0 ); + + ft_lzwstate_reset( state ); + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_done( FT_LzwState state ) + { + FT_Memory memory = state->memory; + + + ft_lzwstate_reset( state ); + + if ( state->stack != state->stack_0 ) + FT_FREE( state->stack ); + + FT_FREE( state->prefix ); + state->suffix = NULL; + + FT_ZERO( state ); + } + + +#define FTLZW_STACK_PUSH( c ) \ + FT_BEGIN_STMNT \ + if ( state->stack_top >= state->stack_size && \ + ft_lzwstate_stack_grow( state ) < 0 ) \ + goto Eof; \ + \ + state->stack[state->stack_top++] = (FT_Byte)(c); \ + FT_END_STMNT + + + FT_LOCAL_DEF( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ) + { + FT_ULong result = 0; + + FT_UInt old_char = state->old_char; + FT_UInt old_code = state->old_code; + FT_UInt in_code = state->in_code; + + + if ( out_size == 0 ) + goto Exit; + + switch ( state->phase ) + { + case FT_LZW_PHASE_START: + { + FT_Byte max_bits; + FT_Int32 c; + + + /* skip magic bytes, and read max_bits + block_flag */ + if ( FT_Stream_Seek( state->source, 2 ) != 0 || + FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 ) + goto Eof; + + state->max_bits = max_bits & LZW_BIT_MASK; + state->block_mode = max_bits & LZW_BLOCK_MASK; + state->max_free = (FT_UInt)( ( 1UL << state->max_bits ) - 256 ); + + if ( state->max_bits > LZW_MAX_BITS ) + goto Eof; + + state->num_bits = LZW_INIT_BITS; + state->free_ent = ( state->block_mode ? LZW_FIRST + : LZW_CLEAR ) - 256; + in_code = 0; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 ) + : state->max_free + 1; + + c = ft_lzwstate_get_code( state ); + if ( c < 0 || c > 255 ) + goto Eof; + + old_code = old_char = (FT_UInt)c; + + if ( buffer ) + buffer[result] = (FT_Byte)old_char; + + if ( ++result >= out_size ) + goto Exit; + + state->phase = FT_LZW_PHASE_CODE; + } + /* fall-through */ + + case FT_LZW_PHASE_CODE: + { + FT_Int32 c; + FT_UInt code; + + + NextCode: + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + + if ( code == LZW_CLEAR && state->block_mode ) + { + /* why not LZW_FIRST-256 ? */ + state->free_ent = ( LZW_FIRST - 1 ) - 256; + state->buf_clear = 1; + + /* not quite right, but at least more predictable */ + old_code = 0; + old_char = 0; + + goto NextCode; + } + + in_code = code; /* save code for later */ + + if ( code >= 256U ) + { + /* special case for KwKwKwK */ + if ( code - 256U >= state->free_ent ) + { + /* corrupted LZW stream */ + if ( code - 256U > state->free_ent ) + goto Eof; + + FTLZW_STACK_PUSH( old_char ); + code = old_code; + } + + while ( code >= 256U ) + { + if ( !state->prefix ) + goto Eof; + + FTLZW_STACK_PUSH( state->suffix[code - 256] ); + code = state->prefix[code - 256]; + } + } + + old_char = code; + FTLZW_STACK_PUSH( old_char ); + + state->phase = FT_LZW_PHASE_STACK; + } + /* fall-through */ + + case FT_LZW_PHASE_STACK: + { + while ( state->stack_top > 0 ) + { + state->stack_top--; + + if ( buffer ) + buffer[result] = state->stack[state->stack_top]; + + if ( ++result == out_size ) + goto Exit; + } + + /* now create new entry */ + if ( state->free_ent < state->max_free ) + { + if ( state->free_ent >= state->prefix_size && + ft_lzwstate_prefix_grow( state ) < 0 ) + goto Eof; + + FT_ASSERT( state->free_ent < state->prefix_size ); + + state->prefix[state->free_ent] = (FT_UShort)old_code; + state->suffix[state->free_ent] = (FT_Byte) old_char; + + state->free_ent += 1; + } + + old_code = in_code; + + state->phase = FT_LZW_PHASE_CODE; + goto NextCode; + } + + default: /* state == EOF */ + ; + } + + Exit: + state->old_code = old_code; + state->old_char = old_char; + state->in_code = in_code; + + return result; + + Eof: + state->phase = FT_LZW_PHASE_EOF; + goto Exit; + } + + +/* END */ diff --git a/thirdparty/freetype/src/lzw/ftzopen.h b/thirdparty/freetype/src/lzw/ftzopen.h new file mode 100644 index 0000000000..a108862c0a --- /dev/null +++ b/thirdparty/freetype/src/lzw/ftzopen.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftzopen.h */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005-2017 by */ +/* David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef FTZOPEN_H_ +#define FTZOPEN_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + + + /* + * This is a complete re-implementation of the LZW file reader, + * since the old one was incredibly badly written, using + * 400 KByte of heap memory before decompressing anything. + * + */ + +#define FT_LZW_IN_BUFF_SIZE 64 +#define FT_LZW_DEFAULT_STACK_SIZE 64 + +#define LZW_INIT_BITS 9 +#define LZW_MAX_BITS 16 + +#define LZW_CLEAR 256 +#define LZW_FIRST 257 + +#define LZW_BIT_MASK 0x1F +#define LZW_BLOCK_MASK 0x80 +#define LZW_MASK( n ) ( ( 1U << (n) ) - 1U ) + + + typedef enum FT_LzwPhase_ + { + FT_LZW_PHASE_START = 0, + FT_LZW_PHASE_CODE, + FT_LZW_PHASE_STACK, + FT_LZW_PHASE_EOF + + } FT_LzwPhase; + + + /* + * state of LZW decompressor + * + * small technical note + * -------------------- + * + * We use a few tricks in this implementation that are explained here to + * ease debugging and maintenance. + * + * - First of all, the `prefix' and `suffix' arrays contain the suffix + * and prefix for codes over 256; this means that + * + * prefix_of(code) == state->prefix[code-256] + * suffix_of(code) == state->suffix[code-256] + * + * Each prefix is a 16-bit code, and each suffix an 8-bit byte. + * + * Both arrays are stored in a single memory block, pointed to by + * `state->prefix'. This means that the following equality is always + * true: + * + * state->suffix == (FT_Byte*)(state->prefix + state->prefix_size) + * + * Of course, state->prefix_size is the number of prefix/suffix slots + * in the arrays, corresponding to codes 256..255+prefix_size. + * + * - `free_ent' is the index of the next free entry in the `prefix' + * and `suffix' arrays. This means that the corresponding `next free + * code' is really `256+free_ent'. + * + * Moreover, `max_free' is the maximum value that `free_ent' can reach. + * + * `max_free' corresponds to `(1 << max_bits) - 256'. Note that this + * value is always <= 0xFF00, which means that both `free_ent' and + * `max_free' can be stored in an FT_UInt variable, even on 16-bit + * machines. + * + * If `free_ent == max_free', you cannot add new codes to the + * prefix/suffix table. + * + * - `num_bits' is the current number of code bits, starting at 9 and + * growing each time `free_ent' reaches the value of `free_bits'. The + * latter is computed as follows + * + * if num_bits < max_bits: + * free_bits = (1 << num_bits)-256 + * else: + * free_bits = max_free + 1 + * + * Since the value of `max_free + 1' can never be reached by + * `free_ent', `num_bits' cannot grow larger than `max_bits'. + */ + + typedef struct FT_LzwStateRec_ + { + FT_LzwPhase phase; + FT_Int in_eof; + + FT_Byte buf_tab[16]; + FT_UInt buf_offset; + FT_UInt buf_size; + FT_Bool buf_clear; + FT_Offset buf_total; + + FT_UInt max_bits; /* max code bits, from file header */ + FT_Int block_mode; /* block mode flag, from file header */ + FT_UInt max_free; /* (1 << max_bits) - 256 */ + + FT_UInt num_bits; /* current code bit number */ + FT_UInt free_ent; /* index of next free entry */ + FT_UInt free_bits; /* if reached by free_ent, increment num_bits */ + FT_UInt old_code; + FT_UInt old_char; + FT_UInt in_code; + + FT_UShort* prefix; /* always dynamically allocated / reallocated */ + FT_Byte* suffix; /* suffix = (FT_Byte*)(prefix + prefix_size) */ + FT_UInt prefix_size; /* number of slots in `prefix' or `suffix' */ + + FT_Byte* stack; /* character stack */ + FT_UInt stack_top; + FT_Offset stack_size; + FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ + + FT_Stream source; /* source stream */ + FT_Memory memory; + + } FT_LzwStateRec, *FT_LzwState; + + + FT_LOCAL( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ); + + FT_LOCAL( void ) + ft_lzwstate_done( FT_LzwState state ); + + + FT_LOCAL( void ) + ft_lzwstate_reset( FT_LzwState state ); + + + FT_LOCAL( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ); + +/* */ + +#endif /* FTZOPEN_H_ */ + + +/* END */ diff --git a/thirdparty/freetype/src/lzw/rules.mk b/thirdparty/freetype/src/lzw/rules.mk new file mode 100644 index 0000000000..e7bf68a065 --- /dev/null +++ b/thirdparty/freetype/src/lzw/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 LZW support configuration rules +# + + +# Copyright 2004-2017 by +# Albert Chin-A-Young. +# +# based on `src/lzw/rules.mk' +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# LZW driver directory +# +LZW_DIR := $(SRC_DIR)/lzw + + +# compilation flags for the driver +# +LZW_COMPILE := $(CC) $(ANSIFLAGS) \ + $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) \ + $(INCLUDE_FLAGS) \ + $(FT_CFLAGS) + + +# LZW support sources (i.e., C files) +# +LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c + +# LZW support headers +# +LZW_DRV_H := $(LZW_DIR)/ftzopen.h \ + $(LZW_DIR)/ftzopen.c + + +# LZW driver object(s) +# +# LZW_DRV_OBJ_M is used during `multi' builds +# LZW_DRV_OBJ_S is used during `single' builds +# +LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O +LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O + +# LZW support source file for single build +# +LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c + + +# LZW support - single object +# +$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) + + +# LZW support - multiple objects +# +$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(LZW_DRV_OBJ_S) +DRV_OBJS_M += $(LZW_DRV_OBJ_M) + + +# EOF diff --git a/thirdparty/freetype/src/otvalid/module.mk b/thirdparty/freetype/src/otvalid/module.mk index b929cdbab0..5ee1265db8 100644 --- a/thirdparty/freetype/src/otvalid/module.mk +++ b/thirdparty/freetype/src/otvalid/module.mk @@ -3,7 +3,7 @@ # -# Copyright 2004-2016 by +# Copyright 2004-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/otvalid/otvalid.c b/thirdparty/freetype/src/otvalid/otvalid.c index 932a974a31..312751a1f4 100644 --- a/thirdparty/freetype/src/otvalid/otvalid.c +++ b/thirdparty/freetype/src/otvalid/otvalid.c @@ -4,7 +4,7 @@ /* */ /* FreeType validator for OpenType tables (body only). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -15,8 +15,8 @@ /* */ /***************************************************************************/ -#define FT_MAKE_OPTION_SINGLE_OBJECT +#define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> #include "otvbase.c" @@ -28,4 +28,5 @@ #include "otvmath.c" #include "otvmod.c" + /* END */ diff --git a/thirdparty/freetype/src/otvalid/otvalid.h b/thirdparty/freetype/src/otvalid/otvalid.h index 93438a0639..f2969ccccc 100644 --- a/thirdparty/freetype/src/otvalid/otvalid.h +++ b/thirdparty/freetype/src/otvalid/otvalid.h @@ -4,7 +4,7 @@ /* */ /* OpenType table validation (specification only). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvbase.c b/thirdparty/freetype/src/otvalid/otvbase.c index e86e8bb2f0..3adad8439c 100644 --- a/thirdparty/freetype/src/otvalid/otvbase.c +++ b/thirdparty/freetype/src/otvalid/otvbase.c @@ -4,7 +4,7 @@ /* */ /* OpenType BASE table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvcommn.c b/thirdparty/freetype/src/otvalid/otvcommn.c index 2e88e102be..3407d2ad4a 100644 --- a/thirdparty/freetype/src/otvalid/otvcommn.c +++ b/thirdparty/freetype/src/otvalid/otvcommn.c @@ -4,7 +4,7 @@ /* */ /* OpenType common tables validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -68,7 +68,7 @@ OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ - for ( i = 0; i < GlyphCount; ++i ) + for ( i = 0; i < GlyphCount; i++ ) { FT_UInt gid; diff --git a/thirdparty/freetype/src/otvalid/otvcommn.h b/thirdparty/freetype/src/otvalid/otvcommn.h index 44e0c63793..10a603ebb9 100644 --- a/thirdparty/freetype/src/otvalid/otvcommn.h +++ b/thirdparty/freetype/src/otvalid/otvcommn.h @@ -4,7 +4,7 @@ /* */ /* OpenType common tables validation (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otverror.h b/thirdparty/freetype/src/otvalid/otverror.h index e7c8db0d58..699903987c 100644 --- a/thirdparty/freetype/src/otvalid/otverror.h +++ b/thirdparty/freetype/src/otvalid/otverror.h @@ -4,7 +4,7 @@ /* */ /* OpenType validation module error codes (specification only). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvgdef.c b/thirdparty/freetype/src/otvalid/otvgdef.c index f19e300e51..27b9a69ca8 100644 --- a/thirdparty/freetype/src/otvalid/otvgdef.c +++ b/thirdparty/freetype/src/otvalid/otvgdef.c @@ -4,7 +4,7 @@ /* */ /* OpenType GDEF table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvgpos.c b/thirdparty/freetype/src/otvalid/otvgpos.c index e904ea5d6c..0fbcc2077c 100644 --- a/thirdparty/freetype/src/otvalid/otvgpos.c +++ b/thirdparty/freetype/src/otvalid/otvgpos.c @@ -4,7 +4,7 @@ /* */ /* OpenType GPOS table validation (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvgpos.h b/thirdparty/freetype/src/otvalid/otvgpos.h index 2c09e64f97..99b0ad3915 100644 --- a/thirdparty/freetype/src/otvalid/otvgpos.h +++ b/thirdparty/freetype/src/otvalid/otvgpos.h @@ -4,7 +4,7 @@ /* */ /* OpenType GPOS table validator (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvgsub.c b/thirdparty/freetype/src/otvalid/otvgsub.c index c2b28569f1..f9bd8dc5d8 100644 --- a/thirdparty/freetype/src/otvalid/otvgsub.c +++ b/thirdparty/freetype/src/otvalid/otvgsub.c @@ -4,7 +4,7 @@ /* */ /* OpenType GSUB table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvjstf.c b/thirdparty/freetype/src/otvalid/otvjstf.c index e19c1c1213..57a38f95c9 100644 --- a/thirdparty/freetype/src/otvalid/otvjstf.c +++ b/thirdparty/freetype/src/otvalid/otvjstf.c @@ -4,7 +4,7 @@ /* */ /* OpenType JSTF table validation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/otvmath.c b/thirdparty/freetype/src/otvalid/otvmath.c index 6c785b6fda..a14d369700 100644 --- a/thirdparty/freetype/src/otvalid/otvmath.c +++ b/thirdparty/freetype/src/otvalid/otvmath.c @@ -4,7 +4,7 @@ /* */ /* OpenType MATH table validation (body). */ /* */ -/* Copyright 2007-2016 by */ +/* Copyright 2007-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* Written by George Williams. */ @@ -60,7 +60,7 @@ table_size = 2 * ( 56 + 51 ); p += 4 * 2; /* First 4 constants have no device tables */ - for ( i = 0; i < 51; ++i ) + for ( i = 0; i < 51; i++ ) { p += 2; /* skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); @@ -110,7 +110,7 @@ OTV_SIZE_CHECK( Coverage ); otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); - for ( i = 0; i < cnt; ++i ) + for ( i = 0; i < cnt; i++ ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); @@ -151,7 +151,7 @@ table_size = 4 + 4 * cnt; /* Heights */ - for ( i = 0; i < cnt; ++i ) + for ( i = 0; i < cnt; i++ ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); @@ -161,7 +161,7 @@ } /* One more Kerning value */ - for ( i = 0; i < cnt + 1; ++i ) + for ( i = 0; i < cnt + 1; i++ ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); @@ -198,9 +198,9 @@ OTV_SIZE_CHECK( Coverage ); otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); - for ( i = 0; i < cnt; ++i ) + for ( i = 0; i < cnt; i++ ) { - for ( j = 0; j < 4; ++j ) + for ( j = 0; j < 4; j++ ) { OTV_OPTIONAL_OFFSET( MKRecordOffset ); OTV_SIZE_CHECK( MKRecordOffset ); @@ -296,7 +296,7 @@ if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, otvalid ); - for ( i = 0; i < pcnt; ++i ) + for ( i = 0; i < pcnt; i++ ) { FT_UInt gid; @@ -332,7 +332,7 @@ OTV_LIMIT_CHECK( 4 * vcnt ); table_size = 4 + 4 * vcnt; - for ( i = 0; i < vcnt; ++i ) + for ( i = 0; i < vcnt; i++ ) { FT_UInt gid; @@ -384,14 +384,14 @@ if ( HCoverage ) otv_Coverage_validate( table + HCoverage, otvalid, (FT_Int)hcnt ); - for ( i = 0; i < vcnt; ++i ) + for ( i = 0; i < vcnt; i++ ) { OTV_OPTIONAL_OFFSET( Offset ); OTV_SIZE_CHECK( Offset ); otv_MathGlyphConstruction_validate( table + Offset, otvalid ); } - for ( i = 0; i < hcnt; ++i ) + for ( i = 0; i < hcnt; i++ ) { OTV_OPTIONAL_OFFSET( Offset ); OTV_SIZE_CHECK( Offset ); diff --git a/thirdparty/freetype/src/otvalid/otvmod.c b/thirdparty/freetype/src/otvalid/otvmod.c index 972bd1baac..35ffc43d3a 100644 --- a/thirdparty/freetype/src/otvalid/otvmod.c +++ b/thirdparty/freetype/src/otvalid/otvmod.c @@ -4,7 +4,7 @@ /* */ /* FreeType's OpenType validation module implementation (body). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -271,11 +271,11 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) otvalid_get_service + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) otvalid_get_service /* get_interface */ }; diff --git a/thirdparty/freetype/src/otvalid/otvmod.h b/thirdparty/freetype/src/otvalid/otvmod.h index e464030ab0..30d401ddca 100644 --- a/thirdparty/freetype/src/otvalid/otvmod.h +++ b/thirdparty/freetype/src/otvalid/otvmod.h @@ -5,7 +5,7 @@ /* FreeType's OpenType validation module implementation */ /* (specification). */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/otvalid/rules.mk b/thirdparty/freetype/src/otvalid/rules.mk index 077447fcb6..10329a96ea 100644 --- a/thirdparty/freetype/src/otvalid/rules.mk +++ b/thirdparty/freetype/src/otvalid/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2004-2016 by +# Copyright 2004-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/pcf/pcf.c b/thirdparty/freetype/src/pcf/pcf.c index 11d5b7b2a0..8ffd6e280b 100644 --- a/thirdparty/freetype/src/pcf/pcf.c +++ b/thirdparty/freetype/src/pcf/pcf.c @@ -26,11 +26,11 @@ THE SOFTWARE. #define FT_MAKE_OPTION_SINGLE_OBJECT - - #include <ft2build.h> -#include "pcfutil.c" -#include "pcfread.c" + #include "pcfdrivr.c" +#include "pcfread.c" +#include "pcfutil.c" + /* END */ diff --git a/thirdparty/freetype/src/pcf/pcf.h b/thirdparty/freetype/src/pcf/pcf.h index c726e5ec6b..f0390cb1eb 100644 --- a/thirdparty/freetype/src/pcf/pcf.h +++ b/thirdparty/freetype/src/pcf/pcf.h @@ -163,6 +163,15 @@ FT_BEGIN_HEADER } PCF_FaceRec, *PCF_Face; + typedef struct PCF_DriverRec_ + { + FT_DriverRec root; + + FT_Bool no_long_family_names; + + } PCF_DriverRec, *PCF_Driver; + + /* macros for pcf font format */ #define LSBFirst 0 diff --git a/thirdparty/freetype/src/pcf/pcfdrivr.c b/thirdparty/freetype/src/pcf/pcfdrivr.c index 0996d10793..9f4d36d111 100644 --- a/thirdparty/freetype/src/pcf/pcfdrivr.c +++ b/thirdparty/freetype/src/pcf/pcfdrivr.c @@ -49,6 +49,8 @@ THE SOFTWARE. #include FT_SERVICE_BDF_H #include FT_SERVICE_FONT_FORMAT_H +#include FT_SERVICE_PROPERTIES_H +#include FT_PCF_DRIVER_H /*************************************************************************/ @@ -286,6 +288,7 @@ THE SOFTWARE. /* this didn't work, try gzip support! */ + FT_TRACE2(( " ... try gzip stream\n" )); error2 = FT_Stream_OpenGzip( &face->comp_stream, stream ); if ( FT_ERR_EQ( error2, Unimplemented_Feature ) ) goto Fail; @@ -301,6 +304,7 @@ THE SOFTWARE. /* this didn't work, try LZW support! */ + FT_TRACE2(( " ... try LZW stream\n" )); error3 = FT_Stream_OpenLZW( &face->comp_stream, stream ); if ( FT_ERR_EQ( error3, Unimplemented_Feature ) ) goto Fail; @@ -316,6 +320,7 @@ THE SOFTWARE. /* this didn't work, try Bzip2 support! */ + FT_TRACE2(( " ... try Bzip2 stream\n" )); error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream ); if ( FT_ERR_EQ( error4, Unimplemented_Feature ) ) goto Fail; @@ -492,8 +497,6 @@ THE SOFTWARE. PCF_Metric metric; FT_ULong bytes; - FT_UNUSED( load_flags ); - FT_TRACE1(( "PCF_Glyph_Load: glyph index %d\n", glyph_index )); @@ -523,11 +526,6 @@ THE SOFTWARE. bitmap->num_grays = 1; bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n", - PCF_BIT_ORDER( face->bitmapsFormat ), - PCF_BYTE_ORDER( face->bitmapsFormat ), - PCF_GLYPH_PAD( face->bitmapsFormat ) )); - switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) ) { case 1: @@ -550,6 +548,24 @@ THE SOFTWARE. return FT_THROW( Invalid_File_Format ); } + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = metric->leftSideBearing; + slot->bitmap_top = metric->ascent; + + slot->metrics.horiAdvance = (FT_Pos)( metric->characterWidth * 64 ); + slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing * 64 ); + slot->metrics.horiBearingY = (FT_Pos)( metric->ascent * 64 ); + slot->metrics.width = (FT_Pos)( ( metric->rightSideBearing - + metric->leftSideBearing ) * 64 ); + slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); + + ft_synthesize_vertical_metrics( &slot->metrics, + ( face->accel.fontAscent + + face->accel.fontDescent ) * 64 ); + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + goto Exit; + /* XXX: to do: are there cases that need repadding the bitmap? */ bytes = (FT_ULong)bitmap->pitch * bitmap->rows; @@ -582,21 +598,6 @@ THE SOFTWARE. } } - slot->format = FT_GLYPH_FORMAT_BITMAP; - slot->bitmap_left = metric->leftSideBearing; - slot->bitmap_top = metric->ascent; - - slot->metrics.horiAdvance = (FT_Pos)( metric->characterWidth * 64 ); - slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing * 64 ); - slot->metrics.horiBearingY = (FT_Pos)( metric->ascent * 64 ); - slot->metrics.width = (FT_Pos)( ( metric->rightSideBearing - - metric->leftSideBearing ) * 64 ); - slot->metrics.height = (FT_Pos)( bitmap->rows * 64 ); - - ft_synthesize_vertical_metrics( &slot->metrics, - ( face->accel.fontAscent + - face->accel.fontDescent ) * 64 ); - Exit: return error; } @@ -617,7 +618,7 @@ THE SOFTWARE. prop = pcf_find_property( face, prop_name ); - if ( prop != NULL ) + if ( prop ) { if ( prop->isString ) { @@ -626,19 +627,23 @@ THE SOFTWARE. } else { - if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) + if ( prop->value.l > 0x7FFFFFFFL || + prop->value.l < ( -1 - 0x7FFFFFFFL ) ) { - FT_TRACE1(( "pcf_get_bdf_property: " )); - FT_TRACE1(( "too large integer 0x%x is truncated\n" )); + FT_TRACE1(( "pcf_get_bdf_property:" )); + FT_TRACE1(( " too large integer 0x%x is truncated\n" )); } - /* Apparently, the PCF driver loads all properties as signed integers! - * This really doesn't seem to be a problem, because this is - * sufficient for any meaningful values. + + /* + * The PCF driver loads all properties as signed integers. + * This really doesn't seem to be a problem, because this is + * sufficient for any meaningful values. */ aproperty->type = BDF_PROPERTY_TYPE_INTEGER; aproperty->u.integer = (FT_Int32)prop->value.l; } - return 0; + + return FT_Err_Ok; } return FT_THROW( Invalid_Argument ); @@ -653,7 +658,7 @@ THE SOFTWARE. *acharset_encoding = face->charset_encoding; *acharset_registry = face->charset_registry; - return 0; + return FT_Err_Ok; } @@ -664,6 +669,116 @@ THE SOFTWARE. }; + /* + * PROPERTY SERVICE + * + */ + static FT_Error + pcf_property_set( FT_Module module, /* PCF_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + FT_Error error = FT_Err_Ok; + PCF_Driver driver = (PCF_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "no-long-family-names" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long lfn = ft_strtol( s, NULL, 10 ); + + + if ( lfn == 0 ) + driver->no_long_family_names = 0; + else if ( lfn == 1 ) + driver->no_long_family_names = 1; + else + return FT_THROW( Invalid_Argument ); + } + else +#endif + { + FT_Bool* no_long_family_names = (FT_Bool*)value; + + + driver->no_long_family_names = *no_long_family_names; + } + + return error; + } + +#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_UNUSED( module ); + FT_UNUSED( value ); + FT_UNUSED( value_is_string ); +#ifndef FT_DEBUG_LEVEL_TRACE + FT_UNUSED( property_name ); +#endif + +#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_TRACE0(( "pcf_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + static FT_Error + pcf_property_get( FT_Module module, /* PCF_Driver */ + const char* property_name, + const void* value ) + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + FT_Error error = FT_Err_Ok; + PCF_Driver driver = (PCF_Driver)module; + + + if ( !ft_strcmp( property_name, "no-long-family-names" ) ) + { + FT_Bool no_long_family_names = driver->no_long_family_names; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_long_family_names; + + return error; + } + +#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_UNUSED( module ); + FT_UNUSED( value ); +#ifndef FT_DEBUG_LEVEL_TRACE + FT_UNUSED( property_name ); +#endif + +#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + FT_TRACE0(( "pcf_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + pcf_service_properties, + + (FT_Properties_SetFunc)pcf_property_set, /* set_property */ + (FT_Properties_GetFunc)pcf_property_get ) /* get_property */ + + /* * * SERVICE LIST @@ -674,6 +789,7 @@ THE SOFTWARE. { { FT_SERVICE_ID_BDF, &pcf_service_bdf }, { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PCF }, + { FT_SERVICE_ID_PROPERTIES, &pcf_service_properties }, { NULL, NULL } }; @@ -688,22 +804,45 @@ THE SOFTWARE. } + FT_CALLBACK_DEF( FT_Error ) + pcf_driver_init( FT_Module module ) /* PCF_Driver */ + { +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + PCF_Driver driver = (PCF_Driver)module; + + + driver->no_long_family_names = 0; +#else + FT_UNUSED( module ); +#endif + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + pcf_driver_done( FT_Module module ) /* PCF_Driver */ + { + FT_UNUSED( module ); + } + + FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec pcf_driver_class = { { FT_MODULE_FONT_DRIVER | FT_MODULE_DRIVER_NO_OUTLINES, - sizeof ( FT_DriverRec ), + sizeof ( PCF_DriverRec ), "pcf", 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - 0, /* FT_Module_Constructor module_init */ - 0, /* FT_Module_Destructor module_done */ + pcf_driver_init, /* FT_Module_Constructor module_init */ + pcf_driver_done, /* FT_Module_Destructor module_done */ pcf_driver_requester /* FT_Module_Requester get_interface */ }, @@ -713,16 +852,16 @@ THE SOFTWARE. PCF_Face_Init, /* FT_Face_InitFunc init_face */ PCF_Face_Done, /* FT_Face_DoneFunc done_face */ - 0, /* FT_Size_InitFunc init_size */ - 0, /* FT_Size_DoneFunc done_size */ - 0, /* FT_Slot_InitFunc init_slot */ - 0, /* FT_Slot_DoneFunc done_slot */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ PCF_Glyph_Load, /* FT_Slot_LoadFunc load_glyph */ - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ PCF_Size_Request, /* FT_Size_RequestFunc request_size */ PCF_Size_Select /* FT_Size_SelectFunc select_size */ diff --git a/thirdparty/freetype/src/pcf/pcfread.c b/thirdparty/freetype/src/pcf/pcfread.c index a86b45d6bf..3eacf2baf6 100644 --- a/thirdparty/freetype/src/pcf/pcfread.c +++ b/thirdparty/freetype/src/pcf/pcfread.c @@ -50,8 +50,15 @@ THE SOFTWARE. #ifdef FT_DEBUG_LEVEL_TRACE static const char* const tableNames[] = { - "prop", "accl", "mtrcs", "bmps", "imtrcs", - "enc", "swidth", "names", "accel" + "properties", + "accelerators", + "metrics", + "bitmaps", + "ink metrics", + "encodings", + "swidths", + "glyph names", + "BDF accelerators" }; #endif @@ -109,17 +116,20 @@ THE SOFTWARE. if ( stream->size < 16 ) return FT_THROW( Invalid_File_Format ); - /* we need 16 bytes per TOC entry */ - if ( toc->count > stream->size >> 4 ) + /* we need 16 bytes per TOC entry, */ + /* and there can be most 9 tables */ + if ( toc->count > ( stream->size >> 4 ) || + toc->count > 9 ) { FT_TRACE0(( "pcf_read_TOC: adjusting number of tables" " (from %d to %d)\n", - toc->count, stream->size >> 4 )); - toc->count = stream->size >> 4; + toc->count, + FT_MIN( stream->size >> 4, 9 ) )); + toc->count = FT_MIN( stream->size >> 4, 9 ); } if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) ) - return FT_THROW( Out_Of_Memory ); + return error; tables = face->toc.tables; for ( n = 0; n < toc->count; n++ ) @@ -232,8 +242,8 @@ THE SOFTWARE. if ( tables[i].type == (FT_UInt)( 1 << j ) ) name = tableNames[j]; - FT_TRACE4(( " %d: type=%s, format=0x%X, " - "size=%ld (0x%lX), offset=%ld (0x%lX)\n", + FT_TRACE4(( " %d: type=%s, format=0x%X," + " size=%ld (0x%lX), offset=%ld (0x%lX)\n", i, name, tables[i].format, tables[i].size, tables[i].size, @@ -319,7 +329,7 @@ THE SOFTWARE. /* parsing normal metrics */ - fields = PCF_BYTE_ORDER( format ) == MSBFirst + fields = ( PCF_BYTE_ORDER( format ) == MSBFirst ) ? pcf_metric_msb_header : pcf_metric_header; @@ -343,6 +353,17 @@ THE SOFTWARE. metric->attributes = 0; } + FT_TRACE5(( " width=%d," + " lsb=%d, rsb=%d," + " ascent=%d, descent=%d," + " attributes=%d\n", + metric->characterWidth, + metric->leftSideBearing, + metric->rightSideBearing, + metric->ascent, + metric->descent, + metric->attributes )); + Exit: return error; } @@ -461,7 +482,7 @@ THE SOFTWARE. { PCF_ParseProperty props = NULL; PCF_Property properties = NULL; - FT_ULong nprops, i; + FT_ULong nprops, orig_nprops, i; FT_ULong format, size; FT_Error error; FT_Memory memory = FT_FACE( face )->memory; @@ -481,32 +502,43 @@ THE SOFTWARE. if ( FT_READ_ULONG_LE( format ) ) goto Bail; - FT_TRACE4(( "pcf_get_properties:\n" )); - - FT_TRACE4(( " format = %ld\n", format )); + FT_TRACE4(( "pcf_get_properties:\n" + " format: 0x%lX (%s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" )); if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) goto Bail; if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( nprops ); + (void)FT_READ_ULONG( orig_nprops ); else - (void)FT_READ_ULONG_LE( nprops ); + (void)FT_READ_ULONG_LE( orig_nprops ); if ( error ) goto Bail; - FT_TRACE4(( " nprop = %d (truncate %d props)\n", - (int)nprops, nprops - (FT_ULong)(int)nprops )); - - nprops = (FT_ULong)(int)nprops; + FT_TRACE4(( " number of properties: %ld\n", orig_nprops )); /* rough estimate */ - if ( nprops > size / PCF_PROPERTY_SIZE ) + if ( orig_nprops > size / PCF_PROPERTY_SIZE ) { error = FT_THROW( Invalid_Table ); goto Bail; } + /* as a heuristic limit to avoid excessive allocation in */ + /* gzip bombs (i.e., very small, invalid input data that */ + /* pretends to expand to an insanely large file) we only */ + /* load the first 256 properties */ + if ( orig_nprops > 256 ) + { + FT_TRACE0(( "pcf_get_properties:" + " only loading first 256 properties\n" )); + nprops = 256; + } + else + nprops = orig_nprops; + face->nprops = (int)nprops; if ( FT_NEW_ARRAY( props, nprops ) ) @@ -526,14 +558,23 @@ THE SOFTWARE. } } + /* this skip will only work if we really have an extremely large */ + /* number of properties; it will fail for fake data, avoiding an */ + /* unnecessarily large allocation later on */ + if ( FT_STREAM_SKIP( ( orig_nprops - nprops ) * PCF_PROPERTY_SIZE ) ) + { + error = FT_THROW( Invalid_Stream_Skip ); + goto Bail; + } + /* pad the property array */ /* */ /* clever here - nprops is the same as the number of odd-units read, */ /* as only isStringProp are odd length (Keith Packard) */ /* */ - if ( nprops & 3 ) + if ( orig_nprops & 3 ) { - i = 4 - ( nprops & 3 ); + i = 4 - ( orig_nprops & 3 ); if ( FT_STREAM_SKIP( i ) ) { error = FT_THROW( Invalid_Stream_Skip ); @@ -548,15 +589,24 @@ THE SOFTWARE. if ( error ) goto Bail; - FT_TRACE4(( " string_size = %ld\n", string_size )); + FT_TRACE4(( " string size: %ld\n", string_size )); /* rough estimate */ - if ( string_size > size - nprops * PCF_PROPERTY_SIZE ) + if ( string_size > size - orig_nprops * PCF_PROPERTY_SIZE ) { error = FT_THROW( Invalid_Table ); goto Bail; } + /* the strings in the `strings' array are PostScript strings, */ + /* which can have a maximum length of 65536 characters each */ + if ( string_size > 16777472 ) /* 256 * (65536 + 1) */ + { + FT_TRACE0(( "pcf_get_properties:" + " loading only 16777472 bytes of strings array\n" )); + string_size = 16777472; + } + /* allocate one more byte so that we have a final null byte */ if ( FT_NEW_ARRAY( strings, string_size + 1 ) ) goto Bail; @@ -570,6 +620,7 @@ THE SOFTWARE. face->properties = properties; + FT_TRACE4(( "\n" )); for ( i = 0; i < nprops; i++ ) { FT_Long name_offset = props[i].name; @@ -632,7 +683,7 @@ THE SOFTWARE. FT_Memory memory = FT_FACE( face )->memory; FT_ULong format, size; PCF_Metric metrics = NULL; - FT_ULong nmetrics, i; + FT_ULong nmetrics, orig_nmetrics, i; error = pcf_seek_to_table_type( stream, @@ -647,6 +698,13 @@ THE SOFTWARE. if ( FT_READ_ULONG_LE( format ) ) goto Bail; + FT_TRACE4(( "pcf_get_metrics:\n" + " format: 0x%lX (%s, %s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB", + PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ? + "compressed" : "uncompressed" )); + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) return FT_THROW( Invalid_File_Format ); @@ -654,61 +712,70 @@ THE SOFTWARE. if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) { if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_ULONG( nmetrics ); + (void)FT_READ_ULONG( orig_nmetrics ); else - (void)FT_READ_ULONG_LE( nmetrics ); + (void)FT_READ_ULONG_LE( orig_nmetrics ); } else { if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - (void)FT_READ_USHORT( nmetrics ); + (void)FT_READ_USHORT( orig_nmetrics ); else - (void)FT_READ_USHORT_LE( nmetrics ); + (void)FT_READ_USHORT_LE( orig_nmetrics ); } if ( error ) return FT_THROW( Invalid_File_Format ); - face->nmetrics = nmetrics; - - if ( !nmetrics ) - return FT_THROW( Invalid_Table ); - - FT_TRACE4(( "pcf_get_metrics:\n" )); - - FT_TRACE4(( " number of metrics: %d\n", nmetrics )); + FT_TRACE4(( " number of metrics: %ld\n", orig_nmetrics )); /* rough estimate */ if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) { - if ( nmetrics > size / PCF_METRIC_SIZE ) + if ( orig_nmetrics > size / PCF_METRIC_SIZE ) return FT_THROW( Invalid_Table ); } else { - if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) + if ( orig_nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) return FT_THROW( Invalid_Table ); } + if ( !orig_nmetrics ) + return FT_THROW( Invalid_Table ); + + /* PCF is a format from ancient times; Unicode was in its */ + /* infancy, and widely used two-byte character sets for CJK */ + /* scripts (Big 5, GB 2312, JIS X 0208, etc.) did have at most */ + /* 15000 characters. Even the more exotic CNS 11643 and CCCII */ + /* standards, which were essentially three-byte character sets, */ + /* provided less then 65536 assigned characters. */ + /* */ + /* While technically possible to have a larger number of glyphs */ + /* in PCF files, we thus limit the number to 65536. */ + if ( orig_nmetrics > 65536 ) + { + FT_TRACE0(( "pcf_get_metrics:" + " only loading first 65536 metrics\n" )); + nmetrics = 65536; + } + else + nmetrics = orig_nmetrics; + + face->nmetrics = nmetrics; + if ( FT_NEW_ARRAY( face->metrics, nmetrics ) ) - return FT_THROW( Out_Of_Memory ); + return error; metrics = face->metrics; + + FT_TRACE4(( "\n" )); for ( i = 0; i < nmetrics; i++, metrics++ ) { + FT_TRACE5(( " idx %ld:", i )); error = pcf_get_metric( stream, format, metrics ); metrics->bits = 0; - FT_TRACE5(( " idx %d: width=%d, " - "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n", - i, - metrics->characterWidth, - metrics->leftSideBearing, - metrics->rightSideBearing, - metrics->ascent, - metrics->descent, - metrics->attributes )); - if ( error ) break; @@ -716,7 +783,7 @@ THE SOFTWARE. /* compute a glyph's bitmap dimensions, thus setting them to zero in */ /* case of an error disables this particular glyph only */ if ( metrics->rightSideBearing < metrics->leftSideBearing || - metrics->ascent + metrics->descent < 0 ) + metrics->ascent < -metrics->descent ) { metrics->characterWidth = 0; metrics->leftSideBearing = 0; @@ -746,7 +813,7 @@ THE SOFTWARE. FT_Long* offsets = NULL; FT_Long bitmapSizes[GLYPHPADOPTIONS]; FT_ULong format, size; - FT_ULong nbitmaps, i, sizebitmaps = 0; + FT_ULong nbitmaps, orig_nbitmaps, i, sizebitmaps = 0; error = pcf_seek_to_table_type( stream, @@ -764,18 +831,40 @@ THE SOFTWARE. format = FT_GET_ULONG_LE(); if ( PCF_BYTE_ORDER( format ) == MSBFirst ) - nbitmaps = FT_GET_ULONG(); + orig_nbitmaps = FT_GET_ULONG(); else - nbitmaps = FT_GET_ULONG_LE(); + orig_nbitmaps = FT_GET_ULONG_LE(); FT_Stream_ExitFrame( stream ); + FT_TRACE4(( "pcf_get_bitmaps:\n" + " format: 0x%lX\n" + " (%s, %s,\n" + " padding=%d bits, scanning=%d bits)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst + ? "most significant byte first" + : "least significant byte first", + PCF_BIT_ORDER( format ) == MSBFirst + ? "most significant bit first" + : "least significant bit first", + 8 << PCF_GLYPH_PAD_INDEX( format ), + 8 << PCF_SCAN_UNIT_INDEX( format ) )); + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) return FT_THROW( Invalid_File_Format ); - FT_TRACE4(( "pcf_get_bitmaps:\n" )); + FT_TRACE4(( " number of bitmaps: %ld\n", orig_nbitmaps )); - FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps )); + /* see comment in `pcf_get_metrics' */ + if ( orig_nbitmaps > 65536 ) + { + FT_TRACE0(( "pcf_get_bitmaps:" + " only loading first 65536 bitmaps\n" )); + nbitmaps = 65536; + } + else + nbitmaps = orig_nbitmaps; if ( nbitmaps != face->nmetrics ) return FT_THROW( Invalid_File_Format ); @@ -783,6 +872,7 @@ THE SOFTWARE. if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) return error; + FT_TRACE5(( "\n" )); for ( i = 0; i < nbitmaps; i++ ) { if ( PCF_BYTE_ORDER( format ) == MSBFirst ) @@ -790,7 +880,7 @@ THE SOFTWARE. else (void)FT_READ_LONG_LE( offsets[i] ); - FT_TRACE5(( " bitmap %d: offset %ld (0x%lX)\n", + FT_TRACE5(( " bitmap %ld: offset %ld (0x%lX)\n", i, offsets[i], offsets[i] )); } if ( error ) @@ -807,17 +897,19 @@ THE SOFTWARE. sizebitmaps = (FT_ULong)bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; - FT_TRACE4(( " padding %d implies a size of %ld\n", - i, bitmapSizes[i] )); + FT_TRACE4(( " %ld-bit padding implies a size of %ld\n", + 8 << i, bitmapSizes[i] )); } - FT_TRACE4(( " %d bitmaps, padding index %ld\n", + FT_TRACE4(( " %ld bitmaps, using %ld-bit padding\n", nbitmaps, - PCF_GLYPH_PAD_INDEX( format ) )); - FT_TRACE4(( " bitmap size = %d\n", sizebitmaps )); + 8 << PCF_GLYPH_PAD_INDEX( format ) )); + FT_TRACE4(( " bitmap size: %ld\n", sizebitmaps )); FT_UNUSED( sizebitmaps ); /* only used for debugging */ + /* right now, we only check the bitmap offsets; */ + /* actual bitmaps are only loaded on demand */ for ( i = 0; i < nbitmaps; i++ ) { /* rough estimate */ @@ -825,7 +917,7 @@ THE SOFTWARE. ( (FT_ULong)offsets[i] > size ) ) { FT_TRACE0(( "pcf_get_bitmaps:" - " invalid offset to bitmap data of glyph %d\n", i )); + " invalid offset to bitmap data of glyph %ld\n", i )); } else face->metrics[i].bits = stream->pos + (FT_ULong)offsets[i]; @@ -889,10 +981,20 @@ THE SOFTWARE. FT_Stream_ExitFrame( stream ); + FT_TRACE4(( "pcf_get_encodings:\n" + " format: 0x%lX (%s)\n", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" )); + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) return FT_THROW( Invalid_File_Format ); - /* sanity checks */ + FT_TRACE4(( " firstCol 0x%X, lastCol 0x%X\n" + " firstRow 0x%X, lastRow 0x%X\n", + firstCol, lastCol, + firstRow, lastRow )); + + /* sanity checks; we limit numbers of rows and columns to 256 */ if ( firstCol < 0 || firstCol > lastCol || lastCol > 0xFF || @@ -901,21 +1003,18 @@ THE SOFTWARE. lastRow > 0xFF ) return FT_THROW( Invalid_Table ); - FT_TRACE4(( "pdf_get_encodings:\n" )); - - FT_TRACE4(( " firstCol %d, lastCol %d, firstRow %d, lastRow %d\n", - firstCol, lastCol, firstRow, lastRow )); - nencoding = (FT_ULong)( lastCol - firstCol + 1 ) * (FT_ULong)( lastRow - firstRow + 1 ); if ( FT_NEW_ARRAY( encoding, nencoding ) ) - return FT_THROW( Out_Of_Memory ); + return error; error = FT_Stream_EnterFrame( stream, 2 * nencoding ); if ( error ) goto Bail; + FT_TRACE5(( "\n" )); + k = 0; for ( i = firstRow; i <= lastRow; i++ ) { @@ -1024,6 +1123,15 @@ THE SOFTWARE. if ( FT_READ_ULONG_LE( format ) ) goto Bail; + FT_TRACE4(( "pcf_get_accel%s:\n" + " format: 0x%lX (%s, %s)\n", + type == PCF_BDF_ACCELERATORS ? " (getting BDF accelerators)" + : "", + format, + PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB", + PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ? + "accelerated" : "not accelerated" )); + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) goto Bail; @@ -1039,12 +1147,29 @@ THE SOFTWARE. goto Bail; } + FT_TRACE5(( " noOverlap=%s, constantMetrics=%s," + " terminalFont=%s, constantWidth=%s\n" + " inkInside=%s, inkMetrics=%s, drawDirection=%s\n" + " fontAscent=%ld, fontDescent=%ld, maxOverlap=%ld\n", + accel->noOverlap ? "yes" : "no", + accel->constantMetrics ? "yes" : "no", + accel->terminalFont ? "yes" : "no", + accel->constantWidth ? "yes" : "no", + accel->inkInside ? "yes" : "no", + accel->inkMetrics ? "yes" : "no", + accel->drawDirection ? "RTL" : "LTR", + accel->fontAscent, + accel->fontDescent, + accel->maxOverlap )); + + FT_TRACE5(( " minbounds:" )); error = pcf_get_metric( stream, format & ( ~PCF_FORMAT_MASK ), &(accel->minbounds) ); if ( error ) goto Bail; + FT_TRACE5(( " maxbounds:" )); error = pcf_get_metric( stream, format & ( ~PCF_FORMAT_MASK ), &(accel->maxbounds) ); @@ -1053,12 +1178,14 @@ THE SOFTWARE. if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) { + FT_TRACE5(( " ink minbounds:" )); error = pcf_get_metric( stream, format & ( ~PCF_FORMAT_MASK ), &(accel->ink_minbounds) ); if ( error ) goto Bail; + FT_TRACE5(( " ink maxbounds:" )); error = pcf_get_metric( stream, format & ( ~PCF_FORMAT_MASK ), &(accel->ink_maxbounds) ); @@ -1067,7 +1194,7 @@ THE SOFTWARE. } else { - accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */ + accel->ink_minbounds = accel->minbounds; accel->ink_maxbounds = accel->maxbounds; } @@ -1156,7 +1283,7 @@ THE SOFTWARE. len = lengths[nn]; - if ( src == NULL ) + if ( !src ) continue; /* separate elements with a space */ @@ -1260,14 +1387,81 @@ THE SOFTWARE. if ( face->accel.constantWidth ) root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - if ( ( error = pcf_interpret_style( face ) ) != 0 ) - goto Exit; + if ( FT_SET_ERROR( pcf_interpret_style( face ) ) ) + goto Exit; prop = pcf_find_property( face, "FAMILY_NAME" ); if ( prop && prop->isString ) { - if ( FT_STRDUP( root->family_name, prop->value.atom ) ) - goto Exit; + +#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES + + PCF_Driver driver = (PCF_Driver)FT_FACE_DRIVER( face ); + + + if ( !driver->no_long_family_names ) + { + /* Prepend the foundry name plus a space to the family name. */ + /* There are many fonts just called `Fixed' which look */ + /* completely different, and which have nothing to do with each */ + /* other. When selecting `Fixed' in KDE or Gnome one gets */ + /* results that appear rather random, the style changes often if */ + /* one changes the size and one cannot select some fonts at all. */ + /* */ + /* We also check whether we have `wide' characters; all put */ + /* together, we get family names like `Sony Fixed' or `Misc */ + /* Fixed Wide'. */ + + PCF_Property foundry_prop, point_size_prop, average_width_prop; + + int l = ft_strlen( prop->value.atom ) + 1; + int wide = 0; + + + foundry_prop = pcf_find_property( face, "FOUNDRY" ); + point_size_prop = pcf_find_property( face, "POINT_SIZE" ); + average_width_prop = pcf_find_property( face, "AVERAGE_WIDTH" ); + + if ( point_size_prop && average_width_prop ) + { + if ( average_width_prop->value.l >= point_size_prop->value.l ) + { + /* This font is at least square shaped or even wider */ + wide = 1; + l += ft_strlen( " Wide" ); + } + } + + if ( foundry_prop && foundry_prop->isString ) + { + l += ft_strlen( foundry_prop->value.atom ) + 1; + + if ( FT_NEW_ARRAY( root->family_name, l ) ) + goto Exit; + + ft_strcpy( root->family_name, foundry_prop->value.atom ); + ft_strcat( root->family_name, " " ); + ft_strcat( root->family_name, prop->value.atom ); + } + else + { + if ( FT_NEW_ARRAY( root->family_name, l ) ) + goto Exit; + + ft_strcpy( root->family_name, prop->value.atom ); + } + + if ( wide ) + ft_strcat( root->family_name, " Wide" ); + } + else + +#endif /* PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + { + if ( FT_STRDUP( root->family_name, prop->value.atom ) ) + goto Exit; + } } else root->family_name = NULL; @@ -1290,7 +1484,7 @@ THE SOFTWARE. FT_Short resolution_x = 0, resolution_y = 0; - FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + FT_ZERO( bsize ); /* for simplicity, we take absolute values of integer properties */ diff --git a/thirdparty/freetype/src/pfr/module.mk b/thirdparty/freetype/src/pfr/module.mk index bf7808c72f..7b84da9708 100644 --- a/thirdparty/freetype/src/pfr/module.mk +++ b/thirdparty/freetype/src/pfr/module.mk @@ -3,7 +3,7 @@ # -# Copyright 2002-2016 by +# Copyright 2002-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/pfr/pfr.c b/thirdparty/freetype/src/pfr/pfr.c index 1a433960a5..4f31f5d9bc 100644 --- a/thirdparty/freetype/src/pfr/pfr.c +++ b/thirdparty/freetype/src/pfr/pfr.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR driver component. */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -15,15 +15,16 @@ /* */ /***************************************************************************/ -#define FT_MAKE_OPTION_SINGLE_OBJECT +#define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> -#include "pfrload.c" -#include "pfrgload.c" #include "pfrcmap.c" -#include "pfrobjs.c" #include "pfrdrivr.c" +#include "pfrgload.c" +#include "pfrload.c" +#include "pfrobjs.c" #include "pfrsbit.c" + /* END */ diff --git a/thirdparty/freetype/src/pfr/pfrcmap.c b/thirdparty/freetype/src/pfr/pfrcmap.c index a1439c2e9f..1d6b15be48 100644 --- a/thirdparty/freetype/src/pfr/pfrcmap.c +++ b/thirdparty/freetype/src/pfr/pfrcmap.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR cmap handling (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -161,12 +161,16 @@ { sizeof ( PFR_CMapRec ), - (FT_CMap_InitFunc) pfr_cmap_init, - (FT_CMap_DoneFunc) pfr_cmap_done, - (FT_CMap_CharIndexFunc)pfr_cmap_char_index, - (FT_CMap_CharNextFunc) pfr_cmap_char_next, + (FT_CMap_InitFunc) pfr_cmap_init, /* init */ + (FT_CMap_DoneFunc) pfr_cmap_done, /* done */ + (FT_CMap_CharIndexFunc)pfr_cmap_char_index, /* char_index */ + (FT_CMap_CharNextFunc) pfr_cmap_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ }; diff --git a/thirdparty/freetype/src/pfr/pfrcmap.h b/thirdparty/freetype/src/pfr/pfrcmap.h index 4a8a4d0a67..957bf65b4c 100644 --- a/thirdparty/freetype/src/pfr/pfrcmap.h +++ b/thirdparty/freetype/src/pfr/pfrcmap.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR cmap handling (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrdrivr.c b/thirdparty/freetype/src/pfr/pfrdrivr.c index b81c15e560..195cdb76ac 100644 --- a/thirdparty/freetype/src/pfr/pfrdrivr.c +++ b/thirdparty/freetype/src/pfr/pfrdrivr.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR driver interface (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -181,10 +181,10 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - 0, /* FT_Module_Constructor module_init */ - 0, /* FT_Module_Destructor module_done */ + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ pfr_get_service /* FT_Module_Requester get_interface */ }, @@ -194,19 +194,19 @@ pfr_face_init, /* FT_Face_InitFunc init_face */ pfr_face_done, /* FT_Face_DoneFunc done_face */ - 0, /* FT_Size_InitFunc init_size */ - 0, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ pfr_slot_init, /* FT_Slot_InitFunc init_slot */ pfr_slot_done, /* FT_Slot_DoneFunc done_slot */ pfr_slot_load, /* FT_Slot_LoadFunc load_glyph */ pfr_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ - 0, /* FT_Size_RequestFunc request_size */ - 0, /* FT_Size_SelectFunc select_size */ + NULL, /* FT_Size_RequestFunc request_size */ + NULL, /* FT_Size_SelectFunc select_size */ }; diff --git a/thirdparty/freetype/src/pfr/pfrdrivr.h b/thirdparty/freetype/src/pfr/pfrdrivr.h index 32b2d9eab3..b81d56017e 100644 --- a/thirdparty/freetype/src/pfr/pfrdrivr.h +++ b/thirdparty/freetype/src/pfr/pfrdrivr.h @@ -4,7 +4,7 @@ /* */ /* High-level Type PFR driver interface (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrerror.h b/thirdparty/freetype/src/pfr/pfrerror.h index 9305f8fb58..ef044e32c9 100644 --- a/thirdparty/freetype/src/pfr/pfrerror.h +++ b/thirdparty/freetype/src/pfr/pfrerror.h @@ -4,7 +4,7 @@ /* */ /* PFR error codes (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrgload.c b/thirdparty/freetype/src/pfr/pfrgload.c index f9cd1f63bb..93f5fc7090 100644 --- a/thirdparty/freetype/src/pfr/pfrgload.c +++ b/thirdparty/freetype/src/pfr/pfrgload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR glyph loader (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrgload.h b/thirdparty/freetype/src/pfr/pfrgload.h index 908d4378a4..6612323871 100644 --- a/thirdparty/freetype/src/pfr/pfrgload.h +++ b/thirdparty/freetype/src/pfr/pfrgload.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR glyph loader (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrload.c b/thirdparty/freetype/src/pfr/pfrload.c index e509e70b5d..4f84165828 100644 --- a/thirdparty/freetype/src/pfr/pfrload.c +++ b/thirdparty/freetype/src/pfr/pfrload.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR loader (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -562,7 +562,7 @@ FT_UInt len = (FT_UInt)( limit - p ); - if ( phy_font->font_id != NULL ) + if ( phy_font->font_id ) goto Exit; if ( FT_ALLOC( phy_font->font_id, len + 1 ) ) @@ -589,7 +589,7 @@ FT_Memory memory = phy_font->memory; - if ( phy_font->vertical.stem_snaps != NULL ) + if ( phy_font->vertical.stem_snaps ) goto Exit; PFR_CHECK( 1 ); diff --git a/thirdparty/freetype/src/pfr/pfrload.h b/thirdparty/freetype/src/pfr/pfrload.h index 0f7a2bb239..f9475ae062 100644 --- a/thirdparty/freetype/src/pfr/pfrload.h +++ b/thirdparty/freetype/src/pfr/pfrload.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR loader (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrobjs.c b/thirdparty/freetype/src/pfr/pfrobjs.c index 769a3b6164..4b1703f51c 100644 --- a/thirdparty/freetype/src/pfr/pfrobjs.c +++ b/thirdparty/freetype/src/pfr/pfrobjs.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR object methods (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -185,7 +185,7 @@ * nothing. */ pfrface->family_name = phy_font->family_name; - if ( pfrface->family_name == NULL ) + if ( !pfrface->family_name ) pfrface->family_name = phy_font->font_id; /* note that the style name can be NULL in certain PFR fonts, @@ -342,8 +342,12 @@ /* try to load an embedded bitmap */ if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 ) { - error = pfr_slot_load_bitmap( slot, size, gindex ); - if ( error == 0 ) + error = pfr_slot_load_bitmap( + slot, + size, + gindex, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + if ( !error ) goto Exit; } diff --git a/thirdparty/freetype/src/pfr/pfrobjs.h b/thirdparty/freetype/src/pfr/pfrobjs.h index 335aca8854..d6ad6562df 100644 --- a/thirdparty/freetype/src/pfr/pfrobjs.h +++ b/thirdparty/freetype/src/pfr/pfrobjs.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR object methods (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/pfrsbit.c b/thirdparty/freetype/src/pfr/pfrsbit.c index 144f50c0b3..54e7d0e6cc 100644 --- a/thirdparty/freetype/src/pfr/pfrsbit.c +++ b/thirdparty/freetype/src/pfr/pfrsbit.c @@ -4,7 +4,7 @@ /* */ /* FreeType PFR bitmap loader (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -578,7 +578,8 @@ FT_LOCAL( FT_Error ) pfr_slot_load_bitmap( PFR_Slot glyph, PFR_Size size, - FT_UInt glyph_index ) + FT_UInt glyph_index, + FT_Bool metrics_only ) { FT_Error error; PFR_Face face = (PFR_Face) glyph->root.face; @@ -775,6 +776,9 @@ glyph->root.bitmap_left = (FT_Int)xpos; glyph->root.bitmap_top = (FT_Int)( ypos + (FT_Long)ysize ); + if ( metrics_only ) + goto Exit1; + /* Allocate and read bitmap data */ { FT_ULong len = (FT_ULong)glyph->root.bitmap.pitch * ysize; diff --git a/thirdparty/freetype/src/pfr/pfrsbit.h b/thirdparty/freetype/src/pfr/pfrsbit.h index 94ead28ca7..fc270f50a8 100644 --- a/thirdparty/freetype/src/pfr/pfrsbit.h +++ b/thirdparty/freetype/src/pfr/pfrsbit.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR bitmap loader (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,7 +26,8 @@ FT_BEGIN_HEADER FT_LOCAL( FT_Error ) pfr_slot_load_bitmap( PFR_Slot glyph, PFR_Size size, - FT_UInt glyph_index ); + FT_UInt glyph_index, + FT_Bool metrics_only ); FT_END_HEADER diff --git a/thirdparty/freetype/src/pfr/pfrtypes.h b/thirdparty/freetype/src/pfr/pfrtypes.h index bd6c2cd30c..c3d542c209 100644 --- a/thirdparty/freetype/src/pfr/pfrtypes.h +++ b/thirdparty/freetype/src/pfr/pfrtypes.h @@ -4,7 +4,7 @@ /* */ /* FreeType PFR data structures (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pfr/rules.mk b/thirdparty/freetype/src/pfr/rules.mk index 39bb9e941a..9940f62286 100644 --- a/thirdparty/freetype/src/pfr/rules.mk +++ b/thirdparty/freetype/src/pfr/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2002-2016 by +# Copyright 2002-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/psaux/afmparse.c b/thirdparty/freetype/src/psaux/afmparse.c index 9fb0ac0e2b..ff2cc8cf08 100644 --- a/thirdparty/freetype/src/psaux/afmparse.c +++ b/thirdparty/freetype/src/psaux/afmparse.c @@ -4,7 +4,7 @@ /* */ /* AFM parser (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,6 +20,8 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_POSTSCRIPT_AUX_H +#ifndef T1_CONFIG_OPTION_NO_AFM + #include "afmparse.h" #include "psconv.h" @@ -973,5 +975,12 @@ return error; } +#else /* T1_CONFIG_OPTION_NO_AFM */ + + /* ANSI C doesn't like empty source files */ + typedef int _afm_parse_dummy; + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + /* END */ diff --git a/thirdparty/freetype/src/psaux/afmparse.h b/thirdparty/freetype/src/psaux/afmparse.h index 6d8b193ffc..cd2beb7804 100644 --- a/thirdparty/freetype/src/psaux/afmparse.h +++ b/thirdparty/freetype/src/psaux/afmparse.h @@ -4,7 +4,7 @@ /* */ /* AFM parser (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/module.mk b/thirdparty/freetype/src/psaux/module.mk index 630c4f39dd..c70a227166 100644 --- a/thirdparty/freetype/src/psaux/module.mk +++ b/thirdparty/freetype/src/psaux/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/psaux/psaux.c b/thirdparty/freetype/src/psaux/psaux.c index 33b462ef15..c373aa7d5b 100644 --- a/thirdparty/freetype/src/psaux/psaux.c +++ b/thirdparty/freetype/src/psaux/psaux.c @@ -4,7 +4,7 @@ /* */ /* FreeType auxiliary PostScript driver component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,18 +17,14 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "psobjs.c" -#include "psauxmod.c" -#include "t1decode.c" -#include "t1cmap.c" -#ifndef T1_CONFIG_OPTION_NO_AFM #include "afmparse.c" -#endif - +#include "psauxmod.c" #include "psconv.c" +#include "psobjs.c" +#include "t1cmap.c" +#include "t1decode.c" /* END */ diff --git a/thirdparty/freetype/src/psaux/psauxerr.h b/thirdparty/freetype/src/psaux/psauxerr.h index 9739157fc4..1d7ac6001b 100644 --- a/thirdparty/freetype/src/psaux/psauxerr.h +++ b/thirdparty/freetype/src/psaux/psauxerr.h @@ -4,7 +4,7 @@ /* */ /* PS auxiliary module error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/psauxmod.c b/thirdparty/freetype/src/psaux/psauxmod.c index 80805e6951..1f589cefc2 100644 --- a/thirdparty/freetype/src/psaux/psauxmod.c +++ b/thirdparty/freetype/src/psaux/psauxmod.c @@ -4,7 +4,7 @@ /* */ /* FreeType auxiliary PostScript module implementation (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -30,52 +30,56 @@ FT_CALLBACK_TABLE_DEF const PS_Table_FuncsRec ps_table_funcs = { - ps_table_new, - ps_table_done, - ps_table_add, - ps_table_release + ps_table_new, /* init */ + ps_table_done, /* done */ + ps_table_add, /* add */ + ps_table_release /* release */ }; FT_CALLBACK_TABLE_DEF const PS_Parser_FuncsRec ps_parser_funcs = { - ps_parser_init, - ps_parser_done, - ps_parser_skip_spaces, - ps_parser_skip_PS_token, - ps_parser_to_int, - ps_parser_to_fixed, - ps_parser_to_bytes, - ps_parser_to_coord_array, - ps_parser_to_fixed_array, - ps_parser_to_token, - ps_parser_to_token_array, - ps_parser_load_field, - ps_parser_load_field_table + ps_parser_init, /* init */ + ps_parser_done, /* done */ + + ps_parser_skip_spaces, /* skip_spaces */ + ps_parser_skip_PS_token, /* skip_PS_token */ + + ps_parser_to_int, /* to_int */ + ps_parser_to_fixed, /* to_fixed */ + ps_parser_to_bytes, /* to_bytes */ + ps_parser_to_coord_array, /* to_coord_array */ + ps_parser_to_fixed_array, /* to_fixed_array */ + ps_parser_to_token, /* to_token */ + ps_parser_to_token_array, /* to_token_array */ + + ps_parser_load_field, /* load_field */ + ps_parser_load_field_table /* load_field_table */ }; FT_CALLBACK_TABLE_DEF const T1_Builder_FuncsRec t1_builder_funcs = { - t1_builder_init, - t1_builder_done, - t1_builder_check_points, - t1_builder_add_point, - t1_builder_add_point1, - t1_builder_add_contour, - t1_builder_start_point, - t1_builder_close_contour + t1_builder_init, /* init */ + t1_builder_done, /* done */ + + t1_builder_check_points, /* check_points */ + t1_builder_add_point, /* add_point */ + t1_builder_add_point1, /* add_point1 */ + t1_builder_add_contour, /* add_contour */ + t1_builder_start_point, /* start_point */ + t1_builder_close_contour /* close_contour */ }; FT_CALLBACK_TABLE_DEF const T1_Decoder_FuncsRec t1_decoder_funcs = { - t1_decoder_init, - t1_decoder_done, - t1_decoder_parse_charstrings + t1_decoder_init, /* init */ + t1_decoder_done, /* done */ + t1_decoder_parse_charstrings /* parse_charstrings */ }; @@ -83,9 +87,9 @@ FT_CALLBACK_TABLE_DEF const AFM_Parser_FuncsRec afm_parser_funcs = { - afm_parser_init, - afm_parser_done, - afm_parser_parse + afm_parser_init, /* init */ + afm_parser_done, /* done */ + afm_parser_parse /* parse */ }; #endif @@ -130,9 +134,9 @@ &psaux_interface, /* module-specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ }; diff --git a/thirdparty/freetype/src/psaux/psauxmod.h b/thirdparty/freetype/src/psaux/psauxmod.h index b1dbb06904..926f37eba5 100644 --- a/thirdparty/freetype/src/psaux/psauxmod.h +++ b/thirdparty/freetype/src/psaux/psauxmod.h @@ -4,7 +4,7 @@ /* */ /* FreeType auxiliary PostScript module implementation (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/psconv.c b/thirdparty/freetype/src/psaux/psconv.c index fdaca7fb5d..b092482194 100644 --- a/thirdparty/freetype/src/psaux/psconv.c +++ b/thirdparty/freetype/src/psaux/psconv.c @@ -4,7 +4,7 @@ /* */ /* Some convenience conversions (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/psconv.h b/thirdparty/freetype/src/psaux/psconv.h index 062de36413..cab254ac5a 100644 --- a/thirdparty/freetype/src/psaux/psconv.h +++ b/thirdparty/freetype/src/psaux/psconv.h @@ -4,7 +4,7 @@ /* */ /* Some convenience conversions (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/psobjs.c b/thirdparty/freetype/src/psaux/psobjs.c index f208b5fc63..f04edea411 100644 --- a/thirdparty/freetype/src/psaux/psobjs.c +++ b/thirdparty/freetype/src/psaux/psobjs.c @@ -4,7 +4,7 @@ /* */ /* Auxiliary functions for PostScript fonts (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -344,7 +344,7 @@ FT_Byte c = *cur; - ++cur; + cur++; if ( c == '\\' ) { @@ -370,17 +370,17 @@ case '\\': case '(': case ')': - ++cur; + cur++; break; default: /* skip octal escape or ignore backslash */ - for ( i = 0; i < 3 && cur < limit; ++i ) + for ( i = 0; i < 3 && cur < limit; i++ ) { if ( !IS_OCTAL_DIGIT( *cur ) ) break; - ++cur; + cur++; } } } @@ -455,19 +455,19 @@ FT_ASSERT( **acur == '{' ); - for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur ) + for ( cur = *acur; cur < limit && error == FT_Err_Ok; cur++ ) { switch ( *cur ) { case '{': - ++embed; + embed++; break; case '}': - --embed; + embed--; if ( embed == 0 ) { - ++cur; + cur++; goto end; } break; @@ -695,7 +695,7 @@ /* ************ otherwise, it is any token **************/ default: token->start = cur; - token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); + token->type = ( *cur == '/' ) ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY; ps_parser_skip_PS_token( parser ); cur = parser->cursor; if ( !parser->error ) @@ -750,7 +750,7 @@ if ( !token.type ) break; - if ( tokens != NULL && cur < limit ) + if ( tokens && cur < limit ) *cur = token; cur++; @@ -815,12 +815,12 @@ old_cur = cur; - if ( coords != NULL && count >= max_coords ) + if ( coords && count >= max_coords ) break; /* call PS_Conv_ToFixed() even if coords == NULL */ /* to properly parse number at `cur' */ - *( coords != NULL ? &coords[count] : &dummy ) = + *( coords ? &coords[count] : &dummy ) = (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); if ( old_cur == cur ) @@ -895,12 +895,12 @@ old_cur = cur; - if ( values != NULL && count >= max_values ) + if ( values && count >= max_values ) break; /* call PS_Conv_ToFixed() even if coords == NULL */ /* to properly parse number at `cur' */ - *( values != NULL ? &values[count] : &dummy ) = + *( values ? &values[count] : &dummy ) = PS_Conv_ToFixed( &cur, limit, power_ten ); if ( old_cur == cur ) @@ -1172,7 +1172,7 @@ /* for this to work (FT_String**)q must have been */ /* initialized to NULL */ - if ( *(FT_String**)q != NULL ) + if ( *(FT_String**)q ) { FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", field->ident )); @@ -1551,7 +1551,7 @@ builder->current = &loader->current.outline; FT_GlyphLoader_Rewind( loader ); - builder->hints_globals = size->internal; + builder->hints_globals = size->internal->module_data; builder->hints_funcs = NULL; if ( hinting ) @@ -1718,6 +1718,14 @@ first = outline->n_contours <= 1 ? 0 : outline->contours[outline->n_contours - 2] + 1; + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + /* We must not include the last point in the path if it */ /* is located on the first point. */ if ( outline->n_points > 1 ) diff --git a/thirdparty/freetype/src/psaux/psobjs.h b/thirdparty/freetype/src/psaux/psobjs.h index 4c7178e79f..202e5b2416 100644 --- a/thirdparty/freetype/src/psaux/psobjs.h +++ b/thirdparty/freetype/src/psaux/psobjs.h @@ -4,7 +4,7 @@ /* */ /* Auxiliary functions for PostScript fonts (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/rules.mk b/thirdparty/freetype/src/psaux/rules.mk index 19787b5f82..542ae12d2b 100644 --- a/thirdparty/freetype/src/psaux/rules.mk +++ b/thirdparty/freetype/src/psaux/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/psaux/t1cmap.c b/thirdparty/freetype/src/psaux/t1cmap.c index 43abb98615..45b713eb7b 100644 --- a/thirdparty/freetype/src/psaux/t1cmap.c +++ b/thirdparty/freetype/src/psaux/t1cmap.c @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -45,7 +45,7 @@ cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding : psnames->adobe_std_encoding; - FT_ASSERT( cmap->code_to_sid != NULL ); + FT_ASSERT( cmap->code_to_sid ); } @@ -136,12 +136,16 @@ { sizeof ( T1_CMapStdRec ), - (FT_CMap_InitFunc) t1_cmap_standard_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + (FT_CMap_InitFunc) t1_cmap_standard_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ }; @@ -161,12 +165,16 @@ { sizeof ( T1_CMapStdRec ), - (FT_CMap_InitFunc) t1_cmap_expert_init, - (FT_CMap_DoneFunc) t1_cmap_std_done, - (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, - (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + (FT_CMap_InitFunc) t1_cmap_expert_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ }; @@ -193,7 +201,7 @@ cmap->count = (FT_UInt)encoding->code_last - cmap->first; cmap->indices = encoding->char_index; - FT_ASSERT( cmap->indices != NULL ); + FT_ASSERT( cmap->indices ); FT_ASSERT( encoding->code_first <= encoding->code_last ); return 0; @@ -232,7 +240,7 @@ FT_UInt32 char_code = *pchar_code; - ++char_code; + char_code++; if ( char_code < cmap->first ) char_code = cmap->first; @@ -257,12 +265,16 @@ { sizeof ( T1_CMapCustomRec ), - (FT_CMap_InitFunc) t1_cmap_custom_init, - (FT_CMap_DoneFunc) t1_cmap_custom_done, - (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, - (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, + (FT_CMap_InitFunc) t1_cmap_custom_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_custom_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ }; @@ -343,12 +355,16 @@ { sizeof ( PS_UnicodesRec ), - (FT_CMap_InitFunc) t1_cmap_unicode_init, - (FT_CMap_DoneFunc) t1_cmap_unicode_done, - (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, - (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, + (FT_CMap_InitFunc) t1_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, /* char_next */ - NULL, NULL, NULL, NULL, NULL + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ }; diff --git a/thirdparty/freetype/src/psaux/t1cmap.h b/thirdparty/freetype/src/psaux/t1cmap.h index 5e1277dc63..7870245a3a 100644 --- a/thirdparty/freetype/src/psaux/t1cmap.h +++ b/thirdparty/freetype/src/psaux/t1cmap.h @@ -4,7 +4,7 @@ /* */ /* Type 1 character map support (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psaux/t1decode.c b/thirdparty/freetype/src/psaux/t1decode.c index 98f6ce1c87..7dd45135de 100644 --- a/thirdparty/freetype/src/psaux/t1decode.c +++ b/thirdparty/freetype/src/psaux/t1decode.c @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -405,9 +405,7 @@ ( decoder->buildchar == NULL ) ); if ( decoder->buildchar && decoder->len_buildchar > 0 ) - ft_memset( &decoder->buildchar[0], - 0, - sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar ); + FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar ); FT_TRACE4(( "\n" "Start charstring\n" )); @@ -668,9 +666,9 @@ #ifdef FT_DEBUG_LEVEL_TRACE if ( large_int ) - FT_TRACE4(( " %ld", value )); + FT_TRACE4(( " %d", value )); else - FT_TRACE4(( " %ld", value / 65536 )); + FT_TRACE4(( " %d", value / 65536 )); #endif *top++ = value; @@ -736,7 +734,7 @@ if ( arg_cnt != 3 ) goto Unexpected_OtherSubr; - if ( decoder->flex_state == 0 || + if ( !decoder->flex_state || decoder->num_flex_vectors != 7 ) { FT_ERROR(( "t1_decoder_parse_charstrings:" @@ -754,13 +752,12 @@ if ( arg_cnt != 0 ) goto Unexpected_OtherSubr; + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 6 ) ) ) + goto Fail; + decoder->flex_state = 1; decoder->num_flex_vectors = 0; - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 6 ) ) - != FT_Err_Ok ) - goto Fail; break; case 2: /* add flex vectors */ @@ -771,7 +768,7 @@ if ( arg_cnt != 0 ) goto Unexpected_OtherSubr; - if ( decoder->flex_state == 0 ) + if ( !decoder->flex_state ) { FT_ERROR(( "t1_decoder_parse_charstrings:" " missing flex start\n" )); @@ -783,10 +780,19 @@ /* point without adding any point to the outline */ idx = decoder->num_flex_vectors++; if ( idx > 0 && idx < 7 ) + { + /* in malformed fonts it is possible to have other */ + /* opcodes in the middle of a flex (which don't */ + /* increase `num_flex_vectors'); we thus have to */ + /* check whether we can add a point */ + if ( FT_SET_ERROR( t1_builder_check_points( builder, 1 ) ) ) + goto Syntax_Error; + t1_builder_add_point( builder, x, y, (FT_Byte)( idx == 3 || idx == 6 ) ); + } } break; @@ -876,7 +882,7 @@ PS_Blend blend = decoder->blend; - if ( arg_cnt != 1 || blend == NULL ) + if ( arg_cnt != 1 || !blend ) goto Unexpected_OtherSubr; idx = Fix2Int( top[0] ); @@ -944,7 +950,7 @@ PS_Blend blend = decoder->blend; - if ( arg_cnt != 2 || blend == NULL ) + if ( arg_cnt != 2 || !blend ) goto Unexpected_OtherSubr; idx = Fix2Int( top[1] ); @@ -965,7 +971,7 @@ PS_Blend blend = decoder->blend; - if ( arg_cnt != 1 || blend == NULL ) + if ( arg_cnt != 1 || !blend ) goto Unexpected_OtherSubr; idx = Fix2Int( top[0] ); @@ -1123,7 +1129,7 @@ FT_TRACE4(( "BuildCharArray = [ " )); - for ( i = 0; i < decoder->len_buildchar; ++i ) + for ( i = 0; i < decoder->len_buildchar; i++ ) FT_TRACE4(( "%d ", decoder->buildchar[i] )); FT_TRACE4(( "]\n" )); @@ -1201,8 +1207,7 @@ case op_hlineto: FT_TRACE4(( " hlineto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) goto Fail; x += top[0]; @@ -1223,10 +1228,8 @@ case op_hvcurveto: FT_TRACE4(( " hvcurveto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) goto Fail; x += top[0]; @@ -1241,16 +1244,14 @@ case op_rlineto: FT_TRACE4(( " rlineto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) goto Fail; x += top[0]; y += top[1]; Add_Line: - if ( ( error = t1_builder_add_point1( builder, x, y ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_add_point1( builder, x, y ) ) ) goto Fail; break; @@ -1270,10 +1271,8 @@ case op_rrcurveto: FT_TRACE4(( " rrcurveto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) goto Fail; x += top[0]; @@ -1292,10 +1291,8 @@ case op_vhcurveto: FT_TRACE4(( " vhcurveto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok || - ( error = t1_builder_check_points( builder, 3 ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) goto Fail; y += top[0]; @@ -1310,8 +1307,7 @@ case op_vlineto: FT_TRACE4(( " vlineto" )); - if ( ( error = t1_builder_start_point( builder, x, y ) ) - != FT_Err_Ok ) + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) goto Fail; y += top[0]; @@ -1336,7 +1332,7 @@ /* otherwise, we divide numbers in 16.16 format -- */ /* in both cases, it is the same operation */ *top = FT_DivFix( top[0], top[1] ); - ++top; + top++; large_int = FALSE; break; @@ -1591,7 +1587,7 @@ FT_Render_Mode hint_mode, T1_Decoder_Callback parse_callback ) { - FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + FT_ZERO( decoder ); /* retrieve PSNames interface from list of current modules */ { diff --git a/thirdparty/freetype/src/psaux/t1decode.h b/thirdparty/freetype/src/psaux/t1decode.h index 0f5adfa156..12c27de775 100644 --- a/thirdparty/freetype/src/psaux/t1decode.h +++ b/thirdparty/freetype/src/psaux/t1decode.h @@ -4,7 +4,7 @@ /* */ /* PostScript Type 1 decoding routines (specification). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/module.mk b/thirdparty/freetype/src/pshinter/module.mk index 63110c46a6..77e35c4c10 100644 --- a/thirdparty/freetype/src/pshinter/module.mk +++ b/thirdparty/freetype/src/pshinter/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/pshinter/pshalgo.c b/thirdparty/freetype/src/pshinter/pshalgo.c index 8f131be759..9ad1a3a02a 100644 --- a/thirdparty/freetype/src/pshinter/pshalgo.c +++ b/thirdparty/freetype/src/pshinter/pshalgo.c @@ -4,7 +4,7 @@ /* */ /* PostScript hinting algorithm (body). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ @@ -898,7 +898,7 @@ static void psh_print_zone( PSH_Zone zone ) { - printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", + printf( "zone [scale,delta,min,max] = [%.5f,%.2f,%d,%d]\n", zone->scale / 65536.0, zone->delta / 64.0, zone->min, @@ -1162,7 +1162,7 @@ /* clear all fields */ - FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); + FT_ZERO( glyph ); memory = glyph->memory = globals->memory; @@ -1531,7 +1531,7 @@ } } - if ( point->hint == NULL ) + if ( !point->hint ) { for ( nn = 0; nn < num_hints; nn++ ) { @@ -1572,8 +1572,8 @@ PS_Mask mask = table->hint_masks->masks; FT_UInt num_masks = table->hint_masks->num_masks; FT_UInt first = 0; - FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL - : PSH_DIR_HORIZONTAL; + FT_Int major_dir = ( dimension == 0 ) ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; PSH_Dimension dim = &glyph->globals->dimension[dimension]; FT_Fixed scale = dim->scale_mult; FT_Int threshold; diff --git a/thirdparty/freetype/src/pshinter/pshalgo.h b/thirdparty/freetype/src/pshinter/pshalgo.h index f1bda65013..62e97d152b 100644 --- a/thirdparty/freetype/src/pshinter/pshalgo.h +++ b/thirdparty/freetype/src/pshinter/pshalgo.h @@ -4,7 +4,7 @@ /* */ /* PostScript hinting algorithm (specification). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshglob.c b/thirdparty/freetype/src/pshinter/pshglob.c index 2ac5ef1558..c68770c73a 100644 --- a/thirdparty/freetype/src/pshinter/pshglob.c +++ b/thirdparty/freetype/src/pshinter/pshglob.c @@ -5,7 +5,7 @@ /* PostScript hinter global hinting management (body). */ /* Inspired by the new auto-hinter module. */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/thirdparty/freetype/src/pshinter/pshglob.h b/thirdparty/freetype/src/pshinter/pshglob.h index 45c957b6ef..8801cbada4 100644 --- a/thirdparty/freetype/src/pshinter/pshglob.h +++ b/thirdparty/freetype/src/pshinter/pshglob.h @@ -4,7 +4,7 @@ /* */ /* PostScript hinter global hinting management. */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshinter.c b/thirdparty/freetype/src/pshinter/pshinter.c index 614e0bb3d8..13e07e1485 100644 --- a/thirdparty/freetype/src/pshinter/pshinter.c +++ b/thirdparty/freetype/src/pshinter/pshinter.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript Hinting module */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,13 +17,13 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "pshpic.c" -#include "pshrec.c" -#include "pshglob.c" + #include "pshalgo.c" +#include "pshglob.c" #include "pshmod.c" +#include "pshpic.c" +#include "pshrec.c" /* END */ diff --git a/thirdparty/freetype/src/pshinter/pshmod.c b/thirdparty/freetype/src/pshinter/pshmod.c index fa4ad1f564..860dc0ae82 100644 --- a/thirdparty/freetype/src/pshinter/pshmod.c +++ b/thirdparty/freetype/src/pshinter/pshmod.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript hinter module implementation (body). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -95,9 +95,11 @@ FT_DEFINE_PSHINTER_INTERFACE( pshinter_interface, + pshinter_get_globals_funcs, pshinter_get_t1_funcs, - pshinter_get_t2_funcs ) + pshinter_get_t2_funcs + ) FT_DEFINE_MODULE( @@ -111,9 +113,9 @@ &PSHINTER_INTERFACE_GET, /* module-specific interface */ - (FT_Module_Constructor)ps_hinter_init, - (FT_Module_Destructor) ps_hinter_done, - (FT_Module_Requester) NULL ) /* no additional interface for now */ - + (FT_Module_Constructor)ps_hinter_init, /* module_init */ + (FT_Module_Destructor) ps_hinter_done, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ + ) /* END */ diff --git a/thirdparty/freetype/src/pshinter/pshmod.h b/thirdparty/freetype/src/pshinter/pshmod.h index 39112a9561..1d2b40fa13 100644 --- a/thirdparty/freetype/src/pshinter/pshmod.h +++ b/thirdparty/freetype/src/pshinter/pshmod.h @@ -4,7 +4,7 @@ /* */ /* PostScript hinter module interface (specification). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshnterr.h b/thirdparty/freetype/src/pshinter/pshnterr.h index 7a94588b87..73d144e34c 100644 --- a/thirdparty/freetype/src/pshinter/pshnterr.h +++ b/thirdparty/freetype/src/pshinter/pshnterr.h @@ -4,7 +4,7 @@ /* */ /* PS Hinter error codes (specification only). */ /* */ -/* Copyright 2003-2016 by */ +/* Copyright 2003-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshpic.c b/thirdparty/freetype/src/pshinter/pshpic.c index d0a3d8ebc9..c0d3a64f29 100644 --- a/thirdparty/freetype/src/pshinter/pshpic.c +++ b/thirdparty/freetype/src/pshinter/pshpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for pshinter module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshpic.h b/thirdparty/freetype/src/pshinter/pshpic.h index 75ee573544..8d9a01c9c5 100644 --- a/thirdparty/freetype/src/pshinter/pshpic.h +++ b/thirdparty/freetype/src/pshinter/pshpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for pshinter module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/pshrec.c b/thirdparty/freetype/src/pshinter/pshrec.c index d7cc4a0d21..fff6d34250 100644 --- a/thirdparty/freetype/src/pshinter/pshrec.c +++ b/thirdparty/freetype/src/pshinter/pshrec.c @@ -4,7 +4,7 @@ /* */ /* FreeType PostScript hints recorder (body). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -818,7 +818,7 @@ ps_hints_init( PS_Hints hints, FT_Memory memory ) { - FT_MEM_ZERO( hints, sizeof ( *hints ) ); + FT_ZERO( hints ); hints->memory = memory; } @@ -1140,7 +1140,7 @@ FT_LOCAL_DEF( void ) t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) { - FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); + FT_ZERO( funcs ); funcs->open = (T1_Hints_OpenFunc) t1_hints_open; funcs->close = (T1_Hints_CloseFunc) ps_hints_close; @@ -1206,7 +1206,7 @@ FT_LOCAL_DEF( void ) t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) { - FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); + FT_ZERO( funcs ); funcs->open = (T2_Hints_OpenFunc) t2_hints_open; funcs->close = (T2_Hints_CloseFunc) ps_hints_close; diff --git a/thirdparty/freetype/src/pshinter/pshrec.h b/thirdparty/freetype/src/pshinter/pshrec.h index 97e6f0ed51..e10bc2b120 100644 --- a/thirdparty/freetype/src/pshinter/pshrec.h +++ b/thirdparty/freetype/src/pshinter/pshrec.h @@ -4,7 +4,7 @@ /* */ /* Postscript (Type1/Type2) hints recorder (specification). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/pshinter/rules.mk b/thirdparty/freetype/src/pshinter/rules.mk index 67ecf7862f..2be6404380 100644 --- a/thirdparty/freetype/src/pshinter/rules.mk +++ b/thirdparty/freetype/src/pshinter/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2001-2016 by +# Copyright 2001-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/psnames/module.mk b/thirdparty/freetype/src/psnames/module.mk index ba29af813c..ddd22960c1 100644 --- a/thirdparty/freetype/src/psnames/module.mk +++ b/thirdparty/freetype/src/psnames/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/psnames/psmodule.c b/thirdparty/freetype/src/psnames/psmodule.c index 345402d7cc..3ff8cb911b 100644 --- a/thirdparty/freetype/src/psnames/psmodule.c +++ b/thirdparty/freetype/src/psnames/psmodule.c @@ -4,7 +4,7 @@ /* */ /* PSNames module implementation (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,6 +22,9 @@ #include FT_SERVICE_POSTSCRIPT_CMAPS_H #include "psmodule.h" + +#include "pstables.h" +#define DEFINE_PS_TABLES #include "pstables.h" #include "psnamerr.h" @@ -525,6 +528,7 @@ FT_DEFINE_SERVICE_PSCMAPSREC( pscmaps_interface, + (PS_Unicode_ValueFunc) ps_unicode_value, /* unicode_value */ (PS_Unicodes_InitFunc) ps_unicodes_init, /* unicodes_init */ (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, /* unicodes_char_index */ @@ -534,12 +538,14 @@ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ t1_standard_encoding, /* adobe_std_encoding */ - t1_expert_encoding ) /* adobe_expert_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) #else FT_DEFINE_SERVICE_PSCMAPSREC( pscmaps_interface, + NULL, /* unicode_value */ NULL, /* unicodes_init */ NULL, /* unicodes_char_index */ @@ -549,13 +555,15 @@ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ t1_standard_encoding, /* adobe_std_encoding */ - t1_expert_encoding ) /* adobe_expert_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ FT_DEFINE_SERVICEDESCREC1( pscmaps_services, + FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET ) @@ -601,9 +609,11 @@ PUT_PS_NAMES_SERVICE( (void*)&PSCMAPS_INTERFACE_GET ), /* module specific interface */ - (FT_Module_Constructor)NULL, - (FT_Module_Destructor) NULL, - (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) ) + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */ + ) /* END */ diff --git a/thirdparty/freetype/src/psnames/psmodule.h b/thirdparty/freetype/src/psnames/psmodule.h index ee3c6cb631..6983b79234 100644 --- a/thirdparty/freetype/src/psnames/psmodule.h +++ b/thirdparty/freetype/src/psnames/psmodule.h @@ -4,7 +4,7 @@ /* */ /* High-level PSNames module interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psnames/psnamerr.h b/thirdparty/freetype/src/psnames/psnamerr.h index 3a9f65323b..f90bf5ea43 100644 --- a/thirdparty/freetype/src/psnames/psnamerr.h +++ b/thirdparty/freetype/src/psnames/psnamerr.h @@ -4,7 +4,7 @@ /* */ /* PS names module error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psnames/psnames.c b/thirdparty/freetype/src/psnames/psnames.c index e7b2c0b5ef..22466d6230 100644 --- a/thirdparty/freetype/src/psnames/psnames.c +++ b/thirdparty/freetype/src/psnames/psnames.c @@ -4,7 +4,7 @@ /* */ /* FreeType PSNames module component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,10 +17,10 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "pspic.c" + #include "psmodule.c" +#include "pspic.c" /* END */ diff --git a/thirdparty/freetype/src/psnames/pspic.c b/thirdparty/freetype/src/psnames/pspic.c index a78ec5aa81..8b9003439b 100644 --- a/thirdparty/freetype/src/psnames/pspic.c +++ b/thirdparty/freetype/src/psnames/pspic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for psnames module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psnames/pspic.h b/thirdparty/freetype/src/psnames/pspic.h index 48348765cf..14497e73fa 100644 --- a/thirdparty/freetype/src/psnames/pspic.h +++ b/thirdparty/freetype/src/psnames/pspic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for psnames module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/psnames/pstables.h b/thirdparty/freetype/src/psnames/pstables.h index eb827fa5ea..e0f5e30804 100644 --- a/thirdparty/freetype/src/psnames/pstables.h +++ b/thirdparty/freetype/src/psnames/pstables.h @@ -4,7 +4,7 @@ /* */ /* PostScript glyph names. */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,7 +19,16 @@ /* This file has been generated automatically -- do not edit! */ - static const char ft_standard_glyph_names[3696] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const char ft_standard_glyph_names[3696] +#ifdef DEFINE_PS_TABLES + = { '.','n','u','l','l', 0, 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, @@ -441,14 +450,25 @@ 'R','e','g','u','l','a','r', 0, 'R','o','m','a','n', 0, 'S','e','m','i','b','o','l','d', 0, - }; + } +#endif /* DEFINE_PS_TABLES */ + ; #define FT_NUM_MAC_NAMES 258 /* Values are offsets into the `ft_standard_glyph_names' table */ - static const short ft_mac_names[FT_NUM_MAC_NAMES] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_mac_names[FT_NUM_MAC_NAMES] +#ifdef DEFINE_PS_TABLES + = { 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, @@ -469,14 +489,25 @@ 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, 209, 218, 225, 232, 239, 246 - }; + } +#endif /* DEFINE_PS_TABLES */ + ; #define FT_NUM_SID_NAMES 391 /* Values are offsets into the `ft_standard_glyph_names' table */ - static const short ft_sid_names[FT_NUM_SID_NAMES] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_sid_names[FT_NUM_SID_NAMES] +#ifdef DEFINE_PS_TABLES + = { 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, @@ -506,11 +537,22 @@ 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 - }; + } +#endif /* DEFINE_PS_TABLES */ + ; /* the following are indices into the SID name table */ - static const unsigned short t1_standard_encoding[256] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_standard_encoding[256] +#ifdef DEFINE_PS_TABLES + = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -528,11 +570,22 @@ 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 - }; + } +#endif /* DEFINE_PS_TABLES */ + ; /* the following are indices into the SID name table */ - static const unsigned short t1_expert_encoding[256] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_expert_encoding[256] +#ifdef DEFINE_PS_TABLES + = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -550,7 +603,9 @@ 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 - }; + } +#endif /* DEFINE_PS_TABLES */ + ; /* @@ -564,7 +619,16 @@ #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST - static const unsigned char ft_adobe_glyph_list[55997L] = +#ifndef DEFINE_PS_TABLES +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned char ft_adobe_glyph_list[55997L] +#ifdef DEFINE_PS_TABLES + = { 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, @@ -4066,9 +4130,12 @@ 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1, 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128, 48, 90,235,225,244,225,235,225,238, 97,128, 48,186 - }; + } +#endif /* DEFINE_PS_TABLES */ + ; +#ifdef DEFINE_PS_TABLES /* * This function searches the compressed table efficiently. */ @@ -4163,6 +4230,7 @@ NotFound: return 0; } +#endif /* DEFINE_PS_TABLES */ #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ diff --git a/thirdparty/freetype/src/psnames/rules.mk b/thirdparty/freetype/src/psnames/rules.mk index 9849f4053a..69fa732200 100644 --- a/thirdparty/freetype/src/psnames/rules.mk +++ b/thirdparty/freetype/src/psnames/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/raster/ftmisc.h b/thirdparty/freetype/src/raster/ftmisc.h index 981ce32279..d1e6627ab4 100644 --- a/thirdparty/freetype/src/raster/ftmisc.h +++ b/thirdparty/freetype/src/raster/ftmisc.h @@ -5,7 +5,7 @@ /* Miscellaneous macros for stand-alone rasterizer (specification */ /* only). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/thirdparty/freetype/src/raster/ftraster.c b/thirdparty/freetype/src/raster/ftraster.c index 0fa2f2687f..c5643f6334 100644 --- a/thirdparty/freetype/src/raster/ftraster.c +++ b/thirdparty/freetype/src/raster/ftraster.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -251,6 +251,10 @@ #define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) #endif +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ /* typically a small value and the result of a*b is known to fit into */ /* 32 bits. */ @@ -1516,8 +1520,9 @@ state_bez = y1 < y3 ? Ascending_State : Descending_State; if ( ras.state != state_bez ) { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); /* finalize current profile if any */ @@ -1652,8 +1657,9 @@ /* detect a change of direction */ if ( ras.state != state_bez ) { - Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) - : IS_TOP_OVERSHOOT( y1 ); + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); /* finalize current profile if any */ @@ -2386,7 +2392,7 @@ pxl = e2; /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; + e1 = ( pxl == e1 ) ? e2 : e1; e1 = TRUNC( e1 ); @@ -2587,7 +2593,7 @@ pxl = e2; /* check that the other pixel isn't set */ - e1 = pxl == e1 ? e2 : e1; + e1 = ( pxl == e1 ) ? e2 : e1; e1 = TRUNC( e1 ); @@ -3057,7 +3063,7 @@ *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + FT_ZERO( &the_raster ); ft_black_init( &the_raster ); return 0; @@ -3208,11 +3214,12 @@ FT_GLYPH_FORMAT_OUTLINE, - (FT_Raster_New_Func) ft_black_new, - (FT_Raster_Reset_Func) ft_black_reset, - (FT_Raster_Set_Mode_Func)ft_black_set_mode, - (FT_Raster_Render_Func) ft_black_render, - (FT_Raster_Done_Func) ft_black_done ) + (FT_Raster_New_Func) ft_black_new, /* raster_new */ + (FT_Raster_Reset_Func) ft_black_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)ft_black_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) ft_black_render, /* raster_render */ + (FT_Raster_Done_Func) ft_black_done /* raster_done */ + ) /* END */ diff --git a/thirdparty/freetype/src/raster/ftraster.h b/thirdparty/freetype/src/raster/ftraster.h index 65cd5f9609..6b3050cb3d 100644 --- a/thirdparty/freetype/src/raster/ftraster.h +++ b/thirdparty/freetype/src/raster/ftraster.h @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used */ diff --git a/thirdparty/freetype/src/raster/ftrend1.c b/thirdparty/freetype/src/raster/ftrend1.c index 494f112234..1a83e9e477 100644 --- a/thirdparty/freetype/src/raster/ftrend1.c +++ b/thirdparty/freetype/src/raster/ftrend1.c @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer interface (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -88,7 +88,7 @@ FT_GlyphSlot slot, FT_BBox* cbox ) { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + FT_ZERO( cbox ); if ( slot->format == render->glyph_format ) FT_Outline_Get_CBox( &slot->outline, cbox ); @@ -224,7 +224,8 @@ } - FT_DEFINE_RENDERER( ft_raster1_renderer_class, + FT_DEFINE_RENDERER( + ft_raster1_renderer_class, FT_MODULE_RENDERER, sizeof ( FT_RendererRec ), @@ -233,21 +234,20 @@ 0x10000L, 0x20000L, - 0, /* module specific interface */ + NULL, /* module specific interface */ - (FT_Module_Constructor)ft_raster1_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , + (FT_Module_Constructor)ft_raster1_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_raster1_render, - (FT_Renderer_TransformFunc)ft_raster1_transform, - (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, - (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + (FT_Renderer_RenderFunc) ft_raster1_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_raster1_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, /* set_mode */ - (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET + (FT_Raster_Funcs*)&FT_STANDARD_RASTER_GET /* raster_class */ ) diff --git a/thirdparty/freetype/src/raster/ftrend1.h b/thirdparty/freetype/src/raster/ftrend1.h index a431f185d2..cff702d140 100644 --- a/thirdparty/freetype/src/raster/ftrend1.h +++ b/thirdparty/freetype/src/raster/ftrend1.h @@ -4,7 +4,7 @@ /* */ /* The FreeType glyph rasterizer interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/raster/module.mk b/thirdparty/freetype/src/raster/module.mk index f4a5f8e838..aad39cb56a 100644 --- a/thirdparty/freetype/src/raster/module.mk +++ b/thirdparty/freetype/src/raster/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/raster/raster.c b/thirdparty/freetype/src/raster/raster.c index 5b21dcbc6a..46a6690b17 100644 --- a/thirdparty/freetype/src/raster/raster.c +++ b/thirdparty/freetype/src/raster/raster.c @@ -4,7 +4,7 @@ /* */ /* FreeType monochrome rasterer module component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,11 +17,11 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "rastpic.c" + #include "ftraster.c" #include "ftrend1.c" +#include "rastpic.c" /* END */ diff --git a/thirdparty/freetype/src/raster/rasterrs.h b/thirdparty/freetype/src/raster/rasterrs.h index 44da7fca56..0d646908ad 100644 --- a/thirdparty/freetype/src/raster/rasterrs.h +++ b/thirdparty/freetype/src/raster/rasterrs.h @@ -4,7 +4,7 @@ /* */ /* monochrome renderer error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/raster/rastpic.c b/thirdparty/freetype/src/raster/rastpic.c index dcfa92eef7..7085339b7b 100644 --- a/thirdparty/freetype/src/raster/rastpic.c +++ b/thirdparty/freetype/src/raster/rastpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for raster module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/raster/rastpic.h b/thirdparty/freetype/src/raster/rastpic.h index 7815876383..dcd691310d 100644 --- a/thirdparty/freetype/src/raster/rastpic.h +++ b/thirdparty/freetype/src/raster/rastpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for raster module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/raster/rules.mk b/thirdparty/freetype/src/raster/rules.mk index 929faa3a95..0462c93177 100644 --- a/thirdparty/freetype/src/raster/rules.mk +++ b/thirdparty/freetype/src/raster/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/sfnt/module.mk b/thirdparty/freetype/src/sfnt/module.mk index ca19e096a3..81dea17de0 100644 --- a/thirdparty/freetype/src/sfnt/module.mk +++ b/thirdparty/freetype/src/sfnt/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/sfnt/pngshim.c b/thirdparty/freetype/src/sfnt/pngshim.c index 2815759ccb..b9b296ea5f 100644 --- a/thirdparty/freetype/src/sfnt/pngshim.c +++ b/thirdparty/freetype/src/sfnt/pngshim.c @@ -4,7 +4,7 @@ /* */ /* PNG Bitmap glyph support. */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* Google, Inc. */ /* Written by Stuart Gill and Behdad Esfahbod. */ /* */ @@ -24,9 +24,10 @@ #include FT_CONFIG_STANDARD_LIBRARY_H -#ifdef FT_CONFIG_OPTION_USE_PNG +#if defined( TT_CONFIG_OPTION_EMBEDDED_BITMAPS ) && \ + defined( FT_CONFIG_OPTION_USE_PNG ) - /* We always include <stjmp.h>, so make libpng shut up! */ + /* We always include <setjmp.h>, so make libpng shut up! */ #define PNG_SKIP_SETJMP_CHECK 1 #include <png.h> #include "pngshim.h" @@ -184,7 +185,8 @@ FT_Memory memory, FT_Byte* data, FT_UInt png_len, - FT_Bool populate_map_and_metrics ) + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ) { FT_Bitmap *map = &slot->bitmap; FT_Error error = FT_Err_Ok; @@ -258,9 +260,6 @@ if ( populate_map_and_metrics ) { - FT_ULong size; - - metrics->width = (FT_UShort)imgWidth; metrics->height = (FT_UShort)imgHeight; @@ -276,13 +275,6 @@ error = FT_THROW( Array_Too_Large ); goto DestroyExit; } - - /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ - size = map->rows * (FT_ULong)map->pitch; - - error = ft_glyphslot_alloc_bitmap( slot, size ); - if ( error ) - goto DestroyExit; } /* convert palette/gray image to rgb */ @@ -334,6 +326,9 @@ goto DestroyExit; } + if ( metrics_only ) + goto DestroyExit; + switch ( color_type ) { default: @@ -349,6 +344,17 @@ break; } + if ( populate_map_and_metrics ) + { + /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ + FT_ULong size = map->rows * (FT_ULong)map->pitch; + + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if ( error ) + goto DestroyExit; + } + if ( FT_NEW_ARRAY( rows, imgHeight ) ) { error = FT_THROW( Out_Of_Memory ); @@ -372,7 +378,12 @@ return error; } -#endif /* FT_CONFIG_OPTION_USE_PNG */ +#else /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ + + /* ANSI C doesn't like empty source files */ + typedef int _pngshim_dummy; + +#endif /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ /* END */ diff --git a/thirdparty/freetype/src/sfnt/pngshim.h b/thirdparty/freetype/src/sfnt/pngshim.h index ff05871332..344eceac12 100644 --- a/thirdparty/freetype/src/sfnt/pngshim.h +++ b/thirdparty/freetype/src/sfnt/pngshim.h @@ -4,7 +4,7 @@ /* */ /* PNG Bitmap glyph support. */ /* */ -/* Copyright 2013-2016 by */ +/* Copyright 2013-2017 by */ /* Google, Inc. */ /* Written by Stuart Gill and Behdad Esfahbod. */ /* */ @@ -38,7 +38,8 @@ FT_BEGIN_HEADER FT_Memory memory, FT_Byte* data, FT_UInt png_len, - FT_Bool populate_map_and_metrics ); + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ); #endif diff --git a/thirdparty/freetype/src/sfnt/rules.mk b/thirdparty/freetype/src/sfnt/rules.mk index e9fc421567..230d56c946 100644 --- a/thirdparty/freetype/src/sfnt/rules.mk +++ b/thirdparty/freetype/src/sfnt/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/sfnt/sfdriver.c b/thirdparty/freetype/src/sfnt/sfdriver.c index 47e8967752..991433ee4c 100644 --- a/thirdparty/freetype/src/sfnt/sfdriver.c +++ b/thirdparty/freetype/src/sfnt/sfdriver.c @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,6 +20,7 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_SFNT_H #include FT_INTERNAL_OBJECTS_H +#include FT_TRUETYPE_IDS_H #include "sfdriver.h" #include "ttload.h" @@ -50,6 +51,11 @@ #include FT_SERVICE_SFNT_H #include FT_SERVICE_TT_CMAP_H +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + /*************************************************************************/ /* */ @@ -88,7 +94,7 @@ break; case FT_SFNT_OS2: - table = face->os2.version == 0xFFFFU ? NULL : &face->os2; + table = ( face->os2.version == 0xFFFFU ) ? NULL : &face->os2; break; case FT_SFNT_POST: @@ -139,9 +145,11 @@ FT_DEFINE_SERVICE_SFNT_TABLEREC( sfnt_service_sfnt_table, + (FT_SFNT_TableLoadFunc)tt_face_load_any, /* load_table */ (FT_SFNT_TableGetFunc) get_sfnt_table, /* get_table */ - (FT_SFNT_TableInfoFunc)sfnt_table_info ) /* table_info */ + (FT_SFNT_TableInfoFunc)sfnt_table_info /* table_info */ + ) #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES @@ -152,7 +160,7 @@ */ static FT_Error - sfnt_get_glyph_name( TT_Face face, + sfnt_get_glyph_name( FT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max ) @@ -161,7 +169,7 @@ FT_Error error; - error = tt_face_get_ps_name( face, glyph_index, &gname ); + error = tt_face_get_ps_name( (TT_Face)face, glyph_index, &gname ); if ( !error ) FT_STRCPYN( buffer, gname, buffer_max ); @@ -170,26 +178,26 @@ static FT_UInt - sfnt_get_name_index( TT_Face face, + sfnt_get_name_index( FT_Face face, FT_String* glyph_name ) { - FT_Face root = &face->root; + TT_Face ttface = (TT_Face)face; FT_UInt i, max_gid = FT_UINT_MAX; - if ( root->num_glyphs < 0 ) + if ( face->num_glyphs < 0 ) return 0; - else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX ) - max_gid = (FT_UInt)root->num_glyphs; + else if ( (FT_ULong)face->num_glyphs < FT_UINT_MAX ) + max_gid = (FT_UInt)face->num_glyphs; else FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", - FT_UINT_MAX, root->num_glyphs )); + FT_UINT_MAX, face->num_glyphs )); for ( i = 0; i < max_gid; i++ ) { FT_String* gname; - FT_Error error = tt_face_get_ps_name( face, i, &gname ); + FT_Error error = tt_face_get_ps_name( ttface, i, &gname ); if ( error ) @@ -205,9 +213,10 @@ FT_DEFINE_SERVICE_GLYPHDICTREC( sfnt_service_glyph_dict, - (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, /* get_name */ - (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index ) /* name_index */ + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, /* get_name */ + (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index /* name_index */ + ) #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ @@ -217,120 +226,847 @@ * */ - static const char* - sfnt_get_ps_name( TT_Face face ) + /* an array representing allowed ASCII characters in a PS string */ + static const unsigned char sfnt_ps_map[16] = { - FT_Int n, found_win, found_apple; - const char* result = NULL; + /* 4 0 C 8 */ + 0x00, 0x00, /* 0x00: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0x00, 0x00, /* 0x10: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0xDE, 0x7C, /* 0x20: 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 */ + 0xFF, 0xAF, /* 0x30: 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 */ + 0xFF, 0xFF, /* 0x40: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0xD7, /* 0x50: 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 */ + 0xFF, 0xFF, /* 0x60: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0x57 /* 0x70: 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 */ + }; + + + static int + sfnt_is_postscript( int c ) + { + unsigned int cc; - /* shouldn't happen, but just in case to avoid memory leaks */ - if ( face->postscript_name ) - return face->postscript_name; + if ( c < 0 || c >= 0x80 ) + return 0; - /* scan the name table to see whether we have a Postscript name here, */ - /* either in Macintosh or Windows platform encodings */ - found_win = -1; - found_apple = -1; + cc = (unsigned int)c; + + return sfnt_ps_map[cc >> 3] & ( 1 << ( cc & 0x07 ) ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* Only ASCII letters and digits are taken for a variation font */ + /* instance's PostScript name. */ + /* */ + /* `ft_isalnum' is a macro, but we need a function here, thus */ + /* this definition. */ + static int + sfnt_is_alphanumeric( int c ) + { + return ft_isalnum( c ); + } + + + /* the implementation of MurmurHash3 is taken and adapted from */ + /* https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */ + +#define ROTL32( x, r ) ( x << r ) | ( x >> ( 32 - r ) ) + + + static FT_UInt32 + fmix32( FT_UInt32 h ) + { + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; + } + + + static void + murmur_hash_3_128( const void* key, + const unsigned int len, + FT_UInt32 seed, + void* out ) + { + const FT_Byte* data = (const FT_Byte*)key; + const int nblocks = (int)len / 16; + + FT_UInt32 h1 = seed; + FT_UInt32 h2 = seed; + FT_UInt32 h3 = seed; + FT_UInt32 h4 = seed; + + const FT_UInt32 c1 = 0x239b961b; + const FT_UInt32 c2 = 0xab0e9789; + const FT_UInt32 c3 = 0x38b34ae5; + const FT_UInt32 c4 = 0xa1e38b93; + + const FT_UInt32* blocks = (const FT_UInt32*)( data + nblocks * 16 ); + + int i; + + + for( i = -nblocks; i; i++ ) + { + FT_UInt32 k1 = blocks[i * 4 + 0]; + FT_UInt32 k2 = blocks[i * 4 + 1]; + FT_UInt32 k3 = blocks[i * 4 + 2]; + FT_UInt32 k4 = blocks[i * 4 + 3]; + + + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; + + h1 = ROTL32( h1, 19 ); + h1 += h2; + h1 = h1 * 5 + 0x561ccd1b; + + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + + h2 = ROTL32( h2, 17 ); + h2 += h3; + h2 = h2 * 5 + 0x0bcaa747; + + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + + h3 = ROTL32( h3, 15 ); + h3 += h4; + h3 = h3 * 5 + 0x96cd1c35; + + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + + h4 = ROTL32( h4, 13 ); + h4 += h1; + h4 = h4 * 5 + 0x32ac3b17; + } - for ( n = 0; n < face->num_names; n++ ) { - TT_NameEntryRec* name = face->name_table.names + n; + const FT_Byte* tail = (const FT_Byte*)( data + nblocks * 16 ); + FT_UInt32 k1 = 0; + FT_UInt32 k2 = 0; + FT_UInt32 k3 = 0; + FT_UInt32 k4 = 0; - if ( name->nameID == 6 && name->stringLength > 0 ) + + switch ( len & 15 ) { - if ( name->platformID == 3 && - name->encodingID == 1 && - name->languageID == 0x409 ) - found_win = n; - - if ( name->platformID == 1 && - name->encodingID == 0 && - name->languageID == 0 ) - found_apple = n; + case 15: + k4 ^= (FT_UInt32)tail[14] << 16; + case 14: + k4 ^= (FT_UInt32)tail[13] << 8; + case 13: + k4 ^= (FT_UInt32)tail[12]; + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + + case 12: + k3 ^= (FT_UInt32)tail[11] << 24; + case 11: + k3 ^= (FT_UInt32)tail[10] << 16; + case 10: + k3 ^= (FT_UInt32)tail[9] << 8; + case 9: + k3 ^= (FT_UInt32)tail[8]; + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + + case 8: + k2 ^= (FT_UInt32)tail[7] << 24; + case 7: + k2 ^= (FT_UInt32)tail[6] << 16; + case 6: + k2 ^= (FT_UInt32)tail[5] << 8; + case 5: + k2 ^= (FT_UInt32)tail[4]; + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + + case 4: + k1 ^= (FT_UInt32)tail[3] << 24; + case 3: + k1 ^= (FT_UInt32)tail[2] << 16; + case 2: + k1 ^= (FT_UInt32)tail[1] << 8; + case 1: + k1 ^= (FT_UInt32)tail[0]; + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; } } - if ( found_win != -1 ) + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + h1 = fmix32( h1 ); + h2 = fmix32( h2 ); + h3 = fmix32( h3 ); + h4 = fmix32( h4 ); + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + ((FT_UInt32*)out)[0] = h1; + ((FT_UInt32*)out)[1] = h2; + ((FT_UInt32*)out)[2] = h3; + ((FT_UInt32*)out)[3] = h4; + } + + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + typedef int (*char_type_func)( int c ); + + + /* handling of PID/EID 3/0 and 3/1 is the same */ +#define IS_WIN( n ) ( (n)->platformID == 3 && \ + ( (n)->encodingID == 1 || (n)->encodingID == 0 ) && \ + (n)->languageID == 0x409 ) + +#define IS_APPLE( n ) ( (n)->platformID == 1 && \ + (n)->encodingID == 0 && \ + (n)->languageID == 0 ) + + static char* + get_win_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error = FT_Err_Ok; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + FT_UNUSED( error ); + + + if ( FT_ALLOC( result, entry->stringLength / 2 + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_win; - FT_UInt len = name->stringLength / 2; - FT_Error error = FT_Err_Ok; + FT_FREE( result ); + entry->stringLength = 0; + entry->stringOffset = 0; + FT_FREE( entry->string ); - FT_UNUSED( error ); + return NULL; + } + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; - if ( !FT_ALLOC( result, name->stringLength + 1 ) ) + for ( len = entry->stringLength / 2; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 ) { - FT_Stream stream = face->name_table.stream; - FT_String* r = (FT_String*)result; - FT_Char* p; + if ( char_type( p[1] ) ) + *r++ = p[1]; + else + { + if ( report_invalid_characters ) + { + FT_TRACE0(( "get_win_string:" + " Character `%c' (0x%X) invalid in PS name string\n", + p[1], p[1] )); + /* it's not the job of FreeType to correct PS names... */ + *r++ = p[1]; + } + } + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + return result; + } + + + static char* + get_apple_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error = FT_Err_Ok; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + FT_UNUSED( error ); + + if ( FT_ALLOC( result, entry->stringLength + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) + { + FT_FREE( result ); + entry->stringOffset = 0; + entry->stringLength = 0; + FT_FREE( entry->string ); - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_FRAME_ENTER( name->stringLength ) ) + return NULL; + } + + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; + + for ( len = entry->stringLength; len > 0; len--, p++ ) + { + if ( char_type( *p ) ) + *r++ = *p; + else + { + if ( report_invalid_characters ) { - FT_FREE( result ); - name->stringLength = 0; - name->stringOffset = 0; - FT_FREE( name->string ); + FT_TRACE0(( "get_apple_string:" + " Character `%c' (0x%X) invalid in PS name string\n", + *p, *p )); + /* it's not the job of FreeType to correct PS names... */ + *r++ = *p; + } + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + return result; + } + + + static FT_Bool + sfnt_get_name_id( TT_Face face, + FT_UShort id, + FT_Int *win, + FT_Int *apple ) + { + FT_Int n; + + + *win = -1; + *apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_Name name = face->name_table.names + n; + + + if ( name->nameID == id && name->stringLength > 0 ) + { + if ( IS_WIN( name ) ) + *win = n; + + if ( IS_APPLE( name ) ) + *apple = n; + } + } + + return ( *win >= 0 ) || ( *apple >= 0 ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + The maximum length of an axis value descriptor. + + We need 65536 different values for the decimal fraction; this fits + nicely into five decimal places. Consequently, it consists of + + . the minus sign if the number is negative, + . up to five characters for the digits before the decimal point, + . the decimal point if there is a fractional part, and + . up to five characters for the digits after the decimal point. + + We also need one byte for the leading `_' character and up to four + bytes for the axis tag. + */ +#define MAX_VALUE_DESCRIPTOR_LEN ( 1 + 5 + 1 + 5 + 1 + 4 ) + + + /* the maximum length of PostScript font names */ +#define MAX_PS_NAME_LEN 127 + + + /* + * Find the shortest decimal representation of a 16.16 fixed point + * number. The function fills `buf' with the result, returning a pointer + * to the position after the representation's last byte. + */ + + static char* + fixed2float( FT_Int fixed, + char* buf ) + { + char* p; + char* q; + char tmp[5]; + + FT_Int int_part; + FT_Int frac_part; + + FT_Int i; + - goto Exit; + p = buf; + + if ( fixed == 0 ) + { + *p++ = '0'; + return p; + } + + if ( fixed < 0 ) + { + *p++ = '-'; + fixed = -fixed; + } + + int_part = ( fixed >> 16 ) & 0xFFFF; + frac_part = fixed & 0xFFFF; + + /* get digits of integer part (in reverse order) */ + q = tmp; + while ( int_part > 0 ) + { + *q++ = '0' + int_part % 10; + int_part /= 10; + } + + /* copy digits in correct order to buffer */ + while ( q > tmp ) + *p++ = *--q; + + if ( !frac_part ) + return p; + + /* save position of point */ + q = p; + *p++ = '.'; + + /* apply rounding */ + frac_part = frac_part * 10 + 5; + + /* get digits of fractional part */ + for ( i = 0; i < 5; i++ ) + { + *p++ = '0' + (char)( frac_part / 0x10000L ); + + frac_part %= 0x10000L; + if ( !frac_part ) + break; + + frac_part *= 10; + } + + /* + If the remainder stored in `frac_part' (after the last FOR loop) is + smaller than 34480*10, the resulting decimal value minus 0.00001 is + an equivalent representation of `fixed'. + + The above FOR loop always finds the larger of the two values; I + verified this by iterating over all possible fixed point numbers. + + If the remainder is 17232*10, both values are equally good, and we + take the next even number (following IEEE 754's `round to nearest, + ties to even' rounding rule). + + If the remainder is smaller than 17232*10, the lower of the two + numbers is nearer to the exact result (values 17232 and 34480 were + also found by testing all possible fixed point values). + + We use this to find a shorter decimal representation. If not ending + with digit zero, we take the representation with less error. + */ + p--; + if ( p - q == 5 ) /* five digits? */ + { + /* take the representation that has zero as the last digit */ + if ( frac_part < 34480 * 10 && + *p == '1' ) + *p = '0'; + + /* otherwise use the one with less error */ + else if ( frac_part == 17232 * 10 && + *p & 1 ) + *p -= 1; + + else if ( frac_part < 17232 * 10 && + *p != '0' ) + *p -= 1; + } + + /* remove trailing zeros */ + while ( *p == '0' ) + *p-- = '\0'; + + return p + 1; + } + + + static const char hexdigits[16] = + { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + + static const char* + sfnt_get_var_ps_name( TT_Face face ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + FT_UInt num_coords; + FT_Fixed* coords; + FT_MM_Var* mm_var; + + FT_Int found, win, apple; + FT_UInt i, j; + + char* result = NULL; + char* p; + + + if ( !face->var_postscript_prefix ) + { + FT_UInt len; + + + /* check whether we have a Variations PostScript Name Prefix */ + found = sfnt_get_name_id( face, + TT_NAME_ID_VARIATIONS_PREFIX, + &win, + &apple ); + if ( !found ) + { + /* otherwise use the typographic family name */ + found = sfnt_get_name_id( face, + TT_NAME_ID_TYPOGRAPHIC_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + /* as a last resort we try the family name; note that this is */ + /* not in the Adobe TechNote, but GX fonts (which predate the */ + /* TechNote) benefit from this behaviour */ + found = sfnt_get_name_id( face, + TT_NAME_ID_FONT_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Can't construct PS name prefix for font instances\n" )); + return NULL; + } + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( face->root.memory, + face->name_table.stream, + face->name_table.names + win, + sfnt_is_alphanumeric, + 0 ); + else + result = get_apple_string( face->root.memory, + face->name_table.stream, + face->name_table.names + apple, + sfnt_is_alphanumeric, + 0 ); + + len = ft_strlen( result ); + + /* sanitize if necessary; we reserve space for 36 bytes (a 128bit */ + /* checksum as a hex number, preceded by `-' and followed by three */ + /* ASCII dots, to be used if the constructed PS name would be too */ + /* long); this is also sufficient for a single instance */ + if ( len > MAX_PS_NAME_LEN - ( 1 + 32 + 3 ) ) + { + len = MAX_PS_NAME_LEN - ( 1 + 32 + 3 ); + result[len] = '\0'; + + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Shortening variation PS name prefix\n" + " " + " to %d characters\n", len )); + } + + face->var_postscript_prefix = result; + face->var_postscript_prefix_len = len; + } + + mm->get_var_blend( FT_FACE( face ), + &num_coords, + &coords, + NULL, + &mm_var ); + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Long instance = ( ( face->root.face_index & 0x7FFF0000L ) >> 16 ) - 1; + FT_UInt psid = mm_var->namedstyle[instance].psid; + + char* ps_name = NULL; + + + /* try first to load the name string with index `postScriptNameID' */ + if ( psid == 6 || + ( psid > 255 && psid < 32768 ) ) + (void)sfnt->get_name( face, (FT_UShort)psid, &ps_name ); + + if ( ps_name ) + { + result = ps_name; + p = result + ft_strlen( result ) + 1; + + goto check_length; + } + else + { + /* otherwise construct a name using `subfamilyNameID' */ + FT_UInt strid = mm_var->namedstyle[instance].strid; + + char* subfamily_name; + char* s; + + + (void)sfnt->get_name( face, (FT_UShort)strid, &subfamily_name ); + + if ( !subfamily_name ) + { + FT_TRACE1(( "sfnt_get_var_ps_name:" + " can't construct named instance PS name;\n" + " " + " trying to construct normal instance PS name\n" )); + goto construct_instance_name; } - p = (FT_Char*)stream->cursor; + /* after the prefix we have character `-' followed by the */ + /* subfamily name (using only characters a-z, A-Z, and 0-9) */ + if ( FT_ALLOC( result, face->var_postscript_prefix_len + + 1 + ft_strlen( subfamily_name ) + 1 ) ) + return NULL; - for ( ; len > 0; len--, p += 2 ) + ft_strcpy( result, face->var_postscript_prefix ); + + p = result + face->var_postscript_prefix_len; + *p++ = '-'; + + s = subfamily_name; + while ( *s ) { - if ( p[0] == 0 && p[1] >= 32 ) - *r++ = p[1]; + if ( ft_isalnum( *s ) ) + *p++ = *s; + s++; } - *r = '\0'; + *p++ = '\0'; + + FT_FREE( subfamily_name ); + } + } + else + { + FT_Var_Axis* axis; - FT_FRAME_EXIT(); + + construct_instance_name: + axis = mm_var->axis; + + if ( FT_ALLOC( result, + face->var_postscript_prefix_len + + num_coords * MAX_VALUE_DESCRIPTOR_LEN + 1 ) ) + return NULL; + + p = result; + + ft_strcpy( p, face->var_postscript_prefix ); + p += face->var_postscript_prefix_len; + + for ( i = 0; i < num_coords; i++, coords++, axis++ ) + { + char t; + + + /* omit axis value descriptor if it is identical */ + /* to the default axis value */ + if ( *coords == axis->def ) + continue; + + *p++ = '_'; + p = fixed2float( *coords, p ); + + t = (char)( axis->tag >> 24 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 16 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 8 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)axis->tag; + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; } - goto Exit; } - if ( found_apple != -1 ) + check_length: + if ( p - result > MAX_PS_NAME_LEN ) { - FT_Memory memory = face->root.memory; - TT_NameEntryRec* name = face->name_table.names + found_apple; - FT_UInt len = name->stringLength; - FT_Error error = FT_Err_Ok; + /* the PS name is too long; replace the part after the prefix with */ + /* a checksum; we use MurmurHash 3 with a hash length of 128 bit */ + + FT_UInt32 seed = 123456789; + + FT_UInt32 hash[4]; + FT_UInt32* h; + - FT_UNUSED( error ); + murmur_hash_3_128( result, p - result, seed, hash ); + p = result + face->var_postscript_prefix_len; + *p++ = '-'; - if ( !FT_ALLOC( result, len + 1 ) ) + /* we convert the hash value to hex digits from back to front */ + p += 32 + 3; + h = hash + 3; + + *p-- = '\0'; + *p-- = '.'; + *p-- = '.'; + *p-- = '.'; + + for ( i = 0; i < 4; i++, h-- ) { - FT_Stream stream = face->name_table.stream; + FT_UInt32 v = *h; - if ( FT_STREAM_SEEK( name->stringOffset ) || - FT_STREAM_READ( result, len ) ) + for ( j = 0; j < 8; j++ ) { - name->stringOffset = 0; - name->stringLength = 0; - FT_FREE( name->string ); - FT_FREE( result ); - goto Exit; + *p-- = hexdigits[v & 0xF]; + v >>= 4; } - ((char*)result)[len] = '\0'; } } - Exit: + return result; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static const char* + sfnt_get_ps_name( TT_Face face ) + { + FT_Int found, win, apple; + const char* result = NULL; + + + if ( face->postscript_name ) + return face->postscript_name; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->blend ) + { + face->postscript_name = sfnt_get_var_ps_name( face ); + return face->postscript_name; + } +#endif + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found = sfnt_get_name_id( face, TT_NAME_ID_PS_NAME, &win, &apple ); + if ( !found ) + return NULL; + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( face->root.memory, + face->name_table.stream, + face->name_table.names + win, + sfnt_is_postscript, + 1 ); + else + result = get_apple_string( face->root.memory, + face->name_table.stream, + face->name_table.names + apple, + sfnt_is_postscript, + 1 ); + face->postscript_name = result; + return result; } FT_DEFINE_SERVICE_PSFONTNAMEREC( sfnt_service_ps_name, - (FT_PsName_GetFunc)sfnt_get_ps_name ) /* get_ps_font_name */ + + (FT_PsName_GetFunc)sfnt_get_ps_name /* get_ps_font_name */ + ) /* @@ -338,7 +1074,9 @@ */ FT_DEFINE_SERVICE_TTCMAPSREC( tt_service_get_cmap_info, - (TT_CMap_Info_GetFunc)tt_get_cmap_info ) /* get_cmap_info */ + + (TT_CMap_Info_GetFunc)tt_get_cmap_info /* get_cmap_info */ + ) #ifdef TT_CONFIG_OPTION_BDF @@ -381,8 +1119,10 @@ FT_DEFINE_SERVICE_BDFRec( sfnt_service_bdf, + (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id, /* get_charset_id */ - (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop ) /* get_property */ + (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop /* get_property */ + ) #endif /* TT_CONFIG_OPTION_BDF */ @@ -395,6 +1135,7 @@ #if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF FT_DEFINE_SERVICEDESCREC5( sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, @@ -403,6 +1144,7 @@ #elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES FT_DEFINE_SERVICEDESCREC4( sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, @@ -410,6 +1152,7 @@ #elif defined TT_CONFIG_OPTION_BDF FT_DEFINE_SERVICEDESCREC4( sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, @@ -417,6 +1160,7 @@ #else FT_DEFINE_SERVICEDESCREC3( sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) @@ -459,55 +1203,64 @@ FT_DEFINE_SFNT_INTERFACE( sfnt_interface, - tt_face_goto_table, - sfnt_init_face, - sfnt_load_face, - sfnt_done_face, - sfnt_get_interface, + tt_face_goto_table, /* TT_Loader_GotoTableFunc goto_table */ + + sfnt_init_face, /* TT_Init_Face_Func init_face */ + sfnt_load_face, /* TT_Load_Face_Func load_face */ + sfnt_done_face, /* TT_Done_Face_Func done_face */ + sfnt_get_interface, /* FT_Module_Requester get_interface */ - tt_face_load_any, + tt_face_load_any, /* TT_Load_Any_Func load_any */ - tt_face_load_head, - tt_face_load_hhea, - tt_face_load_cmap, - tt_face_load_maxp, - tt_face_load_os2, - tt_face_load_post, + tt_face_load_head, /* TT_Load_Table_Func load_head */ + tt_face_load_hhea, /* TT_Load_Metrics_Func load_hhea */ + tt_face_load_cmap, /* TT_Load_Table_Func load_cmap */ + tt_face_load_maxp, /* TT_Load_Table_Func load_maxp */ + tt_face_load_os2, /* TT_Load_Table_Func load_os2 */ + tt_face_load_post, /* TT_Load_Table_Func load_post */ - tt_face_load_name, - tt_face_free_name, + tt_face_load_name, /* TT_Load_Table_Func load_name */ + tt_face_free_name, /* TT_Free_Table_Func free_name */ - tt_face_load_kern, - tt_face_load_gasp, - tt_face_load_pclt, + tt_face_load_kern, /* TT_Load_Table_Func load_kern */ + tt_face_load_gasp, /* TT_Load_Table_Func load_gasp */ + tt_face_load_pclt, /* TT_Load_Table_Func load_init */ /* see `ttload.h' */ PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ), - + /* TT_Load_Table_Func load_bhed */ PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ), + /* TT_Load_SBit_Image_Func load_sbit_image */ /* see `ttpost.h' */ PUT_PS_NAMES( tt_face_get_ps_name ), + /* TT_Get_PS_Name_Func get_psname */ PUT_PS_NAMES( tt_face_free_ps_names ), + /* TT_Free_Table_Func free_psnames */ /* since version 2.1.8 */ - tt_face_get_kerning, + tt_face_get_kerning, /* TT_Face_GetKerningFunc get_kerning */ /* since version 2.2 */ - tt_face_load_font_dir, - tt_face_load_hmtx, + tt_face_load_font_dir, /* TT_Load_Table_Func load_font_dir */ + tt_face_load_hmtx, /* TT_Load_Metrics_Func load_hmtx */ /* see `ttsbit.h' and `sfnt.h' */ PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ), + /* TT_Load_Table_Func load_eblc */ PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ), + /* TT_Free_Table_Func free_eblc */ PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ), + /* TT_Set_SBit_Strike_Func set_sbit_strike */ PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ), + /* TT_Load_Strike_Metrics_Func load_strike_metrics */ - tt_face_get_metrics, + tt_face_get_metrics, /* TT_Get_Metrics_Func get_metrics */ - tt_face_get_name + tt_face_get_name, /* TT_Get_Name_Func get_name */ + sfnt_get_name_id /* TT_Get_Name_ID_Func get_name_id */ ) @@ -523,9 +1276,10 @@ (const void*)&SFNT_INTERFACE_GET, /* module specific interface */ - (FT_Module_Constructor)0, - (FT_Module_Destructor) 0, - (FT_Module_Requester) sfnt_get_interface ) + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) sfnt_get_interface /* get_interface */ + ) /* END */ diff --git a/thirdparty/freetype/src/sfnt/sfdriver.h b/thirdparty/freetype/src/sfnt/sfdriver.h index 2694488e20..38710b60f2 100644 --- a/thirdparty/freetype/src/sfnt/sfdriver.h +++ b/thirdparty/freetype/src/sfnt/sfdriver.h @@ -4,7 +4,7 @@ /* */ /* High-level SFNT driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/sferrors.h b/thirdparty/freetype/src/sfnt/sferrors.h index c2f9fdfead..3cf73d725d 100644 --- a/thirdparty/freetype/src/sfnt/sferrors.h +++ b/thirdparty/freetype/src/sfnt/sferrors.h @@ -4,7 +4,7 @@ /* */ /* SFNT error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/sfnt.c b/thirdparty/freetype/src/sfnt/sfnt.c index 952d6d425a..6cf8c9ef30 100644 --- a/thirdparty/freetype/src/sfnt/sfnt.c +++ b/thirdparty/freetype/src/sfnt/sfnt.c @@ -4,7 +4,7 @@ /* */ /* Single object library component. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,27 +17,19 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> + +#include "pngshim.c" +#include "sfdriver.c" #include "sfntpic.c" -#include "ttload.c" -#include "ttmtx.c" +#include "sfobjs.c" +#include "ttbdf.c" #include "ttcmap.c" #include "ttkern.c" -#include "sfobjs.c" -#include "sfdriver.c" - -#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS -#include "pngshim.c" -#include "ttsbit.c" -#endif - -#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttload.c" +#include "ttmtx.c" #include "ttpost.c" -#endif +#include "ttsbit.c" -#ifdef TT_CONFIG_OPTION_BDF -#include "ttbdf.c" -#endif /* END */ diff --git a/thirdparty/freetype/src/sfnt/sfntpic.c b/thirdparty/freetype/src/sfnt/sfntpic.c index 1f596c0936..8eadd601fd 100644 --- a/thirdparty/freetype/src/sfnt/sfntpic.c +++ b/thirdparty/freetype/src/sfnt/sfntpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for sfnt module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/sfntpic.h b/thirdparty/freetype/src/sfnt/sfntpic.h index 5ce96d3938..3afb668db0 100644 --- a/thirdparty/freetype/src/sfnt/sfntpic.h +++ b/thirdparty/freetype/src/sfnt/sfntpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for sfnt module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/sfobjs.c b/thirdparty/freetype/src/sfnt/sfobjs.c index 2e8c1ecde6..ac2e620e5d 100644 --- a/thirdparty/freetype/src/sfnt/sfobjs.c +++ b/thirdparty/freetype/src/sfnt/sfobjs.c @@ -4,7 +4,7 @@ /* */ /* SFNT object management (base). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -28,6 +28,12 @@ #include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_SFNT_NAMES_H #include FT_GZIP_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + #include "sferrors.h" #ifdef TT_CONFIG_OPTION_BDF @@ -48,8 +54,8 @@ /* convert a UTF-16 name entry to ASCII */ static FT_String* - tt_name_entry_ascii_from_utf16( TT_NameEntry entry, - FT_Memory memory ) + tt_name_ascii_from_utf16( TT_Name entry, + FT_Memory memory ) { FT_String* string = NULL; FT_UInt len, code, n; @@ -83,8 +89,8 @@ /* convert an Apple Roman or symbol name entry to ASCII */ static FT_String* - tt_name_entry_ascii_from_other( TT_NameEntry entry, - FT_Memory memory ) + tt_name_ascii_from_other( TT_Name entry, + FT_Memory memory ) { FT_String* string = NULL; FT_UInt len, code, n; @@ -116,8 +122,8 @@ } - typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, - FT_Memory memory ); + typedef FT_String* (*TT_Name_ConvertFunc)( TT_Name entry, + FT_Memory memory ); /* documentation is in sfnt.h */ @@ -127,20 +133,21 @@ FT_UShort nameid, FT_String** name ) { - FT_Memory memory = face->root.memory; - FT_Error error = FT_Err_Ok; - FT_String* result = NULL; - FT_UShort n; - TT_NameEntryRec* rec; - FT_Int found_apple = -1; - FT_Int found_apple_roman = -1; - FT_Int found_apple_english = -1; - FT_Int found_win = -1; - FT_Int found_unicode = -1; + FT_Memory memory = face->root.memory; + FT_Error error = FT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_Name rec; + + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; - FT_Bool is_english = 0; + FT_Bool is_english = 0; - TT_NameEntry_ConvertFunc convert; + TT_Name_ConvertFunc convert; FT_ASSERT( name ); @@ -225,7 +232,7 @@ /* all Unicode strings are encoded using UTF-16BE */ case TT_MS_ID_UNICODE_CS: case TT_MS_ID_SYMBOL_CS: - convert = tt_name_entry_ascii_from_utf16; + convert = tt_name_ascii_from_utf16; break; case TT_MS_ID_UCS_4: @@ -234,7 +241,7 @@ /* MsGothic font shipped with Windows Vista shows that this really */ /* means UTF-16 encoded names (UCS-4 values are only used within */ /* charmaps). */ - convert = tt_name_entry_ascii_from_utf16; + convert = tt_name_ascii_from_utf16; break; default: @@ -244,17 +251,17 @@ else if ( found_apple >= 0 ) { rec = face->name_table.names + found_apple; - convert = tt_name_entry_ascii_from_other; + convert = tt_name_ascii_from_other; } else if ( found_unicode >= 0 ) { rec = face->name_table.names + found_unicode; - convert = tt_name_entry_ascii_from_utf16; + convert = tt_name_ascii_from_utf16; } if ( rec && convert ) { - if ( rec->string == NULL ) + if ( !rec->string ) { FT_Stream stream = face->name_table.stream; @@ -304,7 +311,7 @@ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, - { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_PRC, FT_ENCODING_PRC }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } @@ -798,6 +805,9 @@ if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) return error; + FT_TRACE3(( " with %ld subfonts\n", + face->ttc_header.count )); + if ( face->ttc_header.count == 0 ) return FT_THROW( Invalid_Table ); @@ -872,6 +882,31 @@ FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !face->mm ) + { + /* we want the MM interface from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->mm = ft_module_get_service( tt_module, + FT_SERVICE_ID_MULTI_MASTERS, + 0 ); + } + + if ( !face->var ) + { + /* we want the metrics variations interface */ + /* from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->var = ft_module_get_service( tt_module, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); + } +#endif + FT_TRACE2(( "SFNT driver\n" )); error = sfnt_open_font( stream, face ); @@ -881,10 +916,14 @@ /* Stream may have changed in sfnt_open_font. */ stream = face->root.stream; - FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_instance_index )); + FT_TRACE2(( "sfnt_init_face: %08p, %d\n", face, face_instance_index )); face_index = FT_ABS( face_instance_index ) & 0xFFFF; + /* value -(N+1) requests information on index N */ + if ( face_instance_index < 0 ) + face_index--; + if ( face_index >= face->ttc_header.count ) { if ( face_instance_index >= 0 ) @@ -903,6 +942,8 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT { + FT_Memory memory = face->root.memory; + FT_ULong fvar_len; FT_ULong version; @@ -915,6 +956,11 @@ FT_Int instance_index; + FT_Byte* default_values = NULL; + FT_Byte* instance_values = NULL; + + + face->is_default_instance = 1; instance_index = FT_ABS( face_instance_index ) >> 16; @@ -923,7 +969,7 @@ fvar_len < 20 || FT_READ_ULONG( version ) || FT_READ_USHORT( offset ) || - FT_STREAM_SKIP( 2 ) || + FT_STREAM_SKIP( 2 ) /* reserved */ || FT_READ_USHORT( num_axes ) || FT_READ_USHORT( axis_size ) || FT_READ_USHORT( num_instances ) || @@ -937,31 +983,90 @@ instance_size = 0; } - /* check that the data is bound by the table length; */ - /* based on similar code in function `TT_Get_MM_Var' */ + /* check that the data is bound by the table length */ if ( version != 0x00010000UL || axis_size != 20 || + num_axes == 0 || + /* `num_axes' limit implied by 16-bit `instance_size' */ num_axes > 0x3FFE || - instance_size != 4 + 4 * num_axes || + !( instance_size == 4 + 4 * num_axes || + instance_size == 6 + 4 * num_axes ) || + /* `num_instances' limit implied by limited range of name IDs */ num_instances > 0x7EFF || offset + axis_size * num_axes + instance_size * num_instances > fvar_len ) num_instances = 0; + else + face->variation_support |= TT_FACE_FLAG_VAR_FVAR; - /* we don't support Multiple Master CFFs yet */ - if ( !face->goto_table( face, TTAG_CFF, stream, 0 ) ) - num_instances = 0; + /* + * As documented in the OpenType specification, an entry for the + * default instance may be omitted in the named instance table. In + * particular this means that even if there is no named instance + * table in the font we actually do have a named instance, namely the + * default instance. + * + * For consistency, we always want the default instance in our list + * of named instances. If it is missing, we try to synthesize it + * later on. Here, we have to adjust `num_instances' accordingly. + */ - /* we support at most 2^15 - 1 instances */ - if ( num_instances >= ( 1U << 15 ) - 1 ) + if ( ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) && + !( FT_ALLOC( default_values, num_axes * 4 ) || + FT_ALLOC( instance_values, num_axes * 4 ) ) ) { - if ( face_instance_index >= 0 ) - return FT_THROW( Invalid_Argument ); - else - num_instances = 0; + /* the current stream position is 16 bytes after the table start */ + FT_ULong array_start = FT_STREAM_POS() - 16 + offset; + FT_ULong default_value_offset, instance_offset; + + FT_Byte* p; + FT_UInt i; + + + default_value_offset = array_start + 8; + p = default_values; + + for ( i = 0; i < num_axes; i++ ) + { + (void)FT_STREAM_READ_AT( default_value_offset, p, 4 ); + + default_value_offset += axis_size; + p += 4; + } + + instance_offset = array_start + axis_size * num_axes + 4; + + for ( i = 0; i < num_instances; i++ ) + { + (void)FT_STREAM_READ_AT( instance_offset, + instance_values, + num_axes * 4 ); + + if ( !ft_memcmp( default_values, instance_values, num_axes * 4 ) ) + break; + + instance_offset += instance_size; + } + + if ( i == num_instances ) + { + /* no default instance in named instance table; */ + /* we thus have to synthesize it */ + num_instances++; + } } + FT_FREE( default_values ); + FT_FREE( instance_values ); + + /* we don't support Multiple Master CFFs yet; */ + /* note that `glyf' or `CFF2' have precedence */ + if ( face->goto_table( face, TTAG_glyf, stream, 0 ) && + face->goto_table( face, TTAG_CFF2, stream, 0 ) && + !face->goto_table( face, TTAG_CFF, stream, 0 ) ) + num_instances = 0; + /* instance indices in `face_instance_index' start with index 1, */ /* thus `>' and not `>=' */ if ( instance_index > num_instances ) @@ -977,7 +1082,7 @@ #endif face->root.num_faces = face->ttc_header.count; - face->root.face_index = face_index; + face->root.face_index = face_instance_index; return error; } @@ -1039,8 +1144,8 @@ FT_Bool has_outline; FT_Bool is_apple_sbit; FT_Bool is_apple_sbix; - FT_Bool ignore_preferred_family = FALSE; - FT_Bool ignore_preferred_subfamily = FALSE; + FT_Bool ignore_typographic_family = FALSE; + FT_Bool ignore_typographic_subfamily = FALSE; SFNT_Service sfnt = (SFNT_Service)face->sfnt; @@ -1055,10 +1160,10 @@ for ( i = 0; i < num_params; i++ ) { - if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) - ignore_preferred_family = TRUE; - else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ) - ignore_preferred_subfamily = TRUE; + if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY ) + ignore_typographic_family = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY ) + ignore_typographic_subfamily = TRUE; } } @@ -1083,12 +1188,14 @@ /* do we have outlines in there? */ #ifdef FT_CONFIG_OPTION_INCREMENTAL - has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || - tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); + has_outline = FT_BOOL( face->root.internal->incremental_interface || + tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); #else - has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || - tt_face_lookup_table( face, TTAG_CFF ) != 0 ); + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); #endif is_apple_sbit = 0; @@ -1220,30 +1327,10 @@ /* embedded bitmap support */ if ( sfnt->load_eblc ) - { LOAD_( eblc ); - if ( error ) - { - /* a font which contains neither bitmaps nor outlines is */ - /* still valid (although rather useless in most cases); */ - /* however, you can find such stripped fonts in PDFs */ - if ( FT_ERR_EQ( error, Table_Missing ) ) - error = FT_Err_Ok; - else - goto Exit; - } - } + /* consider the pclt, kerning, and gasp tables as optional */ LOAD_( pclt ); - if ( error ) - { - if ( FT_ERR_NEQ( error, Table_Missing ) ) - goto Exit; - - face->pclt.Version = 0; - } - - /* consider the kerning and gasp tables as optional */ LOAD_( gasp ); LOAD_( kern ); @@ -1259,27 +1346,27 @@ face->root.style_name = NULL; if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) { - if ( !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); if ( !face->root.family_name ) GET_NAME( FONT_FAMILY, &face->root.family_name ); - if ( !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); if ( !face->root.style_name ) GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); } else { GET_NAME( WWS_FAMILY, &face->root.family_name ); - if ( !face->root.family_name && !ignore_preferred_family ) - GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name && !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); if ( !face->root.family_name ) GET_NAME( FONT_FAMILY, &face->root.family_name ); GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); - if ( !face->root.style_name && !ignore_preferred_subfamily ) - GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name && !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); if ( !face->root.style_name ) GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); } @@ -1327,10 +1414,14 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT /* Don't bother to load the tables unless somebody asks for them. */ /* No need to do work which will (probably) not be used. */ - if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && - tt_face_lookup_table( face, TTAG_fvar ) != 0 && - tt_face_lookup_table( face, TTAG_gvar ) != 0 ) - flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) + { + if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && + tt_face_lookup_table( face, TTAG_gvar ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + if ( tt_face_lookup_table( face, TTAG_CFF2 ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + } #endif root->face_flags = flags; @@ -1393,7 +1484,7 @@ charmap->encoding_id ); #if 0 - if ( root->charmap == NULL && + if ( !root->charmap && charmap->encoding == FT_ENCODING_UNICODE ) { /* set 'root->charmap' to the first Unicode encoding we find */ @@ -1411,7 +1502,7 @@ * depths in the FT_Bitmap_Size record. This is a design error. */ { - FT_UInt i, count; + FT_UInt count; count = face->sbit_num_strikes; @@ -1423,6 +1514,9 @@ FT_Short avgwidth = face->os2.xAvgCharWidth; FT_Size_Metrics metrics; + FT_UInt* sbit_strike_map = NULL; + FT_UInt strike_idx, bsize_idx; + if ( em_size == 0 || face->os2.version == 0xFFFFU ) { @@ -1430,31 +1524,50 @@ em_size = 1; } - if ( FT_NEW_ARRAY( root->available_sizes, count ) ) + /* to avoid invalid strike data in the `available_sizes' field */ + /* of `FT_Face', we map `available_sizes' indices to strike */ + /* indices */ + if ( FT_NEW_ARRAY( root->available_sizes, count ) || + FT_NEW_ARRAY( sbit_strike_map, count ) ) goto Exit; - for ( i = 0; i < count; i++ ) + bsize_idx = 0; + for ( strike_idx = 0; strike_idx < count; strike_idx++ ) { - FT_Bitmap_Size* bsize = root->available_sizes + i; + FT_Bitmap_Size* bsize = root->available_sizes + bsize_idx; - error = sfnt->load_strike_metrics( face, i, &metrics ); + error = sfnt->load_strike_metrics( face, strike_idx, &metrics ); if ( error ) - goto Exit; + continue; bsize->height = (FT_Short)( metrics.height >> 6 ); - bsize->width = (FT_Short)( - ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); bsize->x_ppem = metrics.x_ppem << 6; bsize->y_ppem = metrics.y_ppem << 6; /* assume 72dpi */ bsize->size = metrics.y_ppem << 6; + + /* only use strikes with valid PPEM values */ + if ( bsize->x_ppem && bsize->y_ppem ) + sbit_strike_map[bsize_idx++] = strike_idx; } - root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; - root->num_fixed_sizes = (FT_Int)count; + /* reduce array size to the actually used elements */ + (void)FT_RENEW_ARRAY( sbit_strike_map, count, bsize_idx ); + + /* from now on, all strike indices are mapped */ + /* using `sbit_strike_map' */ + if ( bsize_idx ) + { + face->sbit_strike_map = sbit_strike_map; + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)bsize_idx; + } } } @@ -1615,18 +1728,10 @@ face->cmap_size = 0; } - /* freeing the horizontal metrics */ - { - FT_Stream stream = FT_FACE_STREAM( face ); - + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; - FT_FRAME_RELEASE( face->horz_metrics ); - FT_FRAME_RELEASE( face->vert_metrics ); - face->horz_metrics_size = 0; - face->vert_metrics_size = 0; - } - - /* freeing the vertical ones, if any */ + /* freeing vertical metrics, if any */ if ( face->vertical_info ) { FT_FREE( face->vertical.long_metrics ); @@ -1648,9 +1753,13 @@ /* freeing sbit size table */ FT_FREE( face->root.available_sizes ); + FT_FREE( face->sbit_strike_map ); face->root.num_fixed_sizes = 0; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_FREE( face->postscript_name ); + FT_FREE( face->var_postscript_prefix ); +#endif face->sfnt = NULL; } diff --git a/thirdparty/freetype/src/sfnt/sfobjs.h b/thirdparty/freetype/src/sfnt/sfobjs.h index 60b5698edd..705381459a 100644 --- a/thirdparty/freetype/src/sfnt/sfobjs.h +++ b/thirdparty/freetype/src/sfnt/sfobjs.h @@ -4,7 +4,7 @@ /* */ /* SFNT object management (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttbdf.c b/thirdparty/freetype/src/sfnt/ttbdf.c index f891691118..2196e3791e 100644 --- a/thirdparty/freetype/src/sfnt/ttbdf.c +++ b/thirdparty/freetype/src/sfnt/ttbdf.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded BDF properties (body). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -48,7 +48,7 @@ FT_Stream stream = FT_FACE(face)->stream; - if ( bdf->table != NULL ) + if ( bdf->table ) FT_FRAME_RELEASE( bdf->table ); bdf->table_end = NULL; @@ -165,7 +165,7 @@ error = FT_ERR( Invalid_Argument ); - if ( size == NULL || property_name == NULL ) + if ( !size || !property_name ) goto Exit; property_len = ft_strlen( property_name ); @@ -177,6 +177,7 @@ FT_UInt _ppem = FT_NEXT_USHORT( p ); FT_UInt _count = FT_NEXT_USHORT( p ); + if ( _ppem == size->metrics.y_ppem ) { count = _count; @@ -193,6 +194,7 @@ { FT_UInt type = FT_PEEK_USHORT( p + 4 ); + if ( ( type & 0x10 ) != 0 ) { FT_UInt32 name_offset = FT_PEEK_ULONG( p ); @@ -244,7 +246,12 @@ return error; } -#endif /* TT_CONFIG_OPTION_BDF */ +#else /* !TT_CONFIG_OPTION_BDF */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_bdf_dummy; + +#endif /* !TT_CONFIG_OPTION_BDF */ /* END */ diff --git a/thirdparty/freetype/src/sfnt/ttbdf.h b/thirdparty/freetype/src/sfnt/ttbdf.h index ae521c60b6..398b620600 100644 --- a/thirdparty/freetype/src/sfnt/ttbdf.h +++ b/thirdparty/freetype/src/sfnt/ttbdf.h @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded BDF properties (specification). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttcmap.c b/thirdparty/freetype/src/sfnt/ttcmap.c index 01255a887e..5afa6ae4b7 100644 --- a/thirdparty/freetype/src/sfnt/ttcmap.c +++ b/thirdparty/freetype/src/sfnt/ttcmap.c @@ -4,7 +4,7 @@ /* */ /* TrueType character mapping table (cmap) support (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -180,22 +180,24 @@ FT_DEFINE_TT_CMAP( tt_cmap0_class_rec, - sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap0_char_index, - (FT_CMap_CharNextFunc) tt_cmap0_char_next, + sizeof ( TT_CMapRec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap0_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 0, - (TT_CMap_ValidateFunc)tt_cmap0_validate, - (TT_CMap_Info_GetFunc)tt_cmap0_get_info ) + (TT_CMap_ValidateFunc)tt_cmap0_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap0_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_0 */ @@ -571,22 +573,24 @@ FT_DEFINE_TT_CMAP( tt_cmap2_class_rec, - sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap2_char_index, - (FT_CMap_CharNextFunc) tt_cmap2_char_next, + sizeof ( TT_CMapRec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap2_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 2, - (TT_CMap_ValidateFunc)tt_cmap2_validate, - (TT_CMap_Info_GetFunc)tt_cmap2_get_info ) + (TT_CMap_ValidateFunc)tt_cmap2_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap2_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_2 */ @@ -763,6 +767,9 @@ static void tt_cmap4_next( TT_CMap4 cmap ) { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + FT_UInt charcode; @@ -788,15 +795,19 @@ FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + /* if p > limit, the whole segment is invalid */ + if ( p > limit ) + goto Next_Segment; + do { FT_UInt gindex = FT_NEXT_USHORT( p ); - if ( gindex != 0 ) + if ( gindex ) { gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; - if ( gindex != 0 ) + if ( gindex ) { cmap->cur_charcode = charcode; cmap->cur_gindex = gindex; @@ -812,7 +823,26 @@ FT_UInt gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; - if ( gindex != 0 ) + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + + else + goto Next_Segment; + } + + if ( gindex ) { cmap->cur_charcode = charcode; cmap->cur_gindex = gindex; @@ -822,6 +852,7 @@ } } + Next_Segment: /* we need to find another range */ if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) break; @@ -1170,6 +1201,9 @@ FT_UInt32* pcharcode, FT_Bool next ) { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + FT_UInt num_segs2, start, end, offset; FT_Int delta; FT_UInt max, min, mid, num_segs; @@ -1221,10 +1255,6 @@ if ( mid >= num_segs - 1 && start == 0xFFFFU && end == 0xFFFFU ) { - TT_Face face = (TT_Face)cmap->cmap.charmap.face; - FT_Byte* limit = face->cmap_table + face->cmap_size; - - if ( offset && p + offset + 2 > limit ) { delta = 1; @@ -1347,13 +1377,40 @@ if ( offset ) { p += offset + ( charcode - start ) * 2; + + /* if p > limit, the whole segment is invalid */ + if ( next && p > limit ) + break; + gindex = TT_PEEK_USHORT( p ); - if ( gindex != 0 ) + if ( gindex ) + { gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + gindex = 0; + } } else + { gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + if ( next && gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + } + } + break; } } @@ -1463,21 +1520,24 @@ FT_DEFINE_TT_CMAP( tt_cmap4_class_rec, - sizeof ( TT_CMap4Rec ), - (FT_CMap_InitFunc) tt_cmap4_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap4_char_index, - (FT_CMap_CharNextFunc) tt_cmap4_char_next, - NULL, - NULL, - NULL, - NULL, - NULL, + sizeof ( TT_CMap4Rec ), + + (FT_CMap_InitFunc) tt_cmap4_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap4_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 4, - (TT_CMap_ValidateFunc)tt_cmap4_validate, - (TT_CMap_Info_GetFunc)tt_cmap4_get_info ) + (TT_CMap_ValidateFunc)tt_cmap4_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap4_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_4 */ @@ -1630,22 +1690,24 @@ FT_DEFINE_TT_CMAP( tt_cmap6_class_rec, - sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap6_char_index, - (FT_CMap_CharNextFunc) tt_cmap6_char_next, + sizeof ( TT_CMapRec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap6_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 6, - (TT_CMap_ValidateFunc)tt_cmap6_validate, - (TT_CMap_Info_GetFunc)tt_cmap6_get_info ) + (TT_CMap_ValidateFunc)tt_cmap6_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap6_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_6 */ @@ -1922,22 +1984,24 @@ FT_DEFINE_TT_CMAP( tt_cmap8_class_rec, - sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap8_char_index, - (FT_CMap_CharNextFunc) tt_cmap8_char_next, + sizeof ( TT_CMapRec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap8_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 8, - (TT_CMap_ValidateFunc)tt_cmap8_validate, - (TT_CMap_Info_GetFunc)tt_cmap8_get_info ) + (TT_CMap_ValidateFunc)tt_cmap8_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap8_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_8 */ @@ -2092,22 +2156,24 @@ FT_DEFINE_TT_CMAP( tt_cmap10_class_rec, - sizeof ( TT_CMapRec ), - (FT_CMap_InitFunc) tt_cmap_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap10_char_index, - (FT_CMap_CharNextFunc) tt_cmap10_char_next, + sizeof ( TT_CMapRec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap10_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 10, - (TT_CMap_ValidateFunc)tt_cmap10_validate, - (TT_CMap_Info_GetFunc)tt_cmap10_get_info ) + (TT_CMap_ValidateFunc)tt_cmap10_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap10_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_10 */ @@ -2446,22 +2512,24 @@ FT_DEFINE_TT_CMAP( tt_cmap12_class_rec, - sizeof ( TT_CMap12Rec ), - (FT_CMap_InitFunc) tt_cmap12_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap12_char_index, - (FT_CMap_CharNextFunc) tt_cmap12_char_next, + sizeof ( TT_CMap12Rec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap12_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap12_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 12, - (TT_CMap_ValidateFunc)tt_cmap12_validate, - (TT_CMap_Info_GetFunc)tt_cmap12_get_info ) + (TT_CMap_ValidateFunc)tt_cmap12_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap12_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_12 */ @@ -2770,22 +2838,24 @@ FT_DEFINE_TT_CMAP( tt_cmap13_class_rec, - sizeof ( TT_CMap13Rec ), - (FT_CMap_InitFunc) tt_cmap13_init, - (FT_CMap_DoneFunc) NULL, - (FT_CMap_CharIndexFunc)tt_cmap13_char_index, - (FT_CMap_CharNextFunc) tt_cmap13_char_next, + sizeof ( TT_CMap13Rec ), - NULL, - NULL, - NULL, - NULL, - NULL, + (FT_CMap_InitFunc) tt_cmap13_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap13_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap13_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ 13, - (TT_CMap_ValidateFunc)tt_cmap13_validate, - (TT_CMap_Info_GetFunc)tt_cmap13_get_info ) + (TT_CMap_ValidateFunc)tt_cmap13_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap13_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_13 */ @@ -2876,7 +2946,7 @@ cmap->max_results = 0; - if ( memory != NULL && cmap->results != NULL ) + if ( memory && cmap->results ) FT_FREE( cmap->results ); } @@ -2983,7 +3053,7 @@ if ( numRanges > (FT_ULong)( valid->limit - defp ) / 4 ) FT_INVALID_TOO_SHORT; - for ( i = 0; i < numRanges; ++i ) + for ( i = 0; i < numRanges; i++ ) { FT_ULong base = TT_NEXT_UINT24( defp ); FT_ULong cnt = FT_NEXT_BYTE( defp ); @@ -3016,7 +3086,7 @@ if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 5 ) FT_INVALID_TOO_SHORT; - for ( i = 0; i < numMappings; ++i ) + for ( i = 0; i < numMappings; i++ ) { FT_ULong uni = TT_NEXT_UINT24( ndp ); FT_ULong gid = TT_NEXT_USHORT( ndp ); @@ -3257,7 +3327,7 @@ return NULL; result = cmap14->results; - for ( i = 0; i < count; ++i ) + for ( i = 0; i < count; i++ ) { result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); p += 8; @@ -3282,7 +3352,7 @@ if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) return NULL; - for ( q = cmap14->results; count > 0; --count ) + for ( q = cmap14->results; count > 0; count-- ) { FT_UInt32 varSel = TT_NEXT_UINT24( p ); FT_ULong defOff = TT_NEXT_ULONG( p ); @@ -3341,7 +3411,7 @@ if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) return NULL; - for ( q = cmap14->results; numRanges > 0; --numRanges ) + for ( q = cmap14->results; numRanges > 0; numRanges-- ) { FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); @@ -3378,7 +3448,7 @@ return NULL; ret = cmap14->results; - for ( i = 0; i < numMappings; ++i ) + for ( i = 0; i < numMappings; i++ ) { ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); p += 2; @@ -3462,10 +3532,10 @@ { if ( nuni > duni + dcnt ) { - for ( k = 0; k <= dcnt; ++k ) + for ( k = 0; k <= dcnt; k++ ) ret[i++] = duni + k; - ++di; + di++; if ( di > numRanges ) break; @@ -3479,7 +3549,7 @@ ret[i++] = nuni; /* If it is within the default range then ignore it -- */ /* that should not have happened */ - ++ni; + ni++; if ( ni > numMappings ) break; @@ -3498,7 +3568,7 @@ { ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); p += 2; - ++ni; + ni++; } } else if ( di <= numRanges ) @@ -3506,7 +3576,7 @@ /* If we get here then we have run out of all non-default */ /* mappings. We have read one default range which we haven't */ /* stored and there may be others that need to be read. */ - for ( k = 0; k <= dcnt; ++k ) + for ( k = 0; k <= dcnt; k++ ) ret[i++] = duni + k; while ( di < numRanges ) @@ -3514,9 +3584,9 @@ duni = (FT_UInt32)TT_NEXT_UINT24( dp ); dcnt = FT_NEXT_BYTE( dp ); - for ( k = 0; k <= dcnt; ++k ) + for ( k = 0; k <= dcnt; k++ ) ret[i++] = duni + k; - ++di; + di++; } } @@ -3529,23 +3599,25 @@ FT_DEFINE_TT_CMAP( tt_cmap14_class_rec, - sizeof ( TT_CMap14Rec ), - (FT_CMap_InitFunc) tt_cmap14_init, - (FT_CMap_DoneFunc) tt_cmap14_done, - (FT_CMap_CharIndexFunc)tt_cmap14_char_index, - (FT_CMap_CharNextFunc) tt_cmap14_char_next, + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, /* init */ + (FT_CMap_DoneFunc) tt_cmap14_done, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap14_char_next, /* char_next */ - /* Format 14 extension functions */ - (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, - (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, - (FT_CMap_VariantListFunc) tt_cmap14_variants, - (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, - (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars, + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars, 14, - (TT_CMap_ValidateFunc)tt_cmap14_validate, - (TT_CMap_Info_GetFunc)tt_cmap14_get_info ) + (TT_CMap_ValidateFunc)tt_cmap14_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap14_get_info /* get_cmap_info */ + ) #endif /* TT_CONFIG_CMAP_FORMAT_14 */ @@ -3684,7 +3756,7 @@ error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); } - if ( valid.validator.error == 0 ) + if ( !valid.validator.error ) { FT_CMap ttcmap; @@ -3710,7 +3782,7 @@ } } - if ( *pclazz == NULL ) + if ( !*pclazz ) { FT_TRACE0(( "tt_face_build_cmaps:" " unsupported cmap sub-table ignored\n" )); diff --git a/thirdparty/freetype/src/sfnt/ttcmap.h b/thirdparty/freetype/src/sfnt/ttcmap.h index 2273cbd961..83f12df241 100644 --- a/thirdparty/freetype/src/sfnt/ttcmap.h +++ b/thirdparty/freetype/src/sfnt/ttcmap.h @@ -4,7 +4,7 @@ /* */ /* TrueType character mapping table (cmap) support (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttcmapc.h b/thirdparty/freetype/src/sfnt/ttcmapc.h index 7c732fbd36..9a5e70825e 100644 --- a/thirdparty/freetype/src/sfnt/ttcmapc.h +++ b/thirdparty/freetype/src/sfnt/ttcmapc.h @@ -4,7 +4,7 @@ /* */ /* TT CMAP classes definitions (specification only). */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttkern.c b/thirdparty/freetype/src/sfnt/ttkern.c index 6f9fa522d5..c97e5789ac 100644 --- a/thirdparty/freetype/src/sfnt/ttkern.c +++ b/thirdparty/freetype/src/sfnt/ttkern.c @@ -5,7 +5,7 @@ /* Load the basic TrueType kerning table. This doesn't handle */ /* kerning data within the GPOS table at the moment. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -108,8 +108,8 @@ p_next = p_limit; /* only use horizontal kerning tables */ - if ( ( coverage & ~8U ) != 0x0001 || - p + 8 > p_limit ) + if ( ( coverage & 3U ) != 0x0001 || + p + 8 > p_next ) goto NextTable; num_pairs = FT_NEXT_USHORT( p ); @@ -214,8 +214,7 @@ if ( ( face->kern_avail_bits & mask ) == 0 ) goto NextTable; - if ( p + 8 > next ) - goto NextTable; + FT_ASSERT( p + 8 <= next ); /* tested in tt_face_load_kern */ num_pairs = FT_NEXT_USHORT( p ); p += 6; diff --git a/thirdparty/freetype/src/sfnt/ttkern.h b/thirdparty/freetype/src/sfnt/ttkern.h index 85dd5c31ae..db1a30bdb0 100644 --- a/thirdparty/freetype/src/sfnt/ttkern.h +++ b/thirdparty/freetype/src/sfnt/ttkern.h @@ -5,7 +5,7 @@ /* Load the basic TrueType kerning table. This doesn't handle */ /* kerning data within the GPOS table at the moment. */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttload.c b/thirdparty/freetype/src/sfnt/ttload.c index 2f5b2c3843..df99baa53e 100644 --- a/thirdparty/freetype/src/sfnt/ttload.c +++ b/thirdparty/freetype/src/sfnt/ttload.c @@ -5,7 +5,7 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -679,7 +679,7 @@ /*************************************************************************/ /* */ /* <Function> */ - /* tt_face_load_max_profile */ + /* tt_face_load_maxp */ /* */ /* <Description> */ /* Loads the maximum profile into a face object. */ @@ -775,15 +775,6 @@ maxProfile->maxTwilightPoints = 0xFFFFU - 4; } - - /* we arbitrarily limit recursion to avoid stack exhaustion */ - if ( maxProfile->maxComponentDepth > 100 ) - { - FT_TRACE0(( "tt_face_load_maxp:" - " abnormally large component depth (%d) set to 100\n", - maxProfile->maxComponentDepth )); - maxProfile->maxComponentDepth = 100; - } } FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); @@ -817,7 +808,6 @@ FT_Memory memory = stream->memory; FT_ULong table_pos, table_len; FT_ULong storage_start, storage_limit; - FT_UInt count; TT_NameTable table; static const FT_Frame_Field name_table_fields[] = @@ -835,7 +825,7 @@ static const FT_Frame_Field name_record_fields[] = { #undef FT_STRUCTURE -#define FT_STRUCTURE TT_NameEntryRec +#define FT_STRUCTURE TT_NameRec /* no FT_FRAME_START */ FT_FRAME_USHORT( platformID ), @@ -847,6 +837,17 @@ FT_FRAME_END }; + static const FT_Frame_Field langTag_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_LangTagRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + table = &face->name_table; table->stream = stream; @@ -857,18 +858,17 @@ table_pos = FT_STREAM_POS(); - if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) goto Exit; - /* Some popular Asian fonts have an invalid `storageOffset' value */ - /* (it should be at least "6 + 12*num_names"). However, the string */ - /* offsets, computed as "storageOffset + entry->stringOffset", are */ - /* valid pointers within the name table... */ - /* */ - /* We thus can't check `storageOffset' right now. */ - /* */ - storage_start = table_pos + 6 + 12*table->numNameRecords; + /* Some popular Asian fonts have an invalid `storageOffset' value (it */ + /* should be at least `6 + 12*numNameRecords'). However, the string */ + /* offsets, computed as `storageOffset + entry->stringOffset', are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12 * table->numNameRecords; storage_limit = table_pos + table_len; if ( storage_start > storage_limit ) @@ -878,18 +878,56 @@ goto Exit; } - /* Allocate the array of name records. */ - count = table->numNameRecords; - table->numNameRecords = 0; + /* `name' format 1 contains additional language tag records, */ + /* which we load first */ + if ( table->format == 1 ) + { + if ( FT_STREAM_SEEK( storage_start ) || + FT_READ_USHORT( table->numLangTagRecords ) ) + goto Exit; + + storage_start += 2 + 4 * table->numLangTagRecords; + + /* allocate language tag records array */ + if ( FT_NEW_ARRAY( table->langTags, table->numLangTagRecords ) || + FT_FRAME_ENTER( table->numLangTagRecords * 4 ) ) + goto Exit; + + /* load language tags */ + { + TT_LangTag entry = table->langTags; + TT_LangTag limit = entry + table->numLangTagRecords; + - if ( FT_NEW_ARRAY( table->names, count ) || - FT_FRAME_ENTER( count * 12 ) ) + for ( ; entry < limit; entry++ ) + { + (void)FT_STREAM_READ_FIELDS( langTag_record_fields, entry ); + + /* check that the langTag string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry; ignore it */ + entry->stringLength = 0; + } + } + } + + FT_FRAME_EXIT(); + + (void)FT_STREAM_SEEK( table_pos + 6 ); + } + + /* allocate name records array */ + if ( FT_NEW_ARRAY( table->names, table->numNameRecords ) || + FT_FRAME_ENTER( table->numNameRecords * 12 ) ) goto Exit; - /* Load the name records and determine how much storage is needed */ - /* to hold the strings themselves. */ + /* load name records */ { - TT_NameEntryRec* entry = table->names; + TT_Name entry = table->names; + FT_UInt count = table->numNameRecords; for ( ; count > 0; count-- ) @@ -906,22 +944,37 @@ if ( entry->stringOffset < storage_start || entry->stringOffset + entry->stringLength > storage_limit ) { - /* invalid entry - ignore it */ - entry->stringOffset = 0; - entry->stringLength = 0; + /* invalid entry; ignore it */ continue; } + /* assure that we have a valid language tag ID, and */ + /* that the corresponding langTag entry is valid, too */ + if ( table->format == 1 && entry->languageID >= 0x8000U ) + { + if ( entry->languageID - 0x8000U >= table->numLangTagRecords || + !table->langTags[entry->languageID - 0x8000U].stringLength ) + { + /* invalid entry; ignore it */ + continue; + } + } + entry++; } - table->numNameRecords = (FT_UInt)( entry - table->names ); + /* reduce array size to the actually used elements */ + count = (FT_UInt)( entry - table->names ); + (void)FT_RENEW_ARRAY( table->names, + table->numNameRecords, + count ); + table->numNameRecords = count; } FT_FRAME_EXIT(); /* everything went well, update face->num_names */ - face->num_names = (FT_UShort) table->numNameRecords; + face->num_names = (FT_UShort)table->numNameRecords; Exit: return error; @@ -931,7 +984,7 @@ /*************************************************************************/ /* */ /* <Function> */ - /* tt_face_free_names */ + /* tt_face_free_name */ /* */ /* <Description> */ /* Frees the name records. */ @@ -944,25 +997,36 @@ { FT_Memory memory = face->root.driver->root.memory; TT_NameTable table = &face->name_table; - TT_NameEntry entry = table->names; - FT_UInt count = table->numNameRecords; if ( table->names ) { - for ( ; count > 0; count--, entry++ ) - { + TT_Name entry = table->names; + TT_Name limit = entry + table->numNameRecords; + + + for ( ; entry < limit; entry++ ) FT_FREE( entry->string ); - entry->stringLength = 0; - } - /* free strings table */ FT_FREE( table->names ); } - table->numNameRecords = 0; - table->format = 0; - table->storageOffset = 0; + if ( table->langTags ) + { + TT_LangTag entry = table->langTags; + TT_LangTag limit = entry + table->numLangTagRecords; + + + for ( ; entry < limit; entry++ ) + FT_FREE( entry->string ); + + FT_FREE( table->langTags ); + } + + table->numNameRecords = 0; + table->numLangTagRecords = 0; + table->format = 0; + table->storageOffset = 0; } @@ -1193,8 +1257,8 @@ #define FT_STRUCTURE TT_Postscript FT_FRAME_START( 32 ), - FT_FRAME_ULONG( FormatType ), - FT_FRAME_ULONG( italicAngle ), + FT_FRAME_LONG ( FormatType ), + FT_FRAME_LONG ( italicAngle ), FT_FRAME_SHORT( underlinePosition ), FT_FRAME_SHORT( underlineThickness ), FT_FRAME_ULONG( isFixedPitch ), diff --git a/thirdparty/freetype/src/sfnt/ttload.h b/thirdparty/freetype/src/sfnt/ttload.h index bec42b94b4..296da86ed3 100644 --- a/thirdparty/freetype/src/sfnt/ttload.h +++ b/thirdparty/freetype/src/sfnt/ttload.h @@ -5,7 +5,7 @@ /* Load the basic TrueType tables, i.e., tables that can be either in */ /* TTF or OTF fonts (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttmtx.c b/thirdparty/freetype/src/sfnt/ttmtx.c index 186f873dae..394c6db85c 100644 --- a/thirdparty/freetype/src/sfnt/ttmtx.c +++ b/thirdparty/freetype/src/sfnt/ttmtx.c @@ -4,7 +4,7 @@ /* */ /* Load the metrics tables common to TTF and OTF fonts (body). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -20,11 +20,24 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + #include "ttmtx.h" #include "sferrors.h" + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields, */ + /* which are different. */ + /* */ + /* This ensures that `tt_face_load_hmtx' is able to read */ + /* both the horizontal and vertical headers. */ + + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -214,6 +227,11 @@ FT_ULong table_pos, table_size, table_end; FT_UShort k; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MetricsVariations var = + (FT_Service_MetricsVariations)face->var; +#endif + if ( vertical ) { @@ -274,6 +292,34 @@ *abearing = 0; *aadvance = 0; } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( var ) + { + FT_Face f = FT_FACE( face ); + FT_Int a = (FT_Int)*aadvance; + FT_Int b = (FT_Int)*abearing; + + + if ( vertical ) + { + if ( var->vadvance_adjust ) + var->vadvance_adjust( f, gindex, &a ); + if ( var->tsb_adjust ) + var->tsb_adjust( f, gindex, &b ); + } + else + { + if ( var->hadvance_adjust ) + var->hadvance_adjust( f, gindex, &a ); + if ( var->lsb_adjust ) + var->lsb_adjust( f, gindex, &b ); + } + + *aadvance = (FT_UShort)a; + *abearing = (FT_Short)b; + } +#endif } diff --git a/thirdparty/freetype/src/sfnt/ttmtx.h b/thirdparty/freetype/src/sfnt/ttmtx.h index 78395def33..2b93ab2f0e 100644 --- a/thirdparty/freetype/src/sfnt/ttmtx.h +++ b/thirdparty/freetype/src/sfnt/ttmtx.h @@ -4,7 +4,7 @@ /* */ /* Load the metrics tables common to TTF and OTF fonts (specification). */ /* */ -/* Copyright 2006-2016 by */ +/* Copyright 2006-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttpost.c b/thirdparty/freetype/src/sfnt/ttpost.c index 3277f1ec4f..540d5f2546 100644 --- a/thirdparty/freetype/src/sfnt/ttpost.c +++ b/thirdparty/freetype/src/sfnt/ttpost.c @@ -5,7 +5,7 @@ /* PostScript name table processing for TrueType and OpenType fonts */ /* (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -29,6 +29,10 @@ #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + #include "ttpost.h" #include "sferrors.h" @@ -326,7 +330,9 @@ goto Exit; /* check the number of glyphs */ - if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) + if ( num_glyphs > face->max_profile.numGlyphs || + num_glyphs > 258 || + num_glyphs < 1 ) { error = FT_THROW( Invalid_File_Format ); goto Exit; @@ -559,5 +565,12 @@ return FT_Err_Ok; } +#else /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_post_dummy; + +#endif /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + /* END */ diff --git a/thirdparty/freetype/src/sfnt/ttpost.h b/thirdparty/freetype/src/sfnt/ttpost.h index ede45fd84c..722485e32d 100644 --- a/thirdparty/freetype/src/sfnt/ttpost.h +++ b/thirdparty/freetype/src/sfnt/ttpost.h @@ -5,7 +5,7 @@ /* PostScript name table processing for TrueType and OpenType fonts */ /* (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/sfnt/ttsbit.c b/thirdparty/freetype/src/sfnt/ttsbit.c index e24e7d6cdd..0c76a55779 100644 --- a/thirdparty/freetype/src/sfnt/ttsbit.c +++ b/thirdparty/freetype/src/sfnt/ttsbit.c @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (body). */ /* */ -/* Copyright 2005-2016 by */ +/* Copyright 2005-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* Copyright 2013 by Google, Inc. */ @@ -24,6 +24,10 @@ #include FT_INTERNAL_STREAM_H #include FT_TRUETYPE_TAGS_H #include FT_BITMAP_H + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + #include "ttsbit.h" #include "sferrors.h" @@ -48,6 +52,7 @@ { FT_Error error; FT_ULong table_size; + FT_ULong table_start; face->sbit_table = NULL; @@ -83,6 +88,8 @@ goto Exit; } + table_start = FT_STREAM_POS(); + switch ( (FT_UInt)face->sbit_table_type ) { case TT_SBIT_TABLE_TYPE_EBLC: @@ -104,8 +111,12 @@ version = FT_NEXT_LONG( p ); num_strikes = FT_NEXT_ULONG( p ); + /* there's at least one font (FZShuSong-Z01, version 3) */ + /* that uses the wrong byte order for the `version' field */ if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL && - ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00030000UL ) + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000200UL && + ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00030000UL && + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000300UL ) { error = FT_THROW( Unknown_File_Format ); goto Exit; @@ -190,12 +201,51 @@ break; default: + /* we ignore unknown table formats */ error = FT_THROW( Unknown_File_Format ); break; } if ( !error ) - FT_TRACE3(( "sbit_num_strikes: %u\n", face->sbit_num_strikes )); + FT_TRACE3(( "tt_face_load_sbit_strikes: found %u strikes\n", + face->sbit_num_strikes )); + + face->ebdt_start = 0; + face->ebdt_size = 0; + + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ) + { + /* the `sbix' table is self-contained; */ + /* it has no associated data table */ + face->ebdt_start = table_start; + face->ebdt_size = table_size; + } + else if ( face->sbit_table_type != TT_SBIT_TABLE_TYPE_NONE ) + { + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + + if ( !error ) + { + face->ebdt_start = FT_STREAM_POS(); + face->ebdt_size = ebdt_size; + } + } + + if ( !face->ebdt_size ) + { + FT_TRACE2(( "tt_face_load_sbit_strikes:" + " no embedded bitmap data table found;\n" + " " + " resetting number of strikes to zero\n" )); + face->sbit_num_strikes = 0; + } return FT_Err_Ok; @@ -239,8 +289,22 @@ FT_ULong strike_index, FT_Size_Metrics* metrics ) { - if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) - return FT_THROW( Invalid_Argument ); + /* we have to test for the existence of `sbit_strike_map' */ + /* because the function gets also used at the very beginning */ + /* to construct `sbit_strike_map' itself */ + if ( face->sbit_strike_map ) + { + if ( strike_index >= (FT_ULong)face->root.num_fixed_sizes ) + return FT_THROW( Invalid_Argument ); + + /* map to real index */ + strike_index = face->sbit_strike_map[strike_index]; + } + else + { + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return FT_THROW( Invalid_Argument ); + } switch ( (FT_UInt)face->sbit_table_type ) { @@ -284,7 +348,8 @@ FT_TRACE2(( "tt_face_load_strike_metrics:" " sanitizing invalid ascender and descender\n" " " - " values for strike (%d, %d)\n", + " values for strike %d (%dppem, %dppem)\n", + strike_index, metrics->x_ppem, metrics->y_ppem )); /* sanitize buggy ascender and descender values */ @@ -323,6 +388,16 @@ strike[18] + /* max_width */ (FT_Char)strike[23] /* min_advance_SB */ ) * 64; + + /* set the scale values (in 16.16 units) so advances */ + /* from the hmtx and vmtx table are scaled correctly */ + metrics->x_scale = FT_MulDiv( metrics->x_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + metrics->y_scale = FT_MulDiv( metrics->y_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + return FT_Err_Ok; } @@ -332,7 +407,6 @@ FT_UInt offset; FT_UShort upem, ppem, resolution; TT_HoriHeader *hori; - FT_ULong table_size; FT_Pos ppem_; /* to reduce casts */ FT_Error error; @@ -342,15 +416,11 @@ p = face->sbit_table + 8 + 4 * strike_index; offset = FT_NEXT_ULONG( p ); - error = face->goto_table( face, TTAG_sbix, stream, &table_size ); - if ( error ) - return error; - - if ( offset + 4 > table_size ) + if ( offset + 4 > face->ebdt_size ) return FT_THROW( Invalid_File_Format ); - if ( FT_STREAM_SEEK( FT_STREAM_POS() + offset ) || - FT_FRAME_ENTER( 4 ) ) + if ( FT_STREAM_SEEK( face->ebdt_start + offset ) || + FT_FRAME_ENTER( 4 ) ) return error; ppem = FT_GET_USHORT(); @@ -414,17 +484,15 @@ FT_ULong strike_index, TT_SBit_MetricsRec* metrics ) { - FT_Error error; + FT_Error error = FT_ERR( Table_Missing ); FT_Stream stream = face->root.stream; - FT_ULong ebdt_size; - error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size ); - if ( error ) - error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); - if ( error ) - error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); - if ( error ) + strike_index = face->sbit_strike_map[strike_index]; + + if ( !face->ebdt_size ) + goto Exit; + if ( FT_STREAM_SEEK( face->ebdt_start ) ) goto Exit; decoder->face = face; @@ -435,8 +503,8 @@ decoder->metrics_loaded = 0; decoder->bitmap_allocated = 0; - decoder->ebdt_start = FT_STREAM_POS(); - decoder->ebdt_size = ebdt_size; + decoder->ebdt_start = face->ebdt_start; + decoder->ebdt_size = face->ebdt_size; decoder->eblc_base = face->sbit_table; decoder->eblc_limit = face->sbit_table + face->sbit_table_size; @@ -481,7 +549,8 @@ static FT_Error - tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder ) + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder, + FT_Bool metrics_only ) { FT_Error error = FT_Err_Ok; FT_UInt width, height; @@ -544,6 +613,9 @@ if ( size == 0 ) goto Exit; /* exit successfully! */ + if ( metrics_only ) + goto Exit; /* only metrics are requested */ + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); if ( error ) goto Exit; @@ -610,7 +682,8 @@ FT_UInt glyph_index, FT_Int x_pos, FT_Int y_pos, - FT_UInt recurse_count ); + FT_UInt recurse_count, + FT_Bool metrics_only ); typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder, @@ -854,7 +927,7 @@ } *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) & - ( ~( 0xFF << w ) << ( 8 - w - x_pos ) ); + ( ~( 0xFFU << w ) << ( 8 - w - x_pos ) ); rval <<= 8; w = line_bits - w; @@ -940,7 +1013,9 @@ gindex, x_pos + dx, y_pos + dy, - recurse_count + 1 ); + recurse_count + 1, + /* request full bitmap image */ + FALSE ); if ( error ) break; } @@ -1004,6 +1079,7 @@ decoder->stream->memory, p, png_len, + FALSE, FALSE ); Exit: @@ -1022,7 +1098,8 @@ FT_ULong glyph_size, FT_Int x_pos, FT_Int y_pos, - FT_UInt recurse_count ) + FT_UInt recurse_count, + FT_Bool metrics_only ) { FT_Error error; FT_Stream stream = decoder->stream; @@ -1144,11 +1221,15 @@ if ( !decoder->bitmap_allocated ) { - error = tt_sbit_decoder_alloc_bitmap( decoder ); + error = tt_sbit_decoder_alloc_bitmap( decoder, metrics_only ); + if ( error ) goto Fail; } + if ( metrics_only ) + goto Fail; /* this is not an error */ + error = loader( decoder, p, p_limit, x_pos, y_pos, recurse_count ); } @@ -1165,7 +1246,8 @@ FT_UInt glyph_index, FT_Int x_pos, FT_Int y_pos, - FT_UInt recurse_count ) + FT_UInt recurse_count, + FT_Bool metrics_only ) { FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; FT_Byte* p_limit = decoder->eblc_limit; @@ -1350,7 +1432,8 @@ image_end, x_pos, y_pos, - recurse_count ); + recurse_count, + metrics_only ); Failure: return FT_THROW( Invalid_Table ); @@ -1369,10 +1452,10 @@ FT_UInt glyph_index, FT_Stream stream, FT_Bitmap *map, - TT_SBit_MetricsRec *metrics ) + TT_SBit_MetricsRec *metrics, + FT_Bool metrics_only ) { - FT_UInt sbix_pos, strike_offset, glyph_start, glyph_end; - FT_ULong table_size; + FT_UInt strike_offset, glyph_start, glyph_end; FT_Int originOffsetX, originOffsetY; FT_Tag graphicType; FT_Int recurse_depth = 0; @@ -1381,7 +1464,12 @@ FT_Byte* p; FT_UNUSED( map ); +#ifndef FT_CONFIG_OPTION_USE_PNG + FT_UNUSED( metrics_only ); +#endif + + strike_index = face->sbit_strike_map[strike_index]; metrics->width = 0; metrics->height = 0; @@ -1389,21 +1477,18 @@ p = face->sbit_table + 8 + 4 * strike_index; strike_offset = FT_NEXT_ULONG( p ); - error = face->goto_table( face, TTAG_sbix, stream, &table_size ); - if ( error ) - return error; - sbix_pos = FT_STREAM_POS(); - retry: if ( glyph_index > (FT_UInt)face->root.num_glyphs ) return FT_THROW( Invalid_Argument ); - if ( strike_offset >= table_size || - table_size - strike_offset < 4 + glyph_index * 4 + 8 ) + if ( strike_offset >= face->ebdt_size || + face->ebdt_size - strike_offset < 4 + glyph_index * 4 + 8 ) return FT_THROW( Invalid_File_Format ); - if ( FT_STREAM_SEEK( sbix_pos + strike_offset + 4 + glyph_index * 4 ) || - FT_FRAME_ENTER( 8 ) ) + if ( FT_STREAM_SEEK( face->ebdt_start + + strike_offset + 4 + + glyph_index * 4 ) || + FT_FRAME_ENTER( 8 ) ) return error; glyph_start = FT_GET_ULONG(); @@ -1413,13 +1498,13 @@ if ( glyph_start == glyph_end ) return FT_THROW( Invalid_Argument ); - if ( glyph_start > glyph_end || - glyph_end - glyph_start < 8 || - table_size - strike_offset < glyph_end ) + if ( glyph_start > glyph_end || + glyph_end - glyph_start < 8 || + face->ebdt_size - strike_offset < glyph_end ) return FT_THROW( Invalid_File_Format ); - if ( FT_STREAM_SEEK( sbix_pos + strike_offset + glyph_start ) || - FT_FRAME_ENTER( glyph_end - glyph_start ) ) + if ( FT_STREAM_SEEK( face->ebdt_start + strike_offset + glyph_start ) || + FT_FRAME_ENTER( glyph_end - glyph_start ) ) return error; originOffsetX = FT_GET_SHORT(); @@ -1450,7 +1535,8 @@ stream->memory, stream->cursor, glyph_end - glyph_start - 8, - TRUE ); + TRUE, + metrics_only ); #else error = FT_THROW( Unimplemented_Feature ); #endif @@ -1510,23 +1596,27 @@ error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); if ( !error ) { - error = tt_sbit_decoder_load_image( decoder, - glyph_index, - 0, - 0, - 0 ); + error = tt_sbit_decoder_load_image( + decoder, + glyph_index, + 0, + 0, + 0, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); tt_sbit_decoder_done( decoder ); } } break; case TT_SBIT_TABLE_TYPE_SBIX: - error = tt_face_load_sbix_image( face, - strike_index, - glyph_index, - stream, - map, - metrics ); + error = tt_face_load_sbix_image( + face, + strike_index, + glyph_index, + stream, + map, + metrics, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); break; default: @@ -1535,9 +1625,10 @@ } /* Flatten color bitmaps if color was not requested. */ - if ( !error && - !( load_flags & FT_LOAD_COLOR ) && - map->pixel_mode == FT_PIXEL_MODE_BGRA ) + if ( !error && + !( load_flags & FT_LOAD_COLOR ) && + !( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) && + map->pixel_mode == FT_PIXEL_MODE_BGRA ) { FT_Bitmap new_map; FT_Library library = face->root.glyph->library; @@ -1563,5 +1654,12 @@ return error; } +#else /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_sbit_dummy; + +#endif /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + -/* EOF */ +/* END */ diff --git a/thirdparty/freetype/src/sfnt/ttsbit.h b/thirdparty/freetype/src/sfnt/ttsbit.h index d8a8167083..e859ddda45 100644 --- a/thirdparty/freetype/src/sfnt/ttsbit.h +++ b/thirdparty/freetype/src/sfnt/ttsbit.h @@ -4,7 +4,7 @@ /* */ /* TrueType and OpenType embedded bitmap support (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/smooth/ftgrays.c b/thirdparty/freetype/src/smooth/ftgrays.c index 0bf3ac6ffb..e9a3ce7a7c 100644 --- a/thirdparty/freetype/src/smooth/ftgrays.c +++ b/thirdparty/freetype/src/smooth/ftgrays.c @@ -4,7 +4,7 @@ /* */ /* A new `perfect' anti-aliasing renderer (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -286,6 +286,10 @@ typedef ptrdiff_t FT_PtrDist; #define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) #endif +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + /* as usual, for the speed hungry :-) */ #undef RAS_ARG @@ -337,7 +341,8 @@ typedef ptrdiff_t FT_PtrDist; /* Compute `dividend / divisor' and return both its quotient and */ /* remainder, cast to a specific type. This macro also ensures that */ - /* the remainder is always positive. */ + /* the remainder is always positive. We use the remainder to keep */ + /* track of accumulating errors and compensate for them. */ #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ FT_BEGIN_STMNT \ (quotient) = (type)( (dividend) / (divisor) ); \ @@ -371,8 +376,9 @@ typedef ptrdiff_t FT_PtrDist; /* These macros speed up repetitive divisions by replacing them */ /* with multiplications and right shifts. */ -#define FT_UDIVPREP( b ) \ - long b ## _r = (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) +#define FT_UDIVPREP( c, b ) \ + long b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \ + : 0 #define FT_UDIV( a, b ) \ ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) @@ -403,9 +409,12 @@ typedef ptrdiff_t FT_PtrDist; } TCell; + typedef struct TPixmap_ + { + unsigned char* origin; /* pixmap origin at the bottom-left */ + int pitch; /* pitch to go down one row */ - /* maximum number of gray spans in a call to the span callback */ -#define FT_MAX_GRAY_SPANS 32 + } TPixmap; /* maximum number of gray cells in the buffer */ #if FT_RENDER_POOL_SIZE > 2048 @@ -430,12 +439,12 @@ typedef ptrdiff_t FT_PtrDist; TCoord ex, ey; TCoord min_ex, max_ex; TCoord min_ey, max_ey; - TCoord count_ex, count_ey; TArea area; TCoord cover; int invalid; + PCell* ycells; PCell cells; FT_PtrDist max_cells; FT_PtrDist num_cells; @@ -443,16 +452,10 @@ typedef ptrdiff_t FT_PtrDist; TPos x, y; FT_Outline outline; - FT_Bitmap target; - - FT_Span gray_spans[FT_MAX_GRAY_SPANS]; - int num_gray_spans; + TPixmap target; FT_Raster_Span_Func render_span; void* render_span_data; - int span_y; - - PCell* ycells; } gray_TWorker, *gray_PWorker; @@ -482,17 +485,17 @@ typedef ptrdiff_t FT_PtrDist; static void gray_dump_cells( RAS_ARG ) { - int yindex; + int y; - for ( yindex = 0; yindex < ras.count_ey; yindex++ ) + for ( y = ras.min_ey; y < ras.max_ey; y++ ) { - PCell cell; + PCell cell = ras.ycells[y - ras.min_ey]; - printf( "%3d:", yindex ); + printf( "%3d:", y ); - for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) + for ( ; cell != NULL; cell = cell->next ) printf( " (%3d, c:%4d, a:%6d)", cell->x, cell->cover, cell->area ); printf( "\n" ); @@ -506,25 +509,22 @@ typedef ptrdiff_t FT_PtrDist; /* */ /* Record the current cell in the table. */ /* */ - static PCell - gray_find_cell( RAS_ARG ) + static void + gray_record_cell( RAS_ARG ) { PCell *pcell, cell; TCoord x = ras.ex; - if ( x > ras.count_ex ) - x = ras.count_ex; - - pcell = &ras.ycells[ras.ey]; + pcell = &ras.ycells[ras.ey - ras.min_ey]; for (;;) { cell = *pcell; - if ( cell == NULL || cell->x > x ) + if ( !cell || cell->x > x ) break; if ( cell->x == x ) - goto Exit; + goto Found; pcell = &cell->next; } @@ -532,30 +532,21 @@ typedef ptrdiff_t FT_PtrDist; if ( ras.num_cells >= ras.max_cells ) ft_longjmp( ras.jump_buffer, 1 ); + /* insert new cell */ cell = ras.cells + ras.num_cells++; cell->x = x; - cell->area = 0; - cell->cover = 0; + cell->area = ras.area; + cell->cover = ras.cover; cell->next = *pcell; *pcell = cell; - Exit: - return cell; - } - + return; - static void - gray_record_cell( RAS_ARG ) - { - if ( ras.area | ras.cover ) - { - PCell cell = gray_find_cell( RAS_VAR ); - - - cell->area += ras.area; - cell->cover += ras.cover; - } + Found: + /* update old cell */ + cell->area += ras.area; + cell->cover += ras.cover; } @@ -577,58 +568,23 @@ typedef ptrdiff_t FT_PtrDist; /* Note that if a cell is to the left of the clipping region, it is */ /* actually set to the (min_ex-1) horizontal position. */ - /* All cells that are on the left of the clipping region go to the */ - /* min_ex - 1 horizontal position. */ - ey -= ras.min_ey; - - if ( ex > ras.max_ex ) - ex = ras.max_ex; - - ex -= ras.min_ex; - if ( ex < 0 ) - ex = -1; - - /* are we moving to a different cell ? */ - if ( ex != ras.ex || ey != ras.ey ) - { - /* record the current one if it is valid */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - - ras.area = 0; - ras.cover = 0; - ras.ex = ex; - ras.ey = ey; - } - - ras.invalid = ( (unsigned int)ey >= (unsigned int)ras.count_ey || - ex >= ras.count_ex ); - } - - - /*************************************************************************/ - /* */ - /* Start a new contour at a given cell. */ - /* */ - static void - gray_start_cell( RAS_ARG_ TCoord ex, - TCoord ey ) - { - if ( ex > ras.max_ex ) - ex = ras.max_ex; - if ( ex < ras.min_ex ) ex = ras.min_ex - 1; - ras.area = 0; - ras.cover = 0; - ras.ex = ex - ras.min_ex; - ras.ey = ey - ras.min_ey; - ras.invalid = 0; + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; - gray_set_cell( RAS_VAR_ ex, ey ); + ras.invalid = ( ey >= ras.max_ey || ey < ras.min_ey || + ex >= ras.max_ex ); } + #ifndef FT_LONG64 /*************************************************************************/ @@ -642,7 +598,7 @@ typedef ptrdiff_t FT_PtrDist; TPos x2, TCoord y2 ) { - TCoord ex1, ex2, fx1, fx2, first, delta, mod; + TCoord ex1, ex2, fx1, fx2, first, dy, delta, mod; TPos p, dx; int incr; @@ -657,30 +613,29 @@ typedef ptrdiff_t FT_PtrDist; return; } - fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); - fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); + fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); /* everything is located in a single cell. That is easy! */ /* */ if ( ex1 == ex2 ) - { - delta = y2 - y1; - ras.area += (TArea)(( fx1 + fx2 ) * delta); - ras.cover += delta; - return; - } + goto End; /* ok, we'll have to render a run of adjacent cells on the same */ /* scanline... */ /* */ - p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); - first = ONE_PIXEL; - incr = 1; - dx = x2 - x1; + dx = x2 - x1; + dy = y2 - y1; - if ( dx < 0 ) + if ( dx > 0 ) { - p = fx1 * ( y2 - y1 ); + p = ( ONE_PIXEL - fx1 ) * dy; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fx1 * dy; first = 0; incr = -1; dx = -dx; @@ -688,34 +643,31 @@ typedef ptrdiff_t FT_PtrDist; FT_DIV_MOD( TCoord, p, dx, delta, mod ); - ras.area += (TArea)(( fx1 + first ) * delta); + ras.area += (TArea)( ( fx1 + first ) * delta ); ras.cover += delta; - - ex1 += incr; + y1 += delta; + ex1 += incr; gray_set_cell( RAS_VAR_ ex1, ey ); - y1 += delta; if ( ex1 != ex2 ) { TCoord lift, rem; - p = ONE_PIXEL * ( y2 - y1 + delta ); + p = ONE_PIXEL * dy; FT_DIV_MOD( TCoord, p, dx, lift, rem ); - mod -= (int)dx; - do { delta = lift; mod += rem; - if ( mod >= 0 ) + if ( mod >= (TCoord)dx ) { mod -= (TCoord)dx; delta++; } - ras.area += (TArea)(ONE_PIXEL * delta); + ras.area += (TArea)( ONE_PIXEL * delta ); ras.cover += delta; y1 += delta; ex1 += incr; @@ -723,9 +675,13 @@ typedef ptrdiff_t FT_PtrDist; } while ( ex1 != ex2 ); } - delta = y2 - y1; - ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta); - ras.cover += delta; + fx1 = ONE_PIXEL - first; + + End: + dy = y2 - y1; + + ras.area += (TArea)( ( fx1 + fx2 ) * dy ); + ras.cover += dy; } @@ -764,8 +720,6 @@ typedef ptrdiff_t FT_PtrDist; dy = to_y - ras.y; /* vertical line - avoid calling gray_render_scanline */ - incr = 1; - if ( dx == 0 ) { TCoord ex = TRUNC( ras.x ); @@ -773,8 +727,12 @@ typedef ptrdiff_t FT_PtrDist; TArea area; - first = ONE_PIXEL; - if ( dy < 0 ) + if ( dy > 0) + { + first = ONE_PIXEL; + incr = 1; + } + else { first = 0; incr = -1; @@ -806,11 +764,13 @@ typedef ptrdiff_t FT_PtrDist; } /* ok, we have to render several scanlines */ - p = ( ONE_PIXEL - fy1 ) * dx; - first = ONE_PIXEL; - incr = 1; - - if ( dy < 0 ) + if ( dy > 0) + { + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + } + else { p = fy1 * dx; first = 0; @@ -833,13 +793,12 @@ typedef ptrdiff_t FT_PtrDist; p = ONE_PIXEL * dx; FT_DIV_MOD( TCoord, p, dy, lift, rem ); - mod -= (TCoord)dy; do { delta = lift; mod += rem; - if ( mod >= 0 ) + if ( mod >= (TCoord)dy ) { mod -= (TCoord)dy; delta++; @@ -929,8 +888,8 @@ typedef ptrdiff_t FT_PtrDist; else /* any other line */ { TPos prod = dx * fy1 - dy * fx1; - FT_UDIVPREP( dx ); - FT_UDIVPREP( dy ); + FT_UDIVPREP( ex1 != ex2, dx ); + FT_UDIVPREP( ey1 != ey2, dy ); /* The fundamental value `prod' determines which side and the */ @@ -1218,15 +1177,11 @@ typedef ptrdiff_t FT_PtrDist; TPos x, y; - /* record current cell, if any */ - if ( !ras.invalid ) - gray_record_cell( RAS_VAR ); - /* start to a new position */ x = UPSCALE( to->x ); y = UPSCALE( to->y ); - gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + gray_set_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); ras.x = x; ras.y = y; @@ -1265,79 +1220,23 @@ typedef ptrdiff_t FT_PtrDist; static void - gray_render_span( int y, - int count, - const FT_Span* spans, - gray_PWorker worker ) - { - unsigned char* p; - FT_Bitmap* map = &worker->target; - - - /* first of all, compute the scanline offset */ - p = (unsigned char*)map->buffer - y * map->pitch; - if ( map->pitch >= 0 ) - p += ( map->rows - 1 ) * (unsigned int)map->pitch; - - for ( ; count > 0; count--, spans++ ) - { - unsigned char coverage = spans->coverage; - - - if ( coverage ) - { - unsigned char* q = p + spans->x; - - - /* For small-spans it is faster to do it by ourselves than - * calling `memset'. This is mainly due to the cost of the - * function call. - */ - switch ( spans->len ) - { - case 7: *q++ = coverage; - case 6: *q++ = coverage; - case 5: *q++ = coverage; - case 4: *q++ = coverage; - case 3: *q++ = coverage; - case 2: *q++ = coverage; - case 1: *q = coverage; - case 0: break; - default: - FT_MEM_SET( q, coverage, spans->len ); - } - } - } - } - - - static void gray_hline( RAS_ARG_ TCoord x, TCoord y, - TArea area, + TArea coverage, TCoord acount ) { - int coverage; - - - /* compute the coverage line's coverage, depending on the */ - /* outline fill rule */ - /* */ - /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ - /* */ - coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); - /* use range 0..256 */ + /* scale the coverage from 0..(ONE_PIXEL*ONE_PIXEL*2) to 0..256 */ + coverage >>= PIXEL_BITS * 2 + 1 - 8; if ( coverage < 0 ) - coverage = -coverage; + coverage = -coverage - 1; + /* compute the line's coverage depending on the outline fill rule */ if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) { coverage &= 511; - if ( coverage > 256 ) - coverage = 512 - coverage; - else if ( coverage == 256 ) - coverage = 255; + if ( coverage >= 256 ) + coverage = 511 - coverage; } else { @@ -1346,64 +1245,40 @@ typedef ptrdiff_t FT_PtrDist; coverage = 255; } - y += ras.min_ey; - x += ras.min_ex; - - if ( coverage ) + if ( ras.render_span ) /* for FT_RASTER_FLAG_DIRECT only */ { - FT_Span* span; - int count; - - - /* see whether we can add this span to the current list */ - count = ras.num_gray_spans; - span = ras.gray_spans + count - 1; - if ( span->coverage == coverage && - span->x + span->len == x && - ras.span_y == y && - count > 0 ) - { - span->len = (unsigned short)( span->len + acount ); - return; - } - - if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) - { - if ( ras.render_span && count > 0 ) - ras.render_span( ras.span_y, count, ras.gray_spans, - ras.render_span_data ); + FT_Span span; -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( count > 0 ) - { - int n; + span.x = (short)x; + span.len = (unsigned short)acount; + span.coverage = (unsigned char)coverage; - FT_TRACE7(( "y = %3d ", ras.span_y )); - span = ras.gray_spans; - for ( n = 0; n < count; n++, span++ ) - FT_TRACE7(( "[%d..%d]:%02x ", - span->x, span->x + span->len - 1, span->coverage )); - FT_TRACE7(( "\n" )); - } - -#endif /* FT_DEBUG_LEVEL_TRACE */ + ras.render_span( y, 1, &span, ras.render_span_data ); + } + else + { + unsigned char* q = ras.target.origin - ras.target.pitch * y + x; + unsigned char c = (unsigned char)coverage; - ras.num_gray_spans = 0; - ras.span_y = (int)y; - span = ras.gray_spans; + /* For small-spans it is faster to do it by ourselves than + * calling `memset'. This is mainly due to the cost of the + * function call. + */ + switch ( acount ) + { + case 7: *q++ = c; + case 6: *q++ = c; + case 5: *q++ = c; + case 4: *q++ = c; + case 3: *q++ = c; + case 2: *q++ = c; + case 1: *q = c; + case 0: break; + default: + FT_MEM_SET( q, c, acount ); } - else - span++; - - /* add a gray span to the current list */ - span->x = (short)x; - span->len = (unsigned short)acount; - span->coverage = (unsigned char)coverage; - - ras.num_gray_spans++; } } @@ -1411,71 +1286,38 @@ typedef ptrdiff_t FT_PtrDist; static void gray_sweep( RAS_ARG ) { - int yindex; + int y; - if ( ras.num_cells == 0 ) - return; - - ras.num_gray_spans = 0; - ras.span_y = 0; - FT_TRACE7(( "gray_sweep: start\n" )); - for ( yindex = 0; yindex < ras.count_ey; yindex++ ) + for ( y = ras.min_ey; y < ras.max_ey; y++ ) { - PCell cell = ras.ycells[yindex]; - TCoord cover = 0; - TCoord x = 0; + PCell cell = ras.ycells[y - ras.min_ey]; + TCoord x = ras.min_ex; + TArea cover = 0; + TArea area; for ( ; cell != NULL; cell = cell->next ) { - TArea area; - - - if ( cell->x > x && cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, (TArea)cover * ( ONE_PIXEL * 2 ), - cell->x - x ); + if ( cover != 0 && cell->x > x ) + gray_hline( RAS_VAR_ x, y, cover, cell->x - x ); - cover += cell->cover; - area = (TArea)cover * ( ONE_PIXEL * 2 ) - cell->area; + cover += (TArea)cell->cover * ( ONE_PIXEL * 2 ); + area = cover - cell->area; - if ( area != 0 && cell->x >= 0 ) - gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); + if ( area != 0 && cell->x >= ras.min_ex ) + gray_hline( RAS_VAR_ cell->x, y, area, 1 ); x = cell->x + 1; } if ( cover != 0 ) - gray_hline( RAS_VAR_ x, yindex, (TArea)cover * ( ONE_PIXEL * 2 ), - ras.count_ex - x ); - } - - if ( ras.render_span && ras.num_gray_spans > 0 ) - ras.render_span( ras.span_y, ras.num_gray_spans, - ras.gray_spans, ras.render_span_data ); - -#ifdef FT_DEBUG_LEVEL_TRACE - - if ( ras.num_gray_spans > 0 ) - { - FT_Span* span; - int n; - - - FT_TRACE7(( "y = %3d ", ras.span_y )); - span = ras.gray_spans; - for ( n = 0; n < ras.num_gray_spans; n++, span++ ) - FT_TRACE7(( "[%d..%d]:%02x ", - span->x, span->x + span->len - 1, span->coverage )); - FT_TRACE7(( "\n" )); + gray_hline( RAS_VAR_ x, y, cover, ras.max_ex - x ); } FT_TRACE7(( "gray_sweep: end\n" )); - -#endif /* FT_DEBUG_LEVEL_TRACE */ - } @@ -1754,7 +1596,7 @@ typedef ptrdiff_t FT_PtrDist; return 0; Exit: - FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); return error; Invalid_Outline: @@ -1839,22 +1681,17 @@ typedef ptrdiff_t FT_PtrDist; #endif /* STANDALONE_ */ - typedef struct gray_TBand_ - { - TCoord min, max; - - } gray_TBand; - - FT_DEFINE_OUTLINE_FUNCS( func_interface, - (FT_Outline_MoveTo_Func) gray_move_to, - (FT_Outline_LineTo_Func) gray_line_to, - (FT_Outline_ConicTo_Func)gray_conic_to, - (FT_Outline_CubicTo_Func)gray_cubic_to, - 0, - 0 ) + (FT_Outline_MoveTo_Func) gray_move_to, /* move_to */ + (FT_Outline_LineTo_Func) gray_line_to, /* line_to */ + (FT_Outline_ConicTo_Func)gray_conic_to, /* conic_to */ + (FT_Outline_CubicTo_Func)gray_cubic_to, /* cubic_to */ + + 0, /* shift */ + 0 /* delta */ + ) static int @@ -1892,20 +1729,21 @@ typedef ptrdiff_t FT_PtrDist; static int gray_convert_glyph( RAS_ARG ) { - TCell buffer[FT_MAX_GRAY_POOL]; - TCoord band_size = FT_MAX_GRAY_POOL / 8; - int num_bands; - TCoord min, max, max_y; - gray_TBand bands[32]; /* enough to accommodate bisections */ - gray_TBand* band; + TCell buffer[FT_MAX_GRAY_POOL]; + TCoord band_size = FT_MAX_GRAY_POOL / 8; + TCoord count = ras.max_ey - ras.min_ey; + int num_bands; + TCoord min, max, max_y; + TCoord bands[32]; /* enough to accommodate bisections */ + TCoord* band; /* set up vertical bands */ - if ( ras.count_ey > band_size ) + if ( count > band_size ) { /* two divisions rounded up */ - num_bands = (int)( ( ras.count_ey + band_size - 1) / band_size ); - band_size = ( ras.count_ey + num_bands - 1 ) / num_bands; + num_bands = (int)( ( count + band_size - 1) / band_size ); + band_size = ( count + num_bands - 1 ) / num_bands; } min = ras.min_ey; @@ -1917,41 +1755,37 @@ typedef ptrdiff_t FT_PtrDist; if ( max > max_y ) max = max_y; - bands[0].min = min; - bands[0].max = max; - band = bands; + band = bands; + band[1] = min; + band[0] = max; do { - TCoord bottom, top, middle; + TCoord width = band[0] - band[1]; int error; /* memory management */ { - size_t ycount = (size_t)( band->max - band->min ); + size_t ycount = (size_t)width; size_t cell_start; cell_start = ( ycount * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / sizeof ( TCell ); - if ( FT_MAX_GRAY_POOL - cell_start < 2 ) - goto ReduceBands; - ras.cells = buffer + cell_start; ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - cell_start ); + ras.num_cells = 0; ras.ycells = (PCell*)buffer; while ( ycount ) ras.ycells[--ycount] = NULL; } - ras.num_cells = 0; ras.invalid = 1; - ras.min_ey = band->min; - ras.max_ey = band->max; - ras.count_ey = band->max - band->min; + ras.min_ey = band[1]; + ras.max_ey = band[0]; error = gray_convert_glyph_inner( RAS_VAR ); @@ -1964,25 +1798,20 @@ typedef ptrdiff_t FT_PtrDist; else if ( error != ErrRaster_Memory_Overflow ) return 1; - ReduceBands: /* render pool overflow; we will reduce the render band by half */ - bottom = band->min; - top = band->max; - middle = bottom + ( ( top - bottom ) >> 1 ); + width >>= 1; /* This is too complex for a single scanline; there must */ /* be some problems. */ - if ( middle == bottom ) + if ( width == 0 ) { FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); return 1; } - band[1].min = bottom; - band[1].max = middle; - band[0].min = middle; - band[0].max = top; band++; + band[1] = band[0]; + band[0] += width; } while ( band >= bands ); } @@ -1994,16 +1823,22 @@ typedef ptrdiff_t FT_PtrDist; gray_raster_render( FT_Raster raster, const FT_Raster_Params* params ) { - const FT_Outline* outline = (const FT_Outline*)params->source; - const FT_Bitmap* target_map = params->target; + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; FT_BBox cbox, clip; +#ifndef FT_STATIC_RASTER gray_TWorker worker[1]; +#endif if ( !raster ) return FT_THROW( Invalid_Argument ); + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return FT_THROW( Invalid_Mode ); + if ( !outline ) return FT_THROW( Invalid_Outline ); @@ -2018,9 +1853,19 @@ typedef ptrdiff_t FT_PtrDist; outline->contours[outline->n_contours - 1] + 1 ) return FT_THROW( Invalid_Outline ); - /* if direct mode is not set, we must have a target bitmap */ - if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + ras.outline = *outline; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + if ( !params->gray_spans ) + return 0; + + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + else { + /* if direct mode is not set, we must have a target bitmap */ if ( !target_map ) return FT_THROW( Invalid_Argument ); @@ -2030,11 +1875,18 @@ typedef ptrdiff_t FT_PtrDist; if ( !target_map->buffer ) return FT_THROW( Invalid_Argument ); - } - /* this version does not support monochrome rendering */ - if ( !( params->flags & FT_RASTER_FLAG_AA ) ) - return FT_THROW( Invalid_Mode ); + if ( target_map->pitch < 0 ) + ras.target.origin = target_map->buffer; + else + ras.target.origin = target_map->buffer + + ( target_map->rows - 1 ) * (unsigned int)target_map->pitch; + + ras.target.pitch = target_map->pitch; + + ras.render_span = (FT_Raster_Span_Func)NULL; + ras.render_span_data = NULL; + } FT_Outline_Get_CBox( outline, &cbox ); @@ -2077,23 +1929,6 @@ typedef ptrdiff_t FT_PtrDist; if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey ) return 0; - ras.count_ex = ras.max_ex - ras.min_ex; - ras.count_ey = ras.max_ey - ras.min_ey; - - ras.outline = *outline; - - if ( params->flags & FT_RASTER_FLAG_DIRECT ) - { - ras.render_span = (FT_Raster_Span_Func)params->gray_spans; - ras.render_span_data = params->user; - } - else - { - ras.target = *target_map; - ras.render_span = (FT_Raster_Span_Func)gray_render_span; - ras.render_span_data = &ras; - } - return gray_convert_glyph( RAS_VAR ); } @@ -2113,7 +1948,7 @@ typedef ptrdiff_t FT_PtrDist; *araster = (FT_Raster)&the_raster; - FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + FT_ZERO( &the_raster ); return 0; } @@ -2189,11 +2024,12 @@ typedef ptrdiff_t FT_PtrDist; FT_GLYPH_FORMAT_OUTLINE, - (FT_Raster_New_Func) gray_raster_new, - (FT_Raster_Reset_Func) gray_raster_reset, - (FT_Raster_Set_Mode_Func)gray_raster_set_mode, - (FT_Raster_Render_Func) gray_raster_render, - (FT_Raster_Done_Func) gray_raster_done ) + (FT_Raster_New_Func) gray_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) gray_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)gray_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) gray_raster_render, /* raster_render */ + (FT_Raster_Done_Func) gray_raster_done /* raster_done */ + ) /* END */ diff --git a/thirdparty/freetype/src/smooth/ftgrays.h b/thirdparty/freetype/src/smooth/ftgrays.h index 21c2badcaf..a5447da1a9 100644 --- a/thirdparty/freetype/src/smooth/ftgrays.h +++ b/thirdparty/freetype/src/smooth/ftgrays.h @@ -4,7 +4,7 @@ /* */ /* FreeType smooth renderer declaration */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/smooth/ftsmerrs.h b/thirdparty/freetype/src/smooth/ftsmerrs.h index a759b91c17..a528c61832 100644 --- a/thirdparty/freetype/src/smooth/ftsmerrs.h +++ b/thirdparty/freetype/src/smooth/ftsmerrs.h @@ -4,7 +4,7 @@ /* */ /* smooth renderer error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/smooth/ftsmooth.c b/thirdparty/freetype/src/smooth/ftsmooth.c index 79276765b1..435854e673 100644 --- a/thirdparty/freetype/src/smooth/ftsmooth.c +++ b/thirdparty/freetype/src/smooth/ftsmooth.c @@ -4,7 +4,7 @@ /* */ /* Anti-aliasing renderer interface (body). */ /* */ -/* Copyright 2000-2016 by */ +/* Copyright 2000-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -87,7 +87,7 @@ FT_GlyphSlot slot, FT_BBox* cbox ) { - FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + FT_ZERO( cbox ); if ( slot->format == render->glyph_format ) FT_Outline_Get_CBox( &slot->outline, cbox ); @@ -114,14 +114,68 @@ #ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING FT_Pos height_org, width_org; #endif - FT_Int hmul = mode == FT_RENDER_MODE_LCD; - FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; + FT_Int hmul = ( mode == FT_RENDER_MODE_LCD ); + FT_Int vmul = ( mode == FT_RENDER_MODE_LCD_V ); FT_Raster_Params params; FT_Bool have_outline_shifted = FALSE; FT_Bool have_buffer = FALSE; +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + FT_Int lcd_extra = 0; + FT_LcdFiveTapFilter lcd_weights = { 0 }; + FT_Bool have_custom_weight = FALSE; + FT_Bitmap_LcdFilterFunc lcd_filter_func = NULL; + + + if ( slot->face ) + { + FT_Char i; + + + for ( i = 0; i < FT_LCD_FILTER_FIVE_TAPS; i++ ) + if ( slot->face->internal->lcd_weights[i] != 0 ) + { + have_custom_weight = TRUE; + break; + } + } + + /* + * The LCD filter can be set library-wide and per-face. Face overrides + * library. If the face filter weights are all zero (the default), it + * means that the library default should be used. + */ + if ( have_custom_weight ) + { + /* + * A per-font filter is set. It always uses the default 5-tap + * in-place FIR filter that needs 2 extra pixels. + */ + ft_memcpy( lcd_weights, + slot->face->internal->lcd_weights, + FT_LCD_FILTER_FIVE_TAPS ); + lcd_filter_func = ft_lcd_filter_fir; + lcd_extra = 2; + } + else + { + /* + * The face's lcd_weights is {0, 0, 0, 0, 0}, meaning `use library + * default'. If the library is set to use no LCD filtering + * (lcd_filter_func == NULL), `lcd_filter_func' here is also set to + * NULL and the tests further below pass over the filtering process. + */ + ft_memcpy( lcd_weights, + slot->library->lcd_weights, + FT_LCD_FILTER_FIVE_TAPS ); + lcd_filter_func = slot->library->lcd_filter_func; + lcd_extra = slot->library->lcd_extra; + } + +#endif /*FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ /* check glyph image format */ if ( slot->format != render->glyph_format ) @@ -177,28 +231,23 @@ height *= 3; #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING - - if ( slot->library->lcd_filter_func ) + if ( lcd_filter_func ) { - FT_Int extra = slot->library->lcd_extra; - - if ( hmul ) { - x_shift += 64 * ( extra >> 1 ); - x_left -= extra >> 1; - width += 3 * extra; + x_shift += 64 * ( lcd_extra >> 1 ); + x_left -= lcd_extra >> 1; + width += 3 * lcd_extra; pitch = FT_PAD_CEIL( width, 4 ); } if ( vmul ) { - y_shift += 64 * ( extra >> 1 ); - y_top += extra >> 1; - height += 3 * extra; + y_shift += 64 * ( lcd_extra >> 1 ); + y_top += lcd_extra >> 1; + height += 3 * lcd_extra; } } - #endif /* @@ -299,8 +348,8 @@ if ( error ) goto Exit; - if ( slot->library->lcd_filter_func ) - slot->library->lcd_filter_func( bitmap, mode, slot->library ); + if ( lcd_filter_func ) + lcd_filter_func( bitmap, mode, lcd_weights ); #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ @@ -428,7 +477,8 @@ } - FT_DEFINE_RENDERER( ft_smooth_renderer_class, + FT_DEFINE_RENDERER( + ft_smooth_renderer_class, FT_MODULE_RENDERER, sizeof ( FT_RendererRec ), @@ -437,25 +487,25 @@ 0x10000L, 0x20000L, - 0, /* module specific interface */ + NULL, /* module specific interface */ - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_smooth_render, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + (FT_Renderer_RenderFunc) ft_smooth_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ ) - FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class, + FT_DEFINE_RENDERER( + ft_smooth_lcd_renderer_class, FT_MODULE_RENDERER, sizeof ( FT_RendererRec ), @@ -464,24 +514,25 @@ 0x10000L, 0x20000L, - 0, /* module specific interface */ + NULL, /* module specific interface */ - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_smooth_render_lcd, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + (FT_Renderer_RenderFunc) ft_smooth_render_lcd, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ ) - FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class, + + FT_DEFINE_RENDERER( + ft_smooth_lcdv_renderer_class, FT_MODULE_RENDERER, sizeof ( FT_RendererRec ), @@ -490,21 +541,20 @@ 0x10000L, 0x20000L, - 0, /* module specific interface */ + NULL, /* module specific interface */ - (FT_Module_Constructor)ft_smooth_init, - (FT_Module_Destructor) 0, - (FT_Module_Requester) 0 - , + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, - (FT_Renderer_TransformFunc)ft_smooth_transform, - (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, - (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ - (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ ) diff --git a/thirdparty/freetype/src/smooth/ftsmooth.h b/thirdparty/freetype/src/smooth/ftsmooth.h index c7c28c244c..6dfd65726c 100644 --- a/thirdparty/freetype/src/smooth/ftsmooth.h +++ b/thirdparty/freetype/src/smooth/ftsmooth.h @@ -4,7 +4,7 @@ /* */ /* Anti-aliasing renderer interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,18 +27,11 @@ FT_BEGIN_HEADER -#ifndef FT_CONFIG_OPTION_NO_STD_RASTER - FT_DECLARE_RENDERER( ft_std_renderer_class ) -#endif - -#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER FT_DECLARE_RENDERER( ft_smooth_renderer_class ) FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) - FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class ) -#endif - + FT_DECLARE_RENDERER( ft_smooth_lcdv_renderer_class ) FT_END_HEADER diff --git a/thirdparty/freetype/src/smooth/ftspic.c b/thirdparty/freetype/src/smooth/ftspic.c index 6c2b2329b3..fb89be3488 100644 --- a/thirdparty/freetype/src/smooth/ftspic.c +++ b/thirdparty/freetype/src/smooth/ftspic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for smooth module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/smooth/ftspic.h b/thirdparty/freetype/src/smooth/ftspic.h index fe76152770..9ddd1c7905 100644 --- a/thirdparty/freetype/src/smooth/ftspic.h +++ b/thirdparty/freetype/src/smooth/ftspic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for smooth module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/smooth/module.mk b/thirdparty/freetype/src/smooth/module.mk index f3cb044039..804e9b1386 100644 --- a/thirdparty/freetype/src/smooth/module.mk +++ b/thirdparty/freetype/src/smooth/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/smooth/rules.mk b/thirdparty/freetype/src/smooth/rules.mk index 5e94f73519..dfdc9bc30f 100644 --- a/thirdparty/freetype/src/smooth/rules.mk +++ b/thirdparty/freetype/src/smooth/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/smooth/smooth.c b/thirdparty/freetype/src/smooth/smooth.c index 97ca3e5995..e0460d9d46 100644 --- a/thirdparty/freetype/src/smooth/smooth.c +++ b/thirdparty/freetype/src/smooth/smooth.c @@ -4,7 +4,7 @@ /* */ /* FreeType anti-aliasing rasterer module component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,11 +17,11 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "ftspic.c" + #include "ftgrays.c" #include "ftsmooth.c" +#include "ftspic.c" /* END */ diff --git a/thirdparty/freetype/src/truetype/module.mk b/thirdparty/freetype/src/truetype/module.mk index 80c9832b2c..563c584e2b 100644 --- a/thirdparty/freetype/src/truetype/module.mk +++ b/thirdparty/freetype/src/truetype/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/truetype/rules.mk b/thirdparty/freetype/src/truetype/rules.mk index 3bf7cf770d..ad3d007455 100644 --- a/thirdparty/freetype/src/truetype/rules.mk +++ b/thirdparty/freetype/src/truetype/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/truetype/truetype.c b/thirdparty/freetype/src/truetype/truetype.c index 23e2ea00a7..301b82ad1c 100644 --- a/thirdparty/freetype/src/truetype/truetype.c +++ b/thirdparty/freetype/src/truetype/truetype.c @@ -4,7 +4,7 @@ /* */ /* FreeType TrueType driver component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,22 +17,16 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "ttpic.c" + #include "ttdriver.c" /* driver interface */ -#include "ttpload.c" /* tables loader */ #include "ttgload.c" /* glyph loader */ -#include "ttobjs.c" /* object manager */ - -#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttgxvar.c" /* gx distortable font */ #include "ttinterp.c" +#include "ttobjs.c" /* object manager */ +#include "ttpic.c" +#include "ttpload.c" /* tables loader */ #include "ttsubpix.c" -#endif - -#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT -#include "ttgxvar.c" /* gx distortable font */ -#endif /* END */ diff --git a/thirdparty/freetype/src/truetype/ttdriver.c b/thirdparty/freetype/src/truetype/ttdriver.c index c9d4081efe..a1653b241c 100644 --- a/thirdparty/freetype/src/truetype/ttdriver.c +++ b/thirdparty/freetype/src/truetype/ttdriver.c @@ -4,7 +4,7 @@ /* */ /* TrueType font driver implementation (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -25,6 +25,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT #include FT_MULTIPLE_MASTERS_H #include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H #endif #include FT_SERVICE_TRUETYPE_ENGINE_H @@ -61,26 +62,48 @@ static FT_Error tt_property_set( FT_Module module, /* TT_Driver */ const char* property_name, - const void* value ) + const void* value, + FT_Bool value_is_string ) { FT_Error error = FT_Err_Ok; TT_Driver driver = (TT_Driver)module; +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + if ( !ft_strcmp( property_name, "interpreter-version" ) ) { - FT_UInt* interpreter_version = (FT_UInt*)value; + FT_UInt interpreter_version; - if ( *interpreter_version == TT_INTERPRETER_VERSION_35 +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 ); + } + else +#endif + { + FT_UInt* iv = (FT_UInt*)value; + + + interpreter_version = *iv; + } + + if ( interpreter_version == TT_INTERPRETER_VERSION_35 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY - || *interpreter_version == TT_INTERPRETER_VERSION_38 + || interpreter_version == TT_INTERPRETER_VERSION_38 #endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - || *interpreter_version == TT_INTERPRETER_VERSION_40 + || interpreter_version == TT_INTERPRETER_VERSION_40 #endif ) - driver->interpreter_version = *interpreter_version; + driver->interpreter_version = interpreter_version; else error = FT_ERR( Unimplemented_Feature ); @@ -122,8 +145,10 @@ FT_DEFINE_SERVICE_PROPERTIESREC( tt_service_properties, + (FT_Properties_SetFunc)tt_property_set, /* set_property */ - (FT_Properties_GetFunc)tt_property_get ) /* get_property */ + (FT_Properties_GetFunc)tt_property_get /* get_property */ + ) /*************************************************************************/ @@ -199,13 +224,20 @@ FT_Fixed *advances ) { FT_UInt nn; - TT_Face face = (TT_Face) ttface; + TT_Face face = (TT_Face)ttface; /* XXX: TODO: check for sbits */ if ( flags & FT_LOAD_VERTICAL_LAYOUT ) { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( !face->is_default_instance && + !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + for ( nn = 0; nn < count; nn++ ) { FT_Short tsb; @@ -219,6 +251,13 @@ } else { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( !face->is_default_instance && + !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + for ( nn = 0; nn < count; nn++ ) { FT_Short lsb; @@ -265,15 +304,17 @@ /* use the scaled metrics, even when tt_size_reset fails */ FT_Select_Metrics( size->face, strike_index ); - tt_size_reset( ttsize ); /* ignore return value */ + tt_size_reset( ttsize, 0 ); /* ignore return value */ } else { - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; - FT_Size_Metrics* metrics = &size->metrics; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + FT_Size_Metrics* size_metrics = &size->metrics; - error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); + error = sfnt->load_strike_metrics( ttface, + strike_index, + size_metrics ); if ( error ) ttsize->strike_index = 0xFFFFFFFFUL; } @@ -297,7 +338,7 @@ if ( FT_HAS_FIXED_SIZES( size->face ) ) { TT_Face ttface = (TT_Face)size->face; - SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; FT_ULong strike_index; @@ -315,8 +356,28 @@ if ( FT_IS_SCALABLE( size->face ) ) { - error = tt_size_reset( ttsize ); - ttsize->root.metrics = ttsize->metrics; + error = tt_size_reset( ttsize, 0 ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* for the `MPS' bytecode instruction we need the point size */ + if ( !error ) + { + FT_UInt resolution = + ttsize->metrics->x_ppem > ttsize->metrics->y_ppem + ? req->horiResolution + : req->vertResolution; + + + /* if we don't have a resolution value, assume 72dpi */ + if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES || + !resolution ) + resolution = 72; + + ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem, + 64 * 72, + resolution ); + } +#endif } return error; @@ -398,6 +459,11 @@ load_flags |= FT_LOAD_NO_HINTING; } + /* use hinted metrics only if we load a glyph with hinting */ + size->metrics = ( load_flags & FT_LOAD_NO_HINTING ) + ? &ttsize->metrics + : &size->hinted_metrics; + /* now load the glyph outline if necessary */ error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); @@ -421,14 +487,38 @@ /*************************************************************************/ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICE_MULTIMASTERSREC( tt_service_gx_multi_masters, + (FT_Get_MM_Func) NULL, /* get_mm */ (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, /* set_mm_blend */ + (FT_Get_MM_Blend_Func) TT_Get_MM_Blend, /* get_mm_blend */ (FT_Get_MM_Var_Func) TT_Get_MM_Var, /* get_mm_var */ - (FT_Set_Var_Design_Func)TT_Set_Var_Design ) /* set_var_design */ -#endif + (FT_Set_Var_Design_Func)TT_Set_Var_Design, /* set_var_design */ + (FT_Get_Var_Design_Func)TT_Get_Var_Design, /* get_var_design */ + + (FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */ + (FT_Done_Blend_Func) tt_done_blend /* done_blend */ + ) + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + tt_service_metrics_variations, + + (FT_HAdvance_Adjust_Func)tt_hadvance_adjust, /* hadvance_adjust */ + (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ + (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + + (FT_VAdvance_Adjust_Func)tt_vadvance_adjust, /* vadvance_adjust */ + (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ + (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ + (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + + (FT_Metrics_Adjust_Func) tt_apply_mvar /* metrics_adjust */ + ) + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = @@ -447,20 +537,25 @@ FT_DEFINE_SERVICE_TTGLYFREC( tt_service_truetype_glyf, - (TT_Glyf_GetLocationFunc)tt_face_get_location ) /* get_location */ + + (TT_Glyf_GetLocationFunc)tt_face_get_location /* get_location */ + ) #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_DEFINE_SERVICEDESCREC5( + FT_DEFINE_SERVICEDESCREC6( tt_services, - FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, - FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET, - FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, - FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, - FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, + FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &TT_SERVICE_METRICS_VARIATIONS_GET, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, + FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) #else FT_DEFINE_SERVICEDESCREC4( tt_services, + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, @@ -488,7 +583,7 @@ #endif result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface ); - if ( result != NULL ) + if ( result ) return result; #ifndef FT_CONFIG_OPTION_PIC @@ -539,7 +634,7 @@ 0x10000L, /* driver version == 1.0 */ 0x20000L, /* driver requires FreeType 2.0 or above */ - 0, /* module-specific interface */ + NULL, /* module-specific interface */ tt_driver_init, /* FT_Module_Constructor module_init */ tt_driver_done, /* FT_Module_Destructor module_done */ @@ -554,12 +649,12 @@ tt_size_init, /* FT_Size_InitFunc init_size */ tt_size_done, /* FT_Size_DoneFunc done_size */ tt_slot_init, /* FT_Slot_InitFunc init_slot */ - 0, /* FT_Slot_DoneFunc done_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ tt_glyph_load, /* FT_Slot_LoadFunc load_glyph */ tt_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_AttachFunc attach_file */ tt_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ tt_size_request, /* FT_Size_RequestFunc request_size */ diff --git a/thirdparty/freetype/src/truetype/ttdriver.h b/thirdparty/freetype/src/truetype/ttdriver.h index 74392bbd02..3bcba7f745 100644 --- a/thirdparty/freetype/src/truetype/ttdriver.h +++ b/thirdparty/freetype/src/truetype/ttdriver.h @@ -4,7 +4,7 @@ /* */ /* High-level TrueType driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/truetype/tterrors.h b/thirdparty/freetype/src/truetype/tterrors.h index 895989f5fd..a49f205156 100644 --- a/thirdparty/freetype/src/truetype/tterrors.h +++ b/thirdparty/freetype/src/truetype/tterrors.h @@ -4,7 +4,7 @@ /* */ /* TrueType error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/truetype/ttgload.c b/thirdparty/freetype/src/truetype/ttgload.c index 8be9b6ae65..b7a844a6c7 100644 --- a/thirdparty/freetype/src/truetype/ttgload.c +++ b/thirdparty/freetype/src/truetype/ttgload.c @@ -4,7 +4,7 @@ /* */ /* TrueType Glyph Loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -18,6 +18,7 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H #include FT_INTERNAL_CALC_H #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H @@ -162,7 +163,7 @@ /* This may not be the right place for this, but it works... */ /* Note that we have to unconditionally load the tweaks since */ /* it is possible that glyphs individually switch ClearType's */ - /* backwards compatibility mode on and off. */ + /* backward compatibility mode on and off. */ sph_set_tweaks( loader, glyph_index ); } #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ @@ -194,39 +195,39 @@ if ( face->root.internal->incremental_interface && face->root.internal->incremental_interface->funcs->get_glyph_metrics ) { - FT_Incremental_MetricsRec metrics; + FT_Incremental_MetricsRec incr_metrics; FT_Error error; - metrics.bearing_x = loader->left_bearing; - metrics.bearing_y = 0; - metrics.advance = loader->advance; - metrics.advance_v = 0; + incr_metrics.bearing_x = loader->left_bearing; + incr_metrics.bearing_y = 0; + incr_metrics.advance = loader->advance; + incr_metrics.advance_v = 0; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, - glyph_index, FALSE, &metrics ); + glyph_index, FALSE, &incr_metrics ); if ( error ) goto Exit; - left_bearing = (FT_Short)metrics.bearing_x; - advance_width = (FT_UShort)metrics.advance; + left_bearing = (FT_Short)incr_metrics.bearing_x; + advance_width = (FT_UShort)incr_metrics.advance; #if 0 /* GWW: Do I do the same for vertical metrics? */ - metrics.bearing_x = 0; - metrics.bearing_y = loader->top_bearing; - metrics.advance = loader->vadvance; + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = loader->top_bearing; + incr_metrics.advance = loader->vadvance; error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( face->root.internal->incremental_interface->object, - glyph_index, TRUE, &metrics ); + glyph_index, TRUE, &incr_metrics ); if ( error ) goto Exit; - top_bearing = (FT_Short)metrics.bearing_y; - advance_height = (FT_UShort)metrics.advance; + top_bearing = (FT_Short)incr_metrics.bearing_y; + advance_height = (FT_UShort)incr_metrics.advance; #endif /* 0 */ @@ -332,7 +333,6 @@ FT_Outline* outline; FT_UShort n_ins; FT_Int n_points; - FT_ULong tmp; FT_Byte *flag, *flag_limit; FT_Byte c, count; @@ -398,18 +398,21 @@ FT_TRACE5(( " Instructions size: %u\n", n_ins )); - /* check it */ - if ( ( limit - p ) < n_ins ) - { - FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); - error = FT_THROW( Too_Many_Hints ); - goto Fail; - } - #ifdef TT_USE_BYTECODE_INTERPRETER if ( IS_HINTED( load->load_flags ) ) { + FT_ULong tmp; + + + /* check instructions size */ + if ( ( limit - p ) < n_ins ) + { + FT_TRACE1(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); + error = FT_THROW( Too_Many_Hints ); + goto Fail; + } + /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ /* and thus update the bytecode array size by ourselves */ @@ -441,7 +444,7 @@ flag = (FT_Byte*)outline->tags; flag_limit = flag + n_points; - FT_ASSERT( flag != NULL ); + FT_ASSERT( flag ); while ( flag < flag_limit ) { @@ -775,8 +778,8 @@ } else { - loader->exec->metrics.x_scale = loader->size->metrics.x_scale; - loader->exec->metrics.y_scale = loader->size->metrics.y_scale; + loader->exec->metrics.x_scale = loader->size->metrics->x_scale; + loader->exec->metrics.y_scale = loader->size->metrics->y_scale; } #endif @@ -818,11 +821,11 @@ #endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* Save possibly modified glyph phantom points unless in v40 backwards */ + /* Save possibly modified glyph phantom points unless in v40 backward */ /* compatibility mode, where no movement on the x axis means no reason */ /* to change bearings or advance widths. */ if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - !loader->exec->backwards_compatibility ) ) + !loader->exec->backward_compatibility ) ) { #endif loader->pp1 = zone->cur[zone->n_points - 4]; @@ -886,13 +889,23 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( loader->face->doblend ) + if ( !loader->face->is_default_instance ) { /* Deltas apply to the unscaled data. */ error = TT_Vary_Apply_Glyph_Deltas( loader->face, loader->glyph_index, outline, (FT_UInt)n_points ); + + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = outline->points[n_points - 3].x - + outline->points[n_points - 4].x; + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = outline->points[n_points - 1].x - + outline->points[n_points - 2].x; + if ( error ) return error; } @@ -913,7 +926,7 @@ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics.x_ppem; + FT_UInt ppem = loader->size->metrics->x_ppem; FT_String* style = face->root.style_name; FT_UInt x_scale_factor = 1000; #endif @@ -942,9 +955,9 @@ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 || x_scale_factor != 1000 ) { - x_scale = FT_MulDiv( loader->size->metrics.x_scale, + x_scale = FT_MulDiv( loader->size->metrics->x_scale, (FT_Long)x_scale_factor, 1000 ); - y_scale = loader->size->metrics.y_scale; + y_scale = loader->size->metrics->y_scale; /* compensate for any scaling by de/emboldening; */ /* the amount was determined via experimentation */ @@ -964,8 +977,8 @@ /* scale the glyph */ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) { - x_scale = loader->size->metrics.x_scale; - y_scale = loader->size->metrics.y_scale; + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; do_scale = TRUE; } @@ -1123,8 +1136,8 @@ if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) { - FT_Fixed x_scale = loader->size->metrics.x_scale; - FT_Fixed y_scale = loader->size->metrics.y_scale; + FT_Fixed x_scale = loader->size->metrics->x_scale; + FT_Fixed y_scale = loader->size->metrics->y_scale; x = FT_MulFix( x, x_scale ); @@ -1382,7 +1395,7 @@ /* a utility function to retrieve i-th node from given FT_List */ static FT_ListNode ft_list_get_node_at( FT_List list, - FT_UInt index ) + FT_UInt idx ) { FT_ListNode cur; @@ -1392,10 +1405,10 @@ for ( cur = list->head; cur; cur = cur->next ) { - if ( !index ) + if ( !idx ) return cur; - index--; + idx--; } return NULL; @@ -1436,13 +1449,12 @@ FT_TRACE5(( " nesting level: %d\n", recurse_count )); #endif - /* some fonts have an incorrect value of `maxComponentDepth', */ - /* thus we allow depth 1 to catch the majority of them */ - if ( recurse_count > 1 && - recurse_count > face->max_profile.maxComponentDepth ) + /* some fonts have an incorrect value of `maxComponentDepth' */ + if ( recurse_count > face->max_profile.maxComponentDepth ) { - error = FT_THROW( Invalid_Composite ); - goto Exit; + FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n", + recurse_count )); + face->max_profile.maxComponentDepth = (FT_UShort)recurse_count; } #ifndef FT_CONFIG_OPTION_INCREMENTAL @@ -1458,8 +1470,8 @@ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) { - x_scale = loader->size->metrics.x_scale; - y_scale = loader->size->metrics.y_scale; + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; } else { @@ -1488,7 +1500,7 @@ offset = 0; loader->byte_len = glyph_data.length; - FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); + FT_ZERO( &inc_stream ); FT_Stream_OpenMemory( &inc_stream, glyph_data.pointer, (FT_ULong)glyph_data.length ); @@ -1506,10 +1518,10 @@ { #ifdef FT_CONFIG_OPTION_INCREMENTAL /* for the incremental interface, `glyf_offset' is always zero */ - if ( !loader->glyf_offset && + if ( !face->glyf_offset && !face->root.internal->incremental_interface ) #else - if ( !loader->glyf_offset ) + if ( !face->glyf_offset ) #endif /* FT_CONFIG_OPTION_INCREMENTAL */ { FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); @@ -1518,7 +1530,7 @@ } error = face->access_glyph_frame( loader, glyph_index, - loader->glyf_offset + offset, + face->glyf_offset + offset, (FT_UInt)loader->byte_len ); if ( error ) goto Exit; @@ -1565,7 +1577,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( loader->face->doblend ) + if ( !loader->face->is_default_instance ) { /* a small outline structure with four elements for */ /* communication with `TT_Vary_Apply_Glyph_Deltas' */ @@ -1608,6 +1620,14 @@ loader->pp3.y = points[2].y; loader->pp4.x = points[3].x; loader->pp4.y = points[3].y; + + + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = loader->pp2.x - loader->pp1.x; + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = loader->pp4.x - loader->pp3.x; } #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ @@ -1692,7 +1712,7 @@ /* check whether we already have a composite glyph with this index */ if ( FT_List_Find( &loader->composites, - (void*)(unsigned long)glyph_index ) ) + FT_UINT_TO_POINTER( glyph_index ) ) ) { FT_TRACE1(( "TT_Load_Composite_Glyph:" " infinite recursion detected\n" )); @@ -1701,13 +1721,13 @@ } else if ( node ) - node->data = (void*)(unsigned long)glyph_index; + node->data = FT_UINT_TO_POINTER( glyph_index ); else { if ( FT_NEW( node ) ) goto Exit; - node->data = (void*)(unsigned long)glyph_index; + node->data = FT_UINT_TO_POINTER( glyph_index ); FT_List_Add( &loader->composites, node ); } @@ -1728,7 +1748,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - if ( face->doblend ) + if ( !face->is_default_instance ) { short i, limit; FT_SubGlyph subglyph; @@ -1797,22 +1817,22 @@ /* this call provides additional offsets */ /* for each component's translation */ - if ( ( error = TT_Vary_Apply_Glyph_Deltas( - face, - glyph_index, - &outline, - (FT_UInt)outline.n_points ) ) != 0 ) + if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( + face, + glyph_index, + &outline, + (FT_UInt)outline.n_points ) ) ) goto Exit1; subglyph = gloader->current.subglyphs; for ( i = 0; i < limit; i++, subglyph++ ) { - /* XXX: overflow check for subglyph->{arg1,arg2}. */ - /* Deltas must be within signed 16-bit, */ - /* but the restriction of summed deltas is not clear */ - subglyph->arg1 = (FT_Int16)points[i].x; - subglyph->arg2 = (FT_Int16)points[i].y; + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + subglyph->arg1 = (FT_Int16)points[i].x; + subglyph->arg2 = (FT_Int16)points[i].y; + } } loader->pp1.x = points[i + 0].x; @@ -1825,6 +1845,13 @@ loader->pp4.x = points[i + 3].x; loader->pp4.y = points[i + 3].y; + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = loader->pp2.x - loader->pp1.x; + if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = loader->pp4.x - loader->pp3.x; + Exit1: FT_FREE( outline.points ); FT_FREE( outline.tags ); @@ -1884,6 +1911,9 @@ { FT_Vector pp[4]; + FT_Int linear_hadvance; + FT_Int linear_vadvance; + /* Each time we call load_truetype_glyph in this loop, the */ /* value of `gloader.base.subglyphs' can change due to table */ @@ -1896,6 +1926,9 @@ pp[2] = loader->pp3; pp[3] = loader->pp4; + linear_hadvance = loader->linear; + linear_vadvance = loader->vadvance; + num_base_points = (FT_UInt)gloader->base.outline.n_points; error = load_truetype_glyph( loader, @@ -1915,6 +1948,9 @@ loader->pp2 = pp[1]; loader->pp3 = pp[2]; loader->pp4 = pp[3]; + + loader->linear = linear_hadvance; + loader->vadvance = linear_vadvance; } num_points = (FT_UInt)gloader->base.outline.n_points; @@ -2002,7 +2038,7 @@ y_scale = 0x10000L; if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) - y_scale = size->root.metrics.y_scale; + y_scale = size->metrics->y_scale; if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) FT_Outline_Get_CBox( &glyph->outline, &bbox ); @@ -2017,24 +2053,24 @@ glyph->metrics.horiBearingY = bbox.yMax; glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; - /* Adjust advance width to the value contained in the hdmx table */ - /* unless FT_LOAD_COMPUTE_METRICS is set or backwards compatibility */ - /* mode of the v40 interpreter is active. See `ttinterp.h' for */ - /* details on backwards compatibility mode. */ + /* Adjust advance width to the value contained in the hdmx table */ + /* unless FT_LOAD_COMPUTE_METRICS is set or backward compatibility */ + /* mode of the v40 interpreter is active. See `ttinterp.h' for */ + /* details on backward compatibility mode. */ if ( #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && - ( loader->exec && loader->exec->backwards_compatibility ) ) && + !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + ( loader->exec && loader->exec->backward_compatibility ) ) && #endif - !face->postscript.isFixedPitch && - IS_HINTED( loader->load_flags ) && - !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) ) + !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) && + !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) ) { FT_Byte* widthp; widthp = tt_face_get_device_metrics( face, - size->root.metrics.x_ppem, + size->metrics->x_ppem, glyph_index ); #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY @@ -2116,7 +2152,7 @@ #ifdef FT_CONFIG_OPTION_INCREMENTAL { FT_Incremental_InterfaceRec* incr; - FT_Incremental_MetricsRec metrics; + FT_Incremental_MetricsRec incr_metrics; FT_Error error; @@ -2126,19 +2162,19 @@ /* overriding metrics for this glyph. */ if ( incr && incr->funcs->get_glyph_metrics ) { - metrics.bearing_x = 0; - metrics.bearing_y = top; - metrics.advance = advance; + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = top; + incr_metrics.advance = advance; error = incr->funcs->get_glyph_metrics( incr->object, glyph_index, TRUE, - &metrics ); + &incr_metrics ); if ( error ) return error; - top = metrics.bearing_y; - advance = metrics.advance; + top = incr_metrics.bearing_y; + advance = incr_metrics.advance; } } @@ -2180,7 +2216,7 @@ SFNT_Service sfnt; FT_Stream stream; FT_Error error; - TT_SBit_MetricsRec metrics; + TT_SBit_MetricsRec sbit_metrics; face = (TT_Face)glyph->face; @@ -2193,34 +2229,34 @@ (FT_UInt)load_flags, stream, &glyph->bitmap, - &metrics ); + &sbit_metrics ); if ( !error ) { glyph->outline.n_points = 0; glyph->outline.n_contours = 0; - glyph->metrics.width = (FT_Pos)metrics.width * 64; - glyph->metrics.height = (FT_Pos)metrics.height * 64; + glyph->metrics.width = (FT_Pos)sbit_metrics.width * 64; + glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64; - glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX * 64; - glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY * 64; - glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance * 64; + glyph->metrics.horiBearingX = (FT_Pos)sbit_metrics.horiBearingX * 64; + glyph->metrics.horiBearingY = (FT_Pos)sbit_metrics.horiBearingY * 64; + glyph->metrics.horiAdvance = (FT_Pos)sbit_metrics.horiAdvance * 64; - glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX * 64; - glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY * 64; - glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance * 64; + glyph->metrics.vertBearingX = (FT_Pos)sbit_metrics.vertBearingX * 64; + glyph->metrics.vertBearingY = (FT_Pos)sbit_metrics.vertBearingY * 64; + glyph->metrics.vertAdvance = (FT_Pos)sbit_metrics.vertAdvance * 64; glyph->format = FT_GLYPH_FORMAT_BITMAP; if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) { - glyph->bitmap_left = metrics.vertBearingX; - glyph->bitmap_top = metrics.vertBearingY; + glyph->bitmap_left = sbit_metrics.vertBearingX; + glyph->bitmap_top = sbit_metrics.vertBearingY; } else { - glyph->bitmap_left = metrics.horiBearingX; - glyph->bitmap_top = metrics.horiBearingY; + glyph->bitmap_left = sbit_metrics.horiBearingX; + glyph->bitmap_top = sbit_metrics.horiBearingY; } } @@ -2237,23 +2273,23 @@ FT_Int32 load_flags, FT_Bool glyf_table_only ) { - FT_Error error; - TT_Face face; FT_Stream stream; + #ifdef TT_USE_BYTECODE_INTERPRETER + FT_Error error; FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); -#endif #if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( (TT_Face)glyph->face ); #endif +#endif face = (TT_Face)glyph->face; stream = face->root.stream; - FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); + FT_ZERO( loader ); #ifdef TT_USE_BYTECODE_INTERPRETER @@ -2498,32 +2534,6 @@ #endif /* TT_USE_BYTECODE_INTERPRETER */ - /* seek to the beginning of the glyph table -- for Type 42 fonts */ - /* the table might be accessed from a Postscript stream or something */ - /* else... */ - -#ifdef FT_CONFIG_OPTION_INCREMENTAL - - if ( face->root.internal->incremental_interface ) - loader->glyf_offset = 0; - else - -#endif - - { - error = face->goto_table( face, TTAG_glyf, stream, 0 ); - - if ( FT_ERR_EQ( error, Table_Missing ) ) - loader->glyf_offset = 0; - else if ( error ) - { - FT_ERROR(( "tt_loader_init: could not access glyph table\n" )); - return error; - } - else - loader->glyf_offset = FT_STREAM_POS(); - } - /* get face's glyph loader */ if ( !glyf_table_only ) { @@ -2594,17 +2604,21 @@ FT_Error error; TT_LoaderRec loader; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#define IS_DEFAULT_INSTANCE ( ( (TT_Face)glyph->face )->is_default_instance ) +#else +#define IS_DEFAULT_INSTANCE 1 +#endif + FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS - /* try to load embedded bitmap if any */ - /* */ - /* XXX: The convention should be emphasized in */ - /* the documents because it can be confusing. */ + /* try to load embedded bitmap (if any) */ if ( size->strike_index != 0xFFFFFFFFUL && - ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && + IS_DEFAULT_INSTANCE ) { error = load_sbit_image( size, glyph, glyph_index, load_flags ); if ( !error ) @@ -2623,11 +2637,11 @@ if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) glyph->metrics.horiAdvance = FT_MulFix( glyph->linearHoriAdvance, - size->root.metrics.x_scale ); + size->metrics->x_scale ); if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance ) glyph->metrics.vertAdvance = FT_MulFix( glyph->linearVertAdvance, - size->root.metrics.y_scale ); + size->metrics->y_scale ); } return FT_Err_Ok; @@ -2638,14 +2652,20 @@ /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) - return FT_THROW( Invalid_Size_Handle ); + { + error = FT_THROW( Invalid_Size_Handle ); + goto Exit; + } if ( load_flags & FT_LOAD_SBITS_ONLY ) - return FT_THROW( Invalid_Argument ); + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); if ( error ) - return error; + goto Exit; glyph->format = FT_GLYPH_FORMAT_OUTLINE; glyph->num_subglyphs = 0; @@ -2717,9 +2737,16 @@ /* TrueType glyphs at all sizes using the bytecode interpreter. */ /* */ if ( !( load_flags & FT_LOAD_NO_SCALE ) && - size->root.metrics.y_ppem < 24 ) + size->metrics->y_ppem < 24 ) glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + Exit: +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE1(( " failed (error code 0x%x)\n", + error )); +#endif + return error; } diff --git a/thirdparty/freetype/src/truetype/ttgload.h b/thirdparty/freetype/src/truetype/ttgload.h index bfa29e4ff8..1dd6c841db 100644 --- a/thirdparty/freetype/src/truetype/ttgload.h +++ b/thirdparty/freetype/src/truetype/ttgload.h @@ -4,7 +4,7 @@ /* */ /* TrueType Glyph Loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/truetype/ttgxvar.c b/thirdparty/freetype/src/truetype/ttgxvar.c index 9a02c5a8c1..0cedb6bdfa 100644 --- a/thirdparty/freetype/src/truetype/ttgxvar.c +++ b/thirdparty/freetype/src/truetype/ttgxvar.c @@ -4,7 +4,7 @@ /* */ /* TrueType GX Font Variation loader */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -22,10 +22,6 @@ /* */ /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html */ /* */ - /* The documentation for `fvar' is inconsistent. At one point it says */ - /* that `countSizePairs' should be 3, at another point 2. It should */ - /* be 2. */ - /* */ /* The documentation for `gvar' is not intelligible; `cvar' refers you */ /* to `gvar' and is thus also incomprehensible. */ /* */ @@ -49,7 +45,9 @@ #include FT_INTERNAL_STREAM_H #include FT_INTERNAL_SFNT_H #include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H #include FT_MULTIPLE_MASTERS_H +#include FT_LIST_H #include "ttpload.h" #include "ttgxvar.h" @@ -158,48 +156,49 @@ return NULL; } - if ( FT_NEW_ARRAY( points, n ) ) + /* in the nested loops below we increase `i' twice; */ + /* it is faster to simply allocate one more slot */ + /* than to add another test within the loop */ + if ( FT_NEW_ARRAY( points, n + 1 ) ) return NULL; *point_cnt = n; - i = 0; + first = 0; + i = 0; while ( i < n ) { runcnt = FT_GET_BYTE(); if ( runcnt & GX_PT_POINTS_ARE_WORDS ) { runcnt &= GX_PT_POINT_RUN_COUNT_MASK; - first = FT_GET_USHORT(); + first += FT_GET_USHORT(); points[i++] = first; - if ( runcnt < 1 || i + runcnt > n ) - goto Exit; - /* first point not included in run count */ for ( j = 0; j < runcnt; j++ ) { first += FT_GET_USHORT(); points[i++] = first; + if ( i >= n ) + break; } } else { - first = FT_GET_BYTE(); + first += FT_GET_BYTE(); points[i++] = first; - if ( runcnt < 1 || i + runcnt > n ) - goto Exit; - for ( j = 0; j < runcnt; j++ ) { first += FT_GET_BYTE(); points[i++] = first; + if ( i >= n ) + break; } } } - Exit: return points; } @@ -321,7 +320,7 @@ FT_TRACE2(( "AVAR " )); - blend->avar_checked = TRUE; + blend->avar_loaded = TRUE; error = face->goto_table( face, TTAG_avar, stream, &table_len ); if ( error ) { @@ -345,7 +344,7 @@ if ( axisCount != (FT_Long)blend->mmvar->num_axis ) { - FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `cvar'\n" + FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `fvar'\n" " table are different\n" )); goto Exit; } @@ -379,7 +378,7 @@ segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4; segment->correspondence[j].toCoord = FT_GET_SHORT() * 4; - FT_TRACE5(( " mapping %.4f to %.4f\n", + FT_TRACE5(( " mapping %.5f to %.5f\n", segment->correspondence[j].fromCoord / 65536.0, segment->correspondence[j].toCoord / 65536.0 )); } @@ -392,6 +391,996 @@ } + /* some macros we need */ + #define FT_FIXED_ONE ( (FT_Fixed)0x10000 ) + + #define FT_fdot14ToFixed( x ) \ + ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) + #define FT_intToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 16 ) ) + #define FT_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) + + + static FT_Error + ft_var_load_item_variation_store( TT_Face face, + FT_ULong offset, + GX_ItemVarStore itemStore ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + FT_UShort format; + FT_ULong region_offset; + FT_UInt i, j, k; + FT_UInt shortDeltaCount; + + GX_Blend blend = face->blend; + GX_ItemVarData varData; + + FT_ULong* dataOffsetArray = NULL; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_USHORT( format ) ) + goto Exit; + + if ( format != 1 ) + { + FT_TRACE2(( "ft_var_load_item_variation_store: bad store format %d\n", + format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( region_offset ) || + FT_READ_USHORT( itemStore->dataCount ) ) + goto Exit; + + /* we need at least one entry in `itemStore->varData' */ + if ( !itemStore->dataCount ) + { + FT_TRACE2(( "ft_var_load_item_variation_store: missing varData\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* make temporary copy of item variation data offsets; */ + /* we will parse region list first, then come back */ + if ( FT_NEW_ARRAY( dataOffsetArray, itemStore->dataCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->dataCount; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse array of region records (region list) */ + if ( FT_STREAM_SEEK( offset + region_offset ) ) + goto Exit; + + if ( FT_READ_USHORT( itemStore->axisCount ) || + FT_READ_USHORT( itemStore->regionCount ) ) + goto Exit; + + if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_load_item_variation_store:" + " number of axes in item variation store\n" + " " + " and `fvar' table are different\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_NEW_ARRAY( itemStore->varRegionList, itemStore->regionCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->regionCount; i++ ) + { + GX_AxisCoords axisCoords; + + + if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList, + itemStore->axisCount ) ) + goto Exit; + + axisCoords = itemStore->varRegionList[i].axisList; + + for ( j = 0; j < itemStore->axisCount; j++ ) + { + FT_Short start, peak, end; + + + if ( FT_READ_SHORT( start ) || + FT_READ_SHORT( peak ) || + FT_READ_SHORT( end ) ) + goto Exit; + + axisCoords[j].startCoord = FT_fdot14ToFixed( start ); + axisCoords[j].peakCoord = FT_fdot14ToFixed( peak ); + axisCoords[j].endCoord = FT_fdot14ToFixed( end ); + } + } + + /* end of region list parse */ + + /* use dataOffsetArray now to parse varData items */ + if ( FT_NEW_ARRAY( itemStore->varData, itemStore->dataCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->dataCount; i++ ) + { + varData = &itemStore->varData[i]; + + if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) ) + goto Exit; + + if ( FT_READ_USHORT( varData->itemCount ) || + FT_READ_USHORT( shortDeltaCount ) || + FT_READ_USHORT( varData->regionIdxCount ) ) + goto Exit; + + /* check some data consistency */ + if ( shortDeltaCount > varData->regionIdxCount ) + { + FT_TRACE2(( "bad short count %d or region count %d\n", + shortDeltaCount, + varData->regionIdxCount )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( varData->regionIdxCount > itemStore->regionCount ) + { + FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n", + varData->regionIdxCount, + i )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* parse region indices */ + if ( FT_NEW_ARRAY( varData->regionIndices, + varData->regionIdxCount ) ) + goto Exit; + + for ( j = 0; j < varData->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( varData->regionIndices[j] ) ) + goto Exit; + + if ( varData->regionIndices[j] >= itemStore->regionCount ) + { + FT_TRACE2(( "bad region index %d\n", + varData->regionIndices[j] )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + /* Parse delta set. */ + /* */ + /* On input, deltas are (shortDeltaCount + regionIdxCount) bytes */ + /* each; on output, deltas are expanded to `regionIdxCount' shorts */ + /* each. */ + if ( FT_NEW_ARRAY( varData->deltaSet, + varData->regionIdxCount * varData->itemCount ) ) + goto Exit; + + /* the delta set is stored as a 2-dimensional array of shorts; */ + /* sign-extend signed bytes to signed shorts */ + for ( j = 0; j < varData->itemCount * varData->regionIdxCount; ) + { + for ( k = 0; k < shortDeltaCount; k++, j++ ) + { + /* read the short deltas */ + FT_Short delta; + + + if ( FT_READ_SHORT( delta ) ) + goto Exit; + + varData->deltaSet[j] = delta; + } + + for ( ; k < varData->regionIdxCount; k++, j++ ) + { + /* read the (signed) byte deltas */ + FT_Char delta; + + + if ( FT_READ_CHAR( delta ) ) + goto Exit; + + varData->deltaSet[j] = delta; + } + } + } + + Exit: + FT_FREE( dataOffsetArray ); + + return error; + } + + + static FT_Error + ft_var_load_delta_set_index_mapping( TT_Face face, + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + + FT_UShort format; + FT_UInt entrySize; + FT_UInt innerBitCount; + FT_UInt innerIndexMask; + FT_UInt i, j; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_USHORT( format ) || + FT_READ_USHORT( map->mapCount ) ) + goto Exit; + + if ( format & 0xFFC0 ) + { + FT_TRACE2(( "bad map format %d\n", format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* bytes per entry: 1, 2, 3, or 4 */ + entrySize = ( ( format & 0x0030 ) >> 4 ) + 1; + innerBitCount = ( format & 0x000F ) + 1; + innerIndexMask = ( 1 << innerBitCount ) - 1; + + if ( FT_NEW_ARRAY( map->innerIndex, map->mapCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) ) + goto Exit; + + for ( i = 0; i < map->mapCount; i++ ) + { + FT_UInt mapData = 0; + FT_UInt outerIndex, innerIndex; + + + /* read map data one unsigned byte at a time, big endian */ + for ( j = 0; j < entrySize; j++ ) + { + FT_Byte data; + + + if ( FT_READ_BYTE( data ) ) + goto Exit; + + mapData = ( mapData << 8 ) | data; + } + + outerIndex = mapData >> innerBitCount; + + if ( outerIndex >= itemStore->dataCount ) + { + FT_TRACE2(( "outerIndex[%d] == %d out of range\n", + i, + outerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->outerIndex[i] = outerIndex; + + innerIndex = mapData & innerIndexMask; + + if ( innerIndex >= itemStore->varData[outerIndex].itemCount ) + { + FT_TRACE2(( "innerIndex[%d] == %d out of range\n", + i, + innerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->innerIndex[i] = innerIndex; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_hvvar */ + /* */ + /* <Description> */ + /* If `vertical' is zero, parse the `HVAR' table and set */ + /* `blend->hvar_loaded' to TRUE. On success, `blend->hvar_checked' */ + /* is set to TRUE. */ + /* */ + /* If `vertical' is not zero, parse the `VVAR' table and set */ + /* `blend->vvar_loaded' to TRUE. On success, `blend->vvar_checked' */ + /* is set to TRUE. */ + /* */ + /* Some memory may remain allocated on error; it is always freed in */ + /* `tt_done_blend', however. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_hvvar( TT_Face face, + FT_Bool vertical ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + + GX_HVVarTable table; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_ULong store_offset; + FT_ULong widthMap_offset; + + + if ( vertical ) + { + blend->vvar_loaded = TRUE; + + FT_TRACE2(( "VVAR " )); + + error = face->goto_table( face, TTAG_VVAR, stream, &table_len ); + } + else + { + blend->hvar_loaded = TRUE; + + FT_TRACE2(( "HVAR " )); + + error = face->goto_table( face, TTAG_HVAR, stream, &table_len ); + } + + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + goto Exit; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_READ_ULONG( store_offset ) || + FT_READ_ULONG( widthMap_offset ) ) + goto Exit; + + if ( vertical ) + { + if ( FT_NEW( blend->vvar_table ) ) + goto Exit; + table = blend->vvar_table; + } + else + { + if ( FT_NEW( blend->hvar_table ) ) + goto Exit; + table = blend->hvar_table; + } + + error = ft_var_load_item_variation_store( + face, + table_offset + store_offset, + &table->itemStore ); + if ( error ) + goto Exit; + + if ( widthMap_offset ) + { + error = ft_var_load_delta_set_index_mapping( + face, + table_offset + widthMap_offset, + &table->widthMap, + &table->itemStore ); + if ( error ) + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + error = FT_Err_Ok; + + Exit: + if ( !error ) + { + if ( vertical ) + { + blend->vvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* TSB, BSB, or VORG values; we thus don't have to implement */ + /* support for those three item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_VADVANCE; + } + else + { + blend->hvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* LSB or RSB values; we thus don't have to implement */ + /* support for those two item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_HADVANCE; + } + } + + return error; + } + + + static FT_Int + ft_var_get_item_delta( TT_Face face, + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ) + { + GX_ItemVarData varData; + FT_Short* deltaSet; + + FT_UInt master, j; + FT_Fixed netAdjustment = 0; /* accumulated adjustment */ + FT_Fixed scaledDelta; + FT_Fixed delta; + + + /* See pseudo code from `Font Variations Overview' */ + /* in the OpenType specification. */ + + varData = &itemStore->varData[outerIndex]; + deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex]; + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < varData->regionIdxCount; master++ ) + { + FT_Fixed scalar = FT_FIXED_ONE; + FT_UInt regionIndex = varData->regionIndices[master]; + + GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList; + + + /* inner loop steps through axes in this region */ + for ( j = 0; j < itemStore->axisCount; j++, axis++ ) + { + FT_Fixed axisScalar; + + + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + axisScalar = FT_FIXED_ONE; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + axisScalar = FT_FIXED_ONE; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + axisScalar = FT_FIXED_ONE; + + /* ignore this region if coords are out of range */ + else if ( face->blend->normalizedcoords[j] < axis->startCoord || + face->blend->normalizedcoords[j] > axis->endCoord ) + axisScalar = 0; + + /* calculate a proportional factor */ + else + { + if ( face->blend->normalizedcoords[j] == axis->peakCoord ) + axisScalar = FT_FIXED_ONE; + else if ( face->blend->normalizedcoords[j] < axis->peakCoord ) + axisScalar = + FT_DivFix( face->blend->normalizedcoords[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + axisScalar = + FT_DivFix( axis->endCoord - face->blend->normalizedcoords[j], + axis->endCoord - axis->peakCoord ); + } + + /* take product of all the axis scalars */ + scalar = FT_MulFix( scalar, axisScalar ); + + } /* per-axis loop */ + + /* get the scaled delta for this region */ + delta = FT_intToFixed( deltaSet[master] ); + scaledDelta = FT_MulFix( scalar, delta ); + + /* accumulate the adjustments from each region */ + netAdjustment = netAdjustment + scaledDelta; + + } /* per-region loop */ + + return FT_fixedToInt( netAdjustment ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_hvadvance_adjust */ + /* */ + /* <Description> */ + /* Apply `HVAR' advance width or `VVAR' advance height adjustment of */ + /* a given glyph. */ + /* */ + /* <Input> */ + /* gindex :: The glyph index. */ + /* */ + /* vertical :: If set, handle `VVAR' table. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + /* adelta :: Points to width or height value that gets modified. */ + /* */ + static FT_Error + tt_hvadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue, + FT_Bool vertical ) + { + FT_Error error = FT_Err_Ok; + FT_UInt innerIndex, outerIndex; + FT_Int delta; + + GX_HVVarTable table; + + + if ( !face->doblend || !face->blend ) + goto Exit; + + if ( vertical ) + { + if ( !face->blend->vvar_loaded ) + { + /* initialize vvar table */ + face->blend->vvar_error = ft_var_load_hvvar( face, 1 ); + } + + if ( !face->blend->vvar_checked ) + { + error = face->blend->vvar_error; + goto Exit; + } + + table = face->blend->vvar_table; + } + else + { + if ( !face->blend->hvar_loaded ) + { + /* initialize hvar table */ + face->blend->hvar_error = ft_var_load_hvvar( face, 0 ); + } + + if ( !face->blend->hvar_checked ) + { + error = face->blend->hvar_error; + goto Exit; + } + + table = face->blend->hvar_table; + } + + /* advance width or height adjustments are always present in an */ + /* `HVAR' or `VVAR' table; no need to test for this capability */ + + if ( table->widthMap.innerIndex ) + { + FT_UInt idx = gindex; + + + if ( idx >= table->widthMap.mapCount ) + idx = table->widthMap.mapCount - 1; + + /* trust that HVAR parser has checked indices */ + outerIndex = table->widthMap.outerIndex[idx]; + innerIndex = table->widthMap.innerIndex[idx]; + } + else + { + GX_ItemVarData varData; + + + /* no widthMap data */ + outerIndex = 0; + innerIndex = gindex; + + varData = &table->itemStore.varData[outerIndex]; + if ( gindex >= varData->itemCount ) + { + FT_TRACE2(( "gindex %d out of range\n", gindex )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + delta = ft_var_get_item_delta( face, + &table->itemStore, + outerIndex, + innerIndex ); + + FT_TRACE5(( "%s value %d adjusted by %d units (%s)\n", + vertical ? "vertical height" : "horizontal width", + *avalue, + delta, + vertical ? "VVAR" : "HVAR" )); + + *avalue += delta; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_hadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( face, gindex, avalue, 0 ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_vadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( face, gindex, avalue, 1 ); + } + + +#define GX_VALUE_SIZE 8 + + /* all values are FT_Short or FT_UShort entities; */ + /* we treat them consistently as FT_Short */ +#define GX_VALUE_CASE( tag, dflt ) \ + case MVAR_TAG_ ## tag : \ + p = (FT_Short*)&face->dflt; \ + break + +#define GX_GASP_CASE( idx ) \ + case MVAR_TAG_GASP_ ## idx : \ + if ( idx < face->gasp.numRanges - 1 ) \ + p = (FT_Short*)&face->gasp.gaspRanges[idx].maxPPEM; \ + else \ + p = NULL; \ + break + + + static FT_Short* + ft_var_get_value_pointer( TT_Face face, + FT_ULong mvar_tag ) + { + FT_Short* p; + + + switch ( mvar_tag ) + { + GX_GASP_CASE( 0 ); + GX_GASP_CASE( 1 ); + GX_GASP_CASE( 2 ); + GX_GASP_CASE( 3 ); + GX_GASP_CASE( 4 ); + GX_GASP_CASE( 5 ); + GX_GASP_CASE( 6 ); + GX_GASP_CASE( 7 ); + GX_GASP_CASE( 8 ); + GX_GASP_CASE( 9 ); + + GX_VALUE_CASE( CPHT, os2.sCapHeight ); + GX_VALUE_CASE( HASC, os2.sTypoAscender ); + GX_VALUE_CASE( HCLA, os2.usWinAscent ); + GX_VALUE_CASE( HCLD, os2.usWinDescent ); + GX_VALUE_CASE( HCOF, horizontal.caret_Offset ); + GX_VALUE_CASE( HCRN, horizontal.caret_Slope_Run ); + GX_VALUE_CASE( HCRS, horizontal.caret_Slope_Rise ); + GX_VALUE_CASE( HDSC, os2.sTypoDescender ); + GX_VALUE_CASE( HLGP, os2.sTypoLineGap ); + GX_VALUE_CASE( SBXO, os2.ySubscriptXOffset); + GX_VALUE_CASE( SBXS, os2.ySubscriptXSize ); + GX_VALUE_CASE( SBYO, os2.ySubscriptYOffset ); + GX_VALUE_CASE( SBYS, os2.ySubscriptYSize ); + GX_VALUE_CASE( SPXO, os2.ySuperscriptXOffset ); + GX_VALUE_CASE( SPXS, os2.ySuperscriptXSize ); + GX_VALUE_CASE( SPYO, os2.ySuperscriptYOffset ); + GX_VALUE_CASE( SPYS, os2.ySuperscriptYSize ); + GX_VALUE_CASE( STRO, os2.yStrikeoutPosition ); + GX_VALUE_CASE( STRS, os2.yStrikeoutSize ); + GX_VALUE_CASE( UNDO, postscript.underlinePosition ); + GX_VALUE_CASE( UNDS, postscript.underlineThickness ); + GX_VALUE_CASE( VASC, vertical.Ascender ); + GX_VALUE_CASE( VCOF, vertical.caret_Offset ); + GX_VALUE_CASE( VCRN, vertical.caret_Slope_Run ); + GX_VALUE_CASE( VCRS, vertical.caret_Slope_Rise ); + GX_VALUE_CASE( VDSC, vertical.Descender ); + GX_VALUE_CASE( VLGP, vertical.Line_Gap ); + GX_VALUE_CASE( XHGT, os2.sxHeight ); + + default: + /* ignore unknown tag */ + p = NULL; + } + + return p; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_mvar */ + /* */ + /* <Description> */ + /* Parse the `MVAR' table. */ + /* */ + /* Some memory may remain allocated on error; it is always freed in */ + /* `tt_done_blend', however. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_mvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + GX_ItemVarStore itemStore; + GX_Value value, limit; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_UShort store_offset; + FT_ULong records_offset; + + + FT_TRACE2(( "MVAR " )); + + error = face->goto_table( face, TTAG_MVAR, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + return; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + return; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + return; + } + + if ( FT_NEW( blend->mvar_table ) ) + return; + + /* skip reserved entry and value record size */ + if ( FT_STREAM_SKIP( 4 ) || + FT_READ_USHORT( blend->mvar_table->valueCount ) || + FT_READ_USHORT( store_offset ) ) + return; + + records_offset = FT_STREAM_POS(); + + error = ft_var_load_item_variation_store( + face, + table_offset + store_offset, + &blend->mvar_table->itemStore ); + if ( error ) + return; + + if ( FT_NEW_ARRAY( blend->mvar_table->values, + blend->mvar_table->valueCount ) ) + return; + + if ( FT_STREAM_SEEK( records_offset ) || + FT_FRAME_ENTER( blend->mvar_table->valueCount * GX_VALUE_SIZE ) ) + return; + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + itemStore = &blend->mvar_table->itemStore; + + for ( ; value < limit; value++ ) + { + value->tag = FT_GET_ULONG(); + value->outerIndex = FT_GET_USHORT(); + value->innerIndex = FT_GET_USHORT(); + + if ( value->outerIndex >= itemStore->dataCount || + value->innerIndex >= itemStore->varData[value->outerIndex] + .itemCount ) + { + error = FT_THROW( Invalid_Table ); + break; + } + } + + FT_FRAME_EXIT(); + + if ( error ) + return; + + FT_TRACE2(( "loaded\n" )); + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + + /* save original values of the data MVAR is going to modify */ + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + + + if ( p ) + value->unmodified = *p; +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE1(( "ft_var_load_mvar: Ignoring unknown tag `%c%c%c%c'\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ) )); +#endif + } + + face->variation_support |= TT_FACE_FLAG_VAR_MVAR; + } + + + static FT_Error + tt_size_reset_iterator( FT_ListNode node, + void* user ) + { + TT_Size size = (TT_Size)node->data; + + FT_UNUSED( user ); + + + tt_size_reset( size, 1 ); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_apply_mvar */ + /* */ + /* <Description> */ + /* Apply `MVAR' table adjustments. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + FT_LOCAL_DEF( void ) + tt_apply_mvar( TT_Face face ) + { + GX_Blend blend = face->blend; + GX_Value value, limit; + + + if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) + return; + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + FT_Int delta; + + + delta = ft_var_get_item_delta( face, + &blend->mvar_table->itemStore, + value->outerIndex, + value->innerIndex ); + + if ( p ) + { + FT_TRACE5(( "value %c%c%c%c (%d units) adjusted by %d units (MVAR)\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ), + value->unmodified, + delta )); + + /* since we handle both signed and unsigned values as FT_Short, */ + /* ensure proper overflow arithmetic */ + *p = (FT_Short)( value->unmodified + (FT_Short)delta ); + } + } + + /* adjust all derived values */ + { + FT_Face root = &face->root; + + + if ( face->os2.version != 0xFFFFU ) + { + if ( face->os2.sTypoAscender || face->os2.sTypoDescender ) + { + root->ascender = face->os2.sTypoAscender; + root->descender = face->os2.sTypoDescender; + + root->height = root->ascender - root->descender + + face->os2.sTypoLineGap; + } + else + { + root->ascender = (FT_Short)face->os2.usWinAscent; + root->descender = -(FT_Short)face->os2.usWinDescent; + + root->height = root->ascender - root->descender; + } + } + + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + + /* iterate over all FT_Size objects and call `tt_size_reset' */ + /* to propagate the metrics changes */ + FT_List_Iterate( &root->sizes_list, + tt_size_reset_iterator, + NULL ); + } + } + + typedef struct GX_GVar_Head_ { FT_Long version; @@ -453,10 +1442,10 @@ FT_TRACE2(( "GVAR " )); - if ( ( error = face->goto_table( face, - TTAG_gvar, - stream, - &table_len ) ) != 0 ) + if ( FT_SET_ERROR( face->goto_table( face, + TTAG_gvar, + stream, + &table_len ) ) ) { FT_TRACE2(( "is missing\n" )); goto Exit; @@ -491,10 +1480,9 @@ goto Exit; } - /* rough sanity check: offsets can be either 2 or 4 bytes, */ - /* and a single variation needs at least 4 bytes per glyph */ + /* rough sanity check: offsets can be either 2 or 4 bytes */ if ( (FT_ULong)gvar_head.glyphCount * - ( ( gvar_head.flags & 1 ) ? 8 : 6 ) > table_len ) + ( ( gvar_head.flags & 1 ) ? 4 : 2 ) > table_len ) { FT_TRACE1(( "ft_var_load_gvar: invalid number of glyphs\n" )); error = FT_THROW( Invalid_Table ); @@ -555,7 +1543,7 @@ { blend->tuplecoords[i * gvar_head.axisCount + j] = FT_GET_SHORT() * 4; /* convert to FT_Fixed */ - FT_TRACE5(( "%.4f ", + FT_TRACE5(( "%.5f ", blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 )); } FT_TRACE5(( "]\n" )); @@ -611,10 +1599,10 @@ for ( i = 0; i < blend->num_axis; i++ ) { - FT_TRACE6(( " axis coordinate %d (%.4f):\n", + FT_TRACE6(( " axis coordinate %d (%.5f):\n", i, blend->normalizedcoords[i] / 65536.0 )); if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) - FT_TRACE6(( " intermediate coordinates %d (%.4f, %.4f):\n", + FT_TRACE6(( " intermediate coordinates %d (%.5f, %.5f):\n", i, im_start_coords[i] / 65536.0, im_end_coords[i] / 65536.0 )); @@ -639,7 +1627,7 @@ if ( blend->normalizedcoords[i] == tuple_coords[i] ) { - FT_TRACE6(( " tuple coordinate value %.4f fits perfectly\n", + FT_TRACE6(( " tuple coordinate value %.5f fits perfectly\n", tuple_coords[i] / 65536.0 )); /* `apply' does not change */ continue; @@ -652,13 +1640,13 @@ if ( blend->normalizedcoords[i] < FT_MIN( 0, tuple_coords[i] ) || blend->normalizedcoords[i] > FT_MAX( 0, tuple_coords[i] ) ) { - FT_TRACE6(( " tuple coordinate value %.4f is exceeded, stop\n", + FT_TRACE6(( " tuple coordinate value %.5f is exceeded, stop\n", tuple_coords[i] / 65536.0 )); apply = 0; break; } - FT_TRACE6(( " tuple coordinate value %.4f fits\n", + FT_TRACE6(( " tuple coordinate value %.5f fits\n", tuple_coords[i] / 65536.0 )); apply = FT_MulDiv( apply, blend->normalizedcoords[i], @@ -671,7 +1659,7 @@ if ( blend->normalizedcoords[i] < im_start_coords[i] || blend->normalizedcoords[i] > im_end_coords[i] ) { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] is exceeded," + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] is exceeded," " stop\n", im_start_coords[i] / 65536.0, im_end_coords[i] / 65536.0 )); @@ -681,7 +1669,7 @@ else if ( blend->normalizedcoords[i] < tuple_coords[i] ) { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] fits\n", + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] fits\n", im_start_coords[i] / 65536.0, im_end_coords[i] / 65536.0 )); apply = FT_MulDiv( apply, @@ -691,7 +1679,7 @@ else { - FT_TRACE6(( " intermediate tuple range [%.4f;%.4f] fits\n", + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] fits\n", im_start_coords[i] / 65536.0, im_end_coords[i] / 65536.0 )); apply = FT_MulDiv( apply, @@ -701,12 +1689,196 @@ } } - FT_TRACE6(( " apply factor is %.4f\n", apply / 65536.0 )); + FT_TRACE6(( " apply factor is %.5f\n", apply / 65536.0 )); return apply; } + /* convert from design coordinates to normalized coordinates */ + + static void + ft_var_to_normalized( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* normalized ) + { + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i, j; + FT_Var_Axis* a; + GX_AVarSegment av; + + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_to_normalized:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + /* Axis normalization is a two-stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + FT_TRACE5(( "design coordinates:\n" )); + + a = mmvar->axis; + for ( i = 0; i < num_coords; i++, a++ ) + { + FT_Fixed coord = coords[i]; + + + FT_TRACE5(( " %.5f\n", coord / 65536.0 )); + if ( coord > a->maximum || coord < a->minimum ) + { + FT_TRACE1(( + "ft_var_to_normalized: design coordinate %.5f\n" + " is out of range [%.5f;%.5f]; clamping\n", + coord / 65536.0, + a->minimum / 65536.0, + a->maximum / 65536.0 )); + + if ( coord > a->maximum) + coord = a->maximum; + else + coord = a->minimum; + } + + if ( coord < a->def ) + normalized[i] = -FT_DivFix( coords[i] - a->def, + a->minimum - a->def ); + else if ( coord > a->def ) + normalized[i] = FT_DivFix( coords[i] - a->def, + a->maximum - a->def ); + else + normalized[i] = 0; + } + + FT_TRACE5(( "\n" )); + + for ( ; i < mmvar->num_axis; i++ ) + normalized[i] = 0; + + if ( blend->avar_segment ) + { + FT_TRACE5(( "normalized design coordinates" + " before applying `avar' data:\n" )); + + av = blend->avar_segment; + for ( i = 0; i < mmvar->num_axis; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + FT_TRACE5(( " %.5f\n", normalized[i] / 65536.0 )); + + normalized[i] = + FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + } + } + + + /* convert from normalized coordinates to design coordinates */ + + static void + ft_var_to_design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* design ) + { + GX_Blend blend; + FT_MM_Var* mmvar; + FT_Var_Axis* a; + + FT_UInt i, j, nc; + + + blend = face->blend; + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "ft_var_to_design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( face->doblend ) + { + for ( i = 0; i < nc; i++ ) + design[i] = coords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + design[i] = 0; + } + + for ( ; i < num_coords; i++ ) + design[i] = 0; + + if ( blend->avar_segment ) + { + GX_AVarSegment av = blend->avar_segment; + + + FT_TRACE5(( "design coordinates" + " after removing `avar' distortion:\n" )); + + for ( i = 0; i < nc; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( design[i] < av->correspondence[j].toCoord ) + { + design[i] = + FT_MulDiv( design[i] - av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord ) + + av->correspondence[j - 1].fromCoord; + + FT_TRACE5(( " %.5f\n", design[i] / 65536.0 )); + break; + } + } + } + } + + mmvar = blend->mmvar; + a = mmvar->axis; + + for ( i = 0; i < nc; i++, a++ ) + { + if ( design[i] < 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->def - a->minimum ); + else if ( design[i] > 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->maximum - a->def ); + else + design[i] = a->def; + } + } + + /*************************************************************************/ /*************************************************************************/ /***** *****/ @@ -720,7 +1892,6 @@ { FT_Long version; FT_UShort offsetToData; - FT_UShort countSizePairs; FT_UShort axisCount; FT_UShort axisSize; FT_UShort instanceCount; @@ -748,7 +1919,8 @@ /* */ /* <Description> */ /* Check that the font's `fvar' table is valid, parse it, and return */ - /* those data. */ + /* those data. It also loads (and parses) the `MVAR' table, if */ + /* possible. */ /* */ /* <InOut> */ /* face :: The font face. */ @@ -770,13 +1942,17 @@ FT_ULong table_len; FT_Error error = FT_Err_Ok; FT_ULong fvar_start; - FT_Int i, j; + FT_UInt i, j; FT_MM_Var* mmvar = NULL; FT_Fixed* next_coords; + FT_Fixed* nsc; FT_String* next_name; FT_Var_Axis* a; + FT_Fixed* c; FT_Var_Named_Style* ns; GX_FVar_Head fvar_head; + FT_Bool usePsName; + FT_UInt num_instances; static const FT_Frame_Field fvar_fields[] = { @@ -785,13 +1961,13 @@ #define FT_STRUCTURE GX_FVar_Head FT_FRAME_START( 16 ), - FT_FRAME_LONG ( version ), - FT_FRAME_USHORT( offsetToData ), - FT_FRAME_USHORT( countSizePairs ), - FT_FRAME_USHORT( axisCount ), - FT_FRAME_USHORT( axisSize ), - FT_FRAME_USHORT( instanceCount ), - FT_FRAME_USHORT( instanceSize ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT ( offsetToData ), + FT_FRAME_SKIP_SHORT, + FT_FRAME_USHORT ( axisCount ), + FT_FRAME_USHORT ( axisSize ), + FT_FRAME_USHORT ( instanceCount ), + FT_FRAME_USHORT ( instanceSize ), FT_FRAME_END }; @@ -815,21 +1991,26 @@ /* read the font data and set up the internal representation */ /* if not already done */ - if ( face->blend == NULL ) + if ( !face->blend ) { FT_TRACE2(( "FVAR " )); /* both `fvar' and `gvar' must be present */ - if ( ( error = face->goto_table( face, TTAG_gvar, - stream, &table_len ) ) != 0 ) + if ( FT_SET_ERROR( face->goto_table( face, TTAG_gvar, + stream, &table_len ) ) ) { - FT_TRACE1(( "\n" - "TT_Get_MM_Var: `gvar' table is missing\n" )); - goto Exit; + /* CFF2 is an alternate to gvar here */ + if ( FT_SET_ERROR( face->goto_table( face, TTAG_CFF2, + stream, &table_len ) ) ) + { + FT_TRACE1(( "\n" + "TT_Get_MM_Var: `gvar' or `CFF2' table is missing\n" )); + goto Exit; + } } - if ( ( error = face->goto_table( face, TTAG_fvar, - stream, &table_len ) ) != 0 ) + if ( FT_SET_ERROR( face->goto_table( face, TTAG_fvar, + stream, &table_len ) ) ) { FT_TRACE1(( "is missing\n" )); goto Exit; @@ -837,30 +2018,13 @@ fvar_start = FT_STREAM_POS( ); + /* the validity of the `fvar' header data was already checked */ + /* in function `sfnt_init_face' */ if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) goto Exit; - if ( fvar_head.version != (FT_Long)0x00010000L || -#if 0 - /* fonts like `JamRegular.ttf' have an incorrect value for */ - /* `countSizePairs'; since value 2 is hard-coded in `fvar' */ - /* version 1.0, we simply ignore it */ - fvar_head.countSizePairs != 2 || -#endif - fvar_head.axisSize != 20 || - /* axisCount limit implied by 16-bit instanceSize */ - fvar_head.axisCount > 0x3FFE || - fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || - /* instanceCount limit implied by limited range of name IDs */ - fvar_head.instanceCount > 0x7EFF || - fvar_head.offsetToData + fvar_head.axisCount * 20U + - fvar_head.instanceCount * fvar_head.instanceSize > table_len ) - { - FT_TRACE1(( "\n" - "TT_Get_MM_Var: invalid `fvar' header\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; - } + usePsName = FT_BOOL( fvar_head.instanceSize == + 6 + 4 * fvar_head.axisCount ); FT_TRACE2(( "loaded\n" )); @@ -869,12 +2033,18 @@ if ( FT_NEW( face->blend ) ) goto Exit; - /* cannot overflow 32-bit arithmetic because of limits above */ + /* `num_instances' holds the number of all named instances, */ + /* including the default instance which might be missing */ + /* in fvar's table of named instances */ + num_instances = face->root.style_flags >> 16; + + /* cannot overflow 32-bit arithmetic because of the size limits */ + /* used in the `fvar' table validity check in `sfnt_init_face' */ face->blend->mmvar_len = sizeof ( FT_MM_Var ) + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + - fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + - fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + + num_instances * sizeof ( FT_Var_Named_Style ) + + num_instances * fvar_head.axisCount * sizeof ( FT_Fixed ) + 5 * fvar_head.axisCount; if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) @@ -891,15 +2061,15 @@ /* may have a different number of designs */ /* (or tuples, as called by Apple) */ mmvar->num_namedstyles = - fvar_head.instanceCount; + num_instances; mmvar->axis = (FT_Var_Axis*)&( mmvar[1] ); mmvar->namedstyle = (FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] ); next_coords = - (FT_Fixed*)&( mmvar->namedstyle[fvar_head.instanceCount] ); - for ( i = 0; i < fvar_head.instanceCount; i++ ) + (FT_Fixed*)&( mmvar->namedstyle[num_instances] ); + for ( i = 0; i < num_instances; i++ ) { mmvar->namedstyle[i].coords = next_coords; next_coords += fvar_head.axisCount; @@ -937,7 +2107,18 @@ a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); a->name[4] = '\0'; - FT_TRACE5(( " \"%s\": minimum=%.4f, default=%.4f, maximum=%.4f\n", + if ( a->minimum > a->def || + a->def > a->maximum ) + { + FT_TRACE2(( "TT_Get_MM_Var:" + " invalid \"%s\" axis record; disabling\n", + a->name )); + + a->minimum = a->def; + a->maximum = a->def; + } + + FT_TRACE5(( " \"%s\": minimum=%.5f, default=%.5f, maximum=%.5f\n", a->name, a->minimum / 65536.0, a->def / 65536.0, @@ -948,25 +2129,99 @@ FT_TRACE5(( "\n" )); - ns = mmvar->namedstyle; + /* named instance coordinates are stored as design coordinates; */ + /* we have to convert them to normalized coordinates also */ + if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords, + fvar_head.axisCount * num_instances ) ) + goto Exit; + + if ( fvar_head.instanceCount && !face->blend->avar_loaded ) + ft_var_load_avar( face ); + + ns = mmvar->namedstyle; + nsc = face->blend->normalized_stylecoords; for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) { - if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) + /* PostScript names add 2 bytes to the instance record size */ + if ( FT_FRAME_ENTER( ( usePsName ? 6L : 4L ) + + 4L * fvar_head.axisCount ) ) goto Exit; ns->strid = FT_GET_USHORT(); (void) /* flags = */ FT_GET_USHORT(); - for ( j = 0; j < fvar_head.axisCount; j++ ) - ns->coords[j] = FT_GET_LONG(); + c = ns->coords; + for ( j = 0; j < fvar_head.axisCount; j++, c++ ) + *c = FT_GET_LONG(); + + if ( usePsName ) + ns->psid = FT_GET_USHORT(); + + ft_var_to_normalized( face, + fvar_head.axisCount, + ns->coords, + nsc ); + nsc += fvar_head.axisCount; FT_FRAME_EXIT(); } + + if ( num_instances != fvar_head.instanceCount ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Int found, dummy1, dummy2; + FT_UInt strid = 0xFFFFFFFFUL; + + + /* the default instance is missing in array the */ + /* of named instances; try to synthesize an entry */ + found = sfnt->get_name_id( face, + TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY; + else + { + found = sfnt->get_name_id( face, + TT_NAME_ID_FONT_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_FONT_SUBFAMILY; + } + + if ( found ) + { + found = sfnt->get_name_id( face, + TT_NAME_ID_PS_NAME, + &dummy1, + &dummy2 ); + if ( found ) + { + FT_TRACE5(( "TT_Get_MM_Var:" + " Adding default instance to named instances\n" )); + + ns = &mmvar->namedstyle[fvar_head.instanceCount]; + + ns->strid = strid; + ns->psid = TT_NAME_ID_PS_NAME; + + a = mmvar->axis; + c = ns->coords; + for ( j = 0; j < fvar_head.axisCount; j++, a++, c++ ) + *c = a->def; + } + } + } + + ft_var_load_mvar( face ); } /* fill the output array if requested */ - if ( master != NULL ) + if ( master ) { FT_UInt n; @@ -1016,40 +2271,17 @@ } - /*************************************************************************/ - /* */ - /* <Function> */ - /* TT_Set_MM_Blend */ - /* */ - /* <Description> */ - /* Set the blend (normalized) coordinates for this instance of the */ - /* font. Check that the `gvar' table is reasonable and does some */ - /* initial preparation. */ - /* */ - /* <InOut> */ - /* face :: The font. */ - /* Initialize the blend structure with `gvar' data. */ - /* */ - /* <Input> */ - /* num_coords :: The number of available coordinates. If it is */ - /* larger than the number of axes, ignore the excess */ - /* values. If it is smaller than the number of axes, */ - /* use the default value (0) for the remaining axes. */ - /* */ - /* coords :: An array of `num_coords', each between [-1,1]. */ - /* */ - /* <Return> */ - /* FreeType error code. 0 means success. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - TT_Set_MM_Blend( TT_Face face, + static FT_Error + tt_set_mm_blend( TT_Face face, FT_UInt num_coords, - FT_Fixed* coords ) + FT_Fixed* coords, + FT_Bool set_design_coords ) { FT_Error error = FT_Err_Ok; GX_Blend blend; FT_MM_Var* mmvar; - FT_UInt i; + FT_UInt i, j; + FT_Bool is_default_instance = 1; FT_Memory memory = face->root.memory; enum @@ -1063,9 +2295,9 @@ face->doblend = FALSE; - if ( face->blend == NULL ) + if ( !face->blend ) { - if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 ) + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) goto Exit; } @@ -1074,7 +2306,8 @@ if ( num_coords > mmvar->num_axis ) { - FT_TRACE2(( "TT_Set_MM_Blend: only using first %d of %d coordinates\n", + FT_TRACE2(( "TT_Set_MM_Blend:" + " only using first %d of %d coordinates\n", mmvar->num_axis, num_coords )); num_coords = mmvar->num_axis; } @@ -1083,24 +2316,33 @@ for ( i = 0; i < num_coords; i++ ) { - FT_TRACE5(( " %.4f\n", coords[i] / 65536.0 )); + FT_TRACE5(( " %.5f\n", coords[i] / 65536.0 )); if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) { - FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.4f\n" + FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.5f\n" " is out of range [-1;1]\n", coords[i] / 65536.0 )); error = FT_THROW( Invalid_Argument ); goto Exit; } + + if ( coords[i] != 0 ) + is_default_instance = 0; } FT_TRACE5(( "\n" )); - if ( blend->glyphoffsets == NULL ) - if ( ( error = ft_var_load_gvar( face ) ) != 0 ) + if ( !face->is_cff2 && !blend->glyphoffsets ) + if ( FT_SET_ERROR( ft_var_load_gvar( face ) ) ) + goto Exit; + + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) goto Exit; + } - if ( blend->normalizedcoords == NULL ) + if ( !blend->normalizedcoords ) { if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) ) goto Exit; @@ -1144,9 +2386,15 @@ coords, num_coords * sizeof ( FT_Fixed ) ); + if ( set_design_coords ) + ft_var_to_design( face, + num_coords, + blend->normalizedcoords, + blend->coords ); + face->doblend = TRUE; - if ( face->cvt != NULL ) + if ( face->cvt ) { switch ( manageCvt ) { @@ -1171,6 +2419,36 @@ } } + /* check whether the current variation tuple coincides */ + /* with a named instance */ + + for ( i = 0; i < blend->mmvar->num_namedstyles; i++ ) + { + FT_Fixed* nsc = blend->normalized_stylecoords + i * blend->num_axis; + FT_Fixed* ns = blend->normalizedcoords; + + + for ( j = 0; j < blend->num_axis; j++, nsc++, ns++ ) + { + if ( *nsc != *ns ) + break; + } + + if ( j == blend->num_axis ) + break; + } + + /* adjust named instance index */ + face->root.face_index &= 0xFFFF; + if ( i < blend->mmvar->num_namedstyles ) + face->root.face_index |= ( i + 1 ) << 16; + + face->is_default_instance = is_default_instance; + + /* enforce recomputation of the PostScript name; */ + FT_FREE( face->postscript_name ); + face->postscript_name = NULL; + Exit: return error; } @@ -1179,6 +2457,108 @@ /*************************************************************************/ /* */ /* <Function> */ + /* TT_Set_MM_Blend */ + /* */ + /* <Description> */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* <InOut> */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: The number of available coordinates. If it is */ + /* larger than the number of axes, ignore the excess */ + /* values. If it is smaller than the number of axes, */ + /* use the default value (0) for the remaining axes. */ + /* */ + /* coords :: An array of `num_coords', each between [-1,1]. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + return tt_set_mm_blend( face, num_coords, coords, 1 ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Get_MM_Blend */ + /* */ + /* <Description> */ + /* Get the blend (normalized) coordinates for this instance of the */ + /* font. */ + /* */ + /* <InOut> */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: The number of available coordinates. If it is */ + /* larger than the number of axes, set the excess */ + /* values to 0. */ + /* */ + /* coords :: An array of `num_coords', each between [-1,1]. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; + + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } + + blend = face->blend; + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_MM_Blend:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( face->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->normalizedcoords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } + + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ /* TT_Set_Var_Design */ /* */ /* <Description> */ @@ -1206,19 +2586,21 @@ FT_UInt num_coords, FT_Fixed* coords ) { - FT_Error error = FT_Err_Ok; - FT_Fixed* normalized = NULL; - GX_Blend blend; - FT_MM_Var* mmvar; - FT_UInt i, j; - FT_Var_Axis* a; - GX_AVarSegment av; - FT_Memory memory = face->root.memory; + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = face->root.memory; + + FT_Var_Axis* a; + FT_Fixed* c; + FT_Fixed* normalized = NULL; - if ( face->blend == NULL ) + + if ( !face->blend ) { - if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 ) + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) goto Exit; } @@ -1233,79 +2615,101 @@ num_coords = mmvar->num_axis; } - /* Axis normalization is a two stage process. First we normalize */ - /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ - /* Then, if there's an `avar' table, we renormalize this range. */ + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) + goto Exit; + } + + FT_MEM_COPY( blend->coords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + a = mmvar->axis + num_coords; + c = coords + num_coords; + for ( i = num_coords; i < mmvar->num_axis; i++, a++, c++ ) + *c = a->def; if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) goto Exit; - FT_TRACE5(( "design coordinates:\n" )); + if ( !face->blend->avar_loaded ) + ft_var_load_avar( face ); - a = mmvar->axis; - for ( i = 0; i < num_coords; i++, a++ ) - { - FT_TRACE5(( " %.4f\n", coords[i] / 65536.0 )); - if ( coords[i] > a->maximum || coords[i] < a->minimum ) - { - FT_TRACE1(( "TT_Set_Var_Design: normalized design coordinate %.4f\n" - " is out of range [%.4f;%.4f]\n", - coords[i] / 65536.0, - a->minimum / 65536.0, - a->maximum / 65536.0 )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } + ft_var_to_normalized( face, num_coords, coords, normalized ); - if ( coords[i] < a->def ) - normalized[i] = -FT_DivFix( coords[i] - a->def, - a->minimum - a->def ); - else if ( a->maximum == a->def ) - normalized[i] = 0; - else - normalized[i] = FT_DivFix( coords[i] - a->def, - a->maximum - a->def ); - } + error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 ); - FT_TRACE5(( "\n" )); + Exit: + FT_FREE( normalized ); + return error; + } - for ( ; i < mmvar->num_axis; i++ ) - normalized[i] = 0; - if ( !blend->avar_checked ) - ft_var_load_avar( face ); + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Get_Var_Design */ + /* */ + /* <Description> */ + /* Get the design coordinates of the currently selected interpolated */ + /* font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* num_coords :: The number of design coordinates to retrieve. If it */ + /* is larger than the number of axes, set the excess */ + /* values to~0. */ + /* */ + /* <Output> */ + /* coords :: The design coordinates array. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; - if ( blend->avar_segment != NULL ) + + if ( !face->blend ) { - FT_TRACE5(( "normalized design coordinates" - " before applying `avar' data:\n" )); + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } - av = blend->avar_segment; - for ( i = 0; i < mmvar->num_axis; i++, av++ ) - { - for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) - { - FT_TRACE5(( " %.4f\n", normalized[i] / 65536.0 )); - if ( normalized[i] < av->correspondence[j].fromCoord ) - { - normalized[i] = - FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord, - av->correspondence[j].toCoord - - av->correspondence[j - 1].toCoord, - av->correspondence[j].fromCoord - - av->correspondence[j - 1].fromCoord ) + - av->correspondence[j - 1].toCoord; - break; - } - } - } + blend = face->blend; + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_Var_Design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; } - error = TT_Set_MM_Blend( face, mmvar->num_axis, normalized ); + if ( face->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->coords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } - Exit: - FT_FREE( normalized ); - return error; + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; } @@ -1362,7 +2766,7 @@ FT_TRACE2(( "CVAR " )); - if ( blend == NULL ) + if ( !blend ) { FT_TRACE2(( "\n" "tt_face_vary_cvt: no blend specified\n" )); @@ -1370,7 +2774,7 @@ goto Exit; } - if ( face->cvt == NULL ) + if ( !face->cvt ) { FT_TRACE2(( "\n" "tt_face_vary_cvt: no `cvt ' table\n" )); @@ -1413,7 +2817,8 @@ offsetToData = FT_GET_USHORT(); /* rough sanity test */ - if ( offsetToData + tupleCount * 4 > table_len ) + if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > + table_len ) { FT_TRACE2(( "tt_face_vary_cvt:" " invalid CVT variation array header\n" )); @@ -1497,7 +2902,7 @@ table_len, point_count == 0 ? face->cvt_size : point_count ); - if ( localpoints == NULL || deltas == NULL ) + if ( !localpoints || !deltas ) ; /* failure, ignore it */ else if ( localpoints == ALL_POINTS ) @@ -1545,10 +2950,15 @@ for ( j = 0; j < point_count; j++ ) { - int pindex = localpoints[j]; - FT_Long orig_cvt = face->cvt[pindex]; + int pindex; + FT_Long orig_cvt; + pindex = localpoints[j]; + if ( (FT_ULong)pindex >= face->cvt_size ) + continue; + + orig_cvt = face->cvt[pindex]; face->cvt[pindex] = (FT_Short)( orig_cvt + FT_MulFix( deltas[j], apply ) ); @@ -1671,25 +3081,12 @@ d1 = out1 - in1; d2 = out2 - in2; - if ( out1 == out2 || in1 == in2 ) - { - for ( p = p1; p <= p2; p++ ) - { - out = in_points[p].x; - - if ( out <= in1 ) - out += d1; - else if ( out >= in2 ) - out += d2; - else - out = out1; - - out_points[p].x = out; - } - } - else + /* If the reference points have the same coordinate but different */ + /* delta, inferred delta is zero. Otherwise interpolate. */ + if ( in1 != in2 || out1 == out2 ) { - FT_Fixed scale = FT_DivFix( out2 - out1, in2 - in1 ); + FT_Fixed scale = in1 != in2 ? FT_DivFix( out2 - out1, in2 - in1 ) + : 0; for ( p = p1; p <= p2; p++ ) @@ -1716,12 +3113,11 @@ /* modeled after `Ins_IUP */ static void - tt_handle_deltas( FT_Outline* outline, - FT_Vector* in_points, - FT_Bool* has_delta ) + tt_interpolate_deltas( FT_Outline* outline, + FT_Vector* out_points, + FT_Vector* in_points, + FT_Bool* has_delta ) { - FT_Vector* out_points; - FT_Int first_point; FT_Int end_point; @@ -1736,8 +3132,6 @@ if ( !outline->n_contours ) return; - out_points = outline->points; - contour = 0; point = 0; @@ -1841,6 +3235,7 @@ GX_Blend blend = face->blend; FT_Vector* points_org = NULL; + FT_Vector* points_out = NULL; FT_Bool* has_delta = NULL; FT_Error error; @@ -1859,7 +3254,7 @@ FT_Short *deltas_x, *deltas_y; - if ( !face->doblend || blend == NULL ) + if ( !face->doblend || !blend ) return FT_THROW( Invalid_Argument ); if ( glyph_index >= blend->gv_glyphcnt || @@ -1872,6 +3267,7 @@ } if ( FT_NEW_ARRAY( points_org, n_points ) || + FT_NEW_ARRAY( points_out, n_points ) || FT_NEW_ARRAY( has_delta, n_points ) ) goto Fail1; @@ -1894,7 +3290,8 @@ offsetToData = FT_GET_USHORT(); /* rough sanity test */ - if ( offsetToData + tupleCount * 4 > blend->gvar_size ) + if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > + blend->gvar_size ) { FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" " invalid glyph variation array header\n" )); @@ -1922,6 +3319,9 @@ FT_TRACE5(( "gvar: there are %d tuples:\n", tupleCount & GX_TC_TUPLE_COUNT_MASK )); + for ( j = 0; j < n_points; j++ ) + points_org[j] = outline->points[j]; + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) { FT_UInt tupleDataSize; @@ -1976,10 +3376,10 @@ here = FT_Stream_FTell( stream ); + FT_Stream_SeekSet( stream, offsetToData ); + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) { - FT_Stream_SeekSet( stream, offsetToData ); - localpoints = ft_var_readpackedpoints( stream, blend->gvar_size, &point_count ); @@ -2000,7 +3400,7 @@ point_count == 0 ? n_points : point_count ); - if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) + if ( !points || !deltas_y || !deltas_x ) ; /* failure, ignore it */ else if ( points == ALL_POINTS ) @@ -2015,22 +3415,48 @@ /* this means that there are deltas for every point in the glyph */ for ( j = 0; j < n_points; j++ ) { -#ifdef FT_DEBUG_LEVEL_TRACE - FT_Vector point_org = outline->points[j]; -#endif + FT_Pos delta_x = FT_MulFix( deltas_x[j], apply ); + FT_Pos delta_y = FT_MulFix( deltas_y[j], apply ); - outline->points[j].x += FT_MulFix( deltas_x[j], apply ); - outline->points[j].y += FT_MulFix( deltas_y[j], apply ); + if ( j < n_points - 3 ) + { + outline->points[j].x += delta_x; + outline->points[j].y += delta_y; + } + else + { + /* To avoid double adjustment of advance width or height, */ + /* adjust phantom points only if there is no HVAR or VVAR */ + /* support, respectively. */ + if ( j == ( n_points - 3 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_HADVANCE ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 2 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_LSB ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 1 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_VADVANCE ) ) + outline->points[j].y += delta_y; + + else if ( j == ( n_points - 0 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_TSB ) ) + outline->points[j].y += delta_y; + } #ifdef FT_DEBUG_LEVEL_TRACE - if ( ( point_org.x != outline->points[j].x ) || - ( point_org.y != outline->points[j].y ) ) + if ( delta_x || delta_y ) { FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", j, - point_org.x, - point_org.y, + outline->points[j].x - delta_x, + outline->points[j].y - delta_y, outline->points[j].x, outline->points[j].y )); count++; @@ -2044,9 +3470,6 @@ #endif } - else if ( localpoints == NULL ) - ; /* failure, ignore it */ - else { #ifdef FT_DEBUG_LEVEL_TRACE @@ -2058,13 +3481,13 @@ /* IUP bytecode instruction */ for ( j = 0; j < n_points; j++ ) { - points_org[j] = outline->points[j]; has_delta[j] = FALSE; + points_out[j] = points_org[j]; } for ( j = 0; j < point_count; j++ ) { - FT_UShort idx = localpoints[j]; + FT_UShort idx = points[j]; if ( idx >= n_points ) @@ -2072,34 +3495,43 @@ has_delta[idx] = TRUE; - outline->points[idx].x += FT_MulFix( deltas_x[j], apply ); - outline->points[idx].y += FT_MulFix( deltas_y[j], apply ); + points_out[idx].x += FT_MulFix( deltas_x[j], apply ); + points_out[idx].y += FT_MulFix( deltas_y[j], apply ); } /* no need to handle phantom points here, */ /* since solitary points can't be interpolated */ - tt_handle_deltas( outline, - points_org, - has_delta ); + tt_interpolate_deltas( outline, + points_out, + points_org, + has_delta ); -#ifdef FT_DEBUG_LEVEL_TRACE FT_TRACE7(( " point deltas:\n" )); - for ( j = 0; j < n_points; j++) + for ( j = 0; j < n_points; j++ ) { - if ( ( points_org[j].x != outline->points[j].x ) || - ( points_org[j].y != outline->points[j].y ) ) + FT_Pos delta_x = points_out[j].x - points_org[j].x; + FT_Pos delta_y = points_out[j].y - points_org[j].y; + + + outline->points[j].x += delta_x; + outline->points[j].y += delta_y; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( delta_x || delta_y ) { FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", j, - points_org[j].x, - points_org[j].y, + outline->points[j].x - delta_x, + outline->points[j].y - delta_y, outline->points[j].x, outline->points[j].y )); count++; } +#endif } +#ifdef FT_DEBUG_LEVEL_TRACE if ( !count ) FT_TRACE7(( " none\n" )); #endif @@ -2128,6 +3560,7 @@ Fail1: FT_FREE( points_org ); + FT_FREE( points_out ); FT_FREE( has_delta ); return error; @@ -2137,37 +3570,150 @@ /*************************************************************************/ /* */ /* <Function> */ + /* tt_get_var_blend */ + /* */ + /* <Description> */ + /* An extended internal version of `TT_Get_MM_Blend' that returns */ + /* pointers instead of copying data, without any initialization of */ + /* the MM machinery in case it isn't loaded yet. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_get_var_blend( TT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + if ( face->blend ) + { + if ( num_coords ) + *num_coords = face->blend->num_axis; + if ( coords ) + *coords = face->blend->coords; + if ( normalizedcoords ) + *normalizedcoords = face->blend->normalizedcoords; + if ( mm_var ) + *mm_var = face->blend->mmvar; + } + else + { + if ( num_coords ) + *num_coords = 0; + if ( coords ) + *coords = NULL; + if ( mm_var ) + *mm_var = NULL; + } + + return FT_Err_Ok; + } + + + static void + ft_var_done_item_variation_store( TT_Face face, + GX_ItemVarStore itemStore ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_UInt i; + + + if ( itemStore->varData ) + { + for ( i = 0; i < itemStore->dataCount; i++ ) + { + FT_FREE( itemStore->varData[i].regionIndices ); + FT_FREE( itemStore->varData[i].deltaSet ); + } + + FT_FREE( itemStore->varData ); + } + + if ( itemStore->varRegionList ) + { + for ( i = 0; i < itemStore->regionCount; i++ ) + FT_FREE( itemStore->varRegionList[i].axisList ); + + FT_FREE( itemStore->varRegionList ); + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ /* tt_done_blend */ /* */ /* <Description> */ /* Free the blend internal data structure. */ /* */ FT_LOCAL_DEF( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ) + tt_done_blend( TT_Face face ) { - if ( blend != NULL ) + FT_Memory memory = FT_FACE_MEMORY( face ); + GX_Blend blend = face->blend; + + + if ( blend ) { - FT_UInt i; + FT_UInt i, num_axes; + /* blend->num_axis might not be set up yet */ + num_axes = blend->mmvar->num_axis; + + FT_FREE( blend->coords ); FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->normalized_stylecoords ); FT_FREE( blend->mmvar ); - if ( blend->avar_segment != NULL ) + if ( blend->avar_segment ) { - for ( i = 0; i < blend->num_axis; i++ ) + for ( i = 0; i < num_axes; i++ ) FT_FREE( blend->avar_segment[i].correspondence ); FT_FREE( blend->avar_segment ); } + if ( blend->hvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->hvar_table->itemStore ); + + FT_FREE( blend->hvar_table->widthMap.innerIndex ); + FT_FREE( blend->hvar_table->widthMap.outerIndex ); + FT_FREE( blend->hvar_table ); + } + + if ( blend->vvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->vvar_table->itemStore ); + + FT_FREE( blend->vvar_table->widthMap.innerIndex ); + FT_FREE( blend->vvar_table->widthMap.outerIndex ); + FT_FREE( blend->vvar_table ); + } + + if ( blend->mvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->mvar_table->itemStore ); + + FT_FREE( blend->mvar_table->values ); + FT_FREE( blend->mvar_table ); + } + FT_FREE( blend->tuplecoords ); FT_FREE( blend->glyphoffsets ); FT_FREE( blend ); } } -#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ +#else /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_gxvar_dummy; + +#endif /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ /* END */ diff --git a/thirdparty/freetype/src/truetype/ttgxvar.h b/thirdparty/freetype/src/truetype/ttgxvar.h index aa8f6ea592..7e81719a3e 100644 --- a/thirdparty/freetype/src/truetype/ttgxvar.h +++ b/thirdparty/freetype/src/truetype/ttgxvar.h @@ -4,7 +4,7 @@ /* */ /* TrueType GX Font Variation loader (specification) */ /* */ -/* Copyright 2004-2016 by */ +/* Copyright 2004-2017 by */ /* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -61,6 +61,152 @@ FT_BEGIN_HEADER } GX_AVarSegmentRec, *GX_AVarSegment; + typedef struct GX_ItemVarDataRec_ + { + FT_UInt itemCount; /* number of delta sets per item */ + FT_UInt regionIdxCount; /* number of region indices in this data */ + FT_UInt* regionIndices; /* array of `regionCount' indices; */ + /* these index `varRegionList' */ + FT_Short* deltaSet; /* array of `itemCount' deltas */ + /* use `innerIndex' for this array */ + + } GX_ItemVarDataRec, *GX_ItemVarData; + + + /* contribution of one axis to a region */ + typedef struct GX_AxisCoordsRec_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero means no effect (factor = 1) */ + FT_Fixed endCoord; + + } GX_AxisCoordsRec, *GX_AxisCoords; + + + typedef struct GX_VarRegionRec_ + { + GX_AxisCoords axisList; /* array of axisCount records */ + + } GX_VarRegionRec, *GX_VarRegion; + + + /* item variation store */ + typedef struct GX_ItemVarStoreRec_ + { + FT_UInt dataCount; + GX_ItemVarData varData; /* array of dataCount records; */ + /* use `outerIndex' for this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + GX_VarRegion varRegionList; + + } GX_ItemVarStoreRec, *GX_ItemVarStore; + + + typedef struct GX_DeltaSetIdxMapRec_ + { + FT_UInt mapCount; + FT_UInt* outerIndex; /* indices to item var data */ + FT_UInt* innerIndex; /* indices to delta set */ + + } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_HVVarTableRec */ + /* */ + /* <Description> */ + /* Data from either the `HVAR' or `VVAR' table. */ + /* */ + typedef struct GX_HVVarTableRec_ + { + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_DeltaSetIdxMapRec widthMap; /* Advance Width Mapping */ + +#if 0 + GX_DeltaSetIdxMapRec lsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec rsbMap; /* not implemented */ + + GX_DeltaSetIdxMapRec tsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec bsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec vorgMap; /* not implemented */ +#endif + + } GX_HVVarTableRec, *GX_HVVarTable; + + +#define MVAR_TAG_GASP_0 FT_MAKE_TAG( 'g', 's', 'p', '0' ) +#define MVAR_TAG_GASP_1 FT_MAKE_TAG( 'g', 's', 'p', '1' ) +#define MVAR_TAG_GASP_2 FT_MAKE_TAG( 'g', 's', 'p', '2' ) +#define MVAR_TAG_GASP_3 FT_MAKE_TAG( 'g', 's', 'p', '3' ) +#define MVAR_TAG_GASP_4 FT_MAKE_TAG( 'g', 's', 'p', '4' ) +#define MVAR_TAG_GASP_5 FT_MAKE_TAG( 'g', 's', 'p', '5' ) +#define MVAR_TAG_GASP_6 FT_MAKE_TAG( 'g', 's', 'p', '6' ) +#define MVAR_TAG_GASP_7 FT_MAKE_TAG( 'g', 's', 'p', '7' ) +#define MVAR_TAG_GASP_8 FT_MAKE_TAG( 'g', 's', 'p', '8' ) +#define MVAR_TAG_GASP_9 FT_MAKE_TAG( 'g', 's', 'p', '9' ) + +#define MVAR_TAG_CPHT FT_MAKE_TAG( 'c', 'p', 'h', 't' ) +#define MVAR_TAG_HASC FT_MAKE_TAG( 'h', 'a', 's', 'c' ) +#define MVAR_TAG_HCLA FT_MAKE_TAG( 'h', 'c', 'l', 'a' ) +#define MVAR_TAG_HCLD FT_MAKE_TAG( 'h', 'c', 'l', 'd' ) +#define MVAR_TAG_HCOF FT_MAKE_TAG( 'h', 'c', 'o', 'f' ) +#define MVAR_TAG_HCRN FT_MAKE_TAG( 'h', 'c', 'r', 'n' ) +#define MVAR_TAG_HCRS FT_MAKE_TAG( 'h', 'c', 'r', 's' ) +#define MVAR_TAG_HDSC FT_MAKE_TAG( 'h', 'd', 's', 'c' ) +#define MVAR_TAG_HLGP FT_MAKE_TAG( 'h', 'l', 'g', 'p' ) +#define MVAR_TAG_SBXO FT_MAKE_TAG( 's', 'b', 'x', 'o' ) +#define MVAR_TAG_SBXS FT_MAKE_TAG( 's', 'b', 'x', 's' ) +#define MVAR_TAG_SBYO FT_MAKE_TAG( 's', 'b', 'y', 'o' ) +#define MVAR_TAG_SBYS FT_MAKE_TAG( 's', 'b', 'y', 's' ) +#define MVAR_TAG_SPXO FT_MAKE_TAG( 's', 'p', 'x', 'o' ) +#define MVAR_TAG_SPXS FT_MAKE_TAG( 's', 'p', 'x', 's' ) +#define MVAR_TAG_SPYO FT_MAKE_TAG( 's', 'p', 'y', 'o' ) +#define MVAR_TAG_SPYS FT_MAKE_TAG( 's', 'p', 'y', 's' ) +#define MVAR_TAG_STRO FT_MAKE_TAG( 's', 't', 'r', 'o' ) +#define MVAR_TAG_STRS FT_MAKE_TAG( 's', 't', 'r', 's' ) +#define MVAR_TAG_UNDO FT_MAKE_TAG( 'u', 'n', 'd', 'o' ) +#define MVAR_TAG_UNDS FT_MAKE_TAG( 'u', 'n', 'd', 's' ) +#define MVAR_TAG_VASC FT_MAKE_TAG( 'v', 'a', 's', 'c' ) +#define MVAR_TAG_VCOF FT_MAKE_TAG( 'v', 'c', 'o', 'f' ) +#define MVAR_TAG_VCRN FT_MAKE_TAG( 'v', 'c', 'r', 'n' ) +#define MVAR_TAG_VCRS FT_MAKE_TAG( 'v', 'c', 'r', 's' ) +#define MVAR_TAG_VDSC FT_MAKE_TAG( 'v', 'd', 's', 'c' ) +#define MVAR_TAG_VLGP FT_MAKE_TAG( 'v', 'l', 'g', 'p' ) +#define MVAR_TAG_XHGT FT_MAKE_TAG( 'x', 'h', 'g', 't' ) + + + typedef struct GX_ValueRec_ + { + FT_ULong tag; + FT_UShort outerIndex; + FT_UShort innerIndex; + + FT_Short unmodified; /* values are either FT_Short or FT_UShort */ + + } GX_ValueRec, *GX_Value; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_MVarTableRec */ + /* */ + /* <Description> */ + /* Data from the `MVAR' table. */ + /* */ + typedef struct GX_MVarTableRec_ + { + FT_UShort valueCount; + + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_Value values; /* Value Records */ + + } GX_MVarTableRec, *GX_MVarTable; + + /*************************************************************************/ /* */ /* <Struct> */ @@ -68,32 +214,120 @@ FT_BEGIN_HEADER /* */ /* <Description> */ /* Data for interpolating a font from a distortable font specified */ - /* by the GX *var tables ([fgca]var). */ + /* by the GX *var tables ([fgcahvm]var). */ /* */ /* <Fields> */ - /* num_axis :: The number of axes along which interpolation */ - /* may happen */ + /* num_axis :: */ + /* The number of axes along which interpolation may happen. */ + /* */ + /* coords :: */ + /* An array of design coordinates (in user space) indicating the */ + /* contribution along each axis to the final interpolated font. */ + /* `normalizedcoords' holds the same values. */ + /* */ + /* normalizedcoords :: */ + /* An array of normalized values (between [-1,1]) indicating the */ + /* contribution along each axis to the final interpolated font. */ + /* `coords' holds the same values. */ + /* */ + /* mmvar :: */ + /* Data from the `fvar' table. */ + /* */ + /* mmvar_len :: */ + /* The length of the `mmvar' structure. */ + /* */ + /* normalized_stylecoords :: */ + /* A two-dimensional array that holds the named instance data from */ + /* `mmvar' as normalized values. */ + /* */ + /* avar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `avar' */ + /* table. */ + /* */ + /* avar_segment :: */ + /* Data from the `avar' table. */ + /* */ + /* hvar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `hvar' */ + /* table. */ + /* */ + /* hvar_checked :: */ + /* A Boolean; if set, FreeType successfully loaded and parsed the */ + /* `hvar' table. */ + /* */ + /* hvar_error :: */ + /* If loading and parsing of the `hvar' table failed, this field */ + /* holds the corresponding error code. */ + /* */ + /* hvar_table :: */ + /* Data from the `hvar' table. */ + /* */ + /* vvar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `vvar' */ + /* table. */ + /* */ + /* vvar_checked :: */ + /* A Boolean; if set, FreeType successfully loaded and parsed the */ + /* `vvar' table. */ + /* */ + /* vvar_error :: */ + /* If loading and parsing of the `vvar' table failed, this field */ + /* holds the corresponding error code. */ + /* */ + /* vvar_table :: */ + /* Data from the `vvar' table. */ + /* */ + /* mvar_table :: */ + /* Data from the `mvar' table. */ + /* */ + /* tuplecount :: */ + /* The number of shared tuples in the `gvar' table. */ + /* */ + /* tuplecoords :: */ + /* A two-dimensional array that holds the shared tuple coordinates */ + /* in the `gvar' table. */ /* */ - /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ - /* the contribution along each axis to the final */ - /* interpolated font. */ + /* gv_glyphcnt :: */ + /* The number of glyphs handled in the `gvar' table. */ + /* */ + /* glyphoffsets :: */ + /* Offsets into the glyph variation data array. */ + /* */ + /* gvar_size :: */ + /* The size of the `gvar' table. */ /* */ typedef struct GX_BlendRec_ { FT_UInt num_axis; + FT_Fixed* coords; FT_Fixed* normalizedcoords; FT_MM_Var* mmvar; FT_Offset mmvar_len; - FT_Bool avar_checked; - GX_AVarSegment avar_segment; + FT_Fixed* normalized_stylecoords; + /* normalized_stylecoords[num_namedstyles][num_axis] */ + + FT_Bool avar_loaded; + GX_AVarSegment avar_segment; /* avar_segment[num_axis] */ + + FT_Bool hvar_loaded; + FT_Bool hvar_checked; + FT_Error hvar_error; + GX_HVVarTable hvar_table; + + FT_Bool vvar_loaded; + FT_Bool vvar_checked; + FT_Error vvar_error; + GX_HVVarTable vvar_table; - FT_UInt tuplecount; /* shared tuples in `gvar' */ - FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + GX_MVarTable mvar_table; + + FT_UInt tuplecount; + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ FT_UInt gv_glyphcnt; - FT_ULong* glyphoffsets; + FT_ULong* glyphoffsets; /* glyphoffsets[gv_glyphcnt + 1] */ FT_ULong gvar_size; @@ -149,6 +383,11 @@ FT_BEGIN_HEADER FT_Fixed* coords ); FT_LOCAL( FT_Error ) + TT_Get_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) TT_Set_Var_Design( TT_Face face, FT_UInt num_coords, FT_Fixed* coords ); @@ -157,6 +396,10 @@ FT_BEGIN_HEADER TT_Get_MM_Var( TT_Face face, FT_MM_Var* *master ); + FT_LOCAL( FT_Error ) + TT_Get_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); FT_LOCAL( FT_Error ) tt_face_vary_cvt( TT_Face face, @@ -169,10 +412,28 @@ FT_BEGIN_HEADER FT_Outline* outline, FT_UInt n_points ); + FT_LOCAL( FT_Error ) + tt_hadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( FT_Error ) + tt_vadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( void ) + tt_apply_mvar( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_get_var_blend( TT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); FT_LOCAL( void ) - tt_done_blend( FT_Memory memory, - GX_Blend blend ); + tt_done_blend( TT_Face face ); FT_END_HEADER diff --git a/thirdparty/freetype/src/truetype/ttinterp.c b/thirdparty/freetype/src/truetype/ttinterp.c index 8fe83c5ea8..af31408cbf 100644 --- a/thirdparty/freetype/src/truetype/ttinterp.c +++ b/thirdparty/freetype/src/truetype/ttinterp.c @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -26,10 +26,14 @@ #include FT_TRIGONOMETRY_H #include FT_SYSTEM_H #include FT_TRUETYPE_DRIVER_H +#include FT_MULTIPLE_MASTERS_H #include "ttinterp.h" #include "tterrors.h" #include "ttsubpix.h" +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif #ifdef TT_USE_BYTECODE_INTERPRETER @@ -125,7 +129,7 @@ coderange = &exec->codeRangeTable[range - 1]; - FT_ASSERT( coderange->base != NULL ); + FT_ASSERT( coderange->base ); /* NOTE: Because the last instruction of a program may be a CALL */ /* which will return to the first byte *after* the code */ @@ -396,8 +400,9 @@ exec->maxIDefs = size->max_instruction_defs; exec->FDefs = size->function_defs; exec->IDefs = size->instruction_defs; + exec->pointSize = size->point_size; exec->tt_metrics = size->ttmetrics; - exec->metrics = size->metrics; + exec->metrics = *size->metrics; exec->maxFunc = size->max_func; exec->maxIns = size->max_ins; @@ -418,7 +423,7 @@ /* In case of multi-threading it can happen that the old size object */ /* no longer exists, thus we must clear all glyph zone references. */ - ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) ); + FT_ZERO( &exec->zp0 ); exec->zp1 = exec->zp0; exec->zp2 = exec->zp0; } @@ -681,17 +686,17 @@ /* IUP[0] */ PACK( 0, 0 ), /* IUP[1] */ PACK( 0, 0 ), - /* SHP[0] */ PACK( 0, 0 ), - /* SHP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), /* loops */ + /* SHP[1] */ PACK( 0, 0 ), /* loops */ /* SHC[0] */ PACK( 1, 0 ), /* SHC[1] */ PACK( 1, 0 ), /* SHZ[0] */ PACK( 1, 0 ), /* SHZ[1] */ PACK( 1, 0 ), - /* SHPIX */ PACK( 1, 0 ), - /* IP */ PACK( 0, 0 ), + /* SHPIX */ PACK( 1, 0 ), /* loops */ + /* IP */ PACK( 0, 0 ), /* loops */ /* MSIRP[0] */ PACK( 2, 0 ), /* MSIRP[1] */ PACK( 2, 0 ), - /* AlignRP */ PACK( 0, 0 ), + /* AlignRP */ PACK( 0, 0 ), /* loops */ /* RTDG */ PACK( 0, 0 ), /* MIAP[0] */ PACK( 2, 0 ), /* MIAP[1] */ PACK( 2, 0 ), @@ -764,7 +769,7 @@ /* SANGW */ PACK( 1, 0 ), /* AA */ PACK( 1, 0 ), - /* FlipPT */ PACK( 0, 0 ), + /* FlipPT */ PACK( 0, 0 ), /* loops */ /* FlipRgON */ PACK( 2, 0 ), /* FlipRgOFF */ PACK( 2, 0 ), /* INS_$83 */ PACK( 0, 0 ), @@ -782,8 +787,8 @@ /* INS_$8F */ PACK( 0, 0 ), /* INS_$90 */ PACK( 0, 0 ), - /* INS_$91 */ PACK( 0, 0 ), - /* INS_$92 */ PACK( 0, 0 ), + /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ + /* GETDATA */ PACK( 0, 1 ), /* INS_$93 */ PACK( 0, 0 ), /* INS_$94 */ PACK( 0, 0 ), /* INS_$95 */ PACK( 0, 0 ), @@ -1065,8 +1070,13 @@ "7 INS_$8F", "7 INS_$90", +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + "6 GETVAR", + "7 GETDATA", +#else "7 INS_$91", "7 INS_$92", +#endif "7 INS_$93", "7 INS_$94", "7 INS_$95", @@ -1603,7 +1613,7 @@ range = &exc->codeRangeTable[aRange - 1]; - if ( range->base == NULL ) /* invalid coderange */ + if ( !range->base ) /* invalid coderange */ { exc->error = FT_THROW( Invalid_CodeRange ); return FAILURE; @@ -1646,7 +1656,7 @@ /* zone :: The affected glyph zone. */ /* */ /* <Note> */ - /* See `ttinterp.h' for details on backwards compatibility mode. */ + /* See `ttinterp.h' for details on backward compatibility mode. */ /* `Touches' the point. */ /* */ static void @@ -1674,7 +1684,7 @@ /* Exception to the post-IUP curfew: Allow the x component of */ /* diagonal moves, but only post-IUP. DejaVu tries to adjust */ /* diagonal stems like on `Z' and `z' post-IUP. */ - if ( SUBPIXEL_HINTING_MINIMAL && !exc->backwards_compatibility ) + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P ); else #endif @@ -1690,10 +1700,10 @@ if ( v != 0 ) { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( !( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && - exc->iupx_called && - exc->iupy_called ) ) + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) #endif zone->cur[point].y += FT_MulDiv( distance, v, exc->F_dot_P ); @@ -1746,7 +1756,7 @@ /* */ /* The following versions are used whenever both vectors are both */ /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ - /* See `ttinterp.h' for details on backwards compatibility mode. */ + /* See `ttinterp.h' for details on backward compatibility mode. */ /* */ /*************************************************************************/ @@ -1764,7 +1774,7 @@ #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( SUBPIXEL_HINTING_MINIMAL && !exc->backwards_compatibility ) + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) zone->cur[point].x += distance; else #endif @@ -1786,7 +1796,7 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL if ( !( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && + exc->backward_compatibility && exc->iupx_called && exc->iupy_called ) ) #endif zone->cur[point].y += distance; @@ -2574,13 +2584,20 @@ Ins_MPS( TT_ExecContext exc, FT_Long* args ) { - /* Note: The point size should be irrelevant in a given font program; */ - /* we thus decide to return only the PPEM value. */ -#if 0 - args[0] = exc->metrics.pointSize; -#else - args[0] = exc->func_cur_ppem( exc ); -#endif + if ( NO_SUBPIXEL_HINTING ) + { + /* Microsoft's GDI bytecode interpreter always returns value 12; */ + /* we return the current PPEM value instead. */ + args[0] = exc->func_cur_ppem( exc ); + } + else + { + /* A possible practical application of the MPS instruction is to */ + /* implement optical scaling and similar features, which should be */ + /* based on perceptual attributes, thus independent of the */ + /* resolution. */ + args[0] = exc->pointSize; + } } @@ -2873,7 +2890,7 @@ /* */ /* NEG[]: NEGate */ /* Opcode range: 0x65 */ - /* Stack: f26.6 --> f26.6 */ + /* Stack: f26.6 --> f26.6 */ /* */ static void Ins_NEG( FT_Long* args ) @@ -3113,7 +3130,7 @@ /*************************************************************************/ /* */ /* MAX[]: MAXimum */ - /* Opcode range: 0x68 */ + /* Opcode range: 0x8B */ /* Stack: int32? int32? --> int32 */ /* */ static void @@ -3127,7 +3144,7 @@ /*************************************************************************/ /* */ /* MIN[]: MINimum */ - /* Opcode range: 0x69 */ + /* Opcode range: 0x8C */ /* Stack: int32? int32? --> int32 */ /* */ static void @@ -3371,13 +3388,27 @@ FT_Long* args ) { if ( args[0] == 0 && exc->args == 0 ) + { exc->error = FT_THROW( Bad_Argument ); + return; + } + exc->IP += args[0]; if ( exc->IP < 0 || ( exc->callTop > 0 && exc->IP > exc->callStack[exc->callTop - 1].Def->end ) ) + { exc->error = FT_THROW( Bad_Argument ); + return; + } + exc->step_ins = FALSE; + + if ( args[0] < 0 ) + { + if ( ++exc->neg_jump_counter > exc->neg_jump_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); + } } @@ -3533,6 +3564,13 @@ #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + /* FDEF is only allowed in `prep' or `fpgm' */ + if ( exc->curRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + /* some font programs are broken enough to redefine functions! */ /* We will then parse the current table. */ @@ -3932,6 +3970,10 @@ Ins_Goto_CodeRange( exc, def->range, def->start ); exc->step_ins = FALSE; + + exc->loopcall_counter += (FT_ULong)args[0]; + if ( exc->loopcall_counter > exc->loopcall_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); } return; @@ -3955,6 +3997,13 @@ TT_DefRecord* limit; + /* we enable IDEF only in `prep' or `fpgm' */ + if ( exc->curRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + /* First of all, look for the same function in our table */ def = exc->IDefs; @@ -4002,6 +4051,7 @@ exc->error = FT_THROW( Nested_DEFS ); return; case 0x2D: /* ENDF */ + def->end = exc->IP; return; } } @@ -4485,7 +4535,7 @@ /* */ /* FLIPOFF[]: Set auto-FLIP to OFF */ /* Opcode range: 0x4E */ - /* Stack: --> */ + /* Stack: --> */ /* */ static void Ins_FLIPOFF( TT_ExecContext exc ) @@ -5076,11 +5126,11 @@ #endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* Native ClearType fonts sign a waiver that turns off all backwards */ + /* Native ClearType fonts sign a waiver that turns off all backward */ /* compatibility hacks and lets them program points to the grid like */ /* it's 1996. They might sign a waiver for just one glyph, though. */ if ( SUBPIXEL_HINTING_MINIMAL ) - exc->backwards_compatibility = !FT_BOOL( L == 4 ); + exc->backward_compatibility = !FT_BOOL( L == 4 ); #endif } } @@ -5137,14 +5187,14 @@ /* */ /* SCANTYPE[]: SCAN TYPE */ /* Opcode range: 0x8D */ - /* Stack: uint32? --> */ + /* Stack: uint16 --> */ /* */ static void Ins_SCANTYPE( TT_ExecContext exc, FT_Long* args ) { if ( args[0] >= 0 ) - exc->GS.scan_type = (FT_Int)args[0]; + exc->GS.scan_type = (FT_Int)args[0] & 0xFFFF; } @@ -5168,11 +5218,11 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backwards compatibility mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && - exc->iupx_called && - exc->iupy_called ) + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) goto Fail; #endif @@ -5223,11 +5273,11 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backwards compatibility mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && - exc->iupx_called && - exc->iupy_called ) + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) return; #endif @@ -5261,11 +5311,11 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backwards compatibility mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && - exc->iupx_called && - exc->iupy_called ) + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) return; #endif @@ -5328,7 +5378,7 @@ } - /* See `ttinterp.h' for details on backwards compatibility mode. */ + /* See `ttinterp.h' for details on backward compatibility mode. */ static void Move_Zp2_Point( TT_ExecContext exc, FT_UShort point, @@ -5339,8 +5389,8 @@ if ( exc->GS.freeVector.x != 0 ) { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( !( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility ) ) + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) ) #endif exc->zp2.cur[point].x += dx; @@ -5351,10 +5401,10 @@ if ( exc->GS.freeVector.y != 0 ) { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( !( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility && - exc->iupx_called && - exc->iupy_called ) ) + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) #endif exc->zp2.cur[point].y += dy; @@ -5541,9 +5591,9 @@ FT_Int B1, B2; #endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - FT_Bool in_twilight = exc->GS.gep0 == 0 || \ - exc->GS.gep1 == 0 || \ - exc->GS.gep2 == 0; + FT_Bool in_twilight = FT_BOOL( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); #endif @@ -5651,14 +5701,14 @@ else #endif #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility ) + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) { /* Special case: allow SHPIX to move points in the twilight zone. */ /* Otherwise, treat SHPIX the same as DELTAP. Unbreaks various */ /* fonts such as older versions of Rokkitt and DTL Argo T Light */ - /* that would glitch severly after calling ALIGNRP after a blocked */ - /* SHPIX. */ + /* that would glitch severely after calling ALIGNRP after a */ + /* blocked SHPIX. */ if ( in_twilight || ( !( exc->iupx_called && exc->iupy_called ) && ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || @@ -6088,7 +6138,6 @@ exc->GS.freeVector.x != 0 && !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) control_value_cutin = minimum_distance = 0; - else #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ @@ -6417,7 +6466,7 @@ R.x = FT_MulDiv( val, dax, discriminant ); R.y = FT_MulDiv( val, day, discriminant ); - /* XXX: Block in backwards_compatibility and/or post-IUP? */ + /* XXX: Block in backward_compatibility and/or post-IUP? */ exc->zp2.cur[point].x = exc->zp1.cur[a0].x + R.x; exc->zp2.cur[point].y = exc->zp1.cur[a0].y + R.y; } @@ -6425,7 +6474,7 @@ { /* else, take the middle of the middles of A and B */ - /* XXX: Block in backwards_compatibility and/or post-IUP? */ + /* XXX: Block in backward_compatibility and/or post-IUP? */ exc->zp2.cur[point].x = ( exc->zp1.cur[a0].x + exc->zp1.cur[a1].x + exc->zp0.cur[b0].x + @@ -6502,7 +6551,9 @@ * Otherwise, by definition, the value of exc->twilight.orus[n] is (0,0), * for every n. */ - twilight = exc->GS.gep0 == 0 || exc->GS.gep1 == 0 || exc->GS.gep2 == 0; + twilight = ( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ) { @@ -6550,7 +6601,7 @@ cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base ); } - for ( ; exc->GS.loop > 0; --exc->GS.loop ) + for ( ; exc->GS.loop > 0; exc->GS.loop-- ) { FT_UInt point = (FT_UInt)exc->stack[--exc->args]; FT_F26Dot6 org_dist, cur_dist, new_dist; @@ -6815,11 +6866,11 @@ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backwards compatibility mode. */ + /* See `ttinterp.h' for details on backward compatibility mode. */ /* Allow IUP until it has been called on both axes. Immediately */ /* return on subsequent ones. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility ) + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) { if ( exc->iupx_called && exc->iupy_called ) return; @@ -7061,10 +7112,10 @@ { #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* See `ttinterp.h' for details on backwards compatibility */ - /* mode. */ - if ( SUBPIXEL_HINTING_MINIMAL && - exc->backwards_compatibility ) + /* See `ttinterp.h' for details on backward compatibility */ + /* mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) { if ( !( exc->iupx_called && exc->iupy_called ) && ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || @@ -7208,7 +7259,7 @@ { if ( exc->ignore_x_mode ) { - /* if in ClearType backwards compatibility mode, */ + /* if in ClearType backward compatibility mode, */ /* we sometimes change the TrueType version dynamically */ K = exc->rasterizer_version; FT_TRACE6(( "Setting rasterizer version %d\n", @@ -7228,7 +7279,7 @@ /* Return Bit(s): 8 */ /* */ if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated ) - K |= 0x80; + K |= 1 << 8; /********************************/ /* GLYPH STRETCHED */ @@ -7236,7 +7287,18 @@ /* Return Bit(s): 9 */ /* */ if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched ) - K |= 1 << 8; + K |= 1 << 9; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /********************************/ + /* VARIATION GLYPH */ + /* Selector Bit: 3 */ + /* Return Bit(s): 10 */ + /* */ + /* XXX: UNDOCUMENTED! */ + if ( (args[0] & 8 ) != 0 && exc->face->blend ) + K |= 1 << 10; +#endif /********************************/ /* BI-LEVEL HINTING AND */ @@ -7380,6 +7442,57 @@ } +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /*************************************************************************/ + /* */ + /* GETVARIATION[]: get normalized variation (blend) coordinates */ + /* Opcode range: 0x91 */ + /* Stack: --> f2.14... */ + /* */ + /* XXX: UNDOCUMENTED! There is no official documentation from Apple for */ + /* this bytecode instruction. Active only if a font has GX */ + /* variation axes. */ + /* */ + static void + Ins_GETVARIATION( TT_ExecContext exc, + FT_Long* args ) + { + FT_UInt num_axes = exc->face->blend->num_axis; + FT_Fixed* coords = exc->face->blend->normalizedcoords; + + FT_UInt i; + + + if ( BOUNDS( num_axes, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + for ( i = 0; i < num_axes; i++ ) + args[i] = coords[i] >> 2; /* convert 16.16 to 2.14 format */ + } + + + /*************************************************************************/ + /* */ + /* GETDATA[]: no idea what this is good for */ + /* Opcode range: 0x92 */ + /* Stack: --> 17 */ + /* */ + /* XXX: UNDOCUMENTED! There is no documentation from Apple for this */ + /* very weird bytecode instruction. */ + /* */ + static void + Ins_GETDATA( FT_Long* args ) + { + args[0] = 17; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + static void Ins_UNKNOWN( TT_ExecContext exc ) { @@ -7453,7 +7566,8 @@ FT_EXPORT_DEF( FT_Error ) TT_RunIns( TT_ExecContext exc ) { - FT_Long ins_counter = 0; /* executed instructions counter */ + FT_ULong ins_counter = 0; /* executed instructions counter */ + FT_ULong num_twilight_points; FT_UShort i; #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY @@ -7475,20 +7589,72 @@ #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL - /* Toggle backwards compatibility according to what font says, except */ + /* Toggle backward compatibility according to what font says, except */ /* when it's a `tricky' font that heavily relies on the interpreter to */ - /* render glyphs correctly, e.g. DFKai-SB. Backwards compatibility */ + /* render glyphs correctly, e.g. DFKai-SB. Backward compatibility */ /* hacks may break it. */ if ( SUBPIXEL_HINTING_MINIMAL && !FT_IS_TRICKY( &exc->face->root ) ) - exc->backwards_compatibility = !( exc->GS.instruct_control & 4 ); + exc->backward_compatibility = !( exc->GS.instruct_control & 4 ); else - exc->backwards_compatibility = FALSE; + exc->backward_compatibility = FALSE; exc->iupx_called = FALSE; exc->iupy_called = FALSE; #endif + /* We restrict the number of twilight points to a reasonable, */ + /* heuristic value to avoid slow execution of malformed bytecode. */ + num_twilight_points = FT_MAX( 30, + 2 * ( exc->pts.n_points + exc->cvtSize ) ); + if ( exc->twilight.n_points > num_twilight_points ) + { + if ( num_twilight_points > 0xFFFFU ) + num_twilight_points = 0xFFFFU; + + FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" + " from %d to the more reasonable value %d\n", + exc->twilight.n_points, + num_twilight_points )); + exc->twilight.n_points = (FT_UShort)num_twilight_points; + } + + /* Set up loop detectors. We restrict the number of LOOPCALL loops */ + /* and the number of JMPR, JROT, and JROF calls with a negative */ + /* argument to values that depend on various parameters like the */ + /* size of the CVT table or the number of points in the current */ + /* glyph (if applicable). */ + /* */ + /* The idea is that in real-world bytecode you either iterate over */ + /* all CVT entries (in the `prep' table), or over all points (or */ + /* contours, in the `glyf' table) of a glyph, and such iterations */ + /* don't happen very often. */ + exc->loopcall_counter = 0; + exc->neg_jump_counter = 0; + + /* The maximum values are heuristic. */ + if ( exc->pts.n_points ) + exc->loopcall_counter_max = FT_MAX( 50, + 10 * exc->pts.n_points ) + + FT_MAX( 50, + exc->cvtSize / 10 ); + else + exc->loopcall_counter_max = FT_MAX( 100, + 10 * exc->cvtSize ); + + /* as a protection against an unreasonable number of CVT entries */ + /* we assume at most 100 control values per glyph for the counter */ + if ( exc->loopcall_counter_max > + 100 * (FT_ULong)exc->face->root.num_glyphs ) + exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs; + + FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL" + " to %d\n", exc->loopcall_counter_max )); + + exc->neg_jump_counter_max = exc->loopcall_counter_max; + FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps" + " to %d\n", exc->neg_jump_counter_max )); + /* set PPEM and CVT functions */ exc->tt_metrics.ratio = 0; if ( exc->metrics.x_ppem != exc->metrics.y_ppem ) @@ -7566,7 +7732,21 @@ exc->args = 0; } - exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 ); +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( exc->opcode == 0x91 ) + { + /* this is very special: GETVARIATION returns */ + /* a variable number of arguments */ + + /* it is the job of the application to `activate' GX handling, */ + /* this is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + exc->new_top = exc->args + exc->face->blend->num_axis; + } + else +#endif + exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 ); /* `new_top' is the new top of the stack, after the instruction's */ /* execution. `top' will be set to `new_top' after the `switch' */ @@ -7759,7 +7939,7 @@ Ins_ALIGNPTS( exc, args ); break; - case 0x28: /* ???? */ + case 0x28: /* RAW */ Ins_UNKNOWN( exc ); break; @@ -8111,10 +8291,33 @@ Ins_INSTCTRL( exc, args ); break; - case 0x8F: + case 0x8F: /* ADJUST */ + case 0x90: /* ADJUST */ Ins_UNKNOWN( exc ); break; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + case 0x91: + /* it is the job of the application to `activate' GX handling, */ + /* this is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + Ins_GETVARIATION( exc, args ); + else + Ins_UNKNOWN( exc ); + break; + + case 0x92: + /* there is at least one MS font (LaoUI.ttf version 5.01) that */ + /* uses IDEFs for 0x91 and 0x92; for this reason we activate */ + /* GETDATA for GX fonts only, similar to GETVARIATION */ + if ( exc->face->blend ) + Ins_GETDATA( args ); + else + Ins_UNKNOWN( exc ); + break; +#endif + default: if ( opcode >= 0xE0 ) Ins_MIRP( exc, args ); @@ -8212,29 +8415,25 @@ } while ( !exc->instruction_trap ); LNo_Error_: + FT_TRACE4(( " %d instructions executed\n", ins_counter )); return FT_Err_Ok; LErrorCodeOverflow_: exc->error = FT_THROW( Code_Overflow ); LErrorLabel_: - /* If any errors have occurred, function tables may be broken. */ - /* Force a re-execution of `prep' and `fpgm' tables if no */ - /* bytecode debugger is run. */ - if ( exc->error && - !exc->instruction_trap && - exc->curRange == tt_coderange_glyph ) - { + if ( exc->error && !exc->instruction_trap ) FT_TRACE1(( " The interpreter returned error 0x%x\n", exc->error )); - exc->size->bytecode_ready = -1; - exc->size->cvt_ready = -1; - } return exc->error; } +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_interp_dummy; -#endif /* TT_USE_BYTECODE_INTERPRETER */ +#endif /* !TT_USE_BYTECODE_INTERPRETER */ /* END */ diff --git a/thirdparty/freetype/src/truetype/ttinterp.h b/thirdparty/freetype/src/truetype/ttinterp.h index df7ce51f1c..55e472091c 100644 --- a/thirdparty/freetype/src/truetype/ttinterp.h +++ b/thirdparty/freetype/src/truetype/ttinterp.h @@ -4,7 +4,7 @@ /* */ /* TrueType bytecode interpreter (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -170,6 +170,7 @@ FT_BEGIN_HEADER pts, twilight; + FT_Long pointSize; /* in 26.6 format */ FT_Size_Metrics metrics; TT_Size_Metrics tt_metrics; /* size metrics */ @@ -255,7 +256,7 @@ FT_BEGIN_HEADER * Modern TrueType fonts are usually rendered through Microsoft's * collection of rendering techniques called ClearType (e.g., subpixel * rendering and subpixel hinting). When ClearType was introduced, most - * fonts were not ready. Microsoft decided to implement a backwards + * fonts were not ready. Microsoft decided to implement a backward * compatibility mode that employed several simple to complicated * assumptions and tricks that modified the interpretation of the * bytecode contained in these fonts to make them look ClearType-y @@ -315,12 +316,12 @@ FT_BEGIN_HEADER * very specific patterns (`superhinting') for pre-ClearType-displays, * the worse the results. * - * Microsoft defines a way to turn off backwards compatibility and + * Microsoft defines a way to turn off backward compatibility and * interpret instructions as before (called `native ClearType')[2][3]. * The font designer then regains full control and is responsible for * making the font work correctly with ClearType without any * hand-holding by the interpreter or rasterizer[4]. The v40 - * interpreter assumes backwards compatibility by default, which can be + * interpreter assumes backward compatibility by default, which can be * turned off the same way by executing the following in the control * program (cf. `Ins_INSTCTRL'). * @@ -330,7 +331,7 @@ FT_BEGIN_HEADER * [1] Tricky fonts as FreeType defines them rely on the bytecode * interpreter to display correctly. Hacks can interfere with them, * so they get treated like native ClearType fonts (v40 with - * backwards compatibility turned off). Cf. `TT_RunIns'. + * backward compatibility turned off). Cf. `TT_RunIns'. * * [2] Proposed by Microsoft's Greg Hitchcock in * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx @@ -356,10 +357,10 @@ FT_BEGIN_HEADER /* is managed differently. */ FT_Bool vertical_lcd_lean; - /* Default to backwards compatibility mode in v40 interpreter. If */ + /* Default to backward compatibility mode in v40 interpreter. If */ /* this is false, it implies the interpreter is in v35 or in native */ /* ClearType mode. */ - FT_Bool backwards_compatibility; + FT_Bool backward_compatibility; /* Useful for detecting and denying post-IUP trickery that is usually */ /* used to fix pixel patterns (`superhinting'). */ @@ -407,6 +408,14 @@ FT_BEGIN_HEADER #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + /* We maintain two counters (in addition to the instruction counter) */ + /* that act as loop detectors for LOOPCALL and jump opcodes with */ + /* negative arguments. */ + FT_ULong loopcall_counter; + FT_ULong loopcall_counter_max; + FT_ULong neg_jump_counter; + FT_ULong neg_jump_counter_max; + } TT_ExecContextRec; diff --git a/thirdparty/freetype/src/truetype/ttobjs.c b/thirdparty/freetype/src/truetype/ttobjs.c index ed3be2dbee..4db0f289f8 100644 --- a/thirdparty/freetype/src/truetype/ttobjs.c +++ b/thirdparty/freetype/src/truetype/ttobjs.c @@ -4,7 +4,7 @@ /* */ /* Objects manager (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -117,7 +117,7 @@ FT_Error error; - FT_MEM_ZERO( zone, sizeof ( *zone ) ); + FT_ZERO( zone ); zone->memory = memory; if ( FT_NEW_ARRAY( zone->org, maxPoints ) || @@ -147,20 +147,43 @@ { #define TRICK_NAMES_MAX_CHARACTERS 19 -#define TRICK_NAMES_COUNT 9 +#define TRICK_NAMES_COUNT 18 static const char trick_names[TRICK_NAMES_COUNT] [TRICK_NAMES_MAX_CHARACTERS + 1] = { + /* + PostScript names are given in brackets if they differ from the + family name. The version numbers, together with the copyright or + release year data, are taken from fonts available to the + developers. + + Note that later versions of the fonts might be no longer tricky; + for example, `MingLiU' version 7.00 (file `mingliu.ttc' from + Windows 7) is an ordinary TTC with non-tricky subfonts. + */ + + "cpop", /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */ + "DFGirl-W6-WIN-BF", /* dftt-h6.ttf; version 1.00, 1993 */ "DFKaiSho-SB", /* dfkaisb.ttf */ "DFKaiShu", - "DFKai-SB", /* kaiu.ttf */ + "DFKai-SB", /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */ + "DLC", /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */ + /* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */ + "DLCHayMedium", /* dftt-b5.ttf; version 1.00, 1993 */ + "DLCHayBold", /* dftt-b7.ttf; version 1.00, 1993 */ + "DLCKaiMedium", /* dftt-k5.ttf; version 1.00, 1992 */ + "DLCLiShu", /* dftt-l5.ttf; version 1.00, 1992 */ + "DLCRoundBold", /* dftt-r7.ttf; version 1.00, 1993 */ "HuaTianKaiTi?", /* htkt2.ttf */ "HuaTianSongTi?", /* htst3.ttf */ - "Ming(for ISO10646)", /* hkscsiic.ttf & iicore.ttf */ - "MingLiU", /* mingliu.ttf & mingliu.ttc */ - "PMingLiU", /* mingliu.ttc */ - "MingLi43", /* mingli.ttf */ + "Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */ + /* iicore.ttf; version 0.07, 2007 [Ming] */ + "MingLiU", /* mingliu.ttf */ + /* mingliu.ttc; version 3.21, 2001 */ + "MingMedium", /* dftt-m5.ttf; version 1.00, 1993 [DLCMingMedium] */ + "PMingLiU", /* mingliu.ttc; version 3.21, 2001 */ + "MingLi43", /* mingli.ttf; version 1.00, 1992 */ }; int nn; @@ -242,7 +265,7 @@ tt_check_trickyness_sfnt_ids( TT_Face face ) { #define TRICK_SFNT_IDS_PER_FACE 3 -#define TRICK_SFNT_IDS_NUM_FACES 18 +#define TRICK_SFNT_IDS_NUM_FACES 19 static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] [TRICK_SFNT_IDS_PER_FACE] = { @@ -266,7 +289,7 @@ { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */ { 0x13A42602UL, 0x0000007EUL } /* prep */ }, - { /* DFKaiShu2 */ + { /* DFKaiShu, variant */ { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */ { 0x13A42602UL, 0x0000007EUL } /* prep */ @@ -340,6 +363,11 @@ { 0x00000000UL, 0x00000000UL }, /* cvt */ { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */ { 0x3900DED3UL, 0x00001E18UL } /* prep */ + }, + { /* MINGLI.TTF, 1992 */ + { 0x00170003UL, 0x00000060UL }, /* cvt */ + { 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */ + { 0xD643482AUL, 0x00000035UL } /* prep */ } }; @@ -536,6 +564,7 @@ goto Exit; /* check that we have a valid TrueType file */ + FT_TRACE2(( " " )); error = sfnt->init_face( stream, face, face_index, num_params, params ); /* Stream may have changed. */ @@ -577,58 +606,50 @@ if ( FT_IS_SCALABLE( ttface ) ) { - #ifdef FT_CONFIG_OPTION_INCREMENTAL - if ( !ttface->internal->incremental_interface ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); - - /* Check the scalable flag based on `loca'. */ - if ( !ttface->internal->incremental_interface && - ttface->num_fixed_sizes && - face->glyph_locations && - tt_check_single_notdef( ttface ) ) +#endif { - FT_TRACE5(( "tt_face_init:" - " Only the `.notdef' glyph has an outline.\n" - " " - " Resetting scalable flag to FALSE.\n" )); + error = tt_face_load_loca( face, stream ); - ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + /* having a (non-zero) `glyf' table without */ + /* a `loca' table is not valid */ + if ( face->glyf_len && FT_ERR_EQ( error, Table_Missing ) ) + goto Exit; + if ( error ) + goto Exit; } -#else /* !FT_CONFIG_OPTION_INCREMENTAL */ + /* `fpgm', `cvt', and `prep' are optional */ + error = tt_face_load_cvt( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; - if ( !error ) - error = tt_face_load_loca( face, stream ); - if ( !error ) - error = tt_face_load_cvt( face, stream ); - if ( !error ) - error = tt_face_load_fpgm( face, stream ); - if ( !error ) - error = tt_face_load_prep( face, stream ); + error = tt_face_load_fpgm( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + error = tt_face_load_prep( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; /* Check the scalable flag based on `loca'. */ - if ( ttface->num_fixed_sizes && - face->glyph_locations && - tt_check_single_notdef( ttface ) ) +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !ttface->internal->incremental_interface ) +#endif { - FT_TRACE5(( "tt_face_init:" - " Only the `.notdef' glyph has an outline.\n" - " " - " Resetting scalable flag to FALSE.\n" )); + if ( ttface->num_fixed_sizes && + face->glyph_locations && + tt_check_single_notdef( ttface ) ) + { + FT_TRACE5(( "tt_face_init:" + " Only the `.notdef' glyph has an outline.\n" + " " + " Resetting scalable flag to FALSE.\n" )); - ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + } } - -#endif /* !FT_CONFIG_OPTION_INCREMENTAL */ - } #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT @@ -671,6 +692,8 @@ named_style->coords ); if ( error ) goto Exit; + + tt_apply_mvar( face ); } } } @@ -739,7 +762,7 @@ face->cvt_program_size = 0; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - tt_done_blend( memory, face->blend ); + tt_done_blend( face ); face->blend = NULL; #endif } @@ -797,14 +820,14 @@ exec->pedantic_hinting = pedantic; { - FT_Size_Metrics* metrics = &exec->metrics; - TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + FT_Size_Metrics* size_metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; - metrics->x_ppem = 0; - metrics->y_ppem = 0; - metrics->x_scale = 0; - metrics->y_scale = 0; + size_metrics->x_ppem = 0; + size_metrics->y_ppem = 0; + size_metrics->x_scale = 0; + size_metrics->y_scale = 0; tt_metrics->ppem = 0; tt_metrics->scale = 0; @@ -827,6 +850,11 @@ FT_TRACE4(( "Executing `fpgm' table.\n" )); error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif } else error = FT_Err_Ok; @@ -890,8 +918,12 @@ TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); FT_TRACE4(( "Executing `prep' table.\n" )); - error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif } else error = FT_Err_Ok; @@ -1010,17 +1042,17 @@ /* Set default metrics */ { - TT_Size_Metrics* metrics = &size->ttmetrics; + TT_Size_Metrics* tt_metrics = &size->ttmetrics; - metrics->rotated = FALSE; - metrics->stretched = FALSE; + tt_metrics->rotated = FALSE; + tt_metrics->stretched = FALSE; /* set default engine compensation */ - metrics->compensations[0] = 0; /* gray */ - metrics->compensations[1] = 0; /* black */ - metrics->compensations[2] = 0; /* white */ - metrics->compensations[3] = 0; /* reserved */ + tt_metrics->compensations[0] = 0; /* gray */ + tt_metrics->compensations[1] = 0; /* black */ + tt_metrics->compensations[2] = 0; /* white */ + tt_metrics->compensations[3] = 0; /* reserved */ } /* allocate function defs, instruction defs, cvt, and storage area */ @@ -1083,8 +1115,10 @@ if ( size->bytecode_ready < 0 ) error = tt_size_init_bytecode( (FT_Size)size, pedantic ); + else + error = size->bytecode_ready; - if ( error || size->bytecode_ready ) + if ( error ) goto Exit; /* rescale CVT when needed */ @@ -1116,6 +1150,8 @@ error = tt_size_run_prep( size, pedantic ); } + else + error = size->cvt_ready; Exit: return error; @@ -1192,26 +1228,32 @@ /* have been changed. */ /* */ /* <Input> */ - /* size :: A handle to the target size object. */ + /* size :: A handle to the target size object. */ + /* */ + /* only_height :: Only recompute ascender, descender, and height. */ /* */ FT_LOCAL_DEF( FT_Error ) - tt_size_reset( TT_Size size ) + tt_size_reset( TT_Size size, + FT_Bool only_height ) { TT_Face face; - FT_Error error = FT_Err_Ok; - FT_Size_Metrics* metrics; - + FT_Size_Metrics* size_metrics; - size->ttmetrics.valid = FALSE; face = (TT_Face)size->root.face; - metrics = &size->metrics; + /* nothing to do for CFF2 */ + if ( face->is_cff2 ) + return FT_Err_Ok; + + size->ttmetrics.valid = FALSE; + + size_metrics = &size->hinted_metrics; /* copy the result from base layer */ - *metrics = size->root.metrics; + *size_metrics = size->root.metrics; - if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) + if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 ) return FT_THROW( Invalid_PPem ); /* This bit flag, if set, indicates that the ppems must be */ @@ -1220,48 +1262,62 @@ /* */ if ( face->header.Flags & 8 ) { - metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, - face->root.units_per_EM ); - metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, - face->root.units_per_EM ); - - metrics->ascender = - FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); - metrics->descender = - FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); - metrics->height = - FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); - metrics->max_advance = - FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, - metrics->x_scale ) ); + /* the TT spec always asks for ROUND, not FLOOR or CEIL */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->root.ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->root.descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->root.height, + size_metrics->y_scale ) ); + } + + size->ttmetrics.valid = TRUE; + + if ( only_height ) + return FT_Err_Ok; + + if ( face->header.Flags & 8 ) + { + /* base scaling values on integer ppem values, */ + /* as mandated by the TrueType specification */ + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->root.units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->root.units_per_EM ); + + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->root.max_advance_width, + size_metrics->x_scale ) ); } /* compute new transformation */ - if ( metrics->x_ppem >= metrics->y_ppem ) + if ( size_metrics->x_ppem >= size_metrics->y_ppem ) { - size->ttmetrics.scale = metrics->x_scale; - size->ttmetrics.ppem = metrics->x_ppem; + size->ttmetrics.scale = size_metrics->x_scale; + size->ttmetrics.ppem = size_metrics->x_ppem; size->ttmetrics.x_ratio = 0x10000L; - size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem, - metrics->x_ppem ); + size->ttmetrics.y_ratio = FT_DivFix( size_metrics->y_ppem, + size_metrics->x_ppem ); } else { - size->ttmetrics.scale = metrics->y_scale; - size->ttmetrics.ppem = metrics->y_ppem; - size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem, - metrics->y_ppem ); + size->ttmetrics.scale = size_metrics->y_scale; + size->ttmetrics.ppem = size_metrics->y_ppem; + size->ttmetrics.x_ratio = FT_DivFix( size_metrics->x_ppem, + size_metrics->y_ppem ); size->ttmetrics.y_ratio = 0x10000L; } + size->metrics = size_metrics; + #ifdef TT_USE_BYTECODE_INTERPRETER size->cvt_ready = -1; #endif /* TT_USE_BYTECODE_INTERPRETER */ - if ( !error ) - size->ttmetrics.valid = TRUE; - - return error; + return FT_Err_Ok; } diff --git a/thirdparty/freetype/src/truetype/ttobjs.h b/thirdparty/freetype/src/truetype/ttobjs.h index ed61a7d517..cdacee75e5 100644 --- a/thirdparty/freetype/src/truetype/ttobjs.h +++ b/thirdparty/freetype/src/truetype/ttobjs.h @@ -4,7 +4,7 @@ /* */ /* Objects manager (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -278,7 +278,8 @@ FT_BEGIN_HEADER /* we have our own copy of metrics so that we can modify */ /* it without affecting auto-hinting (when used) */ - FT_Size_Metrics metrics; + FT_Size_Metrics* metrics; /* for the current rendering mode */ + FT_Size_Metrics hinted_metrics; /* for the hinted rendering mode */ TT_Size_Metrics ttmetrics; @@ -286,6 +287,8 @@ FT_BEGIN_HEADER #ifdef TT_USE_BYTECODE_INTERPRETER + FT_Long point_size; /* for the `MPS' bytecode instruction */ + FT_UInt num_function_defs; /* number of function definitions */ FT_UInt max_function_defs; TT_DefArray function_defs; /* table of function definitions */ @@ -387,7 +390,8 @@ FT_BEGIN_HEADER #endif /* TT_USE_BYTECODE_INTERPRETER */ FT_LOCAL( FT_Error ) - tt_size_reset( TT_Size size ); + tt_size_reset( TT_Size size, + FT_Bool only_height ); /*************************************************************************/ diff --git a/thirdparty/freetype/src/truetype/ttpic.c b/thirdparty/freetype/src/truetype/ttpic.c index 54a5b8bed6..66bd7e1934 100644 --- a/thirdparty/freetype/src/truetype/ttpic.c +++ b/thirdparty/freetype/src/truetype/ttpic.c @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for truetype module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/truetype/ttpic.h b/thirdparty/freetype/src/truetype/ttpic.h index f725865c5c..1410cd73c3 100644 --- a/thirdparty/freetype/src/truetype/ttpic.h +++ b/thirdparty/freetype/src/truetype/ttpic.h @@ -4,7 +4,7 @@ /* */ /* The FreeType position independent code services for truetype module. */ /* */ -/* Copyright 2009-2016 by */ +/* Copyright 2009-2017 by */ /* Oran Agra and Mickey Gabel. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -25,15 +25,17 @@ #ifndef FT_CONFIG_OPTION_PIC -#define TT_SERVICES_GET tt_services -#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters -#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf -#define TT_SERVICE_PROPERTIES_GET tt_service_properties +#define TT_SERVICES_GET tt_services +#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters +#define TT_SERVICE_METRICS_VARIATIONS_GET tt_service_metrics_variations +#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf +#define TT_SERVICE_PROPERTIES_GET tt_service_properties #else /* FT_CONFIG_OPTION_PIC */ #include FT_MULTIPLE_MASTERS_H #include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H #include FT_SERVICE_TRUETYPE_GLYF_H #include FT_SERVICE_PROPERTIES_H @@ -42,12 +44,13 @@ FT_BEGIN_HEADER typedef struct TTModulePIC_ { - FT_ServiceDescRec* tt_services; + FT_ServiceDescRec* tt_services; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Service_MultiMastersRec tt_service_gx_multi_masters; + FT_Service_MultiMastersRec tt_service_gx_multi_masters; + FT_Service_MetricsVariationsRec tt_service_metrics_variations; #endif - FT_Service_TTGlyfRec tt_service_truetype_glyf; - FT_Service_PropertiesRec tt_service_properties; + FT_Service_TTGlyfRec tt_service_truetype_glyf; + FT_Service_PropertiesRec tt_service_properties; } TTModulePIC; @@ -56,6 +59,8 @@ FT_BEGIN_HEADER ( (TTModulePIC*)((lib)->pic_container.truetype) ) #define TT_SERVICES_GET \ ( GET_PIC( library )->tt_services ) +#define TT_SERVICE_METRICS_VARIATIONS_GET \ + ( GET_PIC( library )->tt_service_metrics_variations ) #define TT_SERVICE_GX_MULTI_MASTERS_GET \ ( GET_PIC( library )->tt_service_gx_multi_masters ) #define TT_SERVICE_TRUETYPE_GLYF_GET \ diff --git a/thirdparty/freetype/src/truetype/ttpload.c b/thirdparty/freetype/src/truetype/ttpload.c index ca158ac50b..70ac15da4a 100644 --- a/thirdparty/freetype/src/truetype/ttpload.c +++ b/thirdparty/freetype/src/truetype/ttpload.c @@ -4,7 +4,7 @@ /* */ /* TrueType-specific tables loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -73,9 +73,21 @@ /* it is possible that a font doesn't have a glyf table at all */ /* or its size is zero */ if ( FT_ERR_EQ( error, Table_Missing ) ) - face->glyf_len = 0; + { + face->glyf_len = 0; + face->glyf_offset = 0; + } else if ( error ) goto Exit; + else + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + face->glyf_offset = 0; + else +#endif + face->glyf_offset = FT_STREAM_POS(); + } FT_TRACE2(( "Locations " )); error = face->goto_table( face, TTAG_loca, stream, &table_len ); @@ -92,8 +104,7 @@ if ( table_len >= 0x40000L ) { FT_TRACE2(( "table too large\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; + table_len = 0x3FFFFL; } face->num_locations = table_len >> shift; } @@ -104,8 +115,7 @@ if ( table_len >= 0x20000L ) { FT_TRACE2(( "table too large\n" )); - error = FT_THROW( Invalid_Table ); - goto Exit; + table_len = 0x1FFFFL; } face->num_locations = table_len >> shift; } @@ -222,13 +232,13 @@ } } - /* Check broken location data */ + /* Check broken location data. */ if ( pos1 > face->glyf_len ) { FT_TRACE1(( "tt_face_get_location:" - " too large offset=0x%08lx found for gid=0x%04lx,\n" + " too large offset (0x%08lx) found for glyph index %ld,\n" " " - " exceeding the end of glyf table (0x%08lx)\n", + " exceeding the end of `glyf' table (0x%08lx)\n", pos1, gindex, face->glyf_len )); *asize = 0; return 0; @@ -236,12 +246,26 @@ if ( pos2 > face->glyf_len ) { - FT_TRACE1(( "tt_face_get_location:" - " too large offset=0x%08lx found for gid=0x%04lx,\n" - " " - " truncate at the end of glyf table (0x%08lx)\n", - pos2, gindex + 1, face->glyf_len )); - pos2 = face->glyf_len; + /* We try to sanitize the last `loca' entry. */ + if ( gindex == face->num_locations - 1 ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %ld,\n" + " " + " truncating at the end of `glyf' table (0x%08lx)\n", + pos2, gindex + 1, face->glyf_len )); + pos2 = face->glyf_len; + } + else + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %ld,\n" + " " + " exceeding the end of `glyf' table (0x%08lx)\n", + pos2, gindex + 1, face->glyf_len )); + *asize = 0; + return 0; + } } /* The `loca' table must be ordered; it refers to the length of */ @@ -500,7 +524,7 @@ { FT_Error error; FT_Memory memory = stream->memory; - FT_UInt version, nn, num_records; + FT_UInt nn, num_records; FT_ULong table_size, record_size; FT_Byte* p; FT_Byte* limit; @@ -517,7 +541,10 @@ p = face->hdmx_table; limit = p + table_size; - version = FT_NEXT_USHORT( p ); + /* Given that `hdmx' tables are losing its importance (for example, */ + /* variation fonts introduced in OpenType 1.8 must not have this */ + /* table) we no longer test for a correct `version' field. */ + p += 2; num_records = FT_NEXT_USHORT( p ); record_size = FT_NEXT_ULONG( p ); @@ -536,10 +563,10 @@ record_size &= 0xFFFFU; /* The limit for `num_records' is a heuristic value. */ - if ( version != 0 || - num_records > 255 || - record_size > 0x10001L || - record_size < 4 ) + if ( num_records > 255 || + ( num_records > 0 && + ( record_size > 0x10001L || + record_size < 4 ) ) ) { error = FT_THROW( Invalid_File_Format ); goto Fail; diff --git a/thirdparty/freetype/src/truetype/ttpload.h b/thirdparty/freetype/src/truetype/ttpload.h index aa2e38e6e7..79079f345a 100644 --- a/thirdparty/freetype/src/truetype/ttpload.h +++ b/thirdparty/freetype/src/truetype/ttpload.h @@ -4,7 +4,7 @@ /* */ /* TrueType-specific tables loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/truetype/ttsubpix.c b/thirdparty/freetype/src/truetype/ttsubpix.c index 03950960a4..1c8cf01109 100644 --- a/thirdparty/freetype/src/truetype/ttsubpix.c +++ b/thirdparty/freetype/src/truetype/ttsubpix.c @@ -4,7 +4,7 @@ /* */ /* TrueType Subpixel Hinting. */ /* */ -/* Copyright 2010-2016 by */ +/* Copyright 2010-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -27,7 +27,8 @@ #include "ttsubpix.h" -#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#if defined( TT_USE_BYTECODE_INTERPRETER ) && \ + defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY ) /*************************************************************************/ /* */ @@ -905,7 +906,7 @@ { TT_Face face = loader->face; FT_String* family = face->root.family_name; - FT_UInt ppem = loader->size->metrics.x_ppem; + FT_UInt ppem = loader->size->metrics->x_ppem; FT_String* style = face->root.style_name; @@ -1000,12 +1001,14 @@ } } -#else /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ +#else /* !(TT_USE_BYTECODE_INTERPRETER && */ + /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ /* ANSI C doesn't like empty source files */ typedef int _tt_subpix_dummy; -#endif /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ +#endif /* !(TT_USE_BYTECODE_INTERPRETER && */ + /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ /* END */ diff --git a/thirdparty/freetype/src/truetype/ttsubpix.h b/thirdparty/freetype/src/truetype/ttsubpix.h index 86844da666..c68f97ff07 100644 --- a/thirdparty/freetype/src/truetype/ttsubpix.h +++ b/thirdparty/freetype/src/truetype/ttsubpix.h @@ -4,7 +4,7 @@ /* */ /* TrueType Subpixel Hinting. */ /* */ -/* Copyright 2010-2016 by */ +/* Copyright 2010-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/module.mk b/thirdparty/freetype/src/type1/module.mk index d7ab520c74..f299d6fe88 100644 --- a/thirdparty/freetype/src/type1/module.mk +++ b/thirdparty/freetype/src/type1/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/type1/rules.mk b/thirdparty/freetype/src/type1/rules.mk index bdec29479f..97bef288f0 100644 --- a/thirdparty/freetype/src/type1/rules.mk +++ b/thirdparty/freetype/src/type1/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/type1/t1afm.c b/thirdparty/freetype/src/type1/t1afm.c index bbd843c1c3..11a2646fc2 100644 --- a/thirdparty/freetype/src/type1/t1afm.c +++ b/thirdparty/freetype/src/type1/t1afm.c @@ -4,7 +4,7 @@ /* */ /* AFM support for Type 1 fonts (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,6 +24,8 @@ #include "t1errors.h" +#ifndef T1_CONFIG_OPTION_NO_AFM + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ @@ -208,7 +210,7 @@ kp++; } - if ( oldcharmap != NULL ) + if ( oldcharmap ) error = FT_Set_Charmap( t1_face, oldcharmap ); if ( error ) goto Exit; @@ -309,14 +311,14 @@ { t1_face->face_flags |= FT_FACE_FLAG_KERNING; face->afm_data = fi; - fi = NULL; + fi = NULL; } } FT_FRAME_EXIT(); Exit: - if ( fi != NULL ) + if ( fi ) T1_Done_Metrics( memory, fi ); return error; @@ -402,5 +404,12 @@ return FT_Err_Ok; } +#else /* T1_CONFIG_OPTION_NO_AFM */ + + /* ANSI C doesn't like empty source files */ + typedef int _t1_afm_dummy; + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + /* END */ diff --git a/thirdparty/freetype/src/type1/t1afm.h b/thirdparty/freetype/src/type1/t1afm.h index 3a864f2379..9f62cd013d 100644 --- a/thirdparty/freetype/src/type1/t1afm.h +++ b/thirdparty/freetype/src/type1/t1afm.h @@ -4,7 +4,7 @@ /* */ /* AFM support for Type 1 fonts (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1driver.c b/thirdparty/freetype/src/type1/t1driver.c index f1e60d4523..c2089947f9 100644 --- a/thirdparty/freetype/src/type1/t1driver.c +++ b/thirdparty/freetype/src/type1/t1driver.c @@ -4,7 +4,7 @@ /* */ /* Type 1 driver interface (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -122,8 +122,13 @@ (FT_Get_MM_Func) T1_Get_Multi_Master, /* get_mm */ (FT_Set_MM_Design_Func) T1_Set_MM_Design, /* set_mm_design */ (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, /* set_mm_blend */ + (FT_Get_MM_Blend_Func) T1_Get_MM_Blend, /* get_mm_blend */ (FT_Get_MM_Var_Func) T1_Get_MM_Var, /* get_mm_var */ - (FT_Set_Var_Design_Func)T1_Set_Var_Design /* set_var_design */ + (FT_Set_Var_Design_Func)T1_Set_Var_Design, /* set_var_design */ + (FT_Get_Var_Design_Func)T1_Get_Var_Design, /* get_var_design */ + + (FT_Get_Var_Blend_Func) NULL, /* get_var_blend */ + (FT_Done_Blend_Func) T1_Done_Blend /* done_blend */ }; #endif @@ -714,7 +719,7 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ T1_Driver_Init, /* FT_Module_Constructor module_init */ T1_Driver_Done, /* FT_Module_Destructor module_done */ @@ -735,8 +740,8 @@ T1_Load_Glyph, /* FT_Slot_LoadFunc load_glyph */ #ifdef T1_CONFIG_OPTION_NO_AFM - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ #else Get_Kerning, /* FT_Face_GetKerningFunc get_kerning */ T1_Read_Metrics, /* FT_Face_AttachFunc attach_file */ @@ -744,7 +749,7 @@ T1_Get_Advances, /* FT_Face_GetAdvancesFunc get_advances */ T1_Size_Request, /* FT_Size_RequestFunc request_size */ - 0 /* FT_Size_SelectFunc select_size */ + NULL /* FT_Size_SelectFunc select_size */ }; diff --git a/thirdparty/freetype/src/type1/t1driver.h b/thirdparty/freetype/src/type1/t1driver.h index 78d8e38aa9..292786448d 100644 --- a/thirdparty/freetype/src/type1/t1driver.h +++ b/thirdparty/freetype/src/type1/t1driver.h @@ -4,7 +4,7 @@ /* */ /* High-level Type 1 driver interface (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1errors.h b/thirdparty/freetype/src/type1/t1errors.h index 9ba470ed6c..492dbb4a42 100644 --- a/thirdparty/freetype/src/type1/t1errors.h +++ b/thirdparty/freetype/src/type1/t1errors.h @@ -4,7 +4,7 @@ /* */ /* Type 1 error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1gload.c b/thirdparty/freetype/src/type1/t1gload.c index ea36f64142..aaf19b6dcc 100644 --- a/thirdparty/freetype/src/type1/t1gload.c +++ b/thirdparty/freetype/src/type1/t1gload.c @@ -4,7 +4,7 @@ /* */ /* Type 1 Glyph Loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1gload.h b/thirdparty/freetype/src/type1/t1gload.h index 975f227853..cc4d5e734f 100644 --- a/thirdparty/freetype/src/type1/t1gload.h +++ b/thirdparty/freetype/src/type1/t1gload.h @@ -4,7 +4,7 @@ /* */ /* Type 1 Glyph Loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1load.c b/thirdparty/freetype/src/type1/t1load.c index c981adcf2c..f5c661f7de 100644 --- a/thirdparty/freetype/src/type1/t1load.c +++ b/thirdparty/freetype/src/type1/t1load.c @@ -4,7 +4,7 @@ /* */ /* Type 1 font loader (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -237,7 +237,7 @@ if ( ncv <= axismap->blend_points[0] ) return INT_TO_FIXED( axismap->design_points[0] ); - for ( j = 1; j < axismap->num_points; ++j ) + for ( j = 1; j < axismap->num_points; j++ ) { if ( ncv <= axismap->blend_points[j] ) return INT_TO_FIXED( axismap->design_points[j - 1] ) + @@ -321,12 +321,12 @@ mmvar->num_axis = mmaster.num_axis; mmvar->num_designs = mmaster.num_designs; - mmvar->num_namedstyles = ~0U; /* Does not apply */ + mmvar->num_namedstyles = 0; /* Not supported */ mmvar->axis = (FT_Var_Axis*)&mmvar[1]; /* Point to axes after MM_Var struct */ mmvar->namedstyle = NULL; - for ( i = 0; i < mmaster.num_axis; ++i ) + for ( i = 0; i < mmaster.num_axis; i++ ) { mmvar->axis[i].name = mmaster.axis[i].name; mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum); @@ -354,7 +354,7 @@ axiscoords, blend->num_axis ); - for ( i = 0; i < mmaster.num_axis; ++i ) + for ( i = 0; i < mmaster.num_axis; i++ ) mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i], axiscoords[i] ); } @@ -413,6 +413,41 @@ FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + PS_Blend blend = face->blend; + + FT_Fixed axiscoords[4]; + FT_UInt i, nc; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + mm_weights_unmap( blend->weight_vector, + axiscoords, + blend->num_axis ); + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "T1_Get_MM_Blend: only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + coords[i] = axiscoords[i]; + for ( ; i < num_coords; i++ ) + coords[i] = 0x8000; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) T1_Set_MM_Design( T1_Face face, FT_UInt num_coords, FT_Long* coords ) @@ -504,13 +539,49 @@ if ( num_coords > T1_MAX_MM_AXIS ) num_coords = T1_MAX_MM_AXIS; - for ( i = 0; i < num_coords; ++i ) + for ( i = 0; i < num_coords; i++ ) lcoords[i] = FIXED_TO_INT( coords[i] ); return T1_Set_MM_Design( face, num_coords, lcoords ); } + FT_LOCAL_DEF( FT_Error ) + T1_Get_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + PS_Blend blend = face->blend; + + FT_Fixed axiscoords[4]; + FT_UInt i, nc; + + + if ( !blend ) + return FT_THROW( Invalid_Argument ); + + mm_weights_unmap( blend->weight_vector, + axiscoords, + blend->num_axis ); + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "T1_Get_Var_Design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + coords[i] = mm_axis_unmap( &blend->design_map[i], axiscoords[i] ); + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + FT_LOCAL_DEF( void ) T1_Done_Blend( T1_Face face ) { @@ -1406,7 +1477,6 @@ FT_Error error; FT_Int num_subrs; FT_UInt count; - FT_Hash hash = NULL; PSAux_Service psaux = (PSAux_Service)face->psaux; @@ -1433,7 +1503,7 @@ } /* we certainly need more than 8 bytes per subroutine */ - if ( parser->root.limit > parser->root.cursor && + if ( parser->root.limit >= parser->root.cursor && num_subrs > ( parser->root.limit - parser->root.cursor ) >> 3 ) { /* @@ -1457,14 +1527,12 @@ ( parser->root.limit - parser->root.cursor ) >> 3 )); num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3; - if ( !hash ) + if ( !loader->subrs_hash ) { - if ( FT_NEW( hash ) ) + if ( FT_NEW( loader->subrs_hash ) ) goto Fail; - loader->subrs_hash = hash; - - error = ft_hash_num_init( hash, memory ); + error = ft_hash_num_init( loader->subrs_hash, memory ); if ( error ) goto Fail; } @@ -1527,9 +1595,9 @@ /* if we use a hash, the subrs index is the key, and a running */ /* counter specified for `T1_Add_Table' acts as the value */ - if ( hash ) + if ( loader->subrs_hash ) { - ft_hash_num_insert( idx, count, hash, memory ); + ft_hash_num_insert( idx, count, loader->subrs_hash, memory ); idx = count; } @@ -1776,6 +1844,12 @@ } } + if ( !n ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + loader->num_glyphs = n; /* if /.notdef is found but does not occupy index 0, do our magic. */ @@ -2104,7 +2178,7 @@ parser->root.error = t1_load_keyword( face, loader, keyword ); - if ( parser->root.error != FT_Err_Ok ) + if ( parser->root.error ) { if ( FT_ERR_EQ( parser->root.error, Ignore ) ) parser->root.error = FT_Err_Ok; @@ -2143,7 +2217,7 @@ { FT_UNUSED( face ); - FT_MEM_ZERO( loader, sizeof ( *loader ) ); + FT_ZERO( loader ); } diff --git a/thirdparty/freetype/src/type1/t1load.h b/thirdparty/freetype/src/type1/t1load.h index b96fe5a746..2d86984f0e 100644 --- a/thirdparty/freetype/src/type1/t1load.h +++ b/thirdparty/freetype/src/type1/t1load.h @@ -4,7 +4,7 @@ /* */ /* Type 1 font loader (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -70,7 +70,7 @@ FT_BEGIN_HEADER T1_Get_Multi_Master( T1_Face face, FT_Multi_Master* master ); - FT_LOCAL_DEF( FT_Error ) + FT_LOCAL( FT_Error ) T1_Get_MM_Var( T1_Face face, FT_MM_Var* *master ); @@ -80,11 +80,21 @@ FT_BEGIN_HEADER FT_Fixed* coords ); FT_LOCAL( FT_Error ) + T1_Get_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) T1_Set_MM_Design( T1_Face face, FT_UInt num_coords, FT_Long* coords ); - FT_LOCAL_DEF( FT_Error ) + FT_LOCAL( FT_Error ) + T1_Get_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) T1_Set_Var_Design( T1_Face face, FT_UInt num_coords, FT_Fixed* coords ); diff --git a/thirdparty/freetype/src/type1/t1objs.c b/thirdparty/freetype/src/type1/t1objs.c index a009117133..97c16b0fdf 100644 --- a/thirdparty/freetype/src/type1/t1objs.c +++ b/thirdparty/freetype/src/type1/t1objs.c @@ -4,7 +4,7 @@ /* */ /* Type 1 objects manager (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -49,9 +49,6 @@ /* */ /* SIZE FUNCTIONS */ /* */ - /* note that we store the global hints in the size's "internal" root */ - /* field */ - /* */ /*************************************************************************/ @@ -77,16 +74,16 @@ T1_Size size = (T1_Size)t1size; - if ( size->root.internal ) + if ( t1size->internal->module_data ) { PSH_Globals_Funcs funcs; funcs = T1_Size_Get_Globals_Funcs( size ); if ( funcs ) - funcs->destroy( (PSH_Globals)size->root.internal ); + funcs->destroy( (PSH_Globals)t1size->internal->module_data ); - size->root.internal = NULL; + t1size->internal->module_data = NULL; } } @@ -108,7 +105,7 @@ error = funcs->create( size->root.face->memory, &face->type1.private_dict, &globals ); if ( !error ) - size->root.internal = (FT_Size_Internal)(void*)globals; + t1size->internal->module_data = globals; } return error; @@ -126,7 +123,7 @@ FT_Request_Metrics( size->root.face, req ); if ( funcs ) - funcs->set_scale( (PSH_Globals)size->root.internal, + funcs->set_scale( (PSH_Globals)t1size->internal->module_data, size->root.metrics.x_scale, size->root.metrics.y_scale, 0, 0 ); diff --git a/thirdparty/freetype/src/type1/t1objs.h b/thirdparty/freetype/src/type1/t1objs.h index 94fbdee9ae..39d26bf8b9 100644 --- a/thirdparty/freetype/src/type1/t1objs.h +++ b/thirdparty/freetype/src/type1/t1objs.h @@ -4,7 +4,7 @@ /* */ /* Type 1 objects manager (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1parse.c b/thirdparty/freetype/src/type1/t1parse.c index 563d9f37bb..18dd26434c 100644 --- a/thirdparty/freetype/src/type1/t1parse.c +++ b/thirdparty/freetype/src/type1/t1parse.c @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (body). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -437,7 +437,7 @@ *cur == '\t' || (test_cr && *cur == '\r' ) || *cur == '\n' ) ) - ++cur; + cur++; if ( cur >= limit ) { FT_ERROR(( "T1_Get_Private_Dict:" diff --git a/thirdparty/freetype/src/type1/t1parse.h b/thirdparty/freetype/src/type1/t1parse.h index affa818e63..3396680d1a 100644 --- a/thirdparty/freetype/src/type1/t1parse.h +++ b/thirdparty/freetype/src/type1/t1parse.h @@ -4,7 +4,7 @@ /* */ /* Type 1 parser (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/t1tokens.h b/thirdparty/freetype/src/type1/t1tokens.h index a84f291a6b..ca0c55f903 100644 --- a/thirdparty/freetype/src/type1/t1tokens.h +++ b/thirdparty/freetype/src/type1/t1tokens.h @@ -4,7 +4,7 @@ /* */ /* Type 1 tokenizer (specification). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type1/type1.c b/thirdparty/freetype/src/type1/type1.c index bb8aca97f9..81795376ef 100644 --- a/thirdparty/freetype/src/type1/type1.c +++ b/thirdparty/freetype/src/type1/type1.c @@ -4,7 +4,7 @@ /* */ /* FreeType Type 1 driver component (body only). */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -17,17 +17,14 @@ #define FT_MAKE_OPTION_SINGLE_OBJECT - #include <ft2build.h> -#include "t1parse.c" -#include "t1load.c" -#include "t1objs.c" -#include "t1driver.c" -#include "t1gload.c" -#ifndef T1_CONFIG_OPTION_NO_AFM #include "t1afm.c" -#endif +#include "t1driver.c" +#include "t1gload.c" +#include "t1load.c" +#include "t1objs.c" +#include "t1parse.c" /* END */ diff --git a/thirdparty/freetype/src/type42/module.mk b/thirdparty/freetype/src/type42/module.mk index a7e27b7236..2f52806808 100644 --- a/thirdparty/freetype/src/type42/module.mk +++ b/thirdparty/freetype/src/type42/module.mk @@ -3,7 +3,7 @@ # -# Copyright 2002-2016 by +# Copyright 2002-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/type42/rules.mk b/thirdparty/freetype/src/type42/rules.mk index 80710eff67..d7e8965015 100644 --- a/thirdparty/freetype/src/type42/rules.mk +++ b/thirdparty/freetype/src/type42/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 2002-2016 by +# Copyright 2002-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/type42/t42drivr.c b/thirdparty/freetype/src/type42/t42drivr.c index c63ed0c812..366cfb3a1d 100644 --- a/thirdparty/freetype/src/type42/t42drivr.c +++ b/thirdparty/freetype/src/type42/t42drivr.c @@ -4,7 +4,7 @@ /* */ /* High-level Type 42 driver interface (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -81,7 +81,8 @@ if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) - return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); + return (FT_UInt)ft_strtol( (const char *)face->type1.charstrings[i], + NULL, 10 ); } return 0; @@ -213,7 +214,7 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ T42_Driver_Init, /* FT_Module_Constructor module_init */ T42_Driver_Done, /* FT_Module_Destructor module_done */ @@ -233,9 +234,9 @@ T42_GlyphSlot_Load, /* FT_Slot_LoadFunc load_glyph */ - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ T42_Size_Request, /* FT_Size_RequestFunc request_size */ T42_Size_Select /* FT_Size_SelectFunc select_size */ diff --git a/thirdparty/freetype/src/type42/t42drivr.h b/thirdparty/freetype/src/type42/t42drivr.h index 6ddfb639d5..1ac4a0a1a1 100644 --- a/thirdparty/freetype/src/type42/t42drivr.h +++ b/thirdparty/freetype/src/type42/t42drivr.h @@ -4,7 +4,7 @@ /* */ /* High-level Type 42 driver interface (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type42/t42error.h b/thirdparty/freetype/src/type42/t42error.h index e1097cc81e..fda92abf57 100644 --- a/thirdparty/freetype/src/type42/t42error.h +++ b/thirdparty/freetype/src/type42/t42error.h @@ -4,7 +4,7 @@ /* */ /* Type 42 error codes (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type42/t42objs.c b/thirdparty/freetype/src/type42/t42objs.c index 4672c6e164..87e5206b7f 100644 --- a/thirdparty/freetype/src/type42/t42objs.c +++ b/thirdparty/freetype/src/type42/t42objs.c @@ -4,7 +4,7 @@ /* */ /* Type 42 objects manager (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -590,7 +590,7 @@ FT_Error error = FT_Err_Ok; - if ( face->glyph == NULL ) + if ( !face->glyph ) { /* First glyph slot for this face */ slot->ttslot = t42face->ttf_face->glyph; @@ -656,8 +656,9 @@ FT_TRACE1(( "T42_GlyphSlot_Load: glyph index %d\n", glyph_index )); /* map T42 glyph index to embedded TTF's glyph index */ - glyph_index = (FT_UInt)ft_atol( - (const char *)t42face->type1.charstrings[glyph_index] ); + glyph_index = (FT_UInt)ft_strtol( + (const char *)t42face->type1.charstrings[glyph_index], + NULL, 10 ); t42_glyphslot_clear( t42slot->ttslot ); error = ttclazz->load_glyph( t42slot->ttslot, diff --git a/thirdparty/freetype/src/type42/t42objs.h b/thirdparty/freetype/src/type42/t42objs.h index 87a40452f4..eb4c5bf69f 100644 --- a/thirdparty/freetype/src/type42/t42objs.h +++ b/thirdparty/freetype/src/type42/t42objs.h @@ -4,7 +4,7 @@ /* */ /* Type 42 objects manager (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type42/t42parse.c b/thirdparty/freetype/src/type42/t42parse.c index f948916afa..e7c6770bd2 100644 --- a/thirdparty/freetype/src/type42/t42parse.c +++ b/thirdparty/freetype/src/type42/t42parse.c @@ -4,7 +4,7 @@ /* */ /* Type 42 font parser (body). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -936,7 +936,7 @@ if ( *cur == '/' || *cur == '(' ) { FT_UInt len; - FT_Bool have_literal = ( *cur == '(' ); + FT_Bool have_literal = FT_BOOL( *cur == '(' ); if ( cur + ( have_literal ? 3 : 2 ) >= limit ) @@ -1268,7 +1268,7 @@ { FT_UNUSED( face ); - FT_MEM_ZERO( loader, sizeof ( *loader ) ); + FT_ZERO( loader ); loader->num_glyphs = 0; loader->num_chars = 0; diff --git a/thirdparty/freetype/src/type42/t42parse.h b/thirdparty/freetype/src/type42/t42parse.h index ba9e857190..7a68606f2e 100644 --- a/thirdparty/freetype/src/type42/t42parse.h +++ b/thirdparty/freetype/src/type42/t42parse.h @@ -4,7 +4,7 @@ /* */ /* Type 42 font parser (specification). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type42/t42types.h b/thirdparty/freetype/src/type42/t42types.h index 850a156e45..2306ab6c77 100644 --- a/thirdparty/freetype/src/type42/t42types.h +++ b/thirdparty/freetype/src/type42/t42types.h @@ -4,7 +4,7 @@ /* */ /* Type 42 font data types (specification only). */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* Roberto Alameda. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/type42/type42.c b/thirdparty/freetype/src/type42/type42.c index 0d17a9b1dc..ae8ac26782 100644 --- a/thirdparty/freetype/src/type42/type42.c +++ b/thirdparty/freetype/src/type42/type42.c @@ -4,7 +4,7 @@ /* */ /* FreeType Type 42 driver component. */ /* */ -/* Copyright 2002-2016 by */ +/* Copyright 2002-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -15,11 +15,13 @@ /* */ /***************************************************************************/ -#define FT_MAKE_OPTION_SINGLE_OBJECT +#define FT_MAKE_OPTION_SINGLE_OBJECT #include <ft2build.h> + +#include "t42drivr.c" #include "t42objs.c" #include "t42parse.c" -#include "t42drivr.c" + /* END */ diff --git a/thirdparty/freetype/src/winfonts/fnterrs.h b/thirdparty/freetype/src/winfonts/fnterrs.h index 6835d3e64f..4251021a70 100644 --- a/thirdparty/freetype/src/winfonts/fnterrs.h +++ b/thirdparty/freetype/src/winfonts/fnterrs.h @@ -4,7 +4,7 @@ /* */ /* Win FNT/FON error codes (specification only). */ /* */ -/* Copyright 2001-2016 by */ +/* Copyright 2001-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/thirdparty/freetype/src/winfonts/module.mk b/thirdparty/freetype/src/winfonts/module.mk index 83da5732f1..ffc53a19f9 100644 --- a/thirdparty/freetype/src/winfonts/module.mk +++ b/thirdparty/freetype/src/winfonts/module.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/winfonts/rules.mk b/thirdparty/freetype/src/winfonts/rules.mk index 2fd7b822a2..73e825d9ae 100644 --- a/thirdparty/freetype/src/winfonts/rules.mk +++ b/thirdparty/freetype/src/winfonts/rules.mk @@ -3,7 +3,7 @@ # -# Copyright 1996-2016 by +# Copyright 1996-2017 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, diff --git a/thirdparty/freetype/src/winfonts/winfnt.c b/thirdparty/freetype/src/winfonts/winfnt.c index 1c74ccd5ab..9811fbb05a 100644 --- a/thirdparty/freetype/src/winfonts/winfnt.c +++ b/thirdparty/freetype/src/winfonts/winfnt.c @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* Copyright 2003 Huw D M Davies for Codeweavers */ /* Copyright 2007 Dmitry Timoshkov for Codeweavers */ @@ -561,7 +561,7 @@ error = fnt_font_load( face->font, stream ); if ( error ) { - FT_TRACE2(( "font #%lu load error %d\n", + FT_TRACE2(( "font #%lu load error 0x%x\n", dir_entry2.name, error )); goto Fail; } @@ -759,6 +759,14 @@ if ( error ) goto Fail; + /* sanity check */ + if ( !face->font->header.pixel_height ) + { + FT_TRACE2(( "invalid pixel height\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + /* we now need to fill the root FT_Face fields */ /* with relevant information */ { @@ -992,8 +1000,6 @@ FT_ULong offset; FT_Bool new_format; - FT_UNUSED( load_flags ); - if ( !face ) { @@ -1047,6 +1053,26 @@ goto Exit; } + bitmap->rows = font->header.pixel_height; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + slot->bitmap_left = 0; + slot->bitmap_top = font->header.ascent; + slot->format = FT_GLYPH_FORMAT_BITMAP; + + /* now set up metrics */ + slot->metrics.width = (FT_Pos)( bitmap->width << 6 ); + slot->metrics.height = (FT_Pos)( bitmap->rows << 6 ); + slot->metrics.horiAdvance = (FT_Pos)( bitmap->width << 6 ); + slot->metrics.horiBearingX = 0; + slot->metrics.horiBearingY = slot->bitmap_top << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + (FT_Pos)( bitmap->rows << 6 ) ); + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + goto Exit; + /* jump to glyph data */ p = font->fnt_frame + /* font->header.bits_offset */ + offset; @@ -1058,11 +1084,9 @@ FT_Byte* write; - bitmap->pitch = (int)pitch; - bitmap->rows = font->header.pixel_height; - bitmap->pixel_mode = FT_PIXEL_MODE_MONO; - - if ( offset + pitch * bitmap->rows > font->header.file_size ) + bitmap->pitch = (int)pitch; + if ( !pitch || + offset + pitch * bitmap->rows > font->header.file_size ) { FT_TRACE2(( "invalid bitmap width\n" )); error = FT_THROW( Invalid_File_Format ); @@ -1084,22 +1108,9 @@ for ( write = column; p < limit; p++, write += bitmap->pitch ) *write = *p; } - } - slot->internal->flags = FT_GLYPH_OWN_BITMAP; - slot->bitmap_left = 0; - slot->bitmap_top = font->header.ascent; - slot->format = FT_GLYPH_FORMAT_BITMAP; - - /* now set up metrics */ - slot->metrics.width = (FT_Pos)( bitmap->width << 6 ); - slot->metrics.height = (FT_Pos)( bitmap->rows << 6 ); - slot->metrics.horiAdvance = (FT_Pos)( bitmap->width << 6 ); - slot->metrics.horiBearingX = 0; - slot->metrics.horiBearingY = slot->bitmap_top << 6; - - ft_synthesize_vertical_metrics( &slot->metrics, - (FT_Pos)( bitmap->rows << 6 ) ); + slot->internal->flags = FT_GLYPH_OWN_BITMAP; + } Exit: return error; @@ -1161,10 +1172,10 @@ 0x10000L, 0x20000L, - 0, /* module-specific interface */ + NULL, /* module-specific interface */ - 0, /* FT_Module_Constructor module_init */ - 0, /* FT_Module_Destructor module_done */ + NULL, /* FT_Module_Constructor module_init */ + NULL, /* FT_Module_Destructor module_done */ winfnt_get_service /* FT_Module_Requester get_interface */ }, @@ -1174,16 +1185,16 @@ FNT_Face_Init, /* FT_Face_InitFunc init_face */ FNT_Face_Done, /* FT_Face_DoneFunc done_face */ - 0, /* FT_Size_InitFunc init_size */ - 0, /* FT_Size_DoneFunc done_size */ - 0, /* FT_Slot_InitFunc init_slot */ - 0, /* FT_Slot_DoneFunc done_slot */ + NULL, /* FT_Size_InitFunc init_size */ + NULL, /* FT_Size_DoneFunc done_size */ + NULL, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ FNT_Load_Glyph, /* FT_Slot_LoadFunc load_glyph */ - 0, /* FT_Face_GetKerningFunc get_kerning */ - 0, /* FT_Face_AttachFunc attach_file */ - 0, /* FT_Face_GetAdvancesFunc get_advances */ + NULL, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + NULL, /* FT_Face_GetAdvancesFunc get_advances */ FNT_Size_Request, /* FT_Size_RequestFunc request_size */ FNT_Size_Select /* FT_Size_SelectFunc select_size */ diff --git a/thirdparty/freetype/src/winfonts/winfnt.h b/thirdparty/freetype/src/winfonts/winfnt.h index 9a4f32d5b0..884b645a2d 100644 --- a/thirdparty/freetype/src/winfonts/winfnt.h +++ b/thirdparty/freetype/src/winfonts/winfnt.h @@ -4,7 +4,7 @@ /* */ /* FreeType font driver for Windows FNT/FON files */ /* */ -/* Copyright 1996-2016 by */ +/* Copyright 1996-2017 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* Copyright 2007 Dmitry Timoshkov for Codeweavers */ /* */ |